From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from kroah.org ([198.145.64.141]:50664 "EHLO coco.kroah.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755943AbZAWBPF (ORCPT ); Thu, 22 Jan 2009 20:15:05 -0500 Date: Thu, 22 Jan 2009 17:12:26 -0800 From: Greg KH To: linux-kernel@vger.kernel.org, stable@kernel.org Cc: Justin Forbes , Zwane Mwaikambo , Theodore Ts'o , Randy Dunlap , Dave Jones , Chuck Wolber , Chris Wedgwood , Michael Krufky , Chuck Ebbert , Domenico Andreoli , Willy Tarreau , Rodrigo Rubira Branco , Jake Edge , Eugene Teo , torvalds@linux-foundation.org, akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk, Larry Finger , Linux wireless , Christian Lamparter Subject: [patch 27/46] p54usb: fix traffic stalls / packet drop Message-ID: <20090123011226.GB19756@kroah.com> (sfid-20090123_021518_586339_072237AE) References: <20090123010651.683741823@mini.kroah.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20090123011110.GA19756@kroah.com> Sender: linux-wireless-owner@vger.kernel.org List-ID: 2.6.28-stable review patch. If anyone has any objections, please let us know. ------------------ From: Christian Lamparter 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 Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/p54/p54usb.c | 5 +++++ 1 file changed, 5 insertions(+) --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c @@ -215,6 +215,8 @@ static void p54u_tx_3887(struct ieee8021 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 ieee8021 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 ieee8 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); }