From 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 10 May 2024 07:44:59 +0000 Subject: [PATCH] gmac get mac form eeprom --- kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 40 ++++++++++++------- kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 16 deletions(-) diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index 8e1b354..47bb2b3 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -2718,9 +2718,10 @@ struct rk_priv_data *bsp_priv = priv; struct device *dev = &bsp_priv->pdev->dev; //unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0}; - //int ret, id = bsp_priv->bus_id; - int i; + int ret, id = bsp_priv->bus_id; + //int i; + printk("hw-debug:enter rk_get_eth_addr.. \n"); #if 0 if (is_valid_ether_addr(addr)) goto out; @@ -2753,21 +2754,30 @@ } #endif - #if 1 - if (at24_mac_read(macaddr) > 0) { - printk("ben %s: at24_mac_read Success!! \n", __func__); - memcpy(addr, macaddr, 6); - printk("Read the Ethernet MAC address from :"); - for (i = 0; i < 5; i++) - printk("%2.2x:", addr[i]); + //eeprom + ret = at24_mac_read(macaddr); + if (ret > 0) + { + printk("ben %s: at24_mac_read Success!! \n", __func__); + memcpy(addr, macaddr, 6); - printk("%2.2x\n", addr[i]); - } else { - printk("ben %s: at24_mac_read Failed!! \n", __func__); - goto out; - } - #endif + if ((addr[0] == 0x68) && (addr[1] == 0xed)) + { + printk("at24_eeprom mac is valid \n", __func__); + goto out; + } + else + { + printk("at24_eeprom mac is invalid \n", __func__); + addr[0] = 0x68; + addr[1] = 0xed; + addr[2] = 0x01; + addr[3] = 0x02; + addr[4] = 0x03; + addr[5] = 0x04; + } + } out: dev_err(dev, "%s: mac address: %pM\n", __func__, addr); } diff --git a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index f10330b..852e2d3 100644 --- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1101,6 +1101,7 @@ } } +#if 0 static void rtl8211F_led_control(struct phy_device *phydev) { printk("ben debug:rtl8211F_led_control...1 \n"); @@ -1117,6 +1118,44 @@ // phy_write(phydev, 16, 0x6C0A); printk("ben debug:rtl8211F_led_control...2 \n"); } +#endif +#define RTL_8211F_PHY_ID 0x001cc916 +#define RTL_8211F_PHY_ID_MASK 0x001fffff +#define RTL_8211F_PAGE_SELECT 0x1f +#define RTL_8211F_LCR_ADDR 0x10 + +#define GREEN_LED 0 // �̵���LED0 +#define YELLOW0_LED 1 // �Ƶ���LED1 +#define YELLOW1_LED 2 // �Ƶ���LED2 + +static int rtl8211F_led_control(struct phy_device *phydev) +{ + unsigned int temp; + + printk("<<<<<<ben test led ctrl start... %s\n",__FUNCTION__); + if(!phydev) return 0; + if(phydev->phy_id!=0x001cc916) return 0; /* only for 8211E*/ + + // ��������LED�� + phy_write(phydev, 31, 0xd04); + temp = 0x02 << (5 * GREEN_LED); // �̵Ʊ�ʾ����״̬ + temp |= 0x08 << (5 * YELLOW0_LED); // �ƵƱ�ʾ����״̬ + + temp |= 0x1b << (5 * YELLOW1_LED); // �ƵƱ�ʾ���ݰ��շ�״̬ + phy_write(phydev, 0x10, temp); + + temp = 1 << (YELLOW1_LED + 1); // �̵Ʋ�ָʾEEE����״̬, �������ߺ��Ҫ���� + // ���Ƶ�ҪָʾEEE����״̬, û�����ݰ�ʱ��ҪϨ�� + phy_write(phydev, 0x11, 0x00); + phy_write(phydev, 31, 0); + + // �������ߺ�, �̵Ƴ���; �ε����ߺ�, �̵�Ϩ�� + // ��·֧��EEE����: �����ݴ���, �Ƶ���˸, ����Ϩ�� + // ��·��֧��EEE����: �����ݴ���, �Ƶ���˸, ������ + + printk("<<<<<<<ben test led ctrl end %s\n",__FUNCTION__); + return 0; +} /** * stmmac_init_phy - PHY initialization @@ -1132,29 +1171,43 @@ struct device_node *node; int ret; + + printk("ben stmmac_init_phy .. \n"); + mdelay(2000); + printk("ben stmmac_init_phy delay .. \n"); if (priv->plat->integrated_phy_power) ret = priv->plat->integrated_phy_power(priv->plat->bsp_priv, true); node = priv->plat->phylink_node; if (node) + { + //printk("ben ttt.. \n"); ret = phylink_of_phy_connect(priv->phylink, node, 0); + //printk("ben ttt:%d \n", ret); + } /* Some DT bindings do not set-up the PHY handle. Let's try to * manually parse it */ + //printk("ben:stmmac_init_phy..1 \n"); if (!node || ret) { + //if (1) { int addr = priv->plat->phy_addr; struct phy_device *phydev; + //printk("ben:stmmac_init_phy..2 \n"); phydev = mdiobus_get_phy(priv->mii, addr); if (!phydev) { netdev_err(priv->dev, "no phy at addr %d\n", addr); return -ENODEV; } - rtl8211F_led_control(phydev); + //rtl8211F_led_control(phydev); + + //printk("ben:stmmac_init_phy..3 \n"); ret = phylink_connect_phy(priv->phylink, phydev); + //rtl8211F_led_control(phydev); } if (!priv->plat->pmt) { @@ -2884,6 +2937,7 @@ u32 chan; int ret; + //printk("ben:stmmac_open.. \n"); ret = pm_runtime_get_sync(priv->device); if (ret < 0) { pm_runtime_put_noidle(priv->device); @@ -2957,6 +3011,12 @@ goto init_error; } } + + + #if 1 + printk("ben -------bootup add 2s delay time.\n"); + mdelay(2500); + #endif ret = stmmac_hw_setup(dev, true); if (ret < 0) { @@ -5246,6 +5306,9 @@ */ pm_runtime_put(device); + //add + phy_register_fixup_for_uid(RTL_8211F_PHY_ID, RTL_8211F_PHY_ID_MASK, rtl8211F_led_control); + return ret; error_netdev_register: @@ -5457,6 +5520,12 @@ stmmac_free_tx_skbufs(priv); stmmac_clear_descriptors(priv); +#if 1 + printk("ben -------resume add 2s delay time.\n"); + mdelay(2000); + +#endif + stmmac_hw_setup(ndev, false); stmmac_init_coalesce(priv); stmmac_set_rx_mode(ndev); -- Gitblit v1.6.2