net: mv643xx_eth: do not use port number as platform device id
authorJonas Gorski <jogo@openwrt.org>
Sun, 7 Jul 2013 22:44:55 +0000 (00:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Jul 2013 19:51:47 +0000 (12:51 -0700)
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 <jogo@openwrt.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mv643xx_eth.c

index 6495bea56ec84a8f6fc121cb2f2a8e03e3ab7771..c35db735958f76c024123f6401d09984a03755dc 100644 (file)
@@ -2483,6 +2483,7 @@ static int mv643xx_eth_shared_of_add_port(struct platform_device *pdev,
        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_port(struct platform_device *pdev,
                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_port(struct platform_device *pdev,
                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_port(struct platform_device *pdev,
        if (ret)
                goto port_err;
 
-       port_platdev[ppd.port_number] = ppdev;
+       port_platdev[dev_num] = ppdev;
 
        return 0;