usb: gadget: Fix g_ether interface link status
A "usb0" interface that has never been connected to a host has an unknown
operstate, and therefore the IFF_RUNNING flag is (incorrectly) asserted
when queried by ifconfig, ifplugd, etc.  This is a result of calling
netif_carrier_off() too early in the probe function; it should be called
after register_netdev().
Similar problems have been fixed in many other drivers, e.g.:
    e826eafa6 (bonding: Call netif_carrier_off after register_netdevice)
    0d672e9f8 (drivers/net: Call netif_carrier_off at the end of the probe)
    6a3c869a6 (cxgb4: fix reported state of interfaces without link)
Fix is to move netif_carrier_off() to the end of the function.
Cc: stable@vger.kernel.org
Signed-off-by: Kevin Cernekee <cernekee@gmail.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
	
	
This commit is contained in:
		
					parent
					
						
							
								a188b6897e
							
						
					
				
			
			
				commit
				
					
						31bde1ceaa
					
				
			
		
					 1 changed files with 6 additions and 6 deletions
				
			
		| 
						 | 
					@ -798,12 +798,6 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SET_ETHTOOL_OPS(net, &ops);
 | 
						SET_ETHTOOL_OPS(net, &ops);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* two kinds of host-initiated state changes:
 | 
					 | 
				
			||||||
	 *  - iff DATA transfer is active, carrier is "on"
 | 
					 | 
				
			||||||
	 *  - tx queueing enabled if open *and* carrier is "on"
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	netif_carrier_off(net);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dev->gadget = g;
 | 
						dev->gadget = g;
 | 
				
			||||||
	SET_NETDEV_DEV(net, &g->dev);
 | 
						SET_NETDEV_DEV(net, &g->dev);
 | 
				
			||||||
	SET_NETDEV_DEVTYPE(net, &gadget_type);
 | 
						SET_NETDEV_DEVTYPE(net, &gadget_type);
 | 
				
			||||||
| 
						 | 
					@ -817,6 +811,12 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
 | 
				
			||||||
		INFO(dev, "HOST MAC %pM\n", dev->host_mac);
 | 
							INFO(dev, "HOST MAC %pM\n", dev->host_mac);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		the_dev = dev;
 | 
							the_dev = dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* two kinds of host-initiated state changes:
 | 
				
			||||||
 | 
							 *  - iff DATA transfer is active, carrier is "on"
 | 
				
			||||||
 | 
							 *  - tx queueing enabled if open *and* carrier is "on"
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							netif_carrier_off(net);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return status;
 | 
						return status;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue