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 <j...@openwrt.org>
---
 drivers/net/ethernet/marvell/mv643xx_eth.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c 
b/drivers/net/ethernet/marvell/mv643xx_eth.c
index 6495bea..c35db73 100644
--- 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_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;
 
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to