Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phylib: move to dynamic allocation of struct mii_bus

This patch introduces mdiobus_alloc() and mdiobus_free(), and
makes all mdio bus drivers use these functions to allocate their
struct mii_bus'es dynamically.

Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Andy Fleming <afleming@freescale.com>

authored by

Lennert Buytenhek and committed by
David S. Miller
298cf9be 18ee49dd

+285 -191
+27 -16
drivers/net/au1000_eth.c
··· 290 290 291 291 if(aup->mac_id == 0) { /* get PHY0 */ 292 292 # if defined(AU1XXX_PHY0_ADDR) 293 - phydev = au_macs[AU1XXX_PHY0_BUSID]->mii_bus.phy_map[AU1XXX_PHY0_ADDR]; 293 + phydev = au_macs[AU1XXX_PHY0_BUSID]->mii_bus->phy_map[AU1XXX_PHY0_ADDR]; 294 294 # else 295 295 printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n", 296 296 dev->name); ··· 298 298 # endif /* defined(AU1XXX_PHY0_ADDR) */ 299 299 } else if (aup->mac_id == 1) { /* get PHY1 */ 300 300 # if defined(AU1XXX_PHY1_ADDR) 301 - phydev = au_macs[AU1XXX_PHY1_BUSID]->mii_bus.phy_map[AU1XXX_PHY1_ADDR]; 301 + phydev = au_macs[AU1XXX_PHY1_BUSID]->mii_bus->phy_map[AU1XXX_PHY1_ADDR]; 302 302 # else 303 303 printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n", 304 304 dev->name); ··· 311 311 312 312 /* find the first (lowest address) PHY on the current MAC's MII bus */ 313 313 for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) 314 - if (aup->mii_bus.phy_map[phy_addr]) { 315 - phydev = aup->mii_bus.phy_map[phy_addr]; 314 + if (aup->mii_bus->phy_map[phy_addr]) { 315 + phydev = aup->mii_bus->phy_map[phy_addr]; 316 316 # if !defined(AU1XXX_PHY_SEARCH_HIGHEST_ADDR) 317 317 break; /* break out with first one found */ 318 318 # endif ··· 331 331 * the MAC0 MII bus */ 332 332 for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { 333 333 struct phy_device *const tmp_phydev = 334 - au_macs[0]->mii_bus.phy_map[phy_addr]; 334 + au_macs[0]->mii_bus->phy_map[phy_addr]; 335 335 336 336 if (!tmp_phydev) 337 337 continue; /* no PHY here... */ ··· 698 698 *aup->enable = 0; 699 699 aup->mac_enabled = 0; 700 700 701 - aup->mii_bus.priv = dev; 702 - aup->mii_bus.read = mdiobus_read; 703 - aup->mii_bus.write = mdiobus_write; 704 - aup->mii_bus.reset = mdiobus_reset; 705 - aup->mii_bus.name = "au1000_eth_mii"; 706 - snprintf(aup->mii_bus.id, MII_BUS_ID_SIZE, "%x", aup->mac_id); 707 - aup->mii_bus.irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 701 + aup->mii_bus = mdiobus_alloc(); 702 + if (aup->mii_bus == NULL) 703 + goto err_out; 704 + 705 + aup->mii_bus->priv = dev; 706 + aup->mii_bus->read = mdiobus_read; 707 + aup->mii_bus->write = mdiobus_write; 708 + aup->mii_bus->reset = mdiobus_reset; 709 + aup->mii_bus->name = "au1000_eth_mii"; 710 + snprintf(aup->mii_bus->id, MII_BUS_ID_SIZE, "%x", aup->mac_id); 711 + aup->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 708 712 for(i = 0; i < PHY_MAX_ADDR; ++i) 709 - aup->mii_bus.irq[i] = PHY_POLL; 713 + aup->mii_bus->irq[i] = PHY_POLL; 710 714 711 715 /* if known, set corresponding PHY IRQs */ 712 716 #if defined(AU1XXX_PHY_STATIC_CONFIG) 713 717 # if defined(AU1XXX_PHY0_IRQ) 714 718 if (AU1XXX_PHY0_BUSID == aup->mac_id) 715 - aup->mii_bus.irq[AU1XXX_PHY0_ADDR] = AU1XXX_PHY0_IRQ; 719 + aup->mii_bus->irq[AU1XXX_PHY0_ADDR] = AU1XXX_PHY0_IRQ; 716 720 # endif 717 721 # if defined(AU1XXX_PHY1_IRQ) 718 722 if (AU1XXX_PHY1_BUSID == aup->mac_id) 719 - aup->mii_bus.irq[AU1XXX_PHY1_ADDR] = AU1XXX_PHY1_IRQ; 723 + aup->mii_bus->irq[AU1XXX_PHY1_ADDR] = AU1XXX_PHY1_IRQ; 720 724 # endif 721 725 #endif 722 - mdiobus_register(&aup->mii_bus); 726 + mdiobus_register(aup->mii_bus); 723 727 724 728 if (mii_probe(dev) != 0) { 725 729 goto err_out; ··· 779 775 return dev; 780 776 781 777 err_out: 778 + if (aup->mii_bus != NULL) { 779 + mdiobus_unregister(aup->mii_bus); 780 + mdiobus_free(aup->mii_bus); 781 + } 782 + 782 783 /* here we should have a valid dev plus aup-> register addresses 783 784 * so we can reset the mac properly.*/ 784 785 reset_mac(dev); ··· 1014 1005 if (dev) { 1015 1006 aup = (struct au1000_private *) dev->priv; 1016 1007 unregister_netdev(dev); 1008 + mdiobus_unregister(aup->mii_bus); 1009 + mdiobus_free(aup->mii_bus); 1017 1010 for (j = 0; j < NUM_RX_DMA; j++) 1018 1011 if (aup->rx_db_inuse[j]) 1019 1012 ReleaseDB(aup, aup->rx_db_inuse[j]);
+1 -1
drivers/net/au1000_eth.h
··· 106 106 int old_duplex; 107 107 108 108 struct phy_device *phy_dev; 109 - struct mii_bus mii_bus; 109 + struct mii_bus *mii_bus; 110 110 111 111 /* These variables are just for quick access to certain regs addresses. */ 112 112 volatile mac_reg_t *mac; /* mac registers */
+20 -13
drivers/net/bfin_mac.c
··· 398 398 399 399 /* search for connect PHY device */ 400 400 for (i = 0; i < PHY_MAX_ADDR; i++) { 401 - struct phy_device *const tmp_phydev = lp->mii_bus.phy_map[i]; 401 + struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i]; 402 402 403 403 if (!tmp_phydev) 404 404 continue; /* no PHY here... */ ··· 1058 1058 setup_mac_addr(ndev->dev_addr); 1059 1059 1060 1060 /* MDIO bus initial */ 1061 - lp->mii_bus.priv = ndev; 1062 - lp->mii_bus.read = mdiobus_read; 1063 - lp->mii_bus.write = mdiobus_write; 1064 - lp->mii_bus.reset = mdiobus_reset; 1065 - lp->mii_bus.name = "bfin_mac_mdio"; 1066 - snprintf(lp->mii_bus.id, MII_BUS_ID_SIZE, "0"); 1067 - lp->mii_bus.irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 1068 - for (i = 0; i < PHY_MAX_ADDR; ++i) 1069 - lp->mii_bus.irq[i] = PHY_POLL; 1061 + lp->mii_bus = mdiobus_alloc(); 1062 + if (lp->mii_bus == NULL) 1063 + goto out_err_mdiobus_alloc; 1070 1064 1071 - rc = mdiobus_register(&lp->mii_bus); 1065 + lp->mii_bus->priv = ndev; 1066 + lp->mii_bus->read = mdiobus_read; 1067 + lp->mii_bus->write = mdiobus_write; 1068 + lp->mii_bus->reset = mdiobus_reset; 1069 + lp->mii_bus->name = "bfin_mac_mdio"; 1070 + snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "0"); 1071 + lp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 1072 + for (i = 0; i < PHY_MAX_ADDR; ++i) 1073 + lp->mii_bus->irq[i] = PHY_POLL; 1074 + 1075 + rc = mdiobus_register(lp->mii_bus); 1072 1076 if (rc) { 1073 1077 dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); 1074 1078 goto out_err_mdiobus_register; ··· 1125 1121 free_irq(IRQ_MAC_RX, ndev); 1126 1122 out_err_request_irq: 1127 1123 out_err_mii_probe: 1128 - mdiobus_unregister(&lp->mii_bus); 1124 + mdiobus_unregister(lp->mii_bus); 1129 1125 out_err_mdiobus_register: 1126 + mdiobus_free(lp->mii_bus); 1127 + out_err_mdiobus_alloc: 1130 1128 peripheral_free_list(pin_req); 1131 1129 out_err_setup_pin_mux: 1132 1130 out_err_probe_mac: ··· 1145 1139 1146 1140 platform_set_drvdata(pdev, NULL); 1147 1141 1148 - mdiobus_unregister(&lp->mii_bus); 1142 + mdiobus_unregister(lp->mii_bus); 1143 + mdiobus_free(lp->mii_bus); 1149 1144 1150 1145 unregister_netdev(ndev); 1151 1146
+1 -1
drivers/net/bfin_mac.h
··· 66 66 int old_duplex; 67 67 68 68 struct phy_device *phydev; 69 - struct mii_bus mii_bus; 69 + struct mii_bus *mii_bus; 70 70 }; 71 71 72 72 extern void bfin_get_ether_addr(char *addr);
+30 -21
drivers/net/cpmac.c
··· 302 302 303 303 static int mii_irqs[PHY_MAX_ADDR] = { PHY_POLL, }; 304 304 305 - static struct mii_bus cpmac_mii = { 306 - .name = "cpmac-mii", 307 - .read = cpmac_mdio_read, 308 - .write = cpmac_mdio_write, 309 - .reset = cpmac_mdio_reset, 310 - .irq = mii_irqs, 311 - }; 305 + static struct mii_bus *cpmac_mii; 312 306 313 307 static int cpmac_config(struct net_device *dev, struct ifmap *map) 314 308 { ··· 1110 1116 for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { 1111 1117 if (!(pdata->phy_mask & (1 << phy_id))) 1112 1118 continue; 1113 - if (!cpmac_mii.phy_map[phy_id]) 1119 + if (!cpmac_mii->phy_map[phy_id]) 1114 1120 continue; 1115 1121 break; 1116 1122 } ··· 1162 1168 priv->msg_enable = netif_msg_init(debug_level, 0xff); 1163 1169 memcpy(dev->dev_addr, pdata->dev_addr, sizeof(dev->dev_addr)); 1164 1170 1165 - priv->phy = phy_connect(dev, cpmac_mii.phy_map[phy_id]->dev.bus_id, 1171 + priv->phy = phy_connect(dev, cpmac_mii->phy_map[phy_id]->dev.bus_id, 1166 1172 &cpmac_adjust_link, 0, PHY_INTERFACE_MODE_MII); 1167 1173 if (IS_ERR(priv->phy)) { 1168 1174 if (netif_msg_drv(priv)) ··· 1210 1216 u32 mask; 1211 1217 int i, res; 1212 1218 1213 - cpmac_mii.priv = ioremap(AR7_REGS_MDIO, 256); 1219 + cpmac_mii = mdiobus_alloc(); 1220 + if (cpmac_mii == NULL) 1221 + return -ENOMEM; 1214 1222 1215 - if (!cpmac_mii.priv) { 1223 + cpmac_mii->name = "cpmac-mii"; 1224 + cpmac_mii->read = cpmac_mdio_read; 1225 + cpmac_mii->write = cpmac_mdio_write; 1226 + cpmac_mii->reset = cpmac_mdio_reset; 1227 + cpmac_mii->irq = mii_irqs; 1228 + 1229 + cpmac_mii->priv = ioremap(AR7_REGS_MDIO, 256); 1230 + 1231 + if (!cpmac_mii->priv) { 1216 1232 printk(KERN_ERR "Can't ioremap mdio registers\n"); 1217 - return -ENXIO; 1233 + res = -ENXIO; 1234 + goto fail_alloc; 1218 1235 } 1219 1236 1220 1237 #warning FIXME: unhardcode gpio&reset bits ··· 1235 1230 ar7_device_reset(AR7_RESET_BIT_CPMAC_HI); 1236 1231 ar7_device_reset(AR7_RESET_BIT_EPHY); 1237 1232 1238 - cpmac_mii.reset(&cpmac_mii); 1233 + cpmac_mii->reset(cpmac_mii); 1239 1234 1240 1235 for (i = 0; i < 300000; i++) 1241 - if ((mask = cpmac_read(cpmac_mii.priv, CPMAC_MDIO_ALIVE))) 1236 + if ((mask = cpmac_read(cpmac_mii->priv, CPMAC_MDIO_ALIVE))) 1242 1237 break; 1243 1238 else 1244 1239 cpu_relax(); ··· 1249 1244 mask = 0; 1250 1245 } 1251 1246 1252 - cpmac_mii.phy_mask = ~(mask | 0x80000000); 1253 - snprintf(cpmac_mii.id, MII_BUS_ID_SIZE, "0"); 1247 + cpmac_mii->phy_mask = ~(mask | 0x80000000); 1248 + snprintf(cpmac_mii->id, MII_BUS_ID_SIZE, "0"); 1254 1249 1255 - res = mdiobus_register(&cpmac_mii); 1250 + res = mdiobus_register(cpmac_mii); 1256 1251 if (res) 1257 1252 goto fail_mii; 1258 1253 ··· 1263 1258 return 0; 1264 1259 1265 1260 fail_cpmac: 1266 - mdiobus_unregister(&cpmac_mii); 1261 + mdiobus_unregister(cpmac_mii); 1267 1262 1268 1263 fail_mii: 1269 - iounmap(cpmac_mii.priv); 1264 + iounmap(cpmac_mii->priv); 1265 + 1266 + fail_alloc: 1267 + mdiobus_free(cpmac_mii); 1270 1268 1271 1269 return res; 1272 1270 } ··· 1277 1269 void __devexit cpmac_exit(void) 1278 1270 { 1279 1271 platform_driver_unregister(&cpmac_driver); 1280 - mdiobus_unregister(&cpmac_mii); 1281 - iounmap(cpmac_mii.priv); 1272 + mdiobus_unregister(cpmac_mii); 1273 + mdiobus_free(cpmac_mii); 1274 + iounmap(cpmac_mii->priv); 1282 1275 } 1283 1276 1284 1277 module_init(cpmac_init);
+3 -3
drivers/net/fec_mpc52xx_phy.c
··· 83 83 int err; 84 84 int i; 85 85 86 - bus = kzalloc(sizeof(*bus), GFP_KERNEL); 86 + bus = mdiobus_alloc(); 87 87 if (bus == NULL) 88 88 return -ENOMEM; 89 89 priv = kzalloc(sizeof(*priv), GFP_KERNEL); ··· 150 150 irq_dispose_mapping(bus->irq[i]); 151 151 kfree(bus->irq); 152 152 kfree(priv); 153 - kfree(bus); 153 + mdiobus_free(bus); 154 154 155 155 return err; 156 156 } ··· 171 171 irq_dispose_mapping(bus->irq[i]); 172 172 kfree(priv); 173 173 kfree(bus->irq); 174 - kfree(bus); 174 + mdiobus_free(bus); 175 175 176 176 return 0; 177 177 }
+3 -4
drivers/net/fs_enet/mii-bitbang.c
··· 218 218 out_unmap_regs: 219 219 iounmap(bitbang->dir); 220 220 out_free_bus: 221 - kfree(new_bus); 222 - out_free_priv: 223 221 free_mdio_bitbang(new_bus); 222 + out_free_priv: 223 + kfree(bitbang); 224 224 out: 225 225 return ret; 226 226 } ··· 231 231 struct bb_info *bitbang = bus->priv; 232 232 233 233 mdiobus_unregister(bus); 234 - free_mdio_bitbang(bus); 235 234 dev_set_drvdata(&ofdev->dev, NULL); 236 235 kfree(bus->irq); 236 + free_mdio_bitbang(bus); 237 237 iounmap(bitbang->dir); 238 238 kfree(bitbang); 239 - kfree(bus); 240 239 241 240 return 0; 242 241 }
+3 -3
drivers/net/fs_enet/mii-fec.c
··· 128 128 struct fec_info *fec; 129 129 int ret = -ENOMEM, i; 130 130 131 - new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 131 + new_bus = mdiobus_alloc(); 132 132 if (!new_bus) 133 133 goto out; 134 134 ··· 190 190 out_fec: 191 191 kfree(fec); 192 192 out_mii: 193 - kfree(new_bus); 193 + mdiobus_free(new_bus); 194 194 out: 195 195 return ret; 196 196 } ··· 205 205 kfree(bus->irq); 206 206 iounmap(fec->fecp); 207 207 kfree(fec); 208 - kfree(bus); 208 + mdiobus_free(bus); 209 209 210 210 return 0; 211 211 }
+3 -4
drivers/net/gianfar_mii.c
··· 164 164 if (NULL == dev) 165 165 return -EINVAL; 166 166 167 - new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 168 - 167 + new_bus = mdiobus_alloc(); 169 168 if (NULL == new_bus) 170 169 return -ENOMEM; 171 170 ··· 241 242 bus_register_fail: 242 243 iounmap(regs); 243 244 reg_map_fail: 244 - kfree(new_bus); 245 + mdiobus_free(new_bus); 245 246 246 247 return err; 247 248 } ··· 257 258 258 259 iounmap((void __iomem *)bus->priv); 259 260 bus->priv = NULL; 260 - kfree(bus); 261 + mdiobus_free(bus); 261 262 262 263 return 0; 263 264 }
+32 -23
drivers/net/macb.c
··· 195 195 196 196 /* find the first phy */ 197 197 for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { 198 - if (bp->mii_bus.phy_map[phy_addr]) { 199 - phydev = bp->mii_bus.phy_map[phy_addr]; 198 + if (bp->mii_bus->phy_map[phy_addr]) { 199 + phydev = bp->mii_bus->phy_map[phy_addr]; 200 200 break; 201 201 } 202 202 } ··· 244 244 /* Enable managment port */ 245 245 macb_writel(bp, NCR, MACB_BIT(MPE)); 246 246 247 - bp->mii_bus.name = "MACB_mii_bus"; 248 - bp->mii_bus.read = &macb_mdio_read; 249 - bp->mii_bus.write = &macb_mdio_write; 250 - bp->mii_bus.reset = &macb_mdio_reset; 251 - snprintf(bp->mii_bus.id, MII_BUS_ID_SIZE, "%x", bp->pdev->id); 252 - bp->mii_bus.priv = bp; 253 - bp->mii_bus.parent = &bp->dev->dev; 254 - pdata = bp->pdev->dev.platform_data; 255 - 256 - if (pdata) 257 - bp->mii_bus.phy_mask = pdata->phy_mask; 258 - 259 - bp->mii_bus.irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 260 - if (!bp->mii_bus.irq) { 247 + bp->mii_bus = mdiobus_alloc(); 248 + if (bp->mii_bus == NULL) { 261 249 err = -ENOMEM; 262 250 goto err_out; 263 251 } 264 252 253 + bp->mii_bus->name = "MACB_mii_bus"; 254 + bp->mii_bus->read = &macb_mdio_read; 255 + bp->mii_bus->write = &macb_mdio_write; 256 + bp->mii_bus->reset = &macb_mdio_reset; 257 + snprintf(bp->mii_bus->id, MII_BUS_ID_SIZE, "%x", bp->pdev->id); 258 + bp->mii_bus->priv = bp; 259 + bp->mii_bus->parent = &bp->dev->dev; 260 + pdata = bp->pdev->dev.platform_data; 261 + 262 + if (pdata) 263 + bp->mii_bus->phy_mask = pdata->phy_mask; 264 + 265 + bp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); 266 + if (!bp->mii_bus->irq) { 267 + err = -ENOMEM; 268 + goto err_out_free_mdiobus; 269 + } 270 + 265 271 for (i = 0; i < PHY_MAX_ADDR; i++) 266 - bp->mii_bus.irq[i] = PHY_POLL; 272 + bp->mii_bus->irq[i] = PHY_POLL; 267 273 268 - platform_set_drvdata(bp->dev, &bp->mii_bus); 274 + platform_set_drvdata(bp->dev, bp->mii_bus); 269 275 270 - if (mdiobus_register(&bp->mii_bus)) 276 + if (mdiobus_register(bp->mii_bus)) 271 277 goto err_out_free_mdio_irq; 272 278 273 279 if (macb_mii_probe(bp->dev) != 0) { ··· 283 277 return 0; 284 278 285 279 err_out_unregister_bus: 286 - mdiobus_unregister(&bp->mii_bus); 280 + mdiobus_unregister(bp->mii_bus); 287 281 err_out_free_mdio_irq: 288 - kfree(bp->mii_bus.irq); 282 + kfree(bp->mii_bus->irq); 283 + err_out_free_mdiobus: 284 + mdiobus_free(bp->mii_bus); 289 285 err_out: 290 286 return err; 291 287 } ··· 1269 1261 bp = netdev_priv(dev); 1270 1262 if (bp->phy_dev) 1271 1263 phy_disconnect(bp->phy_dev); 1272 - mdiobus_unregister(&bp->mii_bus); 1273 - kfree(bp->mii_bus.irq); 1264 + mdiobus_unregister(bp->mii_bus); 1265 + kfree(bp->mii_bus->irq); 1266 + mdiobus_free(bp->mii_bus); 1274 1267 unregister_netdev(dev); 1275 1268 free_irq(dev->irq, dev); 1276 1269 iounmap(bp->regs);
+1 -1
drivers/net/macb.h
··· 384 384 385 385 unsigned int rx_pending, tx_pending; 386 386 387 - struct mii_bus mii_bus; 387 + struct mii_bus *mii_bus; 388 388 struct phy_device *phy_dev; 389 389 unsigned int link; 390 390 unsigned int speed;
+20 -12
drivers/net/mv643xx_eth.c
··· 250 250 /* 251 251 * Provides access to local SMI interface. 252 252 */ 253 - struct mii_bus smi_bus; 253 + struct mii_bus *smi_bus; 254 254 255 255 /* 256 256 * If we have access to the error interrupt pin (which is ··· 2363 2363 * Set up and register SMI bus. 2364 2364 */ 2365 2365 if (pd == NULL || pd->shared_smi == NULL) { 2366 - msp->smi_bus.priv = msp; 2367 - msp->smi_bus.name = "mv643xx_eth smi"; 2368 - msp->smi_bus.read = smi_bus_read; 2369 - msp->smi_bus.write = smi_bus_write, 2370 - snprintf(msp->smi_bus.id, MII_BUS_ID_SIZE, "%d", pdev->id); 2371 - msp->smi_bus.parent = &pdev->dev; 2372 - msp->smi_bus.phy_mask = 0xffffffff; 2373 - if (mdiobus_register(&msp->smi_bus) < 0) 2366 + msp->smi_bus = mdiobus_alloc(); 2367 + if (msp->smi_bus == NULL) 2374 2368 goto out_unmap; 2369 + 2370 + msp->smi_bus->priv = msp; 2371 + msp->smi_bus->name = "mv643xx_eth smi"; 2372 + msp->smi_bus->read = smi_bus_read; 2373 + msp->smi_bus->write = smi_bus_write, 2374 + snprintf(msp->smi_bus->id, MII_BUS_ID_SIZE, "%d", pdev->id); 2375 + msp->smi_bus->parent = &pdev->dev; 2376 + msp->smi_bus->phy_mask = 0xffffffff; 2377 + if (mdiobus_register(msp->smi_bus) < 0) 2378 + goto out_free_mii_bus; 2375 2379 msp->smi = msp; 2376 2380 } else { 2377 2381 msp->smi = platform_get_drvdata(pd->shared_smi); ··· 2415 2411 2416 2412 return 0; 2417 2413 2414 + out_free_mii_bus: 2415 + mdiobus_free(msp->smi_bus); 2418 2416 out_unmap: 2419 2417 iounmap(msp->base); 2420 2418 out_free: ··· 2430 2424 struct mv643xx_eth_shared_private *msp = platform_get_drvdata(pdev); 2431 2425 struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; 2432 2426 2433 - if (pd == NULL || pd->shared_smi == NULL) 2434 - mdiobus_unregister(&msp->smi_bus); 2427 + if (pd == NULL || pd->shared_smi == NULL) { 2428 + mdiobus_free(msp->smi_bus); 2429 + mdiobus_unregister(msp->smi_bus); 2430 + } 2435 2431 if (msp->err_interrupt != NO_IRQ) 2436 2432 free_irq(msp->err_interrupt, msp); 2437 2433 iounmap(msp->base); ··· 2501 2493 static struct phy_device *phy_scan(struct mv643xx_eth_private *mp, 2502 2494 int phy_addr) 2503 2495 { 2504 - struct mii_bus *bus = &mp->shared->smi->smi_bus; 2496 + struct mii_bus *bus = mp->shared->smi->smi_bus; 2505 2497 struct phy_device *phydev; 2506 2498 int start; 2507 2499 int num;
+20 -11
drivers/net/phy/fixed.c
··· 24 24 25 25 struct fixed_mdio_bus { 26 26 int irqs[PHY_MAX_ADDR]; 27 - struct mii_bus mii_bus; 27 + struct mii_bus *mii_bus; 28 28 struct list_head phys; 29 29 }; 30 30 ··· 213 213 goto err_pdev; 214 214 } 215 215 216 - snprintf(fmb->mii_bus.id, MII_BUS_ID_SIZE, "0"); 217 - fmb->mii_bus.name = "Fixed MDIO Bus"; 218 - fmb->mii_bus.parent = &pdev->dev; 219 - fmb->mii_bus.read = &fixed_mdio_read; 220 - fmb->mii_bus.write = &fixed_mdio_write; 221 - fmb->mii_bus.irq = fmb->irqs; 222 - 223 - ret = mdiobus_register(&fmb->mii_bus); 224 - if (ret) 216 + fmb->mii_bus = mdiobus_alloc(); 217 + if (fmb->mii_bus == NULL) { 218 + ret = -ENOMEM; 225 219 goto err_mdiobus_reg; 220 + } 221 + 222 + snprintf(fmb->mii_bus->id, MII_BUS_ID_SIZE, "0"); 223 + fmb->mii_bus->name = "Fixed MDIO Bus"; 224 + fmb->mii_bus->parent = &pdev->dev; 225 + fmb->mii_bus->read = &fixed_mdio_read; 226 + fmb->mii_bus->write = &fixed_mdio_write; 227 + fmb->mii_bus->irq = fmb->irqs; 228 + 229 + ret = mdiobus_register(fmb->mii_bus); 230 + if (ret) 231 + goto err_mdiobus_alloc; 226 232 227 233 return 0; 228 234 235 + err_mdiobus_alloc: 236 + mdiobus_free(fmb->mii_bus); 229 237 err_mdiobus_reg: 230 238 platform_device_unregister(pdev); 231 239 err_pdev: ··· 246 238 struct fixed_mdio_bus *fmb = &platform_fmb; 247 239 struct fixed_phy *fp, *tmp; 248 240 249 - mdiobus_unregister(&fmb->mii_bus); 241 + mdiobus_unregister(fmb->mii_bus); 242 + mdiobus_free(fmb->mii_bus); 250 243 platform_device_unregister(pdev); 251 244 252 245 list_for_each_entry_safe(fp, tmp, &fmb->phys, node) {
+2 -2
drivers/net/phy/mdio-bitbang.c
··· 165 165 { 166 166 struct mii_bus *bus; 167 167 168 - bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 168 + bus = mdiobus_alloc(); 169 169 if (!bus) 170 170 return NULL; 171 171 ··· 184 184 struct mdiobb_ctrl *ctrl = bus->priv; 185 185 186 186 module_put(ctrl->ops->owner); 187 - kfree(bus); 187 + mdiobus_free(bus); 188 188 } 189 189 EXPORT_SYMBOL(free_mdio_bitbang); 190 190
+4 -5
drivers/net/phy/mdio-ofgpio.c
··· 122 122 123 123 new_bus = alloc_mdio_bitbang(&bitbang->ctrl); 124 124 if (!new_bus) 125 - goto out_free_priv; 125 + goto out_free_bitbang; 126 126 127 127 new_bus->name = "GPIO Bitbanged MII", 128 128 ··· 155 155 dev_set_drvdata(&ofdev->dev, NULL); 156 156 kfree(new_bus->irq); 157 157 out_free_bus: 158 - kfree(new_bus); 159 - out_free_priv: 160 158 free_mdio_bitbang(new_bus); 159 + out_free_bitbang: 160 + kfree(bitbang); 161 161 out: 162 162 return ret; 163 163 } ··· 168 168 struct mdio_gpio_info *bitbang = bus->priv; 169 169 170 170 mdiobus_unregister(bus); 171 + kfree(bus->irq); 171 172 free_mdio_bitbang(bus); 172 173 dev_set_drvdata(&ofdev->dev, NULL); 173 - kfree(bus->irq); 174 174 kfree(bitbang); 175 - kfree(bus); 176 175 177 176 return 0; 178 177 }
+24
drivers/net/phy/mdio_bus.c
··· 36 36 #include <asm/uaccess.h> 37 37 38 38 /** 39 + * mdiobus_alloc - allocate a mii_bus structure 40 + * 41 + * Description: called by a bus driver to allocate an mii_bus 42 + * structure to fill in. 43 + */ 44 + struct mii_bus *mdiobus_alloc(void) 45 + { 46 + return kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 47 + } 48 + EXPORT_SYMBOL(mdiobus_alloc); 49 + 50 + /** 39 51 * mdiobus_register - bring up all the PHYs on a given bus and attach them to bus 40 52 * @bus: target mii_bus 41 53 * ··· 98 86 } 99 87 } 100 88 EXPORT_SYMBOL(mdiobus_unregister); 89 + 90 + /** 91 + * mdiobus_free - free a struct mii_bus 92 + * @bus: mii_bus to free 93 + * 94 + * This function frees the mii_bus. 95 + */ 96 + void mdiobus_free(struct mii_bus *bus) 97 + { 98 + kfree(bus); 99 + } 100 + EXPORT_SYMBOL(mdiobus_free); 101 101 102 102 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) 103 103 {
+22 -14
drivers/net/sb1250-mac.c
··· 256 256 struct net_device *sbm_dev; /* pointer to linux device */ 257 257 struct napi_struct napi; 258 258 struct phy_device *phy_dev; /* the associated PHY device */ 259 - struct mii_bus mii_bus; /* the MII bus */ 259 + struct mii_bus *mii_bus; /* the MII bus */ 260 260 int phy_irq[PHY_MAX_ADDR]; 261 261 spinlock_t sbm_lock; /* spin lock */ 262 262 int sbm_devflags; /* current device flags */ ··· 2348 2348 /* This is needed for PASS2 for Rx H/W checksum feature */ 2349 2349 sbmac_set_iphdr_offset(sc); 2350 2350 2351 + sc->mii_bus = mdiobus_alloc(); 2352 + if (sc->mii_bus == NULL) { 2353 + sbmac_uninitctx(sc); 2354 + return -ENOMEM; 2355 + } 2356 + 2351 2357 err = register_netdev(dev); 2352 2358 if (err) { 2353 2359 printk(KERN_ERR "%s.%d: unable to register netdev\n", 2354 2360 sbmac_string, idx); 2361 + mdiobus_free(sc->mii_bus); 2355 2362 sbmac_uninitctx(sc); 2356 2363 return err; 2357 2364 } ··· 2376 2369 pr_info("%s: SiByte Ethernet at 0x%08Lx, address: %s\n", 2377 2370 dev->name, base, print_mac(mac, eaddr)); 2378 2371 2379 - sc->mii_bus.name = sbmac_mdio_string; 2380 - snprintf(sc->mii_bus.id, MII_BUS_ID_SIZE, "%x", idx); 2381 - sc->mii_bus.priv = sc; 2382 - sc->mii_bus.read = sbmac_mii_read; 2383 - sc->mii_bus.write = sbmac_mii_write; 2384 - sc->mii_bus.irq = sc->phy_irq; 2372 + sc->mii_bus->name = sbmac_mdio_string; 2373 + snprintf(sc->mii_bus->id, MII_BUS_ID_SIZE, "%x", idx); 2374 + sc->mii_bus->priv = sc; 2375 + sc->mii_bus->read = sbmac_mii_read; 2376 + sc->mii_bus->write = sbmac_mii_write; 2377 + sc->mii_bus->irq = sc->phy_irq; 2385 2378 for (i = 0; i < PHY_MAX_ADDR; ++i) 2386 - sc->mii_bus.irq[i] = SBMAC_PHY_INT; 2379 + sc->mii_bus->irq[i] = SBMAC_PHY_INT; 2387 2380 2388 - sc->mii_bus.parent = &pldev->dev; 2389 - dev_set_drvdata(&pldev->dev, &sc->mii_bus); 2381 + sc->mii_bus->parent = &pldev->dev; 2382 + dev_set_drvdata(&pldev->dev, sc->mii_bus); 2390 2383 2391 2384 return 0; 2392 2385 } ··· 2417 2410 /* 2418 2411 * Probe PHY address 2419 2412 */ 2420 - err = mdiobus_register(&sc->mii_bus); 2413 + err = mdiobus_register(sc->mii_bus); 2421 2414 if (err) { 2422 2415 printk(KERN_ERR "%s: unable to register MDIO bus\n", 2423 2416 dev->name); ··· 2454 2447 return 0; 2455 2448 2456 2449 out_unregister: 2457 - mdiobus_unregister(&sc->mii_bus); 2450 + mdiobus_unregister(sc->mii_bus); 2458 2451 2459 2452 out_unirq: 2460 2453 free_irq(dev->irq, dev); ··· 2470 2463 int i; 2471 2464 2472 2465 for (i = 0; i < PHY_MAX_ADDR; i++) { 2473 - phy_dev = sc->mii_bus.phy_map[i]; 2466 + phy_dev = sc->mii_bus->phy_map[i]; 2474 2467 if (phy_dev) 2475 2468 break; 2476 2469 } ··· 2648 2641 phy_disconnect(sc->phy_dev); 2649 2642 sc->phy_dev = NULL; 2650 2643 2651 - mdiobus_unregister(&sc->mii_bus); 2644 + mdiobus_unregister(sc->mii_bus); 2652 2645 2653 2646 free_irq(dev->irq, dev); 2654 2647 ··· 2757 2750 2758 2751 unregister_netdev(dev); 2759 2752 sbmac_uninitctx(sc); 2753 + mdiobus_free(sc->mii_bus); 2760 2754 iounmap(sc->sbm_base); 2761 2755 free_netdev(dev); 2762 2756
+1 -1
drivers/net/sh_eth.c
··· 1166 1166 kfree(mdp->mii_bus->irq); 1167 1167 1168 1168 out_free_bus: 1169 - kfree(mdp->mii_bus); 1169 + free_mdio_bitbang(mdp->mii_bus); 1170 1170 1171 1171 out_free_bitbang: 1172 1172 kfree(bitbang);
+28 -19
drivers/net/tc35815.c
··· 424 424 */ 425 425 spinlock_t lock; 426 426 427 - struct mii_bus mii_bus; 427 + struct mii_bus *mii_bus; 428 428 struct phy_device *phy_dev; 429 429 int duplex; 430 430 int speed; ··· 704 704 705 705 /* find the first phy */ 706 706 for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { 707 - if (lp->mii_bus.phy_map[phy_addr]) { 707 + if (lp->mii_bus->phy_map[phy_addr]) { 708 708 if (phydev) { 709 709 printk(KERN_ERR "%s: multiple PHYs found\n", 710 710 dev->name); 711 711 return -EINVAL; 712 712 } 713 - phydev = lp->mii_bus.phy_map[phy_addr]; 713 + phydev = lp->mii_bus->phy_map[phy_addr]; 714 714 break; 715 715 } 716 716 } ··· 762 762 int err; 763 763 int i; 764 764 765 - lp->mii_bus.name = "tc35815_mii_bus"; 766 - lp->mii_bus.read = tc_mdio_read; 767 - lp->mii_bus.write = tc_mdio_write; 768 - snprintf(lp->mii_bus.id, MII_BUS_ID_SIZE, "%x", 769 - (lp->pci_dev->bus->number << 8) | lp->pci_dev->devfn); 770 - lp->mii_bus.priv = dev; 771 - lp->mii_bus.parent = &lp->pci_dev->dev; 772 - lp->mii_bus.irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); 773 - if (!lp->mii_bus.irq) { 765 + lp->mii_bus = mdiobus_alloc(); 766 + if (lp->mii_bus == NULL) { 774 767 err = -ENOMEM; 775 768 goto err_out; 776 769 } 777 770 778 - for (i = 0; i < PHY_MAX_ADDR; i++) 779 - lp->mii_bus.irq[i] = PHY_POLL; 771 + lp->mii_bus->name = "tc35815_mii_bus"; 772 + lp->mii_bus->read = tc_mdio_read; 773 + lp->mii_bus->write = tc_mdio_write; 774 + snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "%x", 775 + (lp->pci_dev->bus->number << 8) | lp->pci_dev->devfn); 776 + lp->mii_bus->priv = dev; 777 + lp->mii_bus->parent = &lp->pci_dev->dev; 778 + lp->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL); 779 + if (!lp->mii_bus->irq) { 780 + err = -ENOMEM; 781 + goto err_out_free_mii_bus; 782 + } 780 783 781 - err = mdiobus_register(&lp->mii_bus); 784 + for (i = 0; i < PHY_MAX_ADDR; i++) 785 + lp->mii_bus->irq[i] = PHY_POLL; 786 + 787 + err = mdiobus_register(lp->mii_bus); 782 788 if (err) 783 789 goto err_out_free_mdio_irq; 784 790 err = tc_mii_probe(dev); ··· 793 787 return 0; 794 788 795 789 err_out_unregister_bus: 796 - mdiobus_unregister(&lp->mii_bus); 790 + mdiobus_unregister(lp->mii_bus); 797 791 err_out_free_mdio_irq: 798 - kfree(lp->mii_bus.irq); 792 + kfree(lp->mii_bus->irq); 793 + err_out_free_mii_bus; 794 + mdiobus_free(lp->mii_bus); 799 795 err_out: 800 796 return err; 801 797 } ··· 969 961 struct tc35815_local *lp = netdev_priv(dev); 970 962 971 963 phy_disconnect(lp->phy_dev); 972 - mdiobus_unregister(&lp->mii_bus); 973 - kfree(lp->mii_bus.irq); 964 + mdiobus_unregister(lp->mii_bus); 965 + kfree(lp->mii_bus->irq); 966 + mdiobus_free(lp->mii_bus); 974 967 unregister_netdev(dev); 975 968 free_netdev(dev); 976 969 pci_set_drvdata(pdev, NULL);
+34 -32
drivers/net/tg3.c
··· 876 876 { 877 877 u32 val; 878 878 879 - if (tp->mdio_bus.phy_map[PHY_ADDR]->interface != 879 + if (tp->mdio_bus->phy_map[PHY_ADDR]->interface != 880 880 PHY_INTERFACE_MODE_RGMII) 881 881 return; 882 882 ··· 920 920 static void tg3_mdio_start(struct tg3 *tp) 921 921 { 922 922 if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { 923 - mutex_lock(&tp->mdio_bus.mdio_lock); 923 + mutex_lock(&tp->mdio_bus->mdio_lock); 924 924 tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; 925 - mutex_unlock(&tp->mdio_bus.mdio_lock); 925 + mutex_unlock(&tp->mdio_bus->mdio_lock); 926 926 } 927 927 928 928 tp->mi_mode &= ~MAC_MI_MODE_AUTO_POLL; ··· 936 936 static void tg3_mdio_stop(struct tg3 *tp) 937 937 { 938 938 if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { 939 - mutex_lock(&tp->mdio_bus.mdio_lock); 939 + mutex_lock(&tp->mdio_bus->mdio_lock); 940 940 tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_PAUSED; 941 - mutex_unlock(&tp->mdio_bus.mdio_lock); 941 + mutex_unlock(&tp->mdio_bus->mdio_lock); 942 942 } 943 943 } 944 944 ··· 947 947 int i; 948 948 u32 reg; 949 949 struct phy_device *phydev; 950 - struct mii_bus *mdio_bus = &tp->mdio_bus; 951 950 952 951 tg3_mdio_start(tp); 953 952 ··· 954 955 (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED)) 955 956 return 0; 956 957 957 - memset(mdio_bus, 0, sizeof(*mdio_bus)); 958 + tp->mdio_bus = mdiobus_alloc(); 959 + if (tp->mdio_bus == NULL) 960 + return -ENOMEM; 958 961 959 - mdio_bus->name = "tg3 mdio bus"; 960 - snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "%x", 962 + tp->mdio_bus->name = "tg3 mdio bus"; 963 + snprintf(tp->mdio_bus->id, MII_BUS_ID_SIZE, "%x", 961 964 (tp->pdev->bus->number << 8) | tp->pdev->devfn); 962 - mdio_bus->priv = tp; 963 - mdio_bus->parent = &tp->pdev->dev; 964 - mdio_bus->read = &tg3_mdio_read; 965 - mdio_bus->write = &tg3_mdio_write; 966 - mdio_bus->reset = &tg3_mdio_reset; 967 - mdio_bus->phy_mask = ~(1 << PHY_ADDR); 968 - mdio_bus->irq = &tp->mdio_irq[0]; 965 + tp->mdio_bus->priv = tp; 966 + tp->mdio_bus->parent = &tp->pdev->dev; 967 + tp->mdio_bus->read = &tg3_mdio_read; 968 + tp->mdio_bus->write = &tg3_mdio_write; 969 + tp->mdio_bus->reset = &tg3_mdio_reset; 970 + tp->mdio_bus->phy_mask = ~(1 << PHY_ADDR); 971 + tp->mdio_bus->irq = &tp->mdio_irq[0]; 969 972 970 973 for (i = 0; i < PHY_MAX_ADDR; i++) 971 - mdio_bus->irq[i] = PHY_POLL; 974 + tp->mdio_bus->irq[i] = PHY_POLL; 972 975 973 976 /* The bus registration will look for all the PHYs on the mdio bus. 974 977 * Unfortunately, it does not ensure the PHY is powered up before ··· 980 979 if (tg3_readphy(tp, MII_BMCR, &reg) || (reg & BMCR_PDOWN)) 981 980 tg3_bmcr_reset(tp); 982 981 983 - i = mdiobus_register(mdio_bus); 982 + i = mdiobus_register(tp->mdio_bus); 984 983 if (i) { 985 984 printk(KERN_WARNING "%s: mdiobus_reg failed (0x%x)\n", 986 985 tp->dev->name, i); ··· 989 988 990 989 tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED; 991 990 992 - phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 991 + phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 993 992 994 993 switch (phydev->phy_id) { 995 994 case TG3_PHY_ID_BCM50610: ··· 1015 1014 { 1016 1015 if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) { 1017 1016 tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_INITED; 1018 - mdiobus_unregister(&tp->mdio_bus); 1017 + mdiobus_unregister(tp->mdio_bus); 1018 + mdiobus_free(tp->mdio_bus); 1019 1019 tp->tg3_flags3 &= ~TG3_FLG3_MDIOBUS_PAUSED; 1020 1020 } 1021 1021 } ··· 1222 1220 u32 old_tx_mode = tp->tx_mode; 1223 1221 1224 1222 if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) 1225 - autoneg = tp->mdio_bus.phy_map[PHY_ADDR]->autoneg; 1223 + autoneg = tp->mdio_bus->phy_map[PHY_ADDR]->autoneg; 1226 1224 else 1227 1225 autoneg = tp->link_config.autoneg; 1228 1226 ··· 1259 1257 u8 oldflowctrl, linkmesg = 0; 1260 1258 u32 mac_mode, lcl_adv, rmt_adv; 1261 1259 struct tg3 *tp = netdev_priv(dev); 1262 - struct phy_device *phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 1260 + struct phy_device *phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 1263 1261 1264 1262 spin_lock(&tp->lock); 1265 1263 ··· 1336 1334 /* Bring the PHY back to a known state. */ 1337 1335 tg3_bmcr_reset(tp); 1338 1336 1339 - phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 1337 + phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 1340 1338 1341 1339 /* Attach the MAC to the PHY. */ 1342 1340 phydev = phy_connect(tp->dev, phydev->dev.bus_id, tg3_adjust_link, ··· 1369 1367 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 1370 1368 return; 1371 1369 1372 - phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 1370 + phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 1373 1371 1374 1372 if (tp->link_config.phy_is_low_power) { 1375 1373 tp->link_config.phy_is_low_power = 0; ··· 1389 1387 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 1390 1388 return; 1391 1389 1392 - phy_stop(tp->mdio_bus.phy_map[PHY_ADDR]); 1390 + phy_stop(tp->mdio_bus->phy_map[PHY_ADDR]); 1393 1391 } 1394 1392 1395 1393 static void tg3_phy_fini(struct tg3 *tp) 1396 1394 { 1397 1395 if (tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED) { 1398 - phy_disconnect(tp->mdio_bus.phy_map[PHY_ADDR]); 1396 + phy_disconnect(tp->mdio_bus->phy_map[PHY_ADDR]); 1399 1397 tp->tg3_flags3 &= ~TG3_FLG3_PHY_CONNECTED; 1400 1398 } 1401 1399 } ··· 2051 2049 struct phy_device *phydev; 2052 2050 u32 advertising; 2053 2051 2054 - phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 2052 + phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 2055 2053 2056 2054 tp->link_config.phy_is_low_power = 1; 2057 2055 ··· 8956 8954 if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { 8957 8955 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 8958 8956 return -EAGAIN; 8959 - return phy_ethtool_gset(tp->mdio_bus.phy_map[PHY_ADDR], cmd); 8957 + return phy_ethtool_gset(tp->mdio_bus->phy_map[PHY_ADDR], cmd); 8960 8958 } 8961 8959 8962 8960 cmd->supported = (SUPPORTED_Autoneg); ··· 8997 8995 if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { 8998 8996 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 8999 8997 return -EAGAIN; 9000 - return phy_ethtool_sset(tp->mdio_bus.phy_map[PHY_ADDR], cmd); 8998 + return phy_ethtool_sset(tp->mdio_bus->phy_map[PHY_ADDR], cmd); 9001 8999 } 9002 9000 9003 9001 if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) { ··· 9145 9143 if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { 9146 9144 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 9147 9145 return -EAGAIN; 9148 - r = phy_start_aneg(tp->mdio_bus.phy_map[PHY_ADDR]); 9146 + r = phy_start_aneg(tp->mdio_bus->phy_map[PHY_ADDR]); 9149 9147 } else { 9150 9148 u32 bmcr; 9151 9149 ··· 9262 9260 u32 newadv; 9263 9261 struct phy_device *phydev; 9264 9262 9265 - phydev = tp->mdio_bus.phy_map[PHY_ADDR]; 9263 + phydev = tp->mdio_bus->phy_map[PHY_ADDR]; 9266 9264 9267 9265 if (epause->rx_pause) { 9268 9266 if (epause->tx_pause) ··· 10244 10242 if (tp->tg3_flags3 & TG3_FLG3_USE_PHYLIB) { 10245 10243 if (!(tp->tg3_flags3 & TG3_FLG3_PHY_CONNECTED)) 10246 10244 return -EAGAIN; 10247 - return phy_mii_ioctl(tp->mdio_bus.phy_map[PHY_ADDR], data, cmd); 10245 + return phy_mii_ioctl(tp->mdio_bus->phy_map[PHY_ADDR], data, cmd); 10248 10246 } 10249 10247 10250 10248 switch(cmd) {
+1 -1
drivers/net/tg3.h
··· 2556 2556 int msi_cap; 2557 2557 int pcix_cap; 2558 2558 2559 - struct mii_bus mdio_bus; 2559 + struct mii_bus *mdio_bus; 2560 2560 int mdio_irq[PHY_MAX_ADDR]; 2561 2561 2562 2562 /* PHY info */
+3 -4
drivers/net/ucc_geth_mii.c
··· 141 141 struct resource res; 142 142 int k, err = 0; 143 143 144 - new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); 145 - 144 + new_bus = mdiobus_alloc(); 146 145 if (NULL == new_bus) 147 146 return -ENOMEM; 148 147 ··· 234 235 ioremap_fail: 235 236 kfree(new_bus->irq); 236 237 reg_map_fail: 237 - kfree(new_bus); 238 + mdiobus_free(new_bus); 238 239 239 240 return err; 240 241 } ··· 250 251 251 252 iounmap((void __iomem *)bus->priv); 252 253 bus->priv = NULL; 253 - kfree(bus); 254 + mdiobus_free(bus); 254 255 255 256 return 0; 256 257 }
+2
include/linux/phy.h
··· 408 408 void phy_stop(struct phy_device *phydev); 409 409 int phy_start_aneg(struct phy_device *phydev); 410 410 411 + struct mii_bus *mdiobus_alloc(void); 411 412 int mdiobus_register(struct mii_bus *bus); 412 413 void mdiobus_unregister(struct mii_bus *bus); 414 + void mdiobus_free(struct mii_bus *bus); 413 415 struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); 414 416 415 417 void phy_sanitize_settings(struct phy_device *phydev);