diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 25 | 
1 files changed, 10 insertions, 15 deletions
| diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 4671da755e7b..dd10d5817d2a 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -542,17 +542,19 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb)  	}  	// else network stack removes extra byte if we forced a short packet -	if (skb->len) { -		/* all data was already cloned from skb inside the driver */ -		if (dev->driver_info->flags & FLAG_MULTI_PACKET) -			dev_kfree_skb_any(skb); -		else -			usbnet_skb_return(dev, skb); +	/* all data was already cloned from skb inside the driver */ +	if (dev->driver_info->flags & FLAG_MULTI_PACKET) +		goto done; + +	if (skb->len < ETH_HLEN) { +		dev->net->stats.rx_errors++; +		dev->net->stats.rx_length_errors++; +		netif_dbg(dev, rx_err, dev->net, "rx length %d\n", skb->len); +	} else { +		usbnet_skb_return(dev, skb);  		return;  	} -	netif_dbg(dev, rx_err, dev->net, "drop\n"); -	dev->net->stats.rx_errors++;  done:  	skb_queue_tail(&dev->done, skb);  } @@ -574,13 +576,6 @@ static void rx_complete (struct urb *urb)  	switch (urb_status) {  	/* success */  	case 0: -		if (skb->len < dev->net->hard_header_len) { -			state = rx_cleanup; -			dev->net->stats.rx_errors++; -			dev->net->stats.rx_length_errors++; -			netif_dbg(dev, rx_err, dev->net, -				  "rx length %d\n", skb->len); -		}  		break;  	/* stalls need manual reset. this is rare ... except that |