]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
p54usb: fix traffic stalls / packet drop
authorChristian Lamparter <chunkeey@web.de>
Tue, 20 Jan 2009 22:11:11 +0000 (23:11 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 25 Jan 2009 00:41:44 +0000 (16:41 -0800)
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>
drivers/net/wireless/p54/p54usb.c

index c0248e4c21ba24179ac12c4f101d6ec001cec8d8..8a2e32d087a5c8949238a8ff0069fa132be62579 100644 (file)
@@ -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);
 }