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

bgmac: register MII bus

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Rafał Miłecki and committed by
David S. Miller
11e5e76e c7bb15a6

+80 -1
+79 -1
drivers/net/ethernet/broadcom/bgmac.c
··· 13 13 #include <linux/delay.h> 14 14 #include <linux/etherdevice.h> 15 15 #include <linux/mii.h> 16 + #include <linux/phy.h> 16 17 #include <linux/interrupt.h> 17 18 #include <linux/dma-mapping.h> 18 19 #include <bcm47xx_nvram.h> ··· 1314 1313 }; 1315 1314 1316 1315 /************************************************** 1316 + * MII 1317 + **************************************************/ 1318 + 1319 + static int bgmac_mii_read(struct mii_bus *bus, int mii_id, int regnum) 1320 + { 1321 + return bgmac_phy_read(bus->priv, mii_id, regnum); 1322 + } 1323 + 1324 + static int bgmac_mii_write(struct mii_bus *bus, int mii_id, int regnum, 1325 + u16 value) 1326 + { 1327 + return bgmac_phy_write(bus->priv, mii_id, regnum, value); 1328 + } 1329 + 1330 + static int bgmac_mii_register(struct bgmac *bgmac) 1331 + { 1332 + struct mii_bus *mii_bus; 1333 + int i, err = 0; 1334 + 1335 + mii_bus = mdiobus_alloc(); 1336 + if (!mii_bus) 1337 + return -ENOMEM; 1338 + 1339 + mii_bus->name = "bgmac mii bus"; 1340 + sprintf(mii_bus->id, "%s-%d-%d", "bgmac", bgmac->core->bus->num, 1341 + bgmac->core->core_unit); 1342 + mii_bus->priv = bgmac; 1343 + mii_bus->read = bgmac_mii_read; 1344 + mii_bus->write = bgmac_mii_write; 1345 + mii_bus->parent = &bgmac->core->dev; 1346 + mii_bus->phy_mask = ~(1 << bgmac->phyaddr); 1347 + 1348 + mii_bus->irq = kmalloc_array(PHY_MAX_ADDR, sizeof(int), GFP_KERNEL); 1349 + if (!mii_bus->irq) { 1350 + err = -ENOMEM; 1351 + goto err_free_bus; 1352 + } 1353 + for (i = 0; i < PHY_MAX_ADDR; i++) 1354 + mii_bus->irq[i] = PHY_POLL; 1355 + 1356 + err = mdiobus_register(mii_bus); 1357 + if (err) { 1358 + bgmac_err(bgmac, "Registration of mii bus failed\n"); 1359 + goto err_free_irq; 1360 + } 1361 + 1362 + bgmac->mii_bus = mii_bus; 1363 + 1364 + return err; 1365 + 1366 + err_free_irq: 1367 + kfree(mii_bus->irq); 1368 + err_free_bus: 1369 + mdiobus_free(mii_bus); 1370 + return err; 1371 + } 1372 + 1373 + static void bgmac_mii_unregister(struct bgmac *bgmac) 1374 + { 1375 + struct mii_bus *mii_bus = bgmac->mii_bus; 1376 + 1377 + mdiobus_unregister(mii_bus); 1378 + kfree(mii_bus->irq); 1379 + mdiobus_free(mii_bus); 1380 + } 1381 + 1382 + /************************************************** 1317 1383 * BCMA bus ops 1318 1384 **************************************************/ 1319 1385 ··· 1472 1404 if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM) 1473 1405 bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); 1474 1406 1407 + err = bgmac_mii_register(bgmac); 1408 + if (err) { 1409 + bgmac_err(bgmac, "Cannot register MDIO\n"); 1410 + err = -ENOTSUPP; 1411 + goto err_dma_free; 1412 + } 1413 + 1475 1414 err = register_netdev(bgmac->net_dev); 1476 1415 if (err) { 1477 1416 bgmac_err(bgmac, "Cannot register net device\n"); 1478 1417 err = -ENOTSUPP; 1479 - goto err_dma_free; 1418 + goto err_mii_unregister; 1480 1419 } 1481 1420 1482 1421 netif_carrier_off(net_dev); ··· 1492 1417 1493 1418 return 0; 1494 1419 1420 + err_mii_unregister: 1421 + bgmac_mii_unregister(bgmac); 1495 1422 err_dma_free: 1496 1423 bgmac_dma_free(bgmac); 1497 1424 ··· 1510 1433 1511 1434 netif_napi_del(&bgmac->napi); 1512 1435 unregister_netdev(bgmac->net_dev); 1436 + bgmac_mii_unregister(bgmac); 1513 1437 bgmac_dma_free(bgmac); 1514 1438 bcma_set_drvdata(core, NULL); 1515 1439 free_netdev(bgmac->net_dev);
+1
drivers/net/ethernet/broadcom/bgmac.h
··· 399 399 struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */ 400 400 struct net_device *net_dev; 401 401 struct napi_struct napi; 402 + struct mii_bus *mii_bus; 402 403 403 404 /* DMA */ 404 405 struct bgmac_dma_ring tx_ring[BGMAC_MAX_TX_RINGS];