From: Cathy Luo <c...@marvell.com>

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 <c...@marvell.com>
Signed-off-by: Shengzhen Li <s...@marvell.com>
Signed-off-by: Amitkumar Karwar <akar...@marvell.com>
---
 drivers/net/wireless/marvell/mwifiex/usb.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c 
b/drivers/net/wireless/marvell/mwifiex/usb.c
index e8283dc..8fd51e4 100644
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
@@ -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;
                }
        }
 
-- 
1.9.1

Reply via email to