mirror of https://gitee.com/openkylin/linux.git
mwifiex: fix race condition causing tx timeout
It's been observed that in a corner case mwifiex_usb_tx_complete() gets called before we exit from mwifiex_usb_host_to_card() after submitting the urb. 'data_sent' flag remains set in this case. It blocks further Tx packets and triggers watchdog timeout. The problem is fixed by setting data_sent and port_block flag at correct place. Signed-off-by: Cathy Luo <cluo@marvell.com> Signed-off-by: Shengzhen Li <szli@marvell.com> Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
1afac196c1
commit
5476f8030d
|
@ -897,6 +897,13 @@ static int mwifiex_usb_host_to_card(struct mwifiex_adapter *adapter, u8 ep,
|
|||
else
|
||||
atomic_inc(&port->tx_data_urb_pending);
|
||||
|
||||
if (ep != card->tx_cmd_ep &&
|
||||
atomic_read(&port->tx_data_urb_pending) ==
|
||||
MWIFIEX_TX_DATA_URB) {
|
||||
port->block_status = true;
|
||||
adapter->data_sent = mwifiex_usb_data_sent(adapter);
|
||||
}
|
||||
|
||||
if (usb_submit_urb(tx_urb, GFP_ATOMIC)) {
|
||||
mwifiex_dbg(adapter, ERROR,
|
||||
"%s: usb_submit_urb failed\n", __func__);
|
||||
|
@ -905,6 +912,7 @@ static int mwifiex_usb_host_to_card(struct mwifiex_adapter *adapter, u8 ep,
|
|||
} else {
|
||||
atomic_dec(&port->tx_data_urb_pending);
|
||||
port->block_status = false;
|
||||
adapter->data_sent = false;
|
||||
if (port->tx_data_ix)
|
||||
port->tx_data_ix--;
|
||||
else
|
||||
|
@ -916,9 +924,7 @@ static int mwifiex_usb_host_to_card(struct mwifiex_adapter *adapter, u8 ep,
|
|||
if (ep != card->tx_cmd_ep &&
|
||||
atomic_read(&port->tx_data_urb_pending) ==
|
||||
MWIFIEX_TX_DATA_URB) {
|
||||
port->block_status = true;
|
||||
ret = -ENOSR;
|
||||
goto done;
|
||||
return -ENOSR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue