Ben,

I have a specific question on the way we handle phy address
in SPEAr.
>> +
>> +static u8 find_phy(struct eth_device *dev)
>> +{
>> +    u8 phy_addr = 0;
>> +    u16 ctrl, oldctrl;
>> +
>> +    do {
>> +            eth_mdio_read(dev, phy_addr, PHY_BMCR,&ctrl);
>> +            oldctrl = ctrl&  PHY_BMCR_AUTON;
>> +
>> +            ctrl ^= PHY_BMCR_AUTON;
>> +            eth_mdio_write(dev, phy_addr, PHY_BMCR, ctrl);
>> +            eth_mdio_read(dev, phy_addr, PHY_BMCR,&ctrl);
>> +            ctrl&= PHY_BMCR_AUTON;
>> +
>> +            if (ctrl == oldctrl) {
>> +                    phy_addr++;
>> +            } else {
>> +                    ctrl ^= PHY_BMCR_AUTON;
>> +                    eth_mdio_write(dev, phy_addr, PHY_BMCR, ctrl);
>> +                    break;
>> +            }
>> +    } while (phy_addr<  32);
>> +
>> +    return phy_addr;
>> +}
>> +
>>     
As you can see we use an auto-probing mechanism implemented as find_phy()
routine. This auto-probing is also used in other cases, like the
drivers/net/mcfmii.c (mii_discover_phy()).

Actually I'm not sure this auto-probing mechanism is correct, as it 
works only
in case (very used) in which the MAC-PHY are in 1:1 relationship.

Instead, the MDIO bus nature implies that there might be N MACs and M 
PHYs connected
to the bus, so the auto-probing would not work.

See here some comments on the same:
http://lists.ozlabs.org/pipermail/devicetree-discuss/2010-February/001670.html


In our PCB we have the 1:1 relationship, but since the dw_eth.c driver 
is generic, it
might be used on differently designed pcb.

What is your general opinion in that?
Should we implement it differently?

Regards,
Arm
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to