diff options
Diffstat (limited to 'drivers/net/usb/usbnet.c')
| -rw-r--r-- | drivers/net/usb/usbnet.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 840c1c2ab16a..9a6450f796dc 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -165,12 +165,13 @@ EXPORT_SYMBOL_GPL(usbnet_get_endpoints);  int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress)  { +	u8		addr[ETH_ALEN];  	int 		tmp = -1, ret;  	unsigned char	buf [13];  	ret = usb_string(dev->udev, iMACAddress, buf, sizeof buf);  	if (ret == 12) -		tmp = hex2bin(dev->net->dev_addr, buf, 6); +		tmp = hex2bin(addr, buf, 6);  	if (tmp < 0) {  		dev_dbg(&dev->udev->dev,  			"bad MAC string %d fetch, %d\n", iMACAddress, tmp); @@ -178,6 +179,7 @@ int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress)  			ret = -EINVAL;  		return ret;  	} +	eth_hw_addr_set(dev->net, addr);  	return 0;  }  EXPORT_SYMBOL_GPL(usbnet_get_ethernet_addr); @@ -1726,7 +1728,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	dev->net = net;  	strscpy(net->name, "usb%d", sizeof(net->name)); -	memcpy (net->dev_addr, node_id, sizeof node_id); +	eth_hw_addr_set(net, node_id);  	/* rx and tx sides can use different message sizes;  	 * bind() should set rx_urb_size in that case. @@ -1788,6 +1790,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)  	if (!dev->rx_urb_size)  		dev->rx_urb_size = dev->hard_mtu;  	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); +	if (dev->maxpacket == 0) { +		/* that is a broken device */ +		status = -ENODEV; +		goto out4; +	}  	/* let userspace know we have a random address */  	if (ether_addr_equal(net->dev_addr, node_id)) |