diff options
author | Christian Lamparter <chunkeey@web.de> | 2009-01-20 23:11:11 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-24 16:41:44 -0800 |
commit | 8f164d1c939180766da970c95f13c9cff11ab3a7 (patch) | |
tree | 099cf1f46d58a243dc14fd2bbe6dd59e33629e19 /drivers/net | |
parent | 73cb49b8860d9336ee4b24ecbc0d2358aff862f7 (diff) |
p54usb: fix traffic stalls / packet drop
commit 00627f229c9807e4cb825a7ce36b886e2adf2229 upstream.
All p54usb devices need a explicit termination packet, in oder to finish the pending transfer properly.
Else, the firmware could freeze, or simply drop the frame.
Signed-off-by: Christian Lamparter <chunkeey@web.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/p54/p54usb.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index c0248e4c21b..8a2e32d087a 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c @@ -215,6 +215,8 @@ static void p54u_tx_3887(struct ieee80211_hw *dev, struct p54_control_hdr *data, usb_fill_bulk_urb(data_urb, priv->udev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), data, len, free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + addr_urb->transfer_flags |= URB_ZERO_PACKET; + data_urb->transfer_flags |= URB_ZERO_PACKET; usb_submit_urb(addr_urb, GFP_ATOMIC); usb_submit_urb(data_urb, GFP_ATOMIC); @@ -252,6 +254,7 @@ static void p54u_tx_lm87(struct ieee80211_hw *dev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), hdr, len + sizeof(*hdr), free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + data_urb->transfer_flags |= URB_ZERO_PACKET; usb_submit_urb(data_urb, GFP_ATOMIC); } @@ -294,11 +297,13 @@ static void p54u_tx_net2280(struct ieee80211_hw *dev, struct p54_control_hdr *da usb_fill_bulk_urb(int_urb, priv->udev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DEV), reg, sizeof(*reg), p54u_tx_free_cb, dev); + int_urb->transfer_flags |= URB_ZERO_PACKET; usb_submit_urb(int_urb, GFP_ATOMIC); usb_fill_bulk_urb(data_urb, priv->udev, usb_sndbulkpipe(priv->udev, P54U_PIPE_DATA), hdr, len + sizeof(*hdr), free_on_tx ? p54u_tx_free_cb : p54u_tx_cb, dev); + data_urb->transfer_flags |= URB_ZERO_PACKET; usb_submit_urb(data_urb, GFP_ATOMIC); } |