summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Lamparter <chunkeey@web.de>2009-01-20 23:11:11 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-24 16:41:44 -0800
commit8f164d1c939180766da970c95f13c9cff11ab3a7 (patch)
tree099cf1f46d58a243dc14fd2bbe6dd59e33629e19
parent73cb49b8860d9336ee4b24ecbc0d2358aff862f7 (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>
-rw-r--r--drivers/net/wireless/p54/p54usb.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
index c0248e4c21ba..8a2e32d087a5 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);
}