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.

DP83867IR: Unable to write to registers above 31 (0x1f) using Intel FPGA triple-speed-ethernet MAC module using MDIO indirect access.

Part Number: DP83867IR

i am unable to write to registers above 31 (0x1f) using Intel FPGA triple-speed-ethernet MAC module using MDIO indirect access. i can read/write to registers below 31.

the design engineer did not strap the device at all assuming all configuration can be done via MDIO.

Are there any straps mandatory for MDIO to  access all registers ?

Sample code below:

IOWR_ALTERA_TSEMAC_MDIO_ADDR0(tseMAC, 0x0a);

// MMD=0x01, register=0x6f, data=0xdd0b
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x001f); // Reg Addr
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x8000); // Reg value

IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f);
reg_status = IORD_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x001f);
printf("PHY Addr: 0x001f, Reg: 0x%x.\n", reg_status);

// MMD=0x01, register=0x6f, data=0xdd0b
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f); // Dev Addr
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x0000); // Reg Addr
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f); //
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x0140); // Reg value

IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x0000);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f);
reg_status = IORD_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0000);
printf("PHY Addr: 0x0000, Reg: 0x%x.\n", reg_status);

IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x0032); // Reg Addr
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x401f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x00D3); // Reg value

IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x0032);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x401f);
reg_status = IORD_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0032);
printf("PHY Addr: 0x0032, Reg: 0x%x.\n", reg_status);

// MMD=0x01, register=0x6f, data=0xdd0b
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x001f); // Reg Addr
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x401f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x4000); // Reg value

IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0e, 0x001f);
IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x0d, 0x401f);
reg_status = IORD_ALTERA_TSEMAC_MDIO(tseMAC, 1, 0x001f);
printf("PHY Addr: 0x001f, Reg: 0x%x.\n", reg_status);

  • Please change below

    / MMD=0x01, register=0x6f, data=0xdd0b
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f); // Dev Addr
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x0000); // Reg Addr
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f); //
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x0140); // Reg value

    to 

     / MMD=0x01, register=0x6f, data=0xdd0b
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x001f); // Dev Addr
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0x006F); // Reg Addr
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0d, 0x401f); //
    IOWR_ALTERA_TSEMAC_MDIO(tseMAC, 0, 0x0e, 0xDD0B); // Reg value

    Regards,
    Geet

  • Hi,

    I am closing this thread. Incase you need further assistance, kindly open new thread and provide reference to this thread.

    Regards,

    Geet