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