@@ -1050,6 +1050,14 @@ static const struct net_device_ops smsc95xx_netdev_ops = {
1050
1050
.ndo_set_features = smsc95xx_set_features ,
1051
1051
};
1052
1052
1053
+ static void smsc95xx_handle_link_change (struct net_device * net )
1054
+ {
1055
+ struct usbnet * dev = netdev_priv (net );
1056
+
1057
+ phy_print_status (net -> phydev );
1058
+ usbnet_defer_kevent (dev , EVENT_LINK_CHANGE );
1059
+ }
1060
+
1053
1061
static int smsc95xx_bind (struct usbnet * dev , struct usb_interface * intf )
1054
1062
{
1055
1063
struct smsc95xx_priv * pdata ;
@@ -1154,6 +1162,17 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
1154
1162
dev -> net -> min_mtu = ETH_MIN_MTU ;
1155
1163
dev -> net -> max_mtu = ETH_DATA_LEN ;
1156
1164
dev -> hard_mtu = dev -> net -> mtu + dev -> net -> hard_header_len ;
1165
+
1166
+ ret = phy_connect_direct (dev -> net , pdata -> phydev ,
1167
+ & smsc95xx_handle_link_change ,
1168
+ PHY_INTERFACE_MODE_MII );
1169
+ if (ret ) {
1170
+ netdev_err (dev -> net , "can't attach PHY to %s\n" , pdata -> mdiobus -> id );
1171
+ goto unregister_mdio ;
1172
+ }
1173
+
1174
+ phy_attached_info (dev -> net -> phydev );
1175
+
1157
1176
return 0 ;
1158
1177
1159
1178
unregister_mdio :
@@ -1171,47 +1190,25 @@ static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf)
1171
1190
{
1172
1191
struct smsc95xx_priv * pdata = dev -> driver_priv ;
1173
1192
1193
+ phy_disconnect (dev -> net -> phydev );
1174
1194
mdiobus_unregister (pdata -> mdiobus );
1175
1195
mdiobus_free (pdata -> mdiobus );
1176
1196
netif_dbg (dev , ifdown , dev -> net , "free pdata\n" );
1177
1197
kfree (pdata );
1178
1198
}
1179
1199
1180
- static void smsc95xx_handle_link_change (struct net_device * net )
1181
- {
1182
- struct usbnet * dev = netdev_priv (net );
1183
-
1184
- phy_print_status (net -> phydev );
1185
- usbnet_defer_kevent (dev , EVENT_LINK_CHANGE );
1186
- }
1187
-
1188
1200
static int smsc95xx_start_phy (struct usbnet * dev )
1189
1201
{
1190
- struct smsc95xx_priv * pdata = dev -> driver_priv ;
1191
- struct net_device * net = dev -> net ;
1192
- int ret ;
1202
+ phy_start (dev -> net -> phydev );
1193
1203
1194
- ret = smsc95xx_reset (dev );
1195
- if (ret < 0 )
1196
- return ret ;
1197
-
1198
- ret = phy_connect_direct (net , pdata -> phydev ,
1199
- & smsc95xx_handle_link_change ,
1200
- PHY_INTERFACE_MODE_MII );
1201
- if (ret ) {
1202
- netdev_err (net , "can't attach PHY to %s\n" , pdata -> mdiobus -> id );
1203
- return ret ;
1204
- }
1205
-
1206
- phy_attached_info (net -> phydev );
1207
- phy_start (net -> phydev );
1208
1204
return 0 ;
1209
1205
}
1210
1206
1211
- static int smsc95xx_disconnect_phy (struct usbnet * dev )
1207
+ static int smsc95xx_stop (struct usbnet * dev )
1212
1208
{
1213
- phy_stop (dev -> net -> phydev );
1214
- phy_disconnect (dev -> net -> phydev );
1209
+ if (dev -> net -> phydev )
1210
+ phy_stop (dev -> net -> phydev );
1211
+
1215
1212
return 0 ;
1216
1213
}
1217
1214
@@ -1966,7 +1963,7 @@ static const struct driver_info smsc95xx_info = {
1966
1963
.unbind = smsc95xx_unbind ,
1967
1964
.link_reset = smsc95xx_link_reset ,
1968
1965
.reset = smsc95xx_start_phy ,
1969
- .stop = smsc95xx_disconnect_phy ,
1966
+ .stop = smsc95xx_stop ,
1970
1967
.rx_fixup = smsc95xx_rx_fixup ,
1971
1968
.tx_fixup = smsc95xx_tx_fixup ,
1972
1969
.status = smsc95xx_status ,
0 commit comments