rsi: use separate mutex lock for receive thread
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>
This commit is contained in:
parent
ebf084ea0e
commit
6c409cad3d
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue