diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 14 | 
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 72514c46b478..dde05e2fdc3e 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -100,6 +100,11 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf)  			int				intr = 0;  			e = alt->endpoint + ep; + +			/* ignore endpoints which cannot transfer data */ +			if (!usb_endpoint_maxp(&e->desc)) +				continue; +  			switch (e->desc.bmAttributes) {  			case USB_ENDPOINT_XFER_INT:  				if (!usb_endpoint_dir_in(&e->desc)) @@ -339,6 +344,8 @@ void usbnet_update_max_qlen(struct usbnet *dev)  {  	enum usb_device_speed speed = dev->udev->speed; +	if (!dev->rx_urb_size || !dev->hard_mtu) +		goto insanity;  	switch (speed) {  	case USB_SPEED_HIGH:  		dev->rx_qlen = MAX_QUEUE_MEMORY / dev->rx_urb_size; @@ -355,6 +362,7 @@ void usbnet_update_max_qlen(struct usbnet *dev)  		dev->tx_qlen = 5 * MAX_QUEUE_MEMORY / dev->hard_mtu;  		break;  	default: +insanity:  		dev->rx_qlen = dev->tx_qlen = 4;  	}  } @@ -1324,11 +1332,11 @@ static int build_dma_sg(const struct sk_buff *skb, struct urb *urb)  	total_len += skb_headlen(skb);  	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -		struct skb_frag_struct *f = &skb_shinfo(skb)->frags[i]; +		skb_frag_t *f = &skb_shinfo(skb)->frags[i];  		total_len += skb_frag_size(f); -		sg_set_page(&urb->sg[i + s], f->page.p, f->size, -				f->page_offset); +		sg_set_page(&urb->sg[i + s], skb_frag_page(f), skb_frag_size(f), +			    skb_frag_off(f));  	}  	urb->transfer_buffer_length = total_len;  |