From 7bb073cf51aba5851c1b9723e62675bec4481d14 Mon Sep 17 00:00:00 2001 From: weongyo Date: Wed, 14 Oct 2009 20:09:09 +0000 Subject: [PATCH] fixes a TX hang bug that it could happen when if_start callback didn't be restarted by full of the output queue. MFC after: 3 days Tested by: bsduser --- sys/dev/usb/wlan/if_rum.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/sys/dev/usb/wlan/if_rum.c b/sys/dev/usb/wlan/if_rum.c index 7abd10473f5..e7c387c5fa7 100644 --- a/sys/dev/usb/wlan/if_rum.c +++ b/sys/dev/usb/wlan/if_rum.c @@ -826,6 +826,9 @@ rum_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) usbd_transfer_submit(xfer); } + RUM_UNLOCK(sc); + rum_start(ifp); + RUM_LOCK(sc); break; default: /* Error */ @@ -930,8 +933,8 @@ rum_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) * the private mutex of a device! That is why we do the * "ieee80211_input" here, and not some lines up! */ + RUM_UNLOCK(sc); if (m) { - RUM_UNLOCK(sc); ni = ieee80211_find_rxnode(ic, mtod(m, struct ieee80211_frame_min *)); if (ni != NULL) { @@ -941,8 +944,11 @@ rum_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) } else (void) ieee80211_input_all(ic, m, rssi, RT2573_NOISE_FLOOR); - RUM_LOCK(sc); } + if ((ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0 && + !IFQ_IS_EMPTY(&ifp->if_snd)) + rum_start(ifp); + RUM_LOCK(sc); return; default: /* Error */ -- 2.45.2