diff mbox

[1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c

Message ID 1270599787.8900.8.camel@Linuxdev4-laptop
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Elina Pasheva April 7, 2010, 12:23 a.m. UTC
Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
From: Elina Pasheva <epasheva@sierrawireless.com>
This patch adds setting of the urb transfer flag URB_ZERO_PACKET  before
submitting an urb for drivers that have requested it (by advertising flag
FLAG_SEND_ZLP).
The modification is in usbnet.c function usbnet_start_xmit().
This patch only adds the zero length flag.
A subsequent patch will address the buggy code we found when devices do not
advertise FLAG_SEND_ZLP in which case there is a possibility of transferring
packets with non-deterministic length.

This patch has been tested on kernel-2.6.34-rc3.
This patch has been checked against net-2.6 tree.
Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
Signed-off-by: Rory Filer <rfiler@sierrawireless.com>
---

 drivers/net/usb/usbnet.c |   15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)




--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

David Miller April 7, 2010, 2:50 a.m. UTC | #1
From: Elina Pasheva <epasheva@sierrawireless.com>
Date: Tue, 6 Apr 2010 17:23:07 -0700

> Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
> From: Elina Pasheva <epasheva@sierrawireless.com>
> This patch adds setting of the urb transfer flag URB_ZERO_PACKET  before
> submitting an urb for drivers that have requested it (by advertising flag
> FLAG_SEND_ZLP).
> The modification is in usbnet.c function usbnet_start_xmit().
> This patch only adds the zero length flag.
> A subsequent patch will address the buggy code we found when devices do not
> advertise FLAG_SEND_ZLP in which case there is a possibility of transferring
> packets with non-deterministic length.
> 
> This patch has been tested on kernel-2.6.34-rc3.
> This patch has been checked against net-2.6 tree.
> Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
> Signed-off-by: Rory Filer <rfiler@sierrawireless.com>

Applied to net-next-2.6, thanks.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Maulik April 7, 2010, 5:46 a.m. UTC | #2
> -----Original Message-----
> From: linux-usb-owner@vger.kernel.org [mailto:linux-usb-
> owner@vger.kernel.org] On Behalf Of Elina Pasheva
> Sent: Wednesday, April 07, 2010 5:53 AM
> To: dbrownell@users.sourceforge.net
> Cc: epasheva@sierrawireless.com; rfiler@sierrawireless.com;
> netdev@vger.kernel.org; linux-usb@vger.kernel.org
> Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
> 
> Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
> From: Elina Pasheva <epasheva@sierrawireless.com>
> This patch adds setting of the urb transfer flag URB_ZERO_PACKET  before
> submitting an urb for drivers that have requested it (by advertising flag
> FLAG_SEND_ZLP).
> The modification is in usbnet.c function usbnet_start_xmit().
> This patch only adds the zero length flag.
> A subsequent patch will address the buggy code we found when devices do
> not
> advertise FLAG_SEND_ZLP in which case there is a possibility of
> transferring
> packets with non-deterministic length.
> 
> This patch has been tested on kernel-2.6.34-rc3.
> This patch has been checked against net-2.6 tree.
> Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
> Signed-off-by: Rory Filer <rfiler@sierrawireless.com>
> ---
> 
>  drivers/net/usb/usbnet.c |   15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> --- a/drivers/net/usb/usbnet.c	2010-04-06 10:52:54.000000000 -0700
> +++ b/drivers/net/usb/usbnet.c	2010-04-06 16:54:44.000000000 -0700
> @@ -1068,12 +1068,15 @@ netdev_tx_t usbnet_start_xmit (struct sk
>  	 * NOTE:  strictly conforming cdc-ether devices should expect
>  	 * the ZLP here, but ignore the one-byte packet.
>  	 */
> -	if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) ==
> 0) {
> -		urb->transfer_buffer_length++;
> -		if (skb_tailroom(skb)) {
> -			skb->data[skb->len] = 0;
> -			__skb_put(skb, 1);
> -		}
> +	if (length % dev->maxpacket == 0) {
> +		if (!(info->flags & FLAG_SEND_ZLP)) {
> +			urb->transfer_buffer_length++;
> +			if (skb_tailroom(skb)) {
> +				skb->data[skb->len] = 0;
> +				__skb_put(skb, 1);
> +			}
> +		} else
> +			urb->transfer_flags |= URB_ZERO_PACKET;

You should place braces for the else case as well. See
Documentation/CodingStyle.

It states to use braces in both the branches since the if() case 
contains multiple statements. 

Maulik

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Elina Pasheva April 7, 2010, 9:13 p.m. UTC | #3
On Tue, 2010-04-06 at 22:46 -0700, Maulik wrote:
> 
> > -----Original Message-----
> > From: linux-usb-owner@vger.kernel.org [mailto:linux-usb-
> > owner@vger.kernel.org] On Behalf Of Elina Pasheva
> > Sent: Wednesday, April 07, 2010 5:53 AM
> > To: dbrownell@users.sourceforge.net
> > Cc: epasheva@sierrawireless.com; rfiler@sierrawireless.com;
> > netdev@vger.kernel.org; linux-usb@vger.kernel.org
> > Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
> > 
> > Subject: [PATCH 1/1] NET: usb: Adding URB_ZERO_PACKET flag to usbnet.c
> > From: Elina Pasheva <epasheva@sierrawireless.com>
> > This patch adds setting of the urb transfer flag URB_ZERO_PACKET  before
> > submitting an urb for drivers that have requested it (by advertising flag
> > FLAG_SEND_ZLP).
> > The modification is in usbnet.c function usbnet_start_xmit().
> > This patch only adds the zero length flag.
> > A subsequent patch will address the buggy code we found when devices do
> > not
> > advertise FLAG_SEND_ZLP in which case there is a possibility of
> > transferring
> > packets with non-deterministic length.
> > 
> > This patch has been tested on kernel-2.6.34-rc3.
> > This patch has been checked against net-2.6 tree.
> > Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
> > Signed-off-by: Rory Filer <rfiler@sierrawireless.com>
> > ---
> > 
> >  drivers/net/usb/usbnet.c |   15 +++++++++------
> >  1 file changed, 9 insertions(+), 6 deletions(-)
> > 
> > --- a/drivers/net/usb/usbnet.c	2010-04-06 10:52:54.000000000 -0700
> > +++ b/drivers/net/usb/usbnet.c	2010-04-06 16:54:44.000000000 -0700
> > @@ -1068,12 +1068,15 @@ netdev_tx_t usbnet_start_xmit (struct sk
> >  	 * NOTE:  strictly conforming cdc-ether devices should expect
> >  	 * the ZLP here, but ignore the one-byte packet.
> >  	 */
> > -	if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) ==
> > 0) {
> > -		urb->transfer_buffer_length++;
> > -		if (skb_tailroom(skb)) {
> > -			skb->data[skb->len] = 0;
> > -			__skb_put(skb, 1);
> > -		}
> > +	if (length % dev->maxpacket == 0) {
> > +		if (!(info->flags & FLAG_SEND_ZLP)) {
> > +			urb->transfer_buffer_length++;
> > +			if (skb_tailroom(skb)) {
> > +				skb->data[skb->len] = 0;
> > +				__skb_put(skb, 1);
> > +			}
> > +		} else
> > +			urb->transfer_flags |= URB_ZERO_PACKET;
> 
> You should place braces for the else case as well. See
> Documentation/CodingStyle.
> 
> It states to use braces in both the branches since the if() case 
> contains multiple statements. 
> 
> Maulik

Thanks for your review.
The patch has been applied. 
We'll look at it next time.

Elina

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Brownell April 7, 2010, 9:14 p.m. UTC | #4
On Tuesday 06 April 2010, you wrote:
Recall that the reason to avoid sending zero length packts
(ZLPs) is that many systems don't cope well with them...

The ""don't cope well" can be at the hardware level,
or drivers not limited to device firmware.  I've seen
the failures be very context-dependent .... as in, one
standalone ZLP might work, but mix it in with back-to-back
delivery of other packets and trouble ensues...
  
In short, it's hard to know which combinations of
hardware an firmware would need it .... versus which
ones it would break.

... and thus risky to try sending ZLPs through systems
shere for many years) we've carefully avoided doing that.


- Dave
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Elina Pasheva April 7, 2010, 11:07 p.m. UTC | #5
On Wed, 2010-04-07 at 14:14 -0700, David Brownell wrote:
> On Tuesday 06 April 2010, you wrote:
> Recall that the reason to avoid sending zero length packts
> (ZLPs) is that many systems don't cope well with them...
> 
> The ""don't cope well" can be at the hardware level,
> or drivers not limited to device firmware.  I've seen
> the failures be very context-dependent .... as in, one
> standalone ZLP might work, but mix it in with back-to-back
> delivery of other packets and trouble ensues...
>   
> In short, it's hard to know which combinations of
> hardware an firmware would need it .... versus which
> ones it would break.
> 
> ... and thus risky to try sending ZLPs through systems
> shere for many years) we've carefully avoided doing that.
> 
> 
> - Dave
> 
Hi Dave, 
Nice to hear your opinion on this matter. Are you recommending our patch
be retracted? If so, we can look at other ways to fix the problem when a
zero length packet is missing. 

Regards, 
Elina


 

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

--- a/drivers/net/usb/usbnet.c	2010-04-06 10:52:54.000000000 -0700
+++ b/drivers/net/usb/usbnet.c	2010-04-06 16:54:44.000000000 -0700
@@ -1068,12 +1068,15 @@  netdev_tx_t usbnet_start_xmit (struct sk
 	 * NOTE:  strictly conforming cdc-ether devices should expect
 	 * the ZLP here, but ignore the one-byte packet.
 	 */
-	if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) == 0) {
-		urb->transfer_buffer_length++;
-		if (skb_tailroom(skb)) {
-			skb->data[skb->len] = 0;
-			__skb_put(skb, 1);
-		}
+	if (length % dev->maxpacket == 0) {
+		if (!(info->flags & FLAG_SEND_ZLP)) {
+			urb->transfer_buffer_length++;
+			if (skb_tailroom(skb)) {
+				skb->data[skb->len] = 0;
+				__skb_put(skb, 1);
+			}
+		} else
+			urb->transfer_flags |= URB_ZERO_PACKET;
 	}
 
 	spin_lock_irqsave(&dev->txq.lock, flags);