@@ -1146,6 +1146,60 @@ static const struct net_device_ops ftgmac100_netdev_ops = {
11461146 .ndo_do_ioctl = ftgmac100_do_ioctl ,
11471147};
11481148
1149+ static int ftgmac100_setup_mdio (struct net_device * netdev )
1150+ {
1151+ struct ftgmac100 * priv = netdev_priv (netdev );
1152+ struct platform_device * pdev = to_platform_device (priv -> dev );
1153+ int i , err = 0 ;
1154+
1155+ /* initialize mdio bus */
1156+ priv -> mii_bus = mdiobus_alloc ();
1157+ if (!priv -> mii_bus )
1158+ return - EIO ;
1159+
1160+ priv -> mii_bus -> name = "ftgmac100_mdio" ;
1161+ snprintf (priv -> mii_bus -> id , MII_BUS_ID_SIZE , "%s-%d" ,
1162+ pdev -> name , pdev -> id );
1163+ priv -> mii_bus -> priv = priv -> netdev ;
1164+ priv -> mii_bus -> read = ftgmac100_mdiobus_read ;
1165+ priv -> mii_bus -> write = ftgmac100_mdiobus_write ;
1166+
1167+ for (i = 0 ; i < PHY_MAX_ADDR ; i ++ )
1168+ priv -> mii_bus -> irq [i ] = PHY_POLL ;
1169+
1170+ err = mdiobus_register (priv -> mii_bus );
1171+ if (err ) {
1172+ dev_err (priv -> dev , "Cannot register MDIO bus!\n" );
1173+ goto err_register_mdiobus ;
1174+ }
1175+
1176+ err = ftgmac100_mii_probe (priv );
1177+ if (err ) {
1178+ dev_err (priv -> dev , "MII Probe failed!\n" );
1179+ goto err_mii_probe ;
1180+ }
1181+
1182+ return 0 ;
1183+
1184+ err_mii_probe :
1185+ mdiobus_unregister (priv -> mii_bus );
1186+ err_register_mdiobus :
1187+ mdiobus_free (priv -> mii_bus );
1188+ return err ;
1189+ }
1190+
1191+ static void ftgmac100_destroy_mdio (struct net_device * netdev )
1192+ {
1193+ struct ftgmac100 * priv = netdev_priv (netdev );
1194+
1195+ if (!netdev -> phydev )
1196+ return ;
1197+
1198+ phy_disconnect (netdev -> phydev );
1199+ mdiobus_unregister (priv -> mii_bus );
1200+ mdiobus_free (priv -> mii_bus );
1201+ }
1202+
11491203/******************************************************************************
11501204 * struct platform_driver functions
11511205 *****************************************************************************/
@@ -1211,31 +1265,9 @@ static int ftgmac100_probe(struct platform_device *pdev)
12111265
12121266 priv -> irq = irq ;
12131267
1214- /* initialize mdio bus */
1215- priv -> mii_bus = mdiobus_alloc ();
1216- if (!priv -> mii_bus ) {
1217- err = - EIO ;
1218- goto err_alloc_mdiobus ;
1219- }
1220-
1221- priv -> mii_bus -> name = "ftgmac100_mdio" ;
1222- snprintf (priv -> mii_bus -> id , MII_BUS_ID_SIZE , "ftgmac100_mii" );
1223-
1224- priv -> mii_bus -> priv = netdev ;
1225- priv -> mii_bus -> read = ftgmac100_mdiobus_read ;
1226- priv -> mii_bus -> write = ftgmac100_mdiobus_write ;
1227-
1228- err = mdiobus_register (priv -> mii_bus );
1229- if (err ) {
1230- dev_err (& pdev -> dev , "Cannot register MDIO bus!\n" );
1231- goto err_register_mdiobus ;
1232- }
1233-
1234- err = ftgmac100_mii_probe (priv );
1235- if (err ) {
1236- dev_err (& pdev -> dev , "MII Probe failed!\n" );
1237- goto err_mii_probe ;
1238- }
1268+ err = ftgmac100_setup_mdio (netdev );
1269+ if (err )
1270+ goto err_setup_mdio ;
12391271
12401272 /* register network device */
12411273 err = register_netdev (netdev );
@@ -1255,12 +1287,8 @@ static int ftgmac100_probe(struct platform_device *pdev)
12551287 return 0 ;
12561288
12571289err_register_netdev :
1258- phy_disconnect (netdev -> phydev );
1259- err_mii_probe :
1260- mdiobus_unregister (priv -> mii_bus );
1261- err_register_mdiobus :
1262- mdiobus_free (priv -> mii_bus );
1263- err_alloc_mdiobus :
1290+ ftgmac100_destroy_mdio (netdev );
1291+ err_setup_mdio :
12641292 iounmap (priv -> base );
12651293err_ioremap :
12661294 release_resource (priv -> res );
@@ -1280,10 +1308,7 @@ static int __exit ftgmac100_remove(struct platform_device *pdev)
12801308 priv = netdev_priv (netdev );
12811309
12821310 unregister_netdev (netdev );
1283-
1284- phy_disconnect (netdev -> phydev );
1285- mdiobus_unregister (priv -> mii_bus );
1286- mdiobus_free (priv -> mii_bus );
1311+ ftgmac100_destroy_mdio (netdev );
12871312
12881313 iounmap (priv -> base );
12891314 release_resource (priv -> res );
0 commit comments