usbnet: Set link down initially for drivers that update link state
Some usbnet drivers update link state while others do not due to hardware limitations. Add a flag to distinguish those that do, and set the link down initially for their devices. This is intended to fix this bug: http://bugs.debian.org/444043 Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								8cbd9623da
							
						
					
				
			
			
				commit
				
					
						37e8273cd3
					
				
			
		
					 5 changed files with 12 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -1327,7 +1327,7 @@ static const struct driver_info ax8817x_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88172_link_reset,
 | 
			
		||||
	.reset = ax88172_link_reset,
 | 
			
		||||
	.flags =  FLAG_ETHER,
 | 
			
		||||
	.flags =  FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	.data = 0x00130103,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1337,7 +1337,7 @@ static const struct driver_info dlink_dub_e100_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88172_link_reset,
 | 
			
		||||
	.reset = ax88172_link_reset,
 | 
			
		||||
	.flags =  FLAG_ETHER,
 | 
			
		||||
	.flags =  FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	.data = 0x009f9d9f,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1347,7 +1347,7 @@ static const struct driver_info netgear_fa120_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88172_link_reset,
 | 
			
		||||
	.reset = ax88172_link_reset,
 | 
			
		||||
	.flags =  FLAG_ETHER,
 | 
			
		||||
	.flags =  FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	.data = 0x00130103,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1357,7 +1357,7 @@ static const struct driver_info hawking_uf200_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88172_link_reset,
 | 
			
		||||
	.reset = ax88172_link_reset,
 | 
			
		||||
	.flags =  FLAG_ETHER,
 | 
			
		||||
	.flags =  FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	.data = 0x001f1d1f,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1367,7 +1367,7 @@ static const struct driver_info ax88772_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88772_link_reset,
 | 
			
		||||
	.reset = ax88772_link_reset,
 | 
			
		||||
	.flags = FLAG_ETHER | FLAG_FRAMING_AX,
 | 
			
		||||
	.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,
 | 
			
		||||
	.rx_fixup = asix_rx_fixup,
 | 
			
		||||
	.tx_fixup = asix_tx_fixup,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -1378,7 +1378,7 @@ static const struct driver_info ax88178_info = {
 | 
			
		|||
	.status = asix_status,
 | 
			
		||||
	.link_reset = ax88178_link_reset,
 | 
			
		||||
	.reset = ax88178_link_reset,
 | 
			
		||||
	.flags = FLAG_ETHER | FLAG_FRAMING_AX,
 | 
			
		||||
	.flags = FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR,
 | 
			
		||||
	.rx_fixup = asix_rx_fixup,
 | 
			
		||||
	.tx_fixup = asix_tx_fixup,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -413,7 +413,7 @@ static int cdc_bind(struct usbnet *dev, struct usb_interface *intf)
 | 
			
		|||
 | 
			
		||||
static const struct driver_info	cdc_info = {
 | 
			
		||||
	.description =	"CDC Ethernet Device",
 | 
			
		||||
	.flags =	FLAG_ETHER,
 | 
			
		||||
	.flags =	FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	// .check_connect = cdc_check_connect,
 | 
			
		||||
	.bind =		cdc_bind,
 | 
			
		||||
	.unbind =	usbnet_cdc_unbind,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -611,7 +611,7 @@ static int dm9601_link_reset(struct usbnet *dev)
 | 
			
		|||
 | 
			
		||||
static const struct driver_info dm9601_info = {
 | 
			
		||||
	.description	= "Davicom DM9601 USB Ethernet",
 | 
			
		||||
	.flags		= FLAG_ETHER,
 | 
			
		||||
	.flags		= FLAG_ETHER | FLAG_LINK_INTR,
 | 
			
		||||
	.bind		= dm9601_bind,
 | 
			
		||||
	.rx_fixup	= dm9601_rx_fixup,
 | 
			
		||||
	.tx_fixup	= dm9601_tx_fixup,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1352,9 +1352,11 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 | 
			
		|||
	// ok, it's ready to go.
 | 
			
		||||
	usb_set_intfdata (udev, dev);
 | 
			
		||||
 | 
			
		||||
	// start as if the link is up
 | 
			
		||||
	netif_device_attach (net);
 | 
			
		||||
 | 
			
		||||
	if (dev->driver_info->flags & FLAG_LINK_INTR)
 | 
			
		||||
		netif_carrier_off(net);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
out3:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,6 +92,7 @@ struct driver_info {
 | 
			
		|||
#define FLAG_SEND_ZLP	0x0200		/* hw requires ZLPs are sent */
 | 
			
		||||
#define FLAG_WWAN	0x0400		/* use "wwan%d" names */
 | 
			
		||||
 | 
			
		||||
#define FLAG_LINK_INTR	0x0800		/* updates link (carrier) status */
 | 
			
		||||
 | 
			
		||||
	/* init device ... can sleep, or cause probe() failure */
 | 
			
		||||
	int	(*bind)(struct usbnet *, struct usb_interface *);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue