rsi: use separate mutex lock for receive thread
authorKarun Eagalapati <karun256@gmail.com>
Thu, 6 Jul 2017 14:37:23 +0000 (20:07 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Fri, 28 Jul 2017 14:22:43 +0000 (17:22 +0300)
Deadlock issue is observed during our stress tests. The root
cause for the issue is same lock is used between tx and rx threads.

This patch adds a separate mutex lock for rx thread to resolve
the problem.

Signed-off-by: Karun Eagalapati <karun256@gmail.com>
Signed-off-by: Amitkumar Karwar <amit.karwar@redpinesignals.com>
Signed-off-by: Prameela Rani Garnepudi <prameela.j04cs@gmail.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/rsi/rsi_91x_main.c
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c
drivers/net/wireless/rsi/rsi_91x_usb_ops.c
drivers/net/wireless/rsi/rsi_main.h

index f1cde0ca81f9a81e38bcbf99f1d16a04cfb18694..939f568dae9baad5d00a6801d9e5210e29a4d72c 100644 (file)
@@ -221,6 +221,7 @@ struct rsi_hw *rsi_91x_init(void)
        rsi_init_event(&common->tx_thread.event);
        mutex_init(&common->mutex);
        mutex_init(&common->tx_rxlock);
+       mutex_init(&common->rx_lock);
 
        if (rsi_create_kthread(common,
                               &common->tx_thread,
index b6d0e2ae141229e8d23e5037216bed566551ba6b..b3f7adc9d0853049d54b7d0dd6008788d7396aba 100644 (file)
@@ -230,7 +230,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
        dev->rx_info.sdio_int_counter++;
 
        do {
-               mutex_lock(&common->tx_rxlock);
+               mutex_lock(&common->rx_lock);
                status = rsi_sdio_read_register(common->priv,
                                                RSI_FN1_INT_REGISTER,
                                                &isr_status);
@@ -238,7 +238,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
                        rsi_dbg(ERR_ZONE,
                                "%s: Failed to Read Intr Status Register\n",
                                __func__);
-                       mutex_unlock(&common->tx_rxlock);
+                       mutex_unlock(&common->rx_lock);
                        return;
                }
                adapter->interrupt_status = isr_status;
@@ -246,7 +246,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
                if (isr_status == 0) {
                        rsi_set_event(&common->tx_thread.event);
                        dev->rx_info.sdio_intr_status_zero++;
-                       mutex_unlock(&common->tx_rxlock);
+                       mutex_unlock(&common->rx_lock);
                        return;
                }
 
@@ -304,7 +304,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
                                        rsi_dbg(ERR_ZONE,
                                                "%s: Failed to read pkt\n",
                                                __func__);
-                                       mutex_unlock(&common->tx_rxlock);
+                                       mutex_unlock(&common->rx_lock);
                                        return;
                                }
                                break;
@@ -319,7 +319,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
                        }
                        isr_status ^= BIT(isr_type - 1);
                } while (isr_status);
-               mutex_unlock(&common->tx_rxlock);
+               mutex_unlock(&common->rx_lock);
        } while (1);
 }
 
index d3e0a07604a617cdcf8c9fc1ac61b902a9a1afcf..465692b3c3514e022379654e74032b344c18c49c 100644 (file)
@@ -37,14 +37,14 @@ void rsi_usb_rx_thread(struct rsi_common *common)
                if (atomic_read(&dev->rx_thread.thread_done))
                        goto out;
 
-               mutex_lock(&common->tx_rxlock);
+               mutex_lock(&common->rx_lock);
                status = rsi_read_pkt(common, 0);
                if (status) {
                        rsi_dbg(ERR_ZONE, "%s: Failed To read data", __func__);
-                       mutex_unlock(&common->tx_rxlock);
+                       mutex_unlock(&common->rx_lock);
                        return;
                }
-               mutex_unlock(&common->tx_rxlock);
+               mutex_unlock(&common->rx_lock);
                rsi_reset_event(&dev->rx_thread.event);
                if (adapter->rx_urb_submit(adapter)) {
                        rsi_dbg(ERR_ZONE,
index c2e1c1ce285ce57211c7f3f2511c8060b096e130..29bccb7079eca34c2ecb05f40a1dca195725b128 100644 (file)
@@ -181,6 +181,8 @@ struct rsi_common {
        struct mutex mutex;
        /* Mutex used between tx/rx threads */
        struct mutex tx_rxlock;
+       /* Mutex used for rx thread */
+       struct mutex rx_lock;
        u8 endpoint;
 
        /* Channel/band related */