From e58ed5323c4a77e53d63db08de39056f3f89d1a2 Mon Sep 17 00:00:00 2001
From: "Mutalik Desai, Suprasad" <suprasad.desai@intel.com>
Date: Fri, 9 Mar 2018 13:21:44 +0100
Subject: [PATCH] Merge pull request #267 in SW_PON/linux from
 bugfix/UGW_SW-22407-8.x-got-call-trace-in-adsl-scenario-kernel-bug-in-fx_sscasynctxrx
 to xrx500

UGW_SW-22407-8.x-got-call-trace-in-adsl-scenario-kernel-bug-in-fx_sscasynctxrx

* commit 'a4c7d15ea4aa15c8eeb161dc0aaaf8ed60dc2327':
  spi: ltq_ssc - handle invalid params more gracefully
---
 drivers/spi/ltq_ssc.c | 38 +++++++++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 7 deletions(-)

diff --git a/drivers/spi/ltq_ssc.c b/drivers/spi/ltq_ssc.c
index f2f5eaf8c..f682731ef 100644
--- a/drivers/spi/ltq_ssc.c
+++ b/drivers/spi/ltq_ssc.c
@@ -2857,6 +2857,35 @@ static INLINE int ifx_ssc_thread_init(struct ifx_ssc_port *port)
 }
 #endif /* CONFIG_LANTIQ_SPI_ASYNCHRONOUS */
 
+static int ifx_validate_params(IFX_SSC_HANDLE handler, char *txbuf, int txsize,
+			       char *rxbuf, int rxsize)
+{
+	int status = -EINVAL;
+
+	if (!handler) {
+		LOGF_KLOG_ERROR("%s: invalid handler\n", __func__);
+		goto out;
+	}
+
+	if (!rxbuf || rxsize == 0) {
+		LOGF_KLOG_ERROR("%s: invalid rxbuf=%x rxsize=%d\n",
+				__func__, rxbuf, rxsize);
+		goto out;
+	}
+
+	if (!txbuf || txsize == 0) {
+		LOGF_KLOG_ERROR("%s: invalid txbuf=%x txsize=%d\n",
+				__func__, txbuf, txsize);
+		goto out;
+	}
+	status = 0;
+
+out:
+	dump_stack();
+
+	return status;
+}
+
 /**
  * \fn int ifx_sscAsyncTxRx(IFX_SSC_HANDLE handler,
  *                          IFX_SSC_ASYNC_CALLBACK_t *pCallback,
@@ -2897,13 +2926,8 @@ ifx_sscAsyncTxRx(IFX_SSC_HANDLE handler,
 	struct ifx_ssc_port *port;
 	struct ifx_ssc_device_stats *stats;
 
-	/*anity check */
-	SSC_KASSERT((handler != NULL),
-		("%s Invalid parameter\n", __func__));
-
-	SSC_KASSERT(!((rxbuf == NULL) && (rxsize == 0)
-		&& (txbuf == NULL) && (txsize == 0)),
-		("%s Invalid parameter\n", __func__));
+	if (ifx_validate_params(handler, txbuf, txsize, rxbuf, rxsize) < 0)
+		return -EINVAL;
 
 	dev = (ssc_device_t *) handler;
 	stats = &dev->stats;
-- 
GitLab