This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

66AK2H14: Issue using XFI MDIO with 88X3310P

Part Number: 66AK2H14

We connected XFI MDIO with the Marvell 88X3310P but we experienced the same issues read in the related thread. We need an answer to the last question posted that I quote:

"I understand we have not verified SW for XFI MDIO, but what I want to check with you is the HW design guide for XFI MDIO and you can confirm if our 66AK2H14 device is compliance on XFI MDIO although SW is not verified.
i.e. I want to check if XFI MDIO compliance PHY like Marvell's 88x3310 can be connected to 66AK2H14, and how it should be connected.
I need to provide our recommended HW configuration to customer for XFI MDIO at least because it seemed Marvell's 88x3310 is only support XFI MDIO."

Thanks in advance

Fabrizio R.

  • Hi, Fabrizio,

    Hardware-wise, XFI MDIO works for either clause 22 or clause 45 phy, but not connecting both on the same MDIO. 

    For software, pleaes refer to https://e2e.ti.com/support/processors/f/791/t/541869  and in the post, it also refer to https://e2e.ti.com/support/processors/f/791/p/426016/1521977#pi316458=1

    Rex

  • Hi all,

        on  "KeyStone II Architecture 10 Gigabit Ethernet Subsystem" (spruhj5.pdf 2013) the MDI module has "only" the follow registers, the MDIO_CONTROL is the alone used for its configuration (the others are used for communication, interrupt, link state flag, etc):

    Below its description :

    Not exist any bit usable to configure C45/C22 protocol.
    Then I suppose the module is automatically use the correct protocol (I think is nor really).
    Or some other register/bit is usable for force C45 configuration?

    Other possibility I not use the latest version, or exist other doc.

    Regards,
    Dario

  • Hi, Dario,

    sorry for the slow response. I'll need to dig the code a bit.

    By looking at the driver of/of_mdio.c code, shouldn't it be in the phy register and configured in dts as compatible to "ethernet-phy-ieee802.3-c45"?

    static int of_mdiobus_register_phy(struct mii_bus *mdio, struct device_node *child,
    u32 addr)
    {
    struct phy_device *phy;
    bool is_c45;
    int rc;
    u32 phy_id;

    is_c45 = of_device_is_compatible(child,
    "ethernet-phy-ieee802.3-c45");

    if (!is_c45 && !of_get_phy_id(child, &phy_id))
    phy = phy_device_create(mdio, addr, phy_id, 0, NULL);
    else
    phy = get_phy_device(mdio, addr, is_c45);
    if (!phy || IS_ERR(phy))
    return 1;

    Rex

  • Hi Rex,

        the basic problem is that not exists (seems) any register (or bit) in MDIO module configuration to
    be used to configure C45 protocol (the bus start sequence and op sequence are bit differents in C22
    and C45, then any devices that use C45 cannot be used with TI MDIO module).
    The Marvel 88X3310 used in C22 mode seems has only two registers (13 and 14) to use to access in
    "indirect" mode at C45 internal registers (see marvell10g.c).

    State update:

    In linux code (phy_core.c) exist a couple of functions able to execute this sequences. The functions
    are called phy_write_mmd and phy_read_mmd, the problem is that functions use a triple if/else
    construct nidified that selects the device procedure in C45 configuration and these functions are not
    used in phydev library:

        if (phydev->drv->read_mmd) {
            val = phydev->drv->read_mmd(phydev, devad, regnum);
        } else if (phydev->is_c45) {
            u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff);

            val = mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, addr);
        } else {
            struct mii_bus *bus = phydev->mdio.bus;
            int phy_addr = phydev->mdio.addr;

            mutex_lock(&bus->mdio_lock);
            mmd_phy_indirect(bus, phy_addr, devad, regnum);

            /* Read the content of the MMD's selected register */else {
            struct mii_bus *bus = phydev->mdio.bus;
            int phy_addr = phydev->mdio.addr;

            mutex_lock(&bus->mdio_lock);
            mmd_phy_indirect(bus, phy_addr, devad, regnum);

            /* Read the content of the MMD's selected register */
            val = bus->read(bus, phy_addr, MII_MMD_DATA);
            mutex_unlock(&bus->mdio_lock);

            val = bus->read(bus, phy_addr, MII_MMD_DATA);
            mutex_unlock(&bus->mdio_lock);
        }

    for the moment if I configure "ethernet-phy-ieee802.3-c45" in the device tree the highlighted
    code section is not reached.

    Today I have disabled the first two if in previous code and I have changed some functions inphydev
    library as follow:

    #define PHY_ID_MASK 0x1F
    #define PHY_REG_MASK 0x1F
    #define MMD_ACC_CTRL_REG      13
    #define MMD_ACC_ADDR_DATA_REG 14
    // pag 94 88X3310 Datasheet
    #define MMD_ADDR              0x00
    #define MMD_DATA_NOINCR       0x01

    static int mdiobus_read_innodesi(struct mii_bus *bus, int phy_id, int devAddr, int phy_reg)
    {
         int ret;

    printk("%s@%d:*** Called phy_id=%02X devAddr=%d phy_reg=%04X***\n",
           __func__, __LINE__, phy_id, devAddr, phy_reg);

       mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_CTRL_REG, ((MMD_ADDR << 14) | (devAddr&0x1f)));
       mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_ADDR_DATA_REG, phy_reg & PHY_REG_MASK);
       mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_CTRL_REG, ((MMD_DATA_NOINCR << 14) | (devAddr&0x1f)));
       ret = mdiobus_read(bus, phy_id & PHY_ID_MASK, MMD_ACC_ADDR_DATA_REG);

       return ret;
    }

    static int mdiobus_write_innodesi(struct mii_bus *bus, int phy_id, int phy_reg, int devAddr, u16 data)
    {
       int ret;

    printk("%s@%d:*** Called phy_id=%02X  devAddr=%d phy_reg=%04X data=0x%X***\n",
           __func__, __LINE__, phy_id, devAddr, phy_reg, data);

       ret  = mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_CTRL_REG, ((MMD_ADDR << 14) | (devAddr&0x1f)));
       ret |= mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_ADDR_DATA_REG, phy_reg & PHY_REG_MASK);
       ret |= mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_CTRL_REG, ((MMD_DATA_NOINCR << 14) | (devAddr&0x1f)));
       ret |= mdiobus_write(bus, phy_id & PHY_ID_MASK, MMD_ACC_ADDR_DATA_REG, data);

       return ret;
    }

    static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr,
                       u32 *devices_in_package)
    {
        int phy_reg, reg_addr;

    phy_reg = mdiobus_read_innodesi(bus, addr, dev_addr, MDIO_DEVS2);
    if (phy_reg < 0)
        return  -EIO;
    *devices_in_package = (phy_reg & 0xffff) << 16;

    phy_reg = mdiobus_read_innodesi(bus, addr, dev_addr, MDIO_DEVS1);
    if (phy_reg <0)
        return  -EIO;

    *devices_in_package |= (phy_reg & 0xffff);
    return  0;

    // original code

        reg_addr = MII_ADDR_C45 | dev_addr << 16 | MDIO_DEVS2;
        phy_reg = mdiobus_read(bus, addr, reg_addr);
        if (phy_reg < 0)
            return -EIO;
        *devices_in_package = (phy_reg & 0xffff) << 16;

        reg_addr = MII_ADDR_C45 | dev_addr << 16 | MDIO_DEVS1;
        phy_reg = mdiobus_read(bus, addr, reg_addr);
        if (phy_reg < 0)
            return -EIO;
        *devices_in_package |= (phy_reg & 0xffff);

        return 0;
    }
    #endif


    static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
                   struct phy_c45_device_ids *c45_ids) {
        int phy_reg;
        int i, reg_addr;
        const int num_ids = ARRAY_SIZE(c45_ids->device_ids);
        u32 *devs = &c45_ids->devices_in_package;

    printk("%s@%d: *****called\n",__func__, __LINE__);

        /* Find first non-zero Devices In package. Device zero is reserved
         * for 802.3 c45 complied PHYs, so don't probe it at first.
         */
        for (i = 1; i < num_ids && *devs == 0; i++) {
            phy_reg = get_phy_c45_devs_in_pkg(bus, addr, i, devs);
            if (phy_reg < 0)
    {
    printk("%s@%d: *****failed Exit\n",__func__, __LINE__);
                return -EIO;
    }

            if ((*devs & 0x1fffffff) == 0x1fffffff) {
                /*  If mostly Fs, there is no device there,
                 *  then let's continue to probe more, as some
                 *  10G PHYs have zero Devices In package,
                 *  e.g. Cortina CS4315/CS4340 PHY.
                 */
                phy_reg = get_phy_c45_devs_in_pkg(bus, addr, 0, devs);
                if (phy_reg < 0)
    {
    printk("%s@%d: *****error Exit\n",__func__, __LINE__);
                    return -EIO;
    }
                /* no device there, let's get out of here */
                if ((*devs & 0x1fffffff) == 0x1fffffff) {
                    *phy_id = 0xffffffff;
    printk("%s@%d: *****Nodevice Exit\n",__func__, __LINE__);
                    return 0;
                } else {
                    break;
                }
            }
        }

        /* Now probe Device Identifiers for each device present. */
        for (i = 1; i < num_ids; i++) {
            if (!(c45_ids->devices_in_package & (1 << i)))
                continue;
            /*
            reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1;
            phy_reg = mdiobus_read(bus, addr, reg_addr);
            */
    phy_reg = mdiobus_read_innodesi(bus, addr, i, MII_PHYSID1);
            if (phy_reg < 0)
    {
    printk("%s@%d: *****failed2 Exit\n",__func__, __LINE__);
                return -EIO;
    }

            c45_ids->device_ids[i] = (phy_reg & 0xffff) << 16;
    /*      reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2;
            phy_reg = mdiobus_read(bus, addr, reg_addr);*/
    phy_reg = mdiobus_read_innodesi(bus, addr, i, MII_PHYSID2);
            if (phy_reg < 0)
    {
    printk("%s@%d: *****Exit\n",__func__, __LINE__);
                return -EIO;
    }
            c45_ids->device_ids[i] |= (phy_reg & 0xffff);
    printk("%s@%d: *****OK found %X\n",__func__, __LINE__, c45_ids->device_ids[i]);
        }
        *phy_id = 0;
        return 0;
    }

    Follows the linux log:

    [   11.174410] davinci_mdio_reset@160: Called
    [   11.219135] davinci_mdio 2f00500.mdio: davinci mdio revision 1.5, bus freq 2500000
    [   11.219139] libphy: 2f00500.mdio: probed
    [   11.219146] get_phy_device@862: ************Called addr=0*******
    [   11.219148] get_phy_id@800: *****Called isc45=y
    [   11.219150] get_phy_c45_ids@700: *****called
    [   11.219153] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=1 phy_reg=0006***
    [   11.219156] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.219346] mdiobus_write@636: *****info write reg=d addr=0 val=1 err=0
    [   11.219349] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.219562] mdiobus_write@636: *****info write reg=e addr=0 val=6 err=0
    [   11.219565] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.222677] mdiobus_write@636: *****info write reg=d addr=0 val=4001 err=0
    [   11.222681] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.222894] mdiobus_read@570: *****info read reg=e addr=0 ret=0
    [   11.222897] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=1 phy_reg=0005***
    [   11.222900] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.223114] mdiobus_write@636: *****info write reg=d addr=0 val=1 err=0
    [   11.223117] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.223330] mdiobus_write@636: *****info write reg=e addr=0 val=5 err=0
    [   11.223333] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.223545] mdiobus_write@636: *****info write reg=d addr=0 val=4001 err=0
    [   11.223549] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.223761] mdiobus_read@570: *****info read reg=e addr=0 ret=6
    [   11.223764] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=1 phy_reg=0002***
    [   11.223767] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.223980] mdiobus_write@636: *****info write reg=d addr=0 val=1 err=0
    [   11.223983] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.224195] mdiobus_write@636: *****info write reg=e addr=0 val=2 err=0
    [   11.224198] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.224411] mdiobus_write@636: *****info write reg=d addr=0 val=4001 err=0
    [   11.224414] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.224627] mdiobus_read@570: *****info read reg=e addr=0 ret=5
    [   11.224630] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=1 phy_reg=0003***
    [   11.224632] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.224844] mdiobus_write@636: *****info write reg=d addr=0 val=1 err=0
    [   11.224847] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.225060] mdiobus_write@636: *****info write reg=e addr=0 val=3 err=0
    [   11.225063] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.225276] mdiobus_write@636: *****info write reg=d addr=0 val=4001 err=0
    [   11.225279] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.225493] mdiobus_read@570: *****info read reg=e addr=0 ret=2
    [   11.225495] get_phy_c45_ids@769: *****OK found 50002
    [   11.225498] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=2 phy_reg=0002***
    [   11.225500] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.225713] mdiobus_write@636: *****info write reg=d addr=0 val=2 err=0
    [   11.225716] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.225928] mdiobus_write@636: *****info write reg=e addr=0 val=2 err=0
    [   11.225931] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.226142] mdiobus_write@636: *****info write reg=d addr=0 val=4002 err=0
    [   11.226146] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.226358] mdiobus_read@570: *****info read reg=e addr=0 ret=0
    [   11.226361] mdiobus_read_innodesi@597:*** Called phy_id=00 devAddr=2 phy_reg=0003***
    [   11.226364] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.226576] mdiobus_write@636: *****info write reg=d addr=0 val=2 err=0
    [   11.226579] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.226793] mdiobus_write@636: *****info write reg=e addr=0 val=3 err=0
    [   11.226797] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=0 ***
    [   11.227009] mdiobus_write@636: *****info write reg=d addr=0 val=4002 err=0
    [   11.227012] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=0 ***
    [   11.227226] mdiobus_read@570: *****info read reg=e addr=0 ret=0
    [   11.227228] get_phy_c45_ids@769: *****OK found 0
    [   11.227230] get_phy_device@872: *****Request for phy_id=0
    [   11.227233] phy_device_create@412: *****Search phyId=0 is_c45=YES
    [   11.240853] get_phy_device@862: ************Called addr=1C*******
    [   11.240855] get_phy_id@800: *****Called isc45=y
    [   11.240857] get_phy_c45_ids@700: *****called
    [   11.240860] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=1 phy_reg=0006***
    [   11.240864] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.242701] mdiobus_write@636: *****info write reg=d addr=1c val=1 err=0
    [   11.242705] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.242919] mdiobus_write@636: *****info write reg=e addr=1c val=6 err=0
    [   11.242923] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.243136] mdiobus_write@636: *****info write reg=d addr=1c val=4001 err=0
    [   11.243139] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.243353] mdiobus_read@570: *****info read reg=e addr=1c ret=0
    [   11.243356] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=1 phy_reg=0005***
    [   11.243359] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.243572] mdiobus_write@636: *****info write reg=d addr=1c val=1 err=0
    [   11.243575] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.243790] mdiobus_write@636: *****info write reg=e addr=1c val=5 err=0
    [   11.243793] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.244006] mdiobus_write@636: *****info write reg=d addr=1c val=4001 err=0
    [   11.244009] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.244224] mdiobus_read@570: *****info read reg=e addr=1c ret=8a
    [   11.244227] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=1 phy_reg=0002***
    [   11.244230] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.244444] mdiobus_write@636: *****info write reg=d addr=1c val=1 err=0
    [   11.244447] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.244662] mdiobus_write@636: *****info write reg=e addr=1c val=2 err=0
    [   11.244665] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.244879] mdiobus_write@636: *****info write reg=d addr=1c val=4001 err=0
    [   11.244882] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.245097] mdiobus_read@570: *****info read reg=e addr=1c ret=5
    [   11.245100] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=1 phy_reg=0003***
    [   11.245103] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.245317] mdiobus_write@636: *****info write reg=d addr=1c val=1 err=0
    [   11.245320] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.245534] mdiobus_write@636: *****info write reg=e addr=1c val=3 err=0
    [   11.245537] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.245751] mdiobus_write@636: *****info write reg=d addr=1c val=4001 err=0
    [   11.245754] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.245968] mdiobus_read@570: *****info read reg=e addr=1c ret=2
    [   11.245970] get_phy_c45_ids@769: *****OK found 50002
    [   11.245973] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=3 phy_reg=0002***
    [   11.245976] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.246190] mdiobus_write@636: *****info write reg=d addr=1c val=3 err=0
    [   11.246193] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.246406] mdiobus_write@636: *****info write reg=e addr=1c val=2 err=0
    [   11.246409] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.246623] mdiobus_write@636: *****info write reg=d addr=1c val=4003 err=0
    [   11.246627] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.246840] mdiobus_read@570: *****info read reg=e addr=1c ret=0
    [   11.246843] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=3 phy_reg=0003***
    [   11.246846] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.247059] mdiobus_write@636: *****info write reg=d addr=1c val=3 err=0
    [   11.247061] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.247274] mdiobus_write@636: *****info write reg=e addr=1c val=3 err=0
    [   11.247277] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.247491] mdiobus_write@636: *****info write reg=d addr=1c val=4003 err=0
    [   11.247494] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.247707] mdiobus_read@570: *****info read reg=e addr=1c ret=2
    [   11.247709] get_phy_c45_ids@769: *****OK found 2
    [   11.247712] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=7 phy_reg=0002***
    [   11.247715] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.247927] mdiobus_write@636: *****info write reg=d addr=1c val=7 err=0
    [   11.247930] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.248144] mdiobus_write@636: *****info write reg=e addr=1c val=2 err=0
    [   11.248147] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.248361] mdiobus_write@636: *****info write reg=d addr=1c val=4007 err=0
    [   11.248364] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.248578] mdiobus_read@570: *****info read reg=e addr=1c ret=0
    [   11.248581] mdiobus_read_innodesi@597:*** Called phy_id=1C devAddr=7 phy_reg=0003***
    [   11.248584] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.248797] mdiobus_write@636: *****info write reg=d addr=1c val=7 err=0
    [   11.248800] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.249013] mdiobus_write@636: *****info write reg=e addr=1c val=3 err=0
    [   11.249016] davinci_mdio_write@335:*** Called ver=70105 phy_reg=0000000D phy_id=28 ***
    [   11.249229] mdiobus_write@636: *****info write reg=d addr=1c val=4007 err=0
    [   11.249232] davinci_mdio_read@287:*** Called ver=70105 phy_reg=0000000E phy_id=28 ***
    [   11.255378] mdiobus_read@570: *****info read reg=e addr=1c ret=2
    [   11.255381] get_phy_c45_ids@769: *****OK found 2
    [   11.255383] get_phy_device@872: *****Request for phy_id=0
    [   11.255388] phy_device_create@412: *****Search phyId=0 is_c45=YES
    [   11.268604] mdiobus_get_phy@74: *****Called
    [   11.268610] davinci_mdio 2f00500.mdio: phy[0]: device 2f00500.mdio:00, phy_id=00000000 driver unknown
    [   11.268612] mdiobus_get_phy@74: *****Called
    [   11.268614] mdiobus_get_phy@74: *****Called
    [   11.268616] mdiobus_get_phy@74: *****Called
    [   11.268618] mdiobus_get_phy@74: *****Called
    [   11.268619] mdiobus_get_phy@74: *****Called
    [   11.268620] mdiobus_get_phy@74: *****Called
    [   11.268622] mdiobus_get_phy@74: *****Called
    [   11.268623] mdiobus_get_phy@74: *****Called
    [   11.268625] mdiobus_get_phy@74: *****Called
    [   11.268626] mdiobus_get_phy@74: *****Called
    [   11.268628] mdiobus_get_phy@74: *****Called
    [   11.268629] mdiobus_get_phy@74: *****Called
    [   11.268630] mdiobus_get_phy@74: *****Called
    [   11.268632] mdiobus_get_phy@74: *****Called
    [   11.268633] mdiobus_get_phy@74: *****Called
    [   11.268635] mdiobus_get_phy@74: *****Called
    [   11.268636] mdiobus_get_phy@74: *****Called
    [   11.268637] mdiobus_get_phy@74: *****Called
    [   11.268639] mdiobus_get_phy@74: *****Called
    [   11.268640] mdiobus_get_phy@74: *****Called
    [   11.268642] mdiobus_get_phy@74: *****Called
    [   11.268643] mdiobus_get_phy@74: *****Called
    [   11.268644] mdiobus_get_phy@74: *****Called
    [   11.268646] mdiobus_get_phy@74: *****Called
    [   11.268647] mdiobus_get_phy@74: *****Called
    [   11.268649] mdiobus_get_phy@74: *****Called
    [   11.268650] mdiobus_get_phy@74: *****Called
    [   11.268652] mdiobus_get_phy@74: *****Called
    [   11.268656] davinci_mdio 2f00500.mdio: phy[28]: device 2f00500.mdio:1c, phy_id=00000000 driver unknown

    Seems that are no data read from XMDIO bus. The problem can be in TI MDIO module
    or/and in Marvell side (we are waiting to involve their support).

    To assured me that the XMDIO block work that I have created a gel file to send simple
    MDIO commands, but this bus is shared with link status supervision round robin, I
    have used a simple state analyzer but we can't see any write sequence becouse the
    status polling fill our buffer....
    This HW debugger is not easy.

    PS: the gel file works well on 1GbEth MDIO bus that use C 22 standard protocol, on
    XMDIO I use the indirect access, but it fail.

    Regards,
    Dario

  • Hi, Dario,

    As earlier mentioned, TI has not use XFI MDIO for the PHY on the BoC. The PHY selected on the BoC uses retimer which does not require MDIO. From very old code, I see the following in the dts. Since retimer doesn't use mdio. It may not be tested. 

    mdiox0: mdiox {
    compatible = "virtual,mdio-gpio";
    #address-cells = <1>;
    #size-cells = <0>;
    status = "disabled";
    gpios = <&gpio0 2 0x2 /* mdc */
    &gpio0 0 0x2>; /* mdio */

    phyx0: phyx@0 {
    compatible = "Marvell,88x2242", "ethernet-phy-ieee802.3-c45";
    reg = <0>;
    };
    phyx1: phyx@1 {
    compatible = "Marvell,88x2242", "ethernet-phy-ieee802.3-c45";
    reg = <1>;
    };
    };

    Rex