Skip to content

Commit 298cf9b

Browse files
Lennert Buytenhekdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]> Acked-by: Andy Fleming <[email protected]>
1 parent 18ee49d commit 298cf9b

23 files changed

+279
-185
lines changed

drivers/net/au1000_eth.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -290,15 +290,15 @@ static int mii_probe (struct net_device *dev)
290290

291291
if(aup->mac_id == 0) { /* get PHY0 */
292292
# 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];
294294
# else
295295
printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n",
296296
dev->name);
297297
return 0;
298298
# endif /* defined(AU1XXX_PHY0_ADDR) */
299299
} else if (aup->mac_id == 1) { /* get PHY1 */
300300
# 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];
302302
# else
303303
printk (KERN_INFO DRV_NAME ":%s: using PHY-less setup\n",
304304
dev->name);
@@ -311,8 +311,8 @@ static int mii_probe (struct net_device *dev)
311311

312312
/* find the first (lowest address) PHY on the current MAC's MII bus */
313313
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];
316316
# if !defined(AU1XXX_PHY_SEARCH_HIGHEST_ADDR)
317317
break; /* break out with first one found */
318318
# endif
@@ -331,7 +331,7 @@ static int mii_probe (struct net_device *dev)
331331
* the MAC0 MII bus */
332332
for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
333333
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];
335335

336336
if (!tmp_phydev)
337337
continue; /* no PHY here... */
@@ -698,28 +698,32 @@ static struct net_device * au1000_probe(int port_num)
698698
*aup->enable = 0;
699699
aup->mac_enabled = 0;
700700

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);
708712
for(i = 0; i < PHY_MAX_ADDR; ++i)
709-
aup->mii_bus.irq[i] = PHY_POLL;
713+
aup->mii_bus->irq[i] = PHY_POLL;
710714

711715
/* if known, set corresponding PHY IRQs */
712716
#if defined(AU1XXX_PHY_STATIC_CONFIG)
713717
# if defined(AU1XXX_PHY0_IRQ)
714718
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;
716720
# endif
717721
# if defined(AU1XXX_PHY1_IRQ)
718722
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;
720724
# endif
721725
#endif
722-
mdiobus_register(&aup->mii_bus);
726+
mdiobus_register(aup->mii_bus);
723727

724728
if (mii_probe(dev) != 0) {
725729
goto err_out;
@@ -775,6 +779,11 @@ static struct net_device * au1000_probe(int port_num)
775779
return dev;
776780

777781
err_out:
782+
if (aup->mii_bus != NULL) {
783+
mdiobus_unregister(aup->mii_bus);
784+
mdiobus_free(aup->mii_bus);
785+
}
786+
778787
/* here we should have a valid dev plus aup-> register addresses
779788
* so we can reset the mac properly.*/
780789
reset_mac(dev);
@@ -1005,6 +1014,8 @@ static void __exit au1000_cleanup_module(void)
10051014
if (dev) {
10061015
aup = (struct au1000_private *) dev->priv;
10071016
unregister_netdev(dev);
1017+
mdiobus_unregister(aup->mii_bus);
1018+
mdiobus_free(aup->mii_bus);
10081019
for (j = 0; j < NUM_RX_DMA; j++)
10091020
if (aup->rx_db_inuse[j])
10101021
ReleaseDB(aup, aup->rx_db_inuse[j]);

drivers/net/au1000_eth.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ struct au1000_private {
106106
int old_duplex;
107107

108108
struct phy_device *phy_dev;
109-
struct mii_bus mii_bus;
109+
struct mii_bus *mii_bus;
110110

111111
/* These variables are just for quick access to certain regs addresses. */
112112
volatile mac_reg_t *mac; /* mac registers */

drivers/net/bfin_mac.c

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ static int mii_probe(struct net_device *dev)
398398

399399
/* search for connect PHY device */
400400
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];
402402

403403
if (!tmp_phydev)
404404
continue; /* no PHY here... */
@@ -1058,17 +1058,21 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
10581058
setup_mac_addr(ndev->dev_addr);
10591059

10601060
/* 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);
1061+
lp->mii_bus = mdiobus_alloc();
1062+
if (lp->mii_bus == NULL)
1063+
goto out_err_mdiobus_alloc;
1064+
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);
10681072
for (i = 0; i < PHY_MAX_ADDR; ++i)
1069-
lp->mii_bus.irq[i] = PHY_POLL;
1073+
lp->mii_bus->irq[i] = PHY_POLL;
10701074

1071-
rc = mdiobus_register(&lp->mii_bus);
1075+
rc = mdiobus_register(lp->mii_bus);
10721076
if (rc) {
10731077
dev_err(&pdev->dev, "Cannot register MDIO bus!\n");
10741078
goto out_err_mdiobus_register;
@@ -1121,8 +1125,10 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev)
11211125
free_irq(IRQ_MAC_RX, ndev);
11221126
out_err_request_irq:
11231127
out_err_mii_probe:
1124-
mdiobus_unregister(&lp->mii_bus);
1128+
mdiobus_unregister(lp->mii_bus);
11251129
out_err_mdiobus_register:
1130+
mdiobus_free(lp->mii_bus);
1131+
out_err_mdiobus_alloc:
11261132
peripheral_free_list(pin_req);
11271133
out_err_setup_pin_mux:
11281134
out_err_probe_mac:
@@ -1139,7 +1145,8 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev)
11391145

11401146
platform_set_drvdata(pdev, NULL);
11411147

1142-
mdiobus_unregister(&lp->mii_bus);
1148+
mdiobus_unregister(lp->mii_bus);
1149+
mdiobus_free(lp->mii_bus);
11431150

11441151
unregister_netdev(ndev);
11451152

drivers/net/bfin_mac.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ struct bfin_mac_local {
6666
int old_duplex;
6767

6868
struct phy_device *phydev;
69-
struct mii_bus mii_bus;
69+
struct mii_bus *mii_bus;
7070
};
7171

7272
extern void bfin_get_ether_addr(char *addr);

drivers/net/cpmac.c

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -302,13 +302,7 @@ static int cpmac_mdio_reset(struct mii_bus *bus)
302302

303303
static int mii_irqs[PHY_MAX_ADDR] = { PHY_POLL, };
304304

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;
312306

313307
static int cpmac_config(struct net_device *dev, struct ifmap *map)
314308
{
@@ -1116,7 +1110,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
11161110
for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) {
11171111
if (!(pdata->phy_mask & (1 << phy_id)))
11181112
continue;
1119-
if (!cpmac_mii.phy_map[phy_id])
1113+
if (!cpmac_mii->phy_map[phy_id])
11201114
continue;
11211115
break;
11221116
}
@@ -1168,7 +1162,7 @@ static int __devinit cpmac_probe(struct platform_device *pdev)
11681162
priv->msg_enable = netif_msg_init(debug_level, 0xff);
11691163
memcpy(dev->dev_addr, pdata->dev_addr, sizeof(dev->dev_addr));
11701164

1171-
priv->phy = phy_connect(dev, cpmac_mii.phy_map[phy_id]->dev.bus_id,
1165+
priv->phy = phy_connect(dev, cpmac_mii->phy_map[phy_id]->dev.bus_id,
11721166
&cpmac_adjust_link, 0, PHY_INTERFACE_MODE_MII);
11731167
if (IS_ERR(priv->phy)) {
11741168
if (netif_msg_drv(priv))
@@ -1216,11 +1210,22 @@ int __devinit cpmac_init(void)
12161210
u32 mask;
12171211
int i, res;
12181212

1219-
cpmac_mii.priv = ioremap(AR7_REGS_MDIO, 256);
1213+
cpmac_mii = mdiobus_alloc();
1214+
if (cpmac_mii == NULL)
1215+
return -ENOMEM;
1216+
1217+
cpmac_mii->name = "cpmac-mii";
1218+
cpmac_mii->read = cpmac_mdio_read;
1219+
cpmac_mii->write = cpmac_mdio_write;
1220+
cpmac_mii->reset = cpmac_mdio_reset;
1221+
cpmac_mii->irq = mii_irqs;
1222+
1223+
cpmac_mii->priv = ioremap(AR7_REGS_MDIO, 256);
12201224

1221-
if (!cpmac_mii.priv) {
1225+
if (!cpmac_mii->priv) {
12221226
printk(KERN_ERR "Can't ioremap mdio registers\n");
1223-
return -ENXIO;
1227+
res = -ENXIO;
1228+
goto fail_alloc;
12241229
}
12251230

12261231
#warning FIXME: unhardcode gpio&reset bits
@@ -1230,10 +1235,10 @@ int __devinit cpmac_init(void)
12301235
ar7_device_reset(AR7_RESET_BIT_CPMAC_HI);
12311236
ar7_device_reset(AR7_RESET_BIT_EPHY);
12321237

1233-
cpmac_mii.reset(&cpmac_mii);
1238+
cpmac_mii->reset(cpmac_mii);
12341239

12351240
for (i = 0; i < 300000; i++)
1236-
if ((mask = cpmac_read(cpmac_mii.priv, CPMAC_MDIO_ALIVE)))
1241+
if ((mask = cpmac_read(cpmac_mii->priv, CPMAC_MDIO_ALIVE)))
12371242
break;
12381243
else
12391244
cpu_relax();
@@ -1244,10 +1249,10 @@ int __devinit cpmac_init(void)
12441249
mask = 0;
12451250
}
12461251

1247-
cpmac_mii.phy_mask = ~(mask | 0x80000000);
1248-
snprintf(cpmac_mii.id, MII_BUS_ID_SIZE, "0");
1252+
cpmac_mii->phy_mask = ~(mask | 0x80000000);
1253+
snprintf(cpmac_mii->id, MII_BUS_ID_SIZE, "0");
12491254

1250-
res = mdiobus_register(&cpmac_mii);
1255+
res = mdiobus_register(cpmac_mii);
12511256
if (res)
12521257
goto fail_mii;
12531258

@@ -1258,19 +1263,23 @@ int __devinit cpmac_init(void)
12581263
return 0;
12591264

12601265
fail_cpmac:
1261-
mdiobus_unregister(&cpmac_mii);
1266+
mdiobus_unregister(cpmac_mii);
12621267

12631268
fail_mii:
1264-
iounmap(cpmac_mii.priv);
1269+
iounmap(cpmac_mii->priv);
1270+
1271+
fail_alloc:
1272+
mdiobus_free(cpmac_mii);
12651273

12661274
return res;
12671275
}
12681276

12691277
void __devexit cpmac_exit(void)
12701278
{
12711279
platform_driver_unregister(&cpmac_driver);
1272-
mdiobus_unregister(&cpmac_mii);
1273-
iounmap(cpmac_mii.priv);
1280+
mdiobus_unregister(cpmac_mii);
1281+
mdiobus_free(cpmac_mii);
1282+
iounmap(cpmac_mii->priv);
12741283
}
12751284

12761285
module_init(cpmac_init);

drivers/net/fec_mpc52xx_phy.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_i
8383
int err;
8484
int i;
8585

86-
bus = kzalloc(sizeof(*bus), GFP_KERNEL);
86+
bus = mdiobus_alloc();
8787
if (bus == NULL)
8888
return -ENOMEM;
8989
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
@@ -150,7 +150,7 @@ static int mpc52xx_fec_mdio_probe(struct of_device *of, const struct of_device_i
150150
irq_dispose_mapping(bus->irq[i]);
151151
kfree(bus->irq);
152152
kfree(priv);
153-
kfree(bus);
153+
mdiobus_free(bus);
154154

155155
return err;
156156
}
@@ -171,7 +171,7 @@ static int mpc52xx_fec_mdio_remove(struct of_device *of)
171171
irq_dispose_mapping(bus->irq[i]);
172172
kfree(priv);
173173
kfree(bus->irq);
174-
kfree(bus);
174+
mdiobus_free(bus);
175175

176176
return 0;
177177
}

drivers/net/fs_enet/mii-bitbang.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,9 @@ static int __devinit fs_enet_mdio_probe(struct of_device *ofdev,
218218
out_unmap_regs:
219219
iounmap(bitbang->dir);
220220
out_free_bus:
221-
kfree(new_bus);
222-
out_free_priv:
223221
free_mdio_bitbang(new_bus);
222+
out_free_priv:
223+
kfree(bitbang);
224224
out:
225225
return ret;
226226
}
@@ -231,12 +231,11 @@ static int fs_enet_mdio_remove(struct of_device *ofdev)
231231
struct bb_info *bitbang = bus->priv;
232232

233233
mdiobus_unregister(bus);
234-
free_mdio_bitbang(bus);
235234
dev_set_drvdata(&ofdev->dev, NULL);
236235
kfree(bus->irq);
236+
free_mdio_bitbang(bus);
237237
iounmap(bitbang->dir);
238238
kfree(bitbang);
239-
kfree(bus);
240239

241240
return 0;
242241
}

drivers/net/fs_enet/mii-fec.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ static int __devinit fs_enet_mdio_probe(struct of_device *ofdev,
128128
struct fec_info *fec;
129129
int ret = -ENOMEM, i;
130130

131-
new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
131+
new_bus = mdiobus_alloc();
132132
if (!new_bus)
133133
goto out;
134134

@@ -190,7 +190,7 @@ static int __devinit fs_enet_mdio_probe(struct of_device *ofdev,
190190
out_fec:
191191
kfree(fec);
192192
out_mii:
193-
kfree(new_bus);
193+
mdiobus_free(new_bus);
194194
out:
195195
return ret;
196196
}
@@ -205,7 +205,7 @@ static int fs_enet_mdio_remove(struct of_device *ofdev)
205205
kfree(bus->irq);
206206
iounmap(fec->fecp);
207207
kfree(fec);
208-
kfree(bus);
208+
mdiobus_free(bus);
209209

210210
return 0;
211211
}

0 commit comments

Comments
 (0)