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: Ethernet Link is not up with AM335x

Part Number: DP83867IR

Hi Guys,

I am using AM335x Processor. I am interfacing it with DP83867IRR Ethernet IC. I have enabled the driver in kernel.

The PHY ID is configured as 0;

#
# MII PHY device drivers
#
CONFIG_AT803X_PHY=y
CONFIG_AMD_PHY=y
CONFIG_MARVELL_PHY=y
CONFIG_DAVICOM_PHY=y
CONFIG_QSEMI_PHY=y
CONFIG_LXT_PHY=y
CONFIG_CICADA_PHY=y
CONFIG_VITESSE_PHY=y
CONFIG_SMSC_PHY=y
CONFIG_BROADCOM_PHY=y
CONFIG_BCM7XXX_PHY=y
CONFIG_BCM87XX_PHY=y
CONFIG_ICPLUS_PHY=y
CONFIG_REALTEK_PHY=y
CONFIG_NATIONAL_PHY=y
CONFIG_STE10XP=y
CONFIG_LSI_ET1011C_PHY=y
CONFIG_MICREL_PHY=y
CONFIG_DP83848_PHY=y
CONFIG_DP83867_PHY=y
CONFIG_FIXED_PHY=y
CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_GPIO=y
CONFIG_MDIO_BUS_MUX=y
CONFIG_MDIO_BUS_MUX_GPIO=y
CONFIG_MDIO_BUS_MUX_MMIOREG=y
CONFIG_MDIO_BCM_UNIMAC=y
# CONFIG_MICREL_KS8995MA is not set
# CONFIG_PLIP is not set

I have configured the DTS file as follows

&davinci_mdio {
    pinctrl-names = "default", "sleep";
    compatible = "ti,cpsw-mdio", "ti,davinci_mdio";
    pinctrl-0 = <&davinci_mdio_default>;
    pinctrl-1 = <&davinci_mdio_sleep>;
    status = "okay";

    dp83867_0: ethernet-phy@0 {
        reg = <0>;
        ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_25_NS>;
        ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_75_NS>;
        ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
        ti,min-output-impedance;
        ti,dp83867-rxctrl-strap-quirk;
    };
};


&cpsw_emac1 {
    phy_id = <&davinci_mdio>, <0>;
    phy-mode = "rgmii-txid";
};

The Pin Mux is as follows

cpsw_default: cpsw_default {
		pinctrl-single,pins = <
			/* Slave 1 */
			0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txen.rgmii1_tctl */
			0x118 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxdv.rgmii1_rctl */
			0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd3.rgmii1_td3 */
			0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd2.rgmii1_td2 */
			0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd1.rgmii1_td1 */
			0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE2)	/* mii1_txd0.rgmii1_td0 */
			0x12c (PIN_OUTPUT | MUX_MODE2)	/* mii1_txclk.rgmii1_tclk */
			0x130 (PIN_INPUT | MUX_MODE2)	/* mii1_rxclk.rgmii1_rclk */
			0x134 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd3.rgmii1_rd3 */
			0x138 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd2.rgmii1_rd2 */
			0x13c (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd1.rgmii1_rd1 */
			0x140 (PIN_INPUT_PULLDOWN | MUX_MODE2)	/* mii1_rxd0.rgmii1_rd0 */
		>;
	};

If I boot it shows the following during boot-up

[   11.254589] net eth0: initializing cpsw version 1.12 (0)
[   11.261584] libphy: PHY  not found
[   11.338490] net eth0: phy  not found on slave 0
[   11.403951] net eth0: phy found : id is : 0x2000a231

If I give dmesg | grep phy, Its giving output as follows,

root@arm:~# dmesg | grep phy
[    0.000000] Booting Linux on physical CPU 0x0
[    4.126362] libphy: Fixed MDIO Bus: probed
[    4.199525] libphy: 4a101000.mdio: probed
[    4.204942] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver TI DP83867
[    4.214212] cpsw 4a100000.ethernet: Missing slave[0] phy_id property
[    4.284633] am335x-phy-driver 47401300.usb-phy: GPIO lookup for consumer reset
[    4.284654] am335x-phy-driver 47401300.usb-phy: using device tree for GPIO lookup
[    4.284673] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[    4.284686] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[    4.284697] am335x-phy-driver 47401300.usb-phy: using lookup tables for GPIO lookup
[    4.284710] am335x-phy-driver 47401300.usb-phy: lookup for GPIO reset failed
[    4.284723] am335x-phy-driver 47401300.usb-phy: GPIO lookup for consumer vbus-detect
[    4.284733] am335x-phy-driver 47401300.usb-phy: using device tree for GPIO lookup
[    4.284745] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpios' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[    4.284758] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpio' property of node '/ocp/usb@47400000/usb-phy@47401300[0]'
[    4.284769] am335x-phy-driver 47401300.usb-phy: using lookup tables for GPIO lookup
[    4.284780] am335x-phy-driver 47401300.usb-phy: lookup for GPIO vbus-detect failed
[    4.284837] 47401300.usb-phy supply vcc not found, using dummy regulator
[    4.404328] am335x-phy-driver 47401b00.usb-phy: GPIO lookup for consumer reset
[    4.404350] am335x-phy-driver 47401b00.usb-phy: using device tree for GPIO lookup
[    4.404368] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[    4.404382] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[    4.404394] am335x-phy-driver 47401b00.usb-phy: using lookup tables for GPIO lookup
[    4.404407] am335x-phy-driver 47401b00.usb-phy: lookup for GPIO reset failed
[    4.404420] am335x-phy-driver 47401b00.usb-phy: GPIO lookup for consumer vbus-detect
[    4.404430] am335x-phy-driver 47401b00.usb-phy: using device tree for GPIO lookup
[    4.404442] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpios' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[    4.404455] of_get_named_gpiod_flags: can't parse 'vbus-detect-gpio' property of node '/ocp/usb@47400000/usb-phy@47401b00[0]'
[    4.404466] am335x-phy-driver 47401b00.usb-phy: using lookup tables for GPIO lookup
[    4.404477] am335x-phy-driver 47401b00.usb-phy: lookup for GPIO vbus-detect failed
[    4.404531] 47401b00.usb-phy supply vcc not found, using dummy regulator
[   11.261584] libphy: PHY  not found
[   11.338490] net eth0: phy  not found on slave 0
[   11.403951] net eth0: phy found : id is : 0x2000a231

If I give dmesg | grep DP83867

root@arm:~# dmesg | grep DP83867
[    4.204942] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver TI DP83867

But the link is not up and the LED is not blinking.

Please Help !

Regards,

Vibhu

  • Hi Vibhu,

    You may refer to this for troubleshooting :

    If further investigation is required then kindly share the following :

    1. Schematic

    2. Desired mode of operation : 10/100/1000 , aneg on/off

    3. What is being used as Link partner?

    4. Does the link recover if you toggle resetn pin of PHY or by writting PHY register 0x001F = 0x8000?

    --

    Regards,

    Vikram

  • Hi Vikram,

    Thank you for the troubleshooting pdf. I will look into it.

    1) Meanwhile I am attaching the schematic below.SAFE_SYNC_LITE_SCH.PDF

    2) Desired mode of operation is 100/1000. Aneg - off

    3) I am using D-link router to connect to the board.

    4) Can you please tell the procedure for writing to the PHY register.

    Regards,

    Vibhu.

  • Hi Vikram,

    A quick update.

    I had to remove one resistor and after removing the resistor, the link is up. But it is not able to get mac id and it is not able to ping also.

    I tried to probe the pins and there is no clock output in the TX_CLK pin (29th pin of DP83867IR). But there is 25MHz and 125MHz with 100Mbps and 1Gbps respectively in the RX_CLK pin (32nd pin of DP83867IR).

    Please Help !

    Regards,

    Vibhu

  • Hello Vibhu,

    Tx_clk is provided by MAC to PHY. So you may have to look at some MAC's (MPU) setting to enable it.

    --

    Regards,

    Vikram

  • Hi Vikram,

    Thanks for your support. Now I am able to get tx_clk and also IP. I am also able to ping.

    The issue was with my dts file.

    I had not given the correct internal delay.

    The changes I made are as follows,

    &davinci_mdio {
    	pinctrl-names = "default", "sleep";
    	pinctrl-0 = <&davinci_mdio_default>;
    	pinctrl-1 = <&davinci_mdio_sleep>;
    	status = "okay";
    	compatible = "ti,cpsw-mdio", "ti,davinci_mdio";
    
            dp83867_0: ethernet-phy@0 {
                    reg = <0>;
                    ti,rx-internal-delay = <DP83867_RGMIIDCTL_1_75_NS>;
    		ti,tx-internal-delay = <DP83867_RGMIIDCTL_1_75_NS>;
    		ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
    		ti,min-output-impedance;
                    ti,dp83867-rxctrl-strap-quirk;
            };
    };
    
    &cpsw_emac0 {
    	status = "okay";
    	phy_id = <&davinci_mdio>, <0>;
    	phy-mode = "rgmii-rxid";
    	dual_emac_res_vlan = <1>;
    };

    Regards,

    Vibhu