Skip to content

Commit f8c095f

Browse files
gbhat-marvellKalle Valo
authored andcommitted
mwifiex: handle race during mwifiex_usb_disconnect
Race condition is observed during rmmod of mwifiex_usb: 1. The rmmod thread will call mwifiex_usb_disconnect(), download SHUTDOWN command and do wait_event_interruptible_timeout(), waiting for response. 2. The main thread will handle the response and will do a wake_up_interruptible(), unblocking rmmod thread. 3. On getting unblocked, rmmod thread will make rx_cmd.urb = NULL in mwifiex_usb_free(). 4. The main thread will try to resubmit rx_cmd.urb in mwifiex_usb_submit_rx_urb(), which is NULL. To fix this, move mwifiex_usb_free() from mwifiex_usb_disconnect to mwifiex_unregister_dev(). Function mwifiex_unregister_dev() is called after flushing the command and RX work queues. Suggested-by: Brian Norris <[email protected]> Signed-off-by: Ganapathi Bhat <[email protected]> Reviewed-by: Brian Norris <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent 7e58e74 commit f8c095f

File tree

1 file changed

+2
-2
lines changed
  • drivers/net/wireless/marvell/mwifiex

1 file changed

+2
-2
lines changed

drivers/net/wireless/marvell/mwifiex/usb.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,8 +644,6 @@ static void mwifiex_usb_disconnect(struct usb_interface *intf)
644644
MWIFIEX_FUNC_SHUTDOWN);
645645
}
646646

647-
mwifiex_usb_free(card);
648-
649647
mwifiex_dbg(adapter, FATAL,
650648
"%s: removing card\n", __func__);
651649
mwifiex_remove_card(adapter);
@@ -1353,6 +1351,8 @@ static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
13531351
{
13541352
struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
13551353

1354+
mwifiex_usb_free(card);
1355+
13561356
mwifiex_usb_cleanup_tx_aggr(adapter);
13571357

13581358
card->adapter = NULL;

0 commit comments

Comments
 (0)