From dc4eff91629aa5132f9c0737ef6d9ef013d4f8ce Mon Sep 17 00:00:00 2001 From: Jonas Gorski Date: Mon, 8 Jul 2013 00:44:55 +0200 Subject: [PATCH 29/29] net: mv643xx_eth: do not use port number as platform device id The port number is only local to the ethernet block, not global, so there can be two ethernet blocks both using the same port, like kirkwood with both using port 0. Fix this by using the array index offset for the allocated platform devices as the id. Signed-off-by: Jonas Gorski Signed-off-by: David S. Miller --- drivers/net/ethernet/marvell/mv643xx_eth.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c @@ -2483,6 +2483,7 @@ static int mv643xx_eth_shared_of_add_por struct resource res; const char *mac_addr; int ret; + int dev_num = 0; memset(&ppd, 0, sizeof(ppd)); ppd.shared = pdev; @@ -2503,6 +2504,14 @@ static int mv643xx_eth_shared_of_add_por return -EINVAL; } + while (dev_num < 3 && port_platdev[dev_num]) + dev_num++; + + if (dev_num == 3) { + dev_err(&pdev->dev, "too many ports registered\n"); + return -EINVAL; + } + mac_addr = of_get_mac_address(pnp); if (mac_addr) memcpy(ppd.mac_addr, mac_addr, 6); @@ -2521,7 +2530,7 @@ static int mv643xx_eth_shared_of_add_por of_property_read_u32(pnp, "duplex", &ppd.duplex); } - ppdev = platform_device_alloc(MV643XX_ETH_NAME, ppd.port_number); + ppdev = platform_device_alloc(MV643XX_ETH_NAME, dev_num); if (!ppdev) return -ENOMEM; ppdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); @@ -2538,7 +2547,7 @@ static int mv643xx_eth_shared_of_add_por if (ret) goto port_err; - port_platdev[ppd.port_number] = ppdev; + port_platdev[dev_num] = ppdev; return 0;