* [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm @ 2016-01-22 8:23 Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined Mugunthan V N ` (7 more replies) 0 siblings, 8 replies; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot This patch series enables keystone net to adopt driver model. This has been tested on the following evms (logs [1]) by tftp zImage from server. * k2hk evm * k2l evm Also pushed a branch for testing [2] Changes from initial version: * No code changes, changes only in commit text change in PATCH 2/8 *s/warning/error* [1] - http://pastebin.ubuntu.com/14596525/ [2] - git://git.ti.com/~mugunthanvnm/ti-u-boot/mugunth-ti-u-boot.git dm-keystone-net-v2 Mugunthan V N (8): board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH drivers: net: keystone_net: convert driver to adopt device driver model defconfig: k2hk_evm_defconfig: enable net driver model defconfig: k2l_evm_defconfig: enable net driver model defconfig: k2e_evm_defconfig: enable net driver model ARM: dts: k2g: Add keystone net dts files defconfig: k2g_evm_defconfig: enable net driver model arch/arm/dts/k2g-evm.dts | 12 ++ arch/arm/dts/k2g-netcp.dtsi | 151 ++++++++++++++++ arch/arm/dts/k2g.dtsi | 13 ++ board/ti/ks2_evm/board.c | 2 + configs/k2e_evm_defconfig | 1 + configs/k2g_evm_defconfig | 1 + configs/k2hk_evm_defconfig | 1 + configs/k2l_evm_defconfig | 1 + drivers/net/keystone_net.c | 418 +++++++++++++++++++++++++++++++++++++++----- drivers/net/phy/micrel.c | 6 +- 10 files changed, 562 insertions(+), 44 deletions(-) create mode 100644 arch/arm/dts/k2g-netcp.dtsi -- 2.7.0.rc3 ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 19:53 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH Mugunthan V N ` (6 subsequent siblings) 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot remove board_eth_init when CONFIG_DM_ETH is defined Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- board/ti/ks2_evm/board.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/board/ti/ks2_evm/board.c b/board/ti/ks2_evm/board.c index 73d94a6..7d1709c 100644 --- a/board/ti/ks2_evm/board.c +++ b/board/ti/ks2_evm/board.c @@ -56,6 +56,7 @@ int board_init(void) } #ifdef CONFIG_DRIVER_TI_KEYSTONE_NET +#ifndef CONFIG_DM_ETH int get_eth_env_param(char *env_name) { char *env; @@ -105,6 +106,7 @@ int board_eth_init(bd_t *bis) return 0; } #endif +#endif #ifdef CONFIG_SPL_BUILD void spl_board_init(void) -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined 2016-01-22 8:23 ` [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined Mugunthan V N @ 2016-01-22 19:53 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 19:53 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > remove board_eth_init when CONFIG_DM_ETH is defined > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 19:54 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model Mugunthan V N ` (5 subsequent siblings) 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot When Micrel phy is selected without CONFIG_PHY_MICREL_KSZ9031 or CONFIG_PHY_MICREL_KSZ9021 there is a build error. Fixing this by adding proper ifdefs drivers/net/phy/micrel.c:370:39: error: array type has incomplete element type static const struct ksz90x1_reg_field ksz9031_ctl_grp[] = ^ drivers/net/phy/micrel.c:372:39: error: array type has incomplete element type static const struct ksz90x1_reg_field ksz9031_clk_grp[] = ^ drivers/net/phy/micrel.c: In function ?ksz9031_of_config?: drivers/net/phy/micrel.c:377:23: error: array type has incomplete element type struct ksz90x1_ofcfg ofcfg[] = { ^ drivers/net/phy/micrel.c:379:13: error: ?ksz90x1_rxd_grp? undeclared (first use in this function) { MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW, 2, ksz90x1_rxd_grp, 4 }, ^ drivers/net/phy/micrel.c:379:13: note: each undeclared identifier is reported only once for each function it appears in drivers/net/phy/micrel.c:380:13: error: ?ksz90x1_txd_grp? undeclared (first use in this function) { MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW, 2, ksz90x1_txd_grp, 4 }, ^ drivers/net/phy/micrel.c:386:3: warning: implicit declaration of function ?ksz90x1_of_config_group? [-Wimplicit-function-declaration] ret = ksz90x1_of_config_group(phydev, &(ofcfg[i])); ^ drivers/net/phy/micrel.c:377:23: warning: unused variable ?ofcfg? [-Wunused-variable] struct ksz90x1_ofcfg ofcfg[] = { ^ drivers/net/phy/micrel.c: At top level: drivers/net/phy/micrel.c:370:39: warning: ?ksz9031_ctl_grp? defined but not used [-Wunused-variable] static const struct ksz90x1_reg_field ksz9031_ctl_grp[] = ^ drivers/net/phy/micrel.c:372:39: warning: ?ksz9031_clk_grp? defined but not used [-Wunused-variable] static const struct ksz90x1_reg_field ksz9031_clk_grp[] = ^ scripts/Makefile.build:277: recipe for target 'drivers/net/phy/micrel.o' failed make[1]: *** [drivers/net/phy/micrel.o] Error 1 Makefile:1201: recipe for target 'drivers/net/phy' failed make: *** [drivers/net/phy] Error 2 make: *** Waiting for unfinished jobs.... Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- drivers/net/phy/micrel.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 19b6bc7..73ed42a 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -260,7 +260,8 @@ static int ksz90x1_of_config_group(struct phy_device *phydev, #define CTRL1000_CONFIG_MASTER (1 << 11) #define CTRL1000_MANUAL_CONFIG (1 << 12) -#ifdef CONFIG_DM_ETH +#if defined(CONFIG_DM_ETH) && (defined(CONFIG_PHY_MICREL_KSZ9021) || \ + defined(CONFIG_PHY_MICREL_KSZ9031)) static const struct ksz90x1_reg_field ksz9021_clk_grp[] = { { "txen-skew-ps", 4, 0, 0x7 }, { "txc-skew-ps", 4, 4, 0x7 }, { "rxdv-skew-ps", 4, 8, 0x7 }, { "rxc-skew-ps", 4, 12, 0x7 }, @@ -366,7 +367,8 @@ static struct phy_driver ksz9021_driver = { #define MII_KSZ9031_MMD_ACCES_CTRL 0x0d #define MII_KSZ9031_MMD_REG_DATA 0x0e -#ifdef CONFIG_DM_ETH +#if defined(CONFIG_DM_ETH) && (defined(CONFIG_PHY_MICREL_KSZ9021) || \ + defined(CONFIG_PHY_MICREL_KSZ9031)) static const struct ksz90x1_reg_field ksz9031_ctl_grp[] = { { "txen-skew-ps", 4, 0, 0x7 }, { "rxdv-skew-ps", 4, 4, 0x7 } }; static const struct ksz90x1_reg_field ksz9031_clk_grp[] = -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH 2016-01-22 8:23 ` [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH Mugunthan V N @ 2016-01-22 19:54 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 19:54 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > When Micrel phy is selected without CONFIG_PHY_MICREL_KSZ9031 or > CONFIG_PHY_MICREL_KSZ9021 there is a build error. Fixing this > by adding proper ifdefs > > drivers/net/phy/micrel.c:370:39: error: array type has incomplete element type > static const struct ksz90x1_reg_field ksz9031_ctl_grp[] = > ^ > drivers/net/phy/micrel.c:372:39: error: array type has incomplete element type > static const struct ksz90x1_reg_field ksz9031_clk_grp[] = > ^ > drivers/net/phy/micrel.c: In function ?ksz9031_of_config?: > drivers/net/phy/micrel.c:377:23: error: array type has incomplete element type > struct ksz90x1_ofcfg ofcfg[] = { > ^ > drivers/net/phy/micrel.c:379:13: error: ?ksz90x1_rxd_grp? undeclared (first use in this function) > { MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW, 2, ksz90x1_rxd_grp, 4 }, > ^ > drivers/net/phy/micrel.c:379:13: note: each undeclared identifier is reported only once for each function it appears in > drivers/net/phy/micrel.c:380:13: error: ?ksz90x1_txd_grp? undeclared (first use in this function) > { MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW, 2, ksz90x1_txd_grp, 4 }, > ^ > drivers/net/phy/micrel.c:386:3: warning: implicit declaration of function ?ksz90x1_of_config_group? [-Wimplicit-function-declaration] > ret = ksz90x1_of_config_group(phydev, &(ofcfg[i])); > ^ > drivers/net/phy/micrel.c:377:23: warning: unused variable ?ofcfg? [-Wunused-variable] > struct ksz90x1_ofcfg ofcfg[] = { > ^ > drivers/net/phy/micrel.c: At top level: > drivers/net/phy/micrel.c:370:39: warning: ?ksz9031_ctl_grp? defined but not used [-Wunused-variable] > static const struct ksz90x1_reg_field ksz9031_ctl_grp[] = > ^ > drivers/net/phy/micrel.c:372:39: warning: ?ksz9031_clk_grp? defined but not used [-Wunused-variable] > static const struct ksz90x1_reg_field ksz9031_clk_grp[] = > ^ > scripts/Makefile.build:277: recipe for target 'drivers/net/phy/micrel.o' failed > make[1]: *** [drivers/net/phy/micrel.o] Error 1 > Makefile:1201: recipe for target 'drivers/net/phy' failed > make: *** [drivers/net/phy] Error 2 > make: *** Waiting for unfinished jobs.... > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:15 ` Joe Hershberger 2016-01-25 8:35 ` Bin Meng 2016-01-22 8:23 ` [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net " Mugunthan V N ` (4 subsequent siblings) 7 siblings, 2 replies; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot Adopt keystone_net driver to adopt device driver model Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- drivers/net/keystone_net.c | 418 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 376 insertions(+), 42 deletions(-) diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c index 209fae9..21ebaeb 100644 --- a/drivers/net/keystone_net.c +++ b/drivers/net/keystone_net.c @@ -10,6 +10,8 @@ #include <command.h> #include <console.h> +#include <dm.h> + #include <net.h> #include <phy.h> #include <errno.h> @@ -18,10 +20,15 @@ #include <asm/ti-common/keystone_nav.h> #include <asm/ti-common/keystone_net.h> #include <asm/ti-common/keystone_serdes.h> +#include <asm/arch/psc_defs.h> + +DECLARE_GLOBAL_DATA_PTR; +#ifndef CONFIG_DM_ETH unsigned int emac_open; static struct mii_dev *mdio_bus; static unsigned int sys_has_mdio = 1; +#endif #ifdef KEYSTONE2_EMAC_GIG_ENABLE #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) @@ -36,40 +43,44 @@ static unsigned int sys_has_mdio = 1; static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); +#ifndef CONFIG_DM_ETH struct rx_buff_desc net_rx_buffs = { .buff_ptr = rx_buffs, .num_buffs = RX_BUFF_NUMS, .buff_len = RX_BUFF_LEN, .rx_flow = 22, }; - -#ifndef CONFIG_SOC_K2G -static void keystone2_net_serdes_setup(void); #endif -int keystone2_eth_read_mac_addr(struct eth_device *dev) -{ - struct eth_priv_t *eth_priv; - u32 maca = 0; - u32 macb = 0; - - eth_priv = (struct eth_priv_t *)dev->priv; +#ifdef CONFIG_DM_ETH - /* Read the e-fuse mac address */ - if (eth_priv->slave_port == 1) { - maca = __raw_readl(MAC_ID_BASE_ADDR); - macb = __raw_readl(MAC_ID_BASE_ADDR + 4); - } - - dev->enetaddr[0] = (macb >> 8) & 0xff; - dev->enetaddr[1] = (macb >> 0) & 0xff; - dev->enetaddr[2] = (maca >> 24) & 0xff; - dev->enetaddr[3] = (maca >> 16) & 0xff; - dev->enetaddr[4] = (maca >> 8) & 0xff; - dev->enetaddr[5] = (maca >> 0) & 0xff; +enum link_type { + LINK_TYPE_MAC_TO_MAC_AUTO = 0, + LINK_TYPE_MAC_TO_PHY_MODE = 1, + LINK_TYPE_MAC_TO_MAC_FORCED_MODE = 2, + LINK_TYPE_MAC_TO_FIBRE_MODE = 3, + LINK_TYPE_MAC_TO_PHY_NO_MDIO_MODE = 4, + LINK_TYPE_10G_MAC_TO_PHY_MODE = 10, + LINK_TYPE_10G_MAC_TO_MAC_FORCED_MODE = 11, +}; - return 0; -} +struct ks2_eth_priv { + struct udevice *dev; + struct phy_device *phydev; + struct mii_dev *mdio_bus; + int phy_addr; + phy_interface_t phy_if; + int sgmii_link_type; + void *mdio_base; + struct rx_buff_desc net_rx_buffs; + struct pktdma_cfg *netcp_pktdma; + void *hd; + int slave_port; + enum link_type link_type; + bool emac_open; + bool has_mdio; +}; +#endif /* MDIO */ @@ -140,6 +151,7 @@ static int keystone2_mdio_write(struct mii_dev *bus, return 0; } +#ifndef CONFIG_DM_ETH static void __attribute__((unused)) keystone2_eth_gigabit_enable(struct eth_device *dev) { @@ -163,6 +175,31 @@ static void __attribute__((unused)) EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); } +#else +static void __attribute__((unused)) + keystone2_eth_gigabit_enable(struct udevice *dev) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + u_int16_t data; + + if (priv->has_mdio) { + data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, + MDIO_DEVAD_NONE, 0); + /* speed selection MSB */ + if (!(data & (1 << 6))) + return; + } + + /* + * Check if link detected is giga-bit + * If Gigabit mode detected, enable gigbit in MAC + */ + writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + + CPGMACSL_REG_CTL) | + EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, + DEVICE_EMACSL_BASE(priv->slave_port - 1) + CPGMACSL_REG_CTL); +} +#endif #ifdef CONFIG_SOC_K2G int keystone_rgmii_config(struct phy_device *phy_dev) @@ -401,6 +438,58 @@ int ethss_stop(void) return 0; } +struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { + .clk = SERDES_CLOCK_156P25M, + .rate = SERDES_RATE_5G, + .rate_mode = SERDES_QUARTER_RATE, + .intf = SERDES_PHY_SGMII, + .loopback = 0, +}; + +#ifndef CONFIG_SOC_K2G +static void keystone2_net_serdes_setup(void) +{ + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, + &ks2_serdes_sgmii_156p25mhz, + CONFIG_KSNET_SERDES_LANES_PER_SGMII); + +#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, + &ks2_serdes_sgmii_156p25mhz, + CONFIG_KSNET_SERDES_LANES_PER_SGMII); +#endif + + /* wait till setup */ + udelay(5000); +} +#endif + +#ifndef CONFIG_DM_ETH + +int keystone2_eth_read_mac_addr(struct eth_device *dev) +{ + struct eth_priv_t *eth_priv; + u32 maca = 0; + u32 macb = 0; + + eth_priv = (struct eth_priv_t *)dev->priv; + + /* Read the e-fuse mac address */ + if (eth_priv->slave_port == 1) { + maca = __raw_readl(MAC_ID_BASE_ADDR); + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); + } + + dev->enetaddr[0] = (macb >> 8) & 0xff; + dev->enetaddr[1] = (macb >> 0) & 0xff; + dev->enetaddr[2] = (maca >> 24) & 0xff; + dev->enetaddr[3] = (maca >> 16) & 0xff; + dev->enetaddr[4] = (maca >> 8) & 0xff; + dev->enetaddr[5] = (maca >> 0) & 0xff; + + return 0; +} + int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) { if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) @@ -556,6 +645,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) int res; struct eth_device *dev; struct phy_device *phy_dev; + struct mdio_regs *adap_mdio = (struct mdio_regs *)EMAC_MDIO_BASE_ADDR; dev = malloc(sizeof(struct eth_device)); if (dev == NULL) @@ -612,28 +702,272 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) return 0; } -struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { - .clk = SERDES_CLOCK_156P25M, - .rate = SERDES_RATE_5G, - .rate_mode = SERDES_QUARTER_RATE, - .intf = SERDES_PHY_SGMII, - .loopback = 0, -}; +#else -#ifndef CONFIG_SOC_K2G -static void keystone2_net_serdes_setup(void) +int keystone2_eth_read_mac_addr(struct ks2_eth_priv *priv, + struct eth_pdata *pdata) { - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, - &ks2_serdes_sgmii_156p25mhz, - CONFIG_KSNET_SERDES_LANES_PER_SGMII); + u32 maca = 0; + u32 macb = 0; -#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, - &ks2_serdes_sgmii_156p25mhz, - CONFIG_KSNET_SERDES_LANES_PER_SGMII); + /* Read the e-fuse mac address */ + if (priv->slave_port == 1) { + maca = __raw_readl(MAC_ID_BASE_ADDR); + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); + } + + pdata->enetaddr[0] = (macb >> 8) & 0xff; + pdata->enetaddr[1] = (macb >> 0) & 0xff; + pdata->enetaddr[2] = (maca >> 24) & 0xff; + pdata->enetaddr[3] = (maca >> 16) & 0xff; + pdata->enetaddr[4] = (maca >> 8) & 0xff; + pdata->enetaddr[5] = (maca >> 0) & 0xff; + + return 0; +} + +static int ks2_eth_start(struct udevice *dev) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + +#ifdef CONFIG_SOC_K2G + keystone_rgmii_config(priv->phydev); +#else + keystone_sgmii_config(priv->phydev, priv->slave_port - 1, + priv->sgmii_link_type); #endif - /* wait till setup */ - udelay(5000); + udelay(10000); + + /* On chip switch configuration */ + ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); + + qm_init(); + + if (ksnav_init(priv->netcp_pktdma, &priv->net_rx_buffs)) { + error("ksnav_init failed\n"); + goto err_knav_init; + } + + /* + * Streaming switch configuration. If not present this + * statement is defined to void in target.h. + * If present this is usually defined to a series of register writes + */ + hw_config_streaming_switch(); + + if (priv->has_mdio) { + phy_startup(priv->phydev); + if (priv->phydev->link == 0) { + error("phy startup failed\n"); + goto err_phy_start; + } + } + + emac_gigabit_enable(dev); + + ethss_start(); + + priv->emac_open = true; + + return 0; + +err_phy_start: + ksnav_close(priv->netcp_pktdma); +err_knav_init: + qm_close(); + + return -EFAULT; +} + +static int ks2_eth_send(struct udevice *dev, void *packet, int length) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + + genphy_update_link(priv->phydev); + if (priv->phydev->link == 0) + return -1; + + if (length < EMAC_MIN_ETHERNET_PKT_SIZE) + length = EMAC_MIN_ETHERNET_PKT_SIZE; + + return ksnav_send(priv->netcp_pktdma, (u32 *)packet, + length, (priv->slave_port) << 16); +} + +static int ks2_eth_recv(struct udevice *dev, int flags, uchar **packetp) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + int pkt_size; + u32 *pkt = NULL; + + priv->hd = ksnav_recv(priv->netcp_pktdma, &pkt, &pkt_size); + if (priv->hd == NULL) + return -EAGAIN; + + *packetp = (uchar *)pkt; + + return pkt_size; +} + +static int ks2_eth_free_pkt(struct udevice *dev, uchar *packet, + int length) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + + ksnav_release_rxhd(priv->netcp_pktdma, priv->hd); + + return 0; +} + +static void ks2_eth_stop(struct udevice *dev) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + + if (!priv->emac_open) + return; + ethss_stop(); + + ksnav_close(priv->netcp_pktdma); + qm_close(); + phy_shutdown(priv->phydev); + priv->emac_open = false; +} + +static int ks2_eth_probe(struct udevice *dev) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + struct mii_dev *mdio_bus; + int ret; + + priv->dev = dev; + + /* These clock enables has to be moved to common location */ + if (cpu_is_k2g()) + writel(KS2_ETHERNET_RGMII, KS2_ETHERNET_CFG); + + /* By default, select PA PLL clock as PA clock source */ +#ifndef CONFIG_SOC_K2G + if (psc_enable_module(KS2_LPSC_PA)) + return -1; +#endif + if (psc_enable_module(KS2_LPSC_CPGMAC)) + return -1; + if (psc_enable_module(KS2_LPSC_CRYPTO)) + return -1; + + if (cpu_is_k2e() || cpu_is_k2l()) + pll_pa_clk_sel(); + + + priv->net_rx_buffs.buff_ptr = rx_buffs, + priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS, + priv->net_rx_buffs.buff_len = RX_BUFF_LEN, + + /* Register MDIO bus */ + mdio_bus = mdio_alloc(); + if (!mdio_bus) { + error("MDIO alloc failed\n"); + return -ENOMEM; + } + priv->mdio_bus = mdio_bus; + mdio_bus->read = keystone2_mdio_read; + mdio_bus->write = keystone2_mdio_write; + mdio_bus->reset = keystone2_mdio_reset; + mdio_bus->priv = priv->mdio_base; + sprintf(mdio_bus->name, "ethernet-mdio"); + + ret = mdio_register(mdio_bus); + if (ret) { + error("MDIO bus register failed\n"); + return ret; + } + +#ifndef CONFIG_SOC_K2G + keystone2_net_serdes_setup(); +#endif + + priv->netcp_pktdma = &netcp_pktdma; + + priv->phydev = phy_connect(mdio_bus, priv->phy_addr, dev, priv->phy_if); + phy_config(priv->phydev); + + return 0; } + +static const struct eth_ops ks2_eth_ops = { + .start = ks2_eth_start, + .send = ks2_eth_send, + .recv = ks2_eth_recv, + .free_pkt = ks2_eth_free_pkt, + .stop = ks2_eth_stop, +}; + + +static int ks2_eth_ofdata_to_platdata(struct udevice *dev) +{ + struct ks2_eth_priv *priv = dev_get_priv(dev); + struct eth_pdata *pdata = dev_get_platdata(dev); + const void *fdt = gd->fdt_blob; + int interfaces; + int interface_0; + int netcp_gbe_0; + int phy; + int mdio; + u32 dma_channel[6]; + + interfaces = fdt_subnode_offset(fdt, dev->of_offset, + "netcp-interfaces"); + interface_0 = fdt_subnode_offset(fdt, interfaces, "interface-0"); + + netcp_gbe_0 = fdtdec_lookup_phandle(fdt, interface_0, "netcp-gbe"); + priv->link_type = fdtdec_get_int(fdt, netcp_gbe_0, + "link-interface", -1); + priv->slave_port = fdtdec_get_int(fdt, netcp_gbe_0, "slave-port", -1); + /* U-Boot slave port number starts with 1 instead of 0 */ + priv->slave_port += 1; + + phy = fdtdec_lookup_phandle(fdt, netcp_gbe_0, "phy-handle"); + priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1); + + mdio = fdt_parent_offset(fdt, phy); + if (mdio < 0) { + error("mdio dt not found\n"); + return -ENODEV; + } + priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); + + keystone2_eth_read_mac_addr(priv, pdata); + + if (priv->link_type == LINK_TYPE_MAC_TO_PHY_MODE) { + priv->phy_if = PHY_INTERFACE_MODE_SGMII; + pdata->phy_interface = priv->phy_if; + priv->sgmii_link_type = SGMII_LINK_MAC_PHY; + priv->has_mdio = true; + } + pdata->iobase = dev_get_addr(dev); + + fdtdec_get_int_array(fdt, dev->of_offset, "ti,navigator-dmas", + dma_channel, 6); + priv->net_rx_buffs.rx_flow = dma_channel[1]; + + return 0; +} + +static const struct udevice_id ks2_eth_ids[] = { + { .compatible = "ti,netcp-1.0" }, + { } +}; + +U_BOOT_DRIVER(eth_ks2) = { + .name = "eth_ks2", + .id = UCLASS_ETH, + .of_match = ks2_eth_ids, + .ofdata_to_platdata = ks2_eth_ofdata_to_platdata, + .probe = ks2_eth_probe, + .ops = &ks2_eth_ops, + .priv_auto_alloc_size = sizeof(struct ks2_eth_priv), + .platdata_auto_alloc_size = sizeof(struct eth_pdata), + .flags = DM_FLAG_ALLOC_PRIV_DMA, +}; #endif -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model Mugunthan V N @ 2016-01-22 20:15 ` Joe Hershberger 2016-01-25 8:30 ` Mugunthan V N 2016-01-25 8:35 ` Bin Meng 1 sibling, 1 reply; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:15 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > Adopt keystone_net driver to adopt device driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> > --- > drivers/net/keystone_net.c | 418 ++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 376 insertions(+), 42 deletions(-) > > diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c > index 209fae9..21ebaeb 100644 > --- a/drivers/net/keystone_net.c > +++ b/drivers/net/keystone_net.c > @@ -10,6 +10,8 @@ > #include <command.h> > #include <console.h> > > +#include <dm.h> > + > #include <net.h> > #include <phy.h> > #include <errno.h> > @@ -18,10 +20,15 @@ > #include <asm/ti-common/keystone_nav.h> > #include <asm/ti-common/keystone_net.h> > #include <asm/ti-common/keystone_serdes.h> > +#include <asm/arch/psc_defs.h> > + > +DECLARE_GLOBAL_DATA_PTR; > > +#ifndef CONFIG_DM_ETH > unsigned int emac_open; > static struct mii_dev *mdio_bus; > static unsigned int sys_has_mdio = 1; > +#endif > > #ifdef KEYSTONE2_EMAC_GIG_ENABLE > #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) > @@ -36,40 +43,44 @@ static unsigned int sys_has_mdio = 1; > > static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); > > +#ifndef CONFIG_DM_ETH > struct rx_buff_desc net_rx_buffs = { > .buff_ptr = rx_buffs, > .num_buffs = RX_BUFF_NUMS, > .buff_len = RX_BUFF_LEN, > .rx_flow = 22, > }; > - > -#ifndef CONFIG_SOC_K2G > -static void keystone2_net_serdes_setup(void); > #endif > > -int keystone2_eth_read_mac_addr(struct eth_device *dev) > -{ > - struct eth_priv_t *eth_priv; > - u32 maca = 0; > - u32 macb = 0; > - > - eth_priv = (struct eth_priv_t *)dev->priv; > +#ifdef CONFIG_DM_ETH > > - /* Read the e-fuse mac address */ > - if (eth_priv->slave_port == 1) { > - maca = __raw_readl(MAC_ID_BASE_ADDR); > - macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > - } > - > - dev->enetaddr[0] = (macb >> 8) & 0xff; > - dev->enetaddr[1] = (macb >> 0) & 0xff; > - dev->enetaddr[2] = (maca >> 24) & 0xff; > - dev->enetaddr[3] = (maca >> 16) & 0xff; > - dev->enetaddr[4] = (maca >> 8) & 0xff; > - dev->enetaddr[5] = (maca >> 0) & 0xff; > +enum link_type { > + LINK_TYPE_MAC_TO_MAC_AUTO = 0, > + LINK_TYPE_MAC_TO_PHY_MODE = 1, > + LINK_TYPE_MAC_TO_MAC_FORCED_MODE = 2, > + LINK_TYPE_MAC_TO_FIBRE_MODE = 3, > + LINK_TYPE_MAC_TO_PHY_NO_MDIO_MODE = 4, > + LINK_TYPE_10G_MAC_TO_PHY_MODE = 10, > + LINK_TYPE_10G_MAC_TO_MAC_FORCED_MODE = 11, > +}; > > - return 0; > -} > +struct ks2_eth_priv { > + struct udevice *dev; > + struct phy_device *phydev; > + struct mii_dev *mdio_bus; > + int phy_addr; > + phy_interface_t phy_if; > + int sgmii_link_type; > + void *mdio_base; > + struct rx_buff_desc net_rx_buffs; > + struct pktdma_cfg *netcp_pktdma; > + void *hd; > + int slave_port; > + enum link_type link_type; > + bool emac_open; > + bool has_mdio; > +}; > +#endif > > /* MDIO */ > > @@ -140,6 +151,7 @@ static int keystone2_mdio_write(struct mii_dev *bus, > return 0; > } > > +#ifndef CONFIG_DM_ETH > static void __attribute__((unused)) > keystone2_eth_gigabit_enable(struct eth_device *dev) > { > @@ -163,6 +175,31 @@ static void __attribute__((unused)) > EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, > DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); > } > +#else > +static void __attribute__((unused)) > + keystone2_eth_gigabit_enable(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + u_int16_t data; > + > + if (priv->has_mdio) { > + data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, > + MDIO_DEVAD_NONE, 0); > + /* speed selection MSB */ > + if (!(data & (1 << 6))) > + return; > + } > + > + /* > + * Check if link detected is giga-bit > + * If Gigabit mode detected, enable gigbit in MAC > + */ > + writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + > + CPGMACSL_REG_CTL) | > + EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, > + DEVICE_EMACSL_BASE(priv->slave_port - 1) + CPGMACSL_REG_CTL); > +} > +#endif > > #ifdef CONFIG_SOC_K2G > int keystone_rgmii_config(struct phy_device *phy_dev) > @@ -401,6 +438,58 @@ int ethss_stop(void) > return 0; > } > > +struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { > + .clk = SERDES_CLOCK_156P25M, > + .rate = SERDES_RATE_5G, > + .rate_mode = SERDES_QUARTER_RATE, > + .intf = SERDES_PHY_SGMII, > + .loopback = 0, > +}; > + > +#ifndef CONFIG_SOC_K2G > +static void keystone2_net_serdes_setup(void) > +{ > + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, > + &ks2_serdes_sgmii_156p25mhz, > + CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + > +#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) > + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, > + &ks2_serdes_sgmii_156p25mhz, > + CONFIG_KSNET_SERDES_LANES_PER_SGMII); > +#endif > + > + /* wait till setup */ > + udelay(5000); > +} > +#endif > + > +#ifndef CONFIG_DM_ETH > + > +int keystone2_eth_read_mac_addr(struct eth_device *dev) > +{ > + struct eth_priv_t *eth_priv; > + u32 maca = 0; > + u32 macb = 0; > + > + eth_priv = (struct eth_priv_t *)dev->priv; > + > + /* Read the e-fuse mac address */ > + if (eth_priv->slave_port == 1) { > + maca = __raw_readl(MAC_ID_BASE_ADDR); > + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > + } > + > + dev->enetaddr[0] = (macb >> 8) & 0xff; > + dev->enetaddr[1] = (macb >> 0) & 0xff; > + dev->enetaddr[2] = (maca >> 24) & 0xff; > + dev->enetaddr[3] = (maca >> 16) & 0xff; > + dev->enetaddr[4] = (maca >> 8) & 0xff; > + dev->enetaddr[5] = (maca >> 0) & 0xff; > + > + return 0; > +} > + > int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) > { > if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) > @@ -556,6 +645,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) > int res; > struct eth_device *dev; > struct phy_device *phy_dev; > + struct mdio_regs *adap_mdio = (struct mdio_regs *)EMAC_MDIO_BASE_ADDR; > > dev = malloc(sizeof(struct eth_device)); > if (dev == NULL) > @@ -612,28 +702,272 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) > return 0; > } > > -struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { > - .clk = SERDES_CLOCK_156P25M, > - .rate = SERDES_RATE_5G, > - .rate_mode = SERDES_QUARTER_RATE, > - .intf = SERDES_PHY_SGMII, > - .loopback = 0, > -}; > +#else > > -#ifndef CONFIG_SOC_K2G > -static void keystone2_net_serdes_setup(void) > +int keystone2_eth_read_mac_addr(struct ks2_eth_priv *priv, > + struct eth_pdata *pdata) > { > - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, > - &ks2_serdes_sgmii_156p25mhz, > - CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + u32 maca = 0; > + u32 macb = 0; > > -#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) > - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, > - &ks2_serdes_sgmii_156p25mhz, > - CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + /* Read the e-fuse mac address */ > + if (priv->slave_port == 1) { > + maca = __raw_readl(MAC_ID_BASE_ADDR); > + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > + } > + > + pdata->enetaddr[0] = (macb >> 8) & 0xff; > + pdata->enetaddr[1] = (macb >> 0) & 0xff; > + pdata->enetaddr[2] = (maca >> 24) & 0xff; > + pdata->enetaddr[3] = (maca >> 16) & 0xff; > + pdata->enetaddr[4] = (maca >> 8) & 0xff; > + pdata->enetaddr[5] = (maca >> 0) & 0xff; > + > + return 0; > +} > + > +static int ks2_eth_start(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > +#ifdef CONFIG_SOC_K2G > + keystone_rgmii_config(priv->phydev); > +#else > + keystone_sgmii_config(priv->phydev, priv->slave_port - 1, > + priv->sgmii_link_type); > #endif > > - /* wait till setup */ > - udelay(5000); > + udelay(10000); > + > + /* On chip switch configuration */ > + ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); > + > + qm_init(); > + > + if (ksnav_init(priv->netcp_pktdma, &priv->net_rx_buffs)) { > + error("ksnav_init failed\n"); > + goto err_knav_init; > + } > + > + /* > + * Streaming switch configuration. If not present this > + * statement is defined to void in target.h. > + * If present this is usually defined to a series of register writes > + */ > + hw_config_streaming_switch(); > + > + if (priv->has_mdio) { > + phy_startup(priv->phydev); > + if (priv->phydev->link == 0) { > + error("phy startup failed\n"); > + goto err_phy_start; > + } > + } > + > + emac_gigabit_enable(dev); > + > + ethss_start(); > + > + priv->emac_open = true; > + > + return 0; > + > +err_phy_start: > + ksnav_close(priv->netcp_pktdma); > +err_knav_init: > + qm_close(); > + > + return -EFAULT; > +} > + > +static int ks2_eth_send(struct udevice *dev, void *packet, int length) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + genphy_update_link(priv->phydev); > + if (priv->phydev->link == 0) > + return -1; > + > + if (length < EMAC_MIN_ETHERNET_PKT_SIZE) > + length = EMAC_MIN_ETHERNET_PKT_SIZE; > + > + return ksnav_send(priv->netcp_pktdma, (u32 *)packet, > + length, (priv->slave_port) << 16); > +} > + > +static int ks2_eth_recv(struct udevice *dev, int flags, uchar **packetp) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + int pkt_size; > + u32 *pkt = NULL; > + > + priv->hd = ksnav_recv(priv->netcp_pktdma, &pkt, &pkt_size); > + if (priv->hd == NULL) > + return -EAGAIN; > + > + *packetp = (uchar *)pkt; > + > + return pkt_size; > +} > + > +static int ks2_eth_free_pkt(struct udevice *dev, uchar *packet, > + int length) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + ksnav_release_rxhd(priv->netcp_pktdma, priv->hd); > + > + return 0; > +} > + > +static void ks2_eth_stop(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + if (!priv->emac_open) > + return; > + ethss_stop(); > + > + ksnav_close(priv->netcp_pktdma); > + qm_close(); > + phy_shutdown(priv->phydev); > + priv->emac_open = false; > +} > + > +static int ks2_eth_probe(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + struct mii_dev *mdio_bus; > + int ret; > + > + priv->dev = dev; > + > + /* These clock enables has to be moved to common location */ > + if (cpu_is_k2g()) > + writel(KS2_ETHERNET_RGMII, KS2_ETHERNET_CFG); > + > + /* By default, select PA PLL clock as PA clock source */ > +#ifndef CONFIG_SOC_K2G > + if (psc_enable_module(KS2_LPSC_PA)) > + return -1; > +#endif > + if (psc_enable_module(KS2_LPSC_CPGMAC)) > + return -1; > + if (psc_enable_module(KS2_LPSC_CRYPTO)) > + return -1; Is there not a more appropriate error code that could be used here for these 3? > + > + if (cpu_is_k2e() || cpu_is_k2l()) > + pll_pa_clk_sel(); > + > + > + priv->net_rx_buffs.buff_ptr = rx_buffs, > + priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS, > + priv->net_rx_buffs.buff_len = RX_BUFF_LEN, > + > + /* Register MDIO bus */ > + mdio_bus = mdio_alloc(); > + if (!mdio_bus) { > + error("MDIO alloc failed\n"); > + return -ENOMEM; > + } > + priv->mdio_bus = mdio_bus; > + mdio_bus->read = keystone2_mdio_read; > + mdio_bus->write = keystone2_mdio_write; > + mdio_bus->reset = keystone2_mdio_reset; > + mdio_bus->priv = priv->mdio_base; > + sprintf(mdio_bus->name, "ethernet-mdio"); > + > + ret = mdio_register(mdio_bus); > + if (ret) { > + error("MDIO bus register failed\n"); > + return ret; > + } > + > +#ifndef CONFIG_SOC_K2G > + keystone2_net_serdes_setup(); > +#endif > + > + priv->netcp_pktdma = &netcp_pktdma; > + > + priv->phydev = phy_connect(mdio_bus, priv->phy_addr, dev, priv->phy_if); > + phy_config(priv->phydev); > + > + return 0; > } > + > +static const struct eth_ops ks2_eth_ops = { > + .start = ks2_eth_start, > + .send = ks2_eth_send, > + .recv = ks2_eth_recv, > + .free_pkt = ks2_eth_free_pkt, > + .stop = ks2_eth_stop, Do you not have a function to set the MAC address in the emac for packet filtering (write_hwaddr)? > +}; > + > + > +static int ks2_eth_ofdata_to_platdata(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + struct eth_pdata *pdata = dev_get_platdata(dev); > + const void *fdt = gd->fdt_blob; > + int interfaces; > + int interface_0; > + int netcp_gbe_0; > + int phy; > + int mdio; > + u32 dma_channel[6]; > + > + interfaces = fdt_subnode_offset(fdt, dev->of_offset, > + "netcp-interfaces"); > + interface_0 = fdt_subnode_offset(fdt, interfaces, "interface-0"); > + > + netcp_gbe_0 = fdtdec_lookup_phandle(fdt, interface_0, "netcp-gbe"); > + priv->link_type = fdtdec_get_int(fdt, netcp_gbe_0, > + "link-interface", -1); > + priv->slave_port = fdtdec_get_int(fdt, netcp_gbe_0, "slave-port", -1); > + /* U-Boot slave port number starts with 1 instead of 0 */ > + priv->slave_port += 1; > + > + phy = fdtdec_lookup_phandle(fdt, netcp_gbe_0, "phy-handle"); > + priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1); > + > + mdio = fdt_parent_offset(fdt, phy); > + if (mdio < 0) { > + error("mdio dt not found\n"); > + return -ENODEV; > + } > + priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); > + > + keystone2_eth_read_mac_addr(priv, pdata); Would this not be more appropriate to just set a pointer to this function to read_rom_hwaddr in the ops structure? > + > + if (priv->link_type == LINK_TYPE_MAC_TO_PHY_MODE) { > + priv->phy_if = PHY_INTERFACE_MODE_SGMII; > + pdata->phy_interface = priv->phy_if; > + priv->sgmii_link_type = SGMII_LINK_MAC_PHY; > + priv->has_mdio = true; > + } > + pdata->iobase = dev_get_addr(dev); > + > + fdtdec_get_int_array(fdt, dev->of_offset, "ti,navigator-dmas", > + dma_channel, 6); > + priv->net_rx_buffs.rx_flow = dma_channel[1]; > + > + return 0; > +} > + > +static const struct udevice_id ks2_eth_ids[] = { > + { .compatible = "ti,netcp-1.0" }, > + { } > +}; > + > +U_BOOT_DRIVER(eth_ks2) = { > + .name = "eth_ks2", > + .id = UCLASS_ETH, > + .of_match = ks2_eth_ids, > + .ofdata_to_platdata = ks2_eth_ofdata_to_platdata, > + .probe = ks2_eth_probe, > + .ops = &ks2_eth_ops, > + .priv_auto_alloc_size = sizeof(struct ks2_eth_priv), > + .platdata_auto_alloc_size = sizeof(struct eth_pdata), > + .flags = DM_FLAG_ALLOC_PRIV_DMA, > +}; > #endif > -- > 2.7.0.rc3 > > _______________________________________________ > U-Boot mailing list > U-Boot at lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model 2016-01-22 20:15 ` Joe Hershberger @ 2016-01-25 8:30 ` Mugunthan V N 0 siblings, 0 replies; 20+ messages in thread From: Mugunthan V N @ 2016-01-25 8:30 UTC (permalink / raw) To: u-boot On Saturday 23 January 2016 01:45 AM, Joe Hershberger wrote: > On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: >> Adopt keystone_net driver to adopt device driver model >> >> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> >> Reviewed-by: Tom Rini <trini@konsulko.com> >> --- >> drivers/net/keystone_net.c | 418 ++++++++++++++++++++++++++++++++++++++++----- >> 1 file changed, 376 insertions(+), 42 deletions(-) >> >> diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c >> index 209fae9..21ebaeb 100644 >> --- a/drivers/net/keystone_net.c >> +++ b/drivers/net/keystone_net.c >> @@ -10,6 +10,8 @@ >> #include <command.h> >> #include <console.h> >> >> +#include <dm.h> >> + >> #include <net.h> >> #include <phy.h> >> #include <errno.h> >> @@ -18,10 +20,15 @@ >> #include <asm/ti-common/keystone_nav.h> >> #include <asm/ti-common/keystone_net.h> >> #include <asm/ti-common/keystone_serdes.h> >> +#include <asm/arch/psc_defs.h> >> + >> +DECLARE_GLOBAL_DATA_PTR; >> >> +#ifndef CONFIG_DM_ETH >> unsigned int emac_open; >> static struct mii_dev *mdio_bus; >> static unsigned int sys_has_mdio = 1; >> +#endif >> >> #ifdef KEYSTONE2_EMAC_GIG_ENABLE >> #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) >> @@ -36,40 +43,44 @@ static unsigned int sys_has_mdio = 1; >> >> static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); >> >> +#ifndef CONFIG_DM_ETH >> struct rx_buff_desc net_rx_buffs = { >> .buff_ptr = rx_buffs, >> .num_buffs = RX_BUFF_NUMS, >> .buff_len = RX_BUFF_LEN, >> .rx_flow = 22, >> }; >> - >> -#ifndef CONFIG_SOC_K2G >> -static void keystone2_net_serdes_setup(void); >> #endif >> >> -int keystone2_eth_read_mac_addr(struct eth_device *dev) >> -{ >> - struct eth_priv_t *eth_priv; >> - u32 maca = 0; >> - u32 macb = 0; >> - >> - eth_priv = (struct eth_priv_t *)dev->priv; >> +#ifdef CONFIG_DM_ETH >> >> - /* Read the e-fuse mac address */ >> - if (eth_priv->slave_port == 1) { >> - maca = __raw_readl(MAC_ID_BASE_ADDR); >> - macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> - } >> - >> - dev->enetaddr[0] = (macb >> 8) & 0xff; >> - dev->enetaddr[1] = (macb >> 0) & 0xff; >> - dev->enetaddr[2] = (maca >> 24) & 0xff; >> - dev->enetaddr[3] = (maca >> 16) & 0xff; >> - dev->enetaddr[4] = (maca >> 8) & 0xff; >> - dev->enetaddr[5] = (maca >> 0) & 0xff; >> +enum link_type { >> + LINK_TYPE_MAC_TO_MAC_AUTO = 0, >> + LINK_TYPE_MAC_TO_PHY_MODE = 1, >> + LINK_TYPE_MAC_TO_MAC_FORCED_MODE = 2, >> + LINK_TYPE_MAC_TO_FIBRE_MODE = 3, >> + LINK_TYPE_MAC_TO_PHY_NO_MDIO_MODE = 4, >> + LINK_TYPE_10G_MAC_TO_PHY_MODE = 10, >> + LINK_TYPE_10G_MAC_TO_MAC_FORCED_MODE = 11, >> +}; >> >> - return 0; >> -} >> +struct ks2_eth_priv { >> + struct udevice *dev; >> + struct phy_device *phydev; >> + struct mii_dev *mdio_bus; >> + int phy_addr; >> + phy_interface_t phy_if; >> + int sgmii_link_type; >> + void *mdio_base; >> + struct rx_buff_desc net_rx_buffs; >> + struct pktdma_cfg *netcp_pktdma; >> + void *hd; >> + int slave_port; >> + enum link_type link_type; >> + bool emac_open; >> + bool has_mdio; >> +}; >> +#endif >> >> /* MDIO */ >> >> @@ -140,6 +151,7 @@ static int keystone2_mdio_write(struct mii_dev *bus, >> return 0; >> } >> >> +#ifndef CONFIG_DM_ETH >> static void __attribute__((unused)) >> keystone2_eth_gigabit_enable(struct eth_device *dev) >> { >> @@ -163,6 +175,31 @@ static void __attribute__((unused)) >> EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, >> DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); >> } >> +#else >> +static void __attribute__((unused)) >> + keystone2_eth_gigabit_enable(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + u_int16_t data; >> + >> + if (priv->has_mdio) { >> + data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, >> + MDIO_DEVAD_NONE, 0); >> + /* speed selection MSB */ >> + if (!(data & (1 << 6))) >> + return; >> + } >> + >> + /* >> + * Check if link detected is giga-bit >> + * If Gigabit mode detected, enable gigbit in MAC >> + */ >> + writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + >> + CPGMACSL_REG_CTL) | >> + EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, >> + DEVICE_EMACSL_BASE(priv->slave_port - 1) + CPGMACSL_REG_CTL); >> +} >> +#endif >> >> #ifdef CONFIG_SOC_K2G >> int keystone_rgmii_config(struct phy_device *phy_dev) >> @@ -401,6 +438,58 @@ int ethss_stop(void) >> return 0; >> } >> >> +struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { >> + .clk = SERDES_CLOCK_156P25M, >> + .rate = SERDES_RATE_5G, >> + .rate_mode = SERDES_QUARTER_RATE, >> + .intf = SERDES_PHY_SGMII, >> + .loopback = 0, >> +}; >> + >> +#ifndef CONFIG_SOC_K2G >> +static void keystone2_net_serdes_setup(void) >> +{ >> + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, >> + &ks2_serdes_sgmii_156p25mhz, >> + CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + >> +#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) >> + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, >> + &ks2_serdes_sgmii_156p25mhz, >> + CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> +#endif >> + >> + /* wait till setup */ >> + udelay(5000); >> +} >> +#endif >> + >> +#ifndef CONFIG_DM_ETH >> + >> +int keystone2_eth_read_mac_addr(struct eth_device *dev) >> +{ >> + struct eth_priv_t *eth_priv; >> + u32 maca = 0; >> + u32 macb = 0; >> + >> + eth_priv = (struct eth_priv_t *)dev->priv; >> + >> + /* Read the e-fuse mac address */ >> + if (eth_priv->slave_port == 1) { >> + maca = __raw_readl(MAC_ID_BASE_ADDR); >> + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> + } >> + >> + dev->enetaddr[0] = (macb >> 8) & 0xff; >> + dev->enetaddr[1] = (macb >> 0) & 0xff; >> + dev->enetaddr[2] = (maca >> 24) & 0xff; >> + dev->enetaddr[3] = (maca >> 16) & 0xff; >> + dev->enetaddr[4] = (maca >> 8) & 0xff; >> + dev->enetaddr[5] = (maca >> 0) & 0xff; >> + >> + return 0; >> +} >> + >> int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) >> { >> if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) >> @@ -556,6 +645,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) >> int res; >> struct eth_device *dev; >> struct phy_device *phy_dev; >> + struct mdio_regs *adap_mdio = (struct mdio_regs *)EMAC_MDIO_BASE_ADDR; >> >> dev = malloc(sizeof(struct eth_device)); >> if (dev == NULL) >> @@ -612,28 +702,272 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) >> return 0; >> } >> >> -struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { >> - .clk = SERDES_CLOCK_156P25M, >> - .rate = SERDES_RATE_5G, >> - .rate_mode = SERDES_QUARTER_RATE, >> - .intf = SERDES_PHY_SGMII, >> - .loopback = 0, >> -}; >> +#else >> >> -#ifndef CONFIG_SOC_K2G >> -static void keystone2_net_serdes_setup(void) >> +int keystone2_eth_read_mac_addr(struct ks2_eth_priv *priv, >> + struct eth_pdata *pdata) >> { >> - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, >> - &ks2_serdes_sgmii_156p25mhz, >> - CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + u32 maca = 0; >> + u32 macb = 0; >> >> -#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) >> - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, >> - &ks2_serdes_sgmii_156p25mhz, >> - CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + /* Read the e-fuse mac address */ >> + if (priv->slave_port == 1) { >> + maca = __raw_readl(MAC_ID_BASE_ADDR); >> + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> + } >> + >> + pdata->enetaddr[0] = (macb >> 8) & 0xff; >> + pdata->enetaddr[1] = (macb >> 0) & 0xff; >> + pdata->enetaddr[2] = (maca >> 24) & 0xff; >> + pdata->enetaddr[3] = (maca >> 16) & 0xff; >> + pdata->enetaddr[4] = (maca >> 8) & 0xff; >> + pdata->enetaddr[5] = (maca >> 0) & 0xff; >> + >> + return 0; >> +} >> + >> +static int ks2_eth_start(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> +#ifdef CONFIG_SOC_K2G >> + keystone_rgmii_config(priv->phydev); >> +#else >> + keystone_sgmii_config(priv->phydev, priv->slave_port - 1, >> + priv->sgmii_link_type); >> #endif >> >> - /* wait till setup */ >> - udelay(5000); >> + udelay(10000); >> + >> + /* On chip switch configuration */ >> + ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); >> + >> + qm_init(); >> + >> + if (ksnav_init(priv->netcp_pktdma, &priv->net_rx_buffs)) { >> + error("ksnav_init failed\n"); >> + goto err_knav_init; >> + } >> + >> + /* >> + * Streaming switch configuration. If not present this >> + * statement is defined to void in target.h. >> + * If present this is usually defined to a series of register writes >> + */ >> + hw_config_streaming_switch(); >> + >> + if (priv->has_mdio) { >> + phy_startup(priv->phydev); >> + if (priv->phydev->link == 0) { >> + error("phy startup failed\n"); >> + goto err_phy_start; >> + } >> + } >> + >> + emac_gigabit_enable(dev); >> + >> + ethss_start(); >> + >> + priv->emac_open = true; >> + >> + return 0; >> + >> +err_phy_start: >> + ksnav_close(priv->netcp_pktdma); >> +err_knav_init: >> + qm_close(); >> + >> + return -EFAULT; >> +} >> + >> +static int ks2_eth_send(struct udevice *dev, void *packet, int length) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + genphy_update_link(priv->phydev); >> + if (priv->phydev->link == 0) >> + return -1; >> + >> + if (length < EMAC_MIN_ETHERNET_PKT_SIZE) >> + length = EMAC_MIN_ETHERNET_PKT_SIZE; >> + >> + return ksnav_send(priv->netcp_pktdma, (u32 *)packet, >> + length, (priv->slave_port) << 16); >> +} >> + >> +static int ks2_eth_recv(struct udevice *dev, int flags, uchar **packetp) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + int pkt_size; >> + u32 *pkt = NULL; >> + >> + priv->hd = ksnav_recv(priv->netcp_pktdma, &pkt, &pkt_size); >> + if (priv->hd == NULL) >> + return -EAGAIN; >> + >> + *packetp = (uchar *)pkt; >> + >> + return pkt_size; >> +} >> + >> +static int ks2_eth_free_pkt(struct udevice *dev, uchar *packet, >> + int length) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + ksnav_release_rxhd(priv->netcp_pktdma, priv->hd); >> + >> + return 0; >> +} >> + >> +static void ks2_eth_stop(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + if (!priv->emac_open) >> + return; >> + ethss_stop(); >> + >> + ksnav_close(priv->netcp_pktdma); >> + qm_close(); >> + phy_shutdown(priv->phydev); >> + priv->emac_open = false; >> +} >> + >> +static int ks2_eth_probe(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + struct mii_dev *mdio_bus; >> + int ret; >> + >> + priv->dev = dev; >> + >> + /* These clock enables has to be moved to common location */ >> + if (cpu_is_k2g()) >> + writel(KS2_ETHERNET_RGMII, KS2_ETHERNET_CFG); >> + >> + /* By default, select PA PLL clock as PA clock source */ >> +#ifndef CONFIG_SOC_K2G >> + if (psc_enable_module(KS2_LPSC_PA)) >> + return -1; >> +#endif >> + if (psc_enable_module(KS2_LPSC_CPGMAC)) >> + return -1; >> + if (psc_enable_module(KS2_LPSC_CRYPTO)) >> + return -1; > > Is there not a more appropriate error code that could be used here for these 3? Hmmm, moved this code from board_eth_init() to here. Will add appropriate returns here in v3. > >> + >> + if (cpu_is_k2e() || cpu_is_k2l()) >> + pll_pa_clk_sel(); >> + >> + >> + priv->net_rx_buffs.buff_ptr = rx_buffs, >> + priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS, >> + priv->net_rx_buffs.buff_len = RX_BUFF_LEN, >> + >> + /* Register MDIO bus */ >> + mdio_bus = mdio_alloc(); >> + if (!mdio_bus) { >> + error("MDIO alloc failed\n"); >> + return -ENOMEM; >> + } >> + priv->mdio_bus = mdio_bus; >> + mdio_bus->read = keystone2_mdio_read; >> + mdio_bus->write = keystone2_mdio_write; >> + mdio_bus->reset = keystone2_mdio_reset; >> + mdio_bus->priv = priv->mdio_base; >> + sprintf(mdio_bus->name, "ethernet-mdio"); >> + >> + ret = mdio_register(mdio_bus); >> + if (ret) { >> + error("MDIO bus register failed\n"); >> + return ret; >> + } >> + >> +#ifndef CONFIG_SOC_K2G >> + keystone2_net_serdes_setup(); >> +#endif >> + >> + priv->netcp_pktdma = &netcp_pktdma; >> + >> + priv->phydev = phy_connect(mdio_bus, priv->phy_addr, dev, priv->phy_if); >> + phy_config(priv->phydev); >> + >> + return 0; >> } >> + >> +static const struct eth_ops ks2_eth_ops = { >> + .start = ks2_eth_start, >> + .send = ks2_eth_send, >> + .recv = ks2_eth_recv, >> + .free_pkt = ks2_eth_free_pkt, >> + .stop = ks2_eth_stop, > > Do you not have a function to set the MAC address in the emac for > packet filtering (write_hwaddr)? Hmmm, There is a register in hardware to writing mac for packet filtering which is never implemented in this driver. Will fix it in next version. > >> +}; >> + >> + >> +static int ks2_eth_ofdata_to_platdata(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + struct eth_pdata *pdata = dev_get_platdata(dev); >> + const void *fdt = gd->fdt_blob; >> + int interfaces; >> + int interface_0; >> + int netcp_gbe_0; >> + int phy; >> + int mdio; >> + u32 dma_channel[6]; >> + >> + interfaces = fdt_subnode_offset(fdt, dev->of_offset, >> + "netcp-interfaces"); >> + interface_0 = fdt_subnode_offset(fdt, interfaces, "interface-0"); >> + >> + netcp_gbe_0 = fdtdec_lookup_phandle(fdt, interface_0, "netcp-gbe"); >> + priv->link_type = fdtdec_get_int(fdt, netcp_gbe_0, >> + "link-interface", -1); >> + priv->slave_port = fdtdec_get_int(fdt, netcp_gbe_0, "slave-port", -1); >> + /* U-Boot slave port number starts with 1 instead of 0 */ >> + priv->slave_port += 1; >> + >> + phy = fdtdec_lookup_phandle(fdt, netcp_gbe_0, "phy-handle"); >> + priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1); >> + >> + mdio = fdt_parent_offset(fdt, phy); >> + if (mdio < 0) { >> + error("mdio dt not found\n"); >> + return -ENODEV; >> + } >> + priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); >> + >> + keystone2_eth_read_mac_addr(priv, pdata); > > Would this not be more appropriate to just set a pointer to this > function to read_rom_hwaddr in the ops structure? Okay, will move this code to read_rom_hwaddr ops. Regards Mugunthan V N ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model Mugunthan V N 2016-01-22 20:15 ` Joe Hershberger @ 2016-01-25 8:35 ` Bin Meng 2016-01-25 10:10 ` Mugunthan V N 1 sibling, 1 reply; 20+ messages in thread From: Bin Meng @ 2016-01-25 8:35 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 4:23 PM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > Adopt keystone_net driver to adopt device driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> > --- > drivers/net/keystone_net.c | 418 ++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 376 insertions(+), 42 deletions(-) > > diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c > index 209fae9..21ebaeb 100644 > --- a/drivers/net/keystone_net.c > +++ b/drivers/net/keystone_net.c > @@ -10,6 +10,8 @@ > #include <command.h> > #include <console.h> > > +#include <dm.h> > + > #include <net.h> > #include <phy.h> > #include <errno.h> > @@ -18,10 +20,15 @@ > #include <asm/ti-common/keystone_nav.h> > #include <asm/ti-common/keystone_net.h> > #include <asm/ti-common/keystone_serdes.h> > +#include <asm/arch/psc_defs.h> > + > +DECLARE_GLOBAL_DATA_PTR; > > +#ifndef CONFIG_DM_ETH > unsigned int emac_open; > static struct mii_dev *mdio_bus; > static unsigned int sys_has_mdio = 1; > +#endif > > #ifdef KEYSTONE2_EMAC_GIG_ENABLE > #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) > @@ -36,40 +43,44 @@ static unsigned int sys_has_mdio = 1; > > static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); > > +#ifndef CONFIG_DM_ETH > struct rx_buff_desc net_rx_buffs = { > .buff_ptr = rx_buffs, > .num_buffs = RX_BUFF_NUMS, > .buff_len = RX_BUFF_LEN, > .rx_flow = 22, > }; > - > -#ifndef CONFIG_SOC_K2G > -static void keystone2_net_serdes_setup(void); > #endif > > -int keystone2_eth_read_mac_addr(struct eth_device *dev) > -{ > - struct eth_priv_t *eth_priv; > - u32 maca = 0; > - u32 macb = 0; > - > - eth_priv = (struct eth_priv_t *)dev->priv; > +#ifdef CONFIG_DM_ETH > > - /* Read the e-fuse mac address */ > - if (eth_priv->slave_port == 1) { > - maca = __raw_readl(MAC_ID_BASE_ADDR); > - macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > - } > - > - dev->enetaddr[0] = (macb >> 8) & 0xff; > - dev->enetaddr[1] = (macb >> 0) & 0xff; > - dev->enetaddr[2] = (maca >> 24) & 0xff; > - dev->enetaddr[3] = (maca >> 16) & 0xff; > - dev->enetaddr[4] = (maca >> 8) & 0xff; > - dev->enetaddr[5] = (maca >> 0) & 0xff; > +enum link_type { > + LINK_TYPE_MAC_TO_MAC_AUTO = 0, > + LINK_TYPE_MAC_TO_PHY_MODE = 1, > + LINK_TYPE_MAC_TO_MAC_FORCED_MODE = 2, > + LINK_TYPE_MAC_TO_FIBRE_MODE = 3, > + LINK_TYPE_MAC_TO_PHY_NO_MDIO_MODE = 4, > + LINK_TYPE_10G_MAC_TO_PHY_MODE = 10, > + LINK_TYPE_10G_MAC_TO_MAC_FORCED_MODE = 11, > +}; > > - return 0; > -} > +struct ks2_eth_priv { > + struct udevice *dev; > + struct phy_device *phydev; > + struct mii_dev *mdio_bus; > + int phy_addr; > + phy_interface_t phy_if; > + int sgmii_link_type; > + void *mdio_base; > + struct rx_buff_desc net_rx_buffs; > + struct pktdma_cfg *netcp_pktdma; > + void *hd; > + int slave_port; > + enum link_type link_type; > + bool emac_open; > + bool has_mdio; > +}; > +#endif > > /* MDIO */ > > @@ -140,6 +151,7 @@ static int keystone2_mdio_write(struct mii_dev *bus, > return 0; > } > > +#ifndef CONFIG_DM_ETH > static void __attribute__((unused)) > keystone2_eth_gigabit_enable(struct eth_device *dev) > { > @@ -163,6 +175,31 @@ static void __attribute__((unused)) > EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, > DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); > } > +#else > +static void __attribute__((unused)) > + keystone2_eth_gigabit_enable(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + u_int16_t data; > + > + if (priv->has_mdio) { > + data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, > + MDIO_DEVAD_NONE, 0); > + /* speed selection MSB */ > + if (!(data & (1 << 6))) > + return; > + } > + > + /* > + * Check if link detected is giga-bit > + * If Gigabit mode detected, enable gigbit in MAC > + */ > + writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + > + CPGMACSL_REG_CTL) | > + EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, > + DEVICE_EMACSL_BASE(priv->slave_port - 1) + CPGMACSL_REG_CTL); > +} > +#endif > > #ifdef CONFIG_SOC_K2G > int keystone_rgmii_config(struct phy_device *phy_dev) > @@ -401,6 +438,58 @@ int ethss_stop(void) > return 0; > } > > +struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { > + .clk = SERDES_CLOCK_156P25M, > + .rate = SERDES_RATE_5G, > + .rate_mode = SERDES_QUARTER_RATE, > + .intf = SERDES_PHY_SGMII, > + .loopback = 0, > +}; > + > +#ifndef CONFIG_SOC_K2G > +static void keystone2_net_serdes_setup(void) > +{ > + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, > + &ks2_serdes_sgmii_156p25mhz, > + CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + > +#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) > + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, > + &ks2_serdes_sgmii_156p25mhz, > + CONFIG_KSNET_SERDES_LANES_PER_SGMII); > +#endif > + > + /* wait till setup */ > + udelay(5000); > +} > +#endif > + > +#ifndef CONFIG_DM_ETH > + > +int keystone2_eth_read_mac_addr(struct eth_device *dev) > +{ > + struct eth_priv_t *eth_priv; > + u32 maca = 0; > + u32 macb = 0; > + > + eth_priv = (struct eth_priv_t *)dev->priv; > + > + /* Read the e-fuse mac address */ > + if (eth_priv->slave_port == 1) { > + maca = __raw_readl(MAC_ID_BASE_ADDR); > + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > + } > + > + dev->enetaddr[0] = (macb >> 8) & 0xff; > + dev->enetaddr[1] = (macb >> 0) & 0xff; > + dev->enetaddr[2] = (maca >> 24) & 0xff; > + dev->enetaddr[3] = (maca >> 16) & 0xff; > + dev->enetaddr[4] = (maca >> 8) & 0xff; > + dev->enetaddr[5] = (maca >> 0) & 0xff; > + > + return 0; > +} > + > int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) > { > if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) > @@ -556,6 +645,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) > int res; > struct eth_device *dev; > struct phy_device *phy_dev; > + struct mdio_regs *adap_mdio = (struct mdio_regs *)EMAC_MDIO_BASE_ADDR; > > dev = malloc(sizeof(struct eth_device)); > if (dev == NULL) > @@ -612,28 +702,272 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) > return 0; > } > > -struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { > - .clk = SERDES_CLOCK_156P25M, > - .rate = SERDES_RATE_5G, > - .rate_mode = SERDES_QUARTER_RATE, > - .intf = SERDES_PHY_SGMII, > - .loopback = 0, > -}; > +#else > > -#ifndef CONFIG_SOC_K2G > -static void keystone2_net_serdes_setup(void) > +int keystone2_eth_read_mac_addr(struct ks2_eth_priv *priv, > + struct eth_pdata *pdata) > { > - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, > - &ks2_serdes_sgmii_156p25mhz, > - CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + u32 maca = 0; > + u32 macb = 0; > > -#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) > - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, > - &ks2_serdes_sgmii_156p25mhz, > - CONFIG_KSNET_SERDES_LANES_PER_SGMII); > + /* Read the e-fuse mac address */ > + if (priv->slave_port == 1) { > + maca = __raw_readl(MAC_ID_BASE_ADDR); > + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); > + } > + > + pdata->enetaddr[0] = (macb >> 8) & 0xff; > + pdata->enetaddr[1] = (macb >> 0) & 0xff; > + pdata->enetaddr[2] = (maca >> 24) & 0xff; > + pdata->enetaddr[3] = (maca >> 16) & 0xff; > + pdata->enetaddr[4] = (maca >> 8) & 0xff; > + pdata->enetaddr[5] = (maca >> 0) & 0xff; > + > + return 0; > +} > + > +static int ks2_eth_start(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > +#ifdef CONFIG_SOC_K2G > + keystone_rgmii_config(priv->phydev); > +#else > + keystone_sgmii_config(priv->phydev, priv->slave_port - 1, > + priv->sgmii_link_type); > #endif > > - /* wait till setup */ > - udelay(5000); > + udelay(10000); > + > + /* On chip switch configuration */ > + ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); > + > + qm_init(); > + > + if (ksnav_init(priv->netcp_pktdma, &priv->net_rx_buffs)) { > + error("ksnav_init failed\n"); > + goto err_knav_init; > + } > + > + /* > + * Streaming switch configuration. If not present this > + * statement is defined to void in target.h. > + * If present this is usually defined to a series of register writes > + */ > + hw_config_streaming_switch(); > + > + if (priv->has_mdio) { > + phy_startup(priv->phydev); > + if (priv->phydev->link == 0) { > + error("phy startup failed\n"); > + goto err_phy_start; > + } > + } > + > + emac_gigabit_enable(dev); > + > + ethss_start(); > + > + priv->emac_open = true; > + > + return 0; > + > +err_phy_start: > + ksnav_close(priv->netcp_pktdma); > +err_knav_init: > + qm_close(); > + > + return -EFAULT; > +} > + > +static int ks2_eth_send(struct udevice *dev, void *packet, int length) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + genphy_update_link(priv->phydev); > + if (priv->phydev->link == 0) > + return -1; > + > + if (length < EMAC_MIN_ETHERNET_PKT_SIZE) > + length = EMAC_MIN_ETHERNET_PKT_SIZE; > + > + return ksnav_send(priv->netcp_pktdma, (u32 *)packet, > + length, (priv->slave_port) << 16); > +} > + > +static int ks2_eth_recv(struct udevice *dev, int flags, uchar **packetp) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + int pkt_size; > + u32 *pkt = NULL; > + > + priv->hd = ksnav_recv(priv->netcp_pktdma, &pkt, &pkt_size); > + if (priv->hd == NULL) > + return -EAGAIN; > + > + *packetp = (uchar *)pkt; > + > + return pkt_size; > +} > + > +static int ks2_eth_free_pkt(struct udevice *dev, uchar *packet, > + int length) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + ksnav_release_rxhd(priv->netcp_pktdma, priv->hd); > + > + return 0; > +} > + > +static void ks2_eth_stop(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + > + if (!priv->emac_open) > + return; > + ethss_stop(); > + > + ksnav_close(priv->netcp_pktdma); > + qm_close(); > + phy_shutdown(priv->phydev); > + priv->emac_open = false; > +} > + > +static int ks2_eth_probe(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + struct mii_dev *mdio_bus; > + int ret; > + > + priv->dev = dev; > + > + /* These clock enables has to be moved to common location */ > + if (cpu_is_k2g()) > + writel(KS2_ETHERNET_RGMII, KS2_ETHERNET_CFG); > + > + /* By default, select PA PLL clock as PA clock source */ > +#ifndef CONFIG_SOC_K2G > + if (psc_enable_module(KS2_LPSC_PA)) > + return -1; > +#endif > + if (psc_enable_module(KS2_LPSC_CPGMAC)) > + return -1; > + if (psc_enable_module(KS2_LPSC_CRYPTO)) > + return -1; > + > + if (cpu_is_k2e() || cpu_is_k2l()) > + pll_pa_clk_sel(); > + > + > + priv->net_rx_buffs.buff_ptr = rx_buffs, > + priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS, > + priv->net_rx_buffs.buff_len = RX_BUFF_LEN, > + > + /* Register MDIO bus */ > + mdio_bus = mdio_alloc(); > + if (!mdio_bus) { > + error("MDIO alloc failed\n"); > + return -ENOMEM; > + } > + priv->mdio_bus = mdio_bus; > + mdio_bus->read = keystone2_mdio_read; > + mdio_bus->write = keystone2_mdio_write; > + mdio_bus->reset = keystone2_mdio_reset; > + mdio_bus->priv = priv->mdio_base; > + sprintf(mdio_bus->name, "ethernet-mdio"); > + > + ret = mdio_register(mdio_bus); > + if (ret) { > + error("MDIO bus register failed\n"); > + return ret; > + } > + > +#ifndef CONFIG_SOC_K2G > + keystone2_net_serdes_setup(); > +#endif > + > + priv->netcp_pktdma = &netcp_pktdma; > + > + priv->phydev = phy_connect(mdio_bus, priv->phy_addr, dev, priv->phy_if); > + phy_config(priv->phydev); > + > + return 0; > } > + > +static const struct eth_ops ks2_eth_ops = { > + .start = ks2_eth_start, > + .send = ks2_eth_send, > + .recv = ks2_eth_recv, > + .free_pkt = ks2_eth_free_pkt, > + .stop = ks2_eth_stop, > +}; > + > + > +static int ks2_eth_ofdata_to_platdata(struct udevice *dev) > +{ > + struct ks2_eth_priv *priv = dev_get_priv(dev); > + struct eth_pdata *pdata = dev_get_platdata(dev); > + const void *fdt = gd->fdt_blob; > + int interfaces; > + int interface_0; > + int netcp_gbe_0; > + int phy; > + int mdio; > + u32 dma_channel[6]; > + > + interfaces = fdt_subnode_offset(fdt, dev->of_offset, > + "netcp-interfaces"); > + interface_0 = fdt_subnode_offset(fdt, interfaces, "interface-0"); > + > + netcp_gbe_0 = fdtdec_lookup_phandle(fdt, interface_0, "netcp-gbe"); > + priv->link_type = fdtdec_get_int(fdt, netcp_gbe_0, > + "link-interface", -1); > + priv->slave_port = fdtdec_get_int(fdt, netcp_gbe_0, "slave-port", -1); > + /* U-Boot slave port number starts with 1 instead of 0 */ > + priv->slave_port += 1; > + > + phy = fdtdec_lookup_phandle(fdt, netcp_gbe_0, "phy-handle"); > + priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1); > + > + mdio = fdt_parent_offset(fdt, phy); > + if (mdio < 0) { > + error("mdio dt not found\n"); > + return -ENODEV; > + } > + priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); > + > + keystone2_eth_read_mac_addr(priv, pdata); > + > + if (priv->link_type == LINK_TYPE_MAC_TO_PHY_MODE) { > + priv->phy_if = PHY_INTERFACE_MODE_SGMII; > + pdata->phy_interface = priv->phy_if; > + priv->sgmii_link_type = SGMII_LINK_MAC_PHY; > + priv->has_mdio = true; > + } > + pdata->iobase = dev_get_addr(dev); > + > + fdtdec_get_int_array(fdt, dev->of_offset, "ti,navigator-dmas", > + dma_channel, 6); > + priv->net_rx_buffs.rx_flow = dma_channel[1]; > + > + return 0; > +} > + > +static const struct udevice_id ks2_eth_ids[] = { > + { .compatible = "ti,netcp-1.0" }, > + { } > +}; > + > +U_BOOT_DRIVER(eth_ks2) = { > + .name = "eth_ks2", > + .id = UCLASS_ETH, > + .of_match = ks2_eth_ids, > + .ofdata_to_platdata = ks2_eth_ofdata_to_platdata, > + .probe = ks2_eth_probe, > + .ops = &ks2_eth_ops, > + .priv_auto_alloc_size = sizeof(struct ks2_eth_priv), > + .platdata_auto_alloc_size = sizeof(struct eth_pdata), > + .flags = DM_FLAG_ALLOC_PRIV_DMA, > +}; > #endif > -- Please add .remove op as I see mdio bus is being used. Regards, Bin ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model 2016-01-25 8:35 ` Bin Meng @ 2016-01-25 10:10 ` Mugunthan V N 0 siblings, 0 replies; 20+ messages in thread From: Mugunthan V N @ 2016-01-25 10:10 UTC (permalink / raw) To: u-boot On Monday 25 January 2016 02:05 PM, Bin Meng wrote: > On Fri, Jan 22, 2016 at 4:23 PM, Mugunthan V N <mugunthanvnm@ti.com> wrote: >> Adopt keystone_net driver to adopt device driver model >> >> Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> >> Reviewed-by: Tom Rini <trini@konsulko.com> >> --- >> drivers/net/keystone_net.c | 418 ++++++++++++++++++++++++++++++++++++++++----- >> 1 file changed, 376 insertions(+), 42 deletions(-) >> >> diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c >> index 209fae9..21ebaeb 100644 >> --- a/drivers/net/keystone_net.c >> +++ b/drivers/net/keystone_net.c >> @@ -10,6 +10,8 @@ >> #include <command.h> >> #include <console.h> >> >> +#include <dm.h> >> + >> #include <net.h> >> #include <phy.h> >> #include <errno.h> >> @@ -18,10 +20,15 @@ >> #include <asm/ti-common/keystone_nav.h> >> #include <asm/ti-common/keystone_net.h> >> #include <asm/ti-common/keystone_serdes.h> >> +#include <asm/arch/psc_defs.h> >> + >> +DECLARE_GLOBAL_DATA_PTR; >> >> +#ifndef CONFIG_DM_ETH >> unsigned int emac_open; >> static struct mii_dev *mdio_bus; >> static unsigned int sys_has_mdio = 1; >> +#endif >> >> #ifdef KEYSTONE2_EMAC_GIG_ENABLE >> #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) >> @@ -36,40 +43,44 @@ static unsigned int sys_has_mdio = 1; >> >> static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); >> >> +#ifndef CONFIG_DM_ETH >> struct rx_buff_desc net_rx_buffs = { >> .buff_ptr = rx_buffs, >> .num_buffs = RX_BUFF_NUMS, >> .buff_len = RX_BUFF_LEN, >> .rx_flow = 22, >> }; >> - >> -#ifndef CONFIG_SOC_K2G >> -static void keystone2_net_serdes_setup(void); >> #endif >> >> -int keystone2_eth_read_mac_addr(struct eth_device *dev) >> -{ >> - struct eth_priv_t *eth_priv; >> - u32 maca = 0; >> - u32 macb = 0; >> - >> - eth_priv = (struct eth_priv_t *)dev->priv; >> +#ifdef CONFIG_DM_ETH >> >> - /* Read the e-fuse mac address */ >> - if (eth_priv->slave_port == 1) { >> - maca = __raw_readl(MAC_ID_BASE_ADDR); >> - macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> - } >> - >> - dev->enetaddr[0] = (macb >> 8) & 0xff; >> - dev->enetaddr[1] = (macb >> 0) & 0xff; >> - dev->enetaddr[2] = (maca >> 24) & 0xff; >> - dev->enetaddr[3] = (maca >> 16) & 0xff; >> - dev->enetaddr[4] = (maca >> 8) & 0xff; >> - dev->enetaddr[5] = (maca >> 0) & 0xff; >> +enum link_type { >> + LINK_TYPE_MAC_TO_MAC_AUTO = 0, >> + LINK_TYPE_MAC_TO_PHY_MODE = 1, >> + LINK_TYPE_MAC_TO_MAC_FORCED_MODE = 2, >> + LINK_TYPE_MAC_TO_FIBRE_MODE = 3, >> + LINK_TYPE_MAC_TO_PHY_NO_MDIO_MODE = 4, >> + LINK_TYPE_10G_MAC_TO_PHY_MODE = 10, >> + LINK_TYPE_10G_MAC_TO_MAC_FORCED_MODE = 11, >> +}; >> >> - return 0; >> -} >> +struct ks2_eth_priv { >> + struct udevice *dev; >> + struct phy_device *phydev; >> + struct mii_dev *mdio_bus; >> + int phy_addr; >> + phy_interface_t phy_if; >> + int sgmii_link_type; >> + void *mdio_base; >> + struct rx_buff_desc net_rx_buffs; >> + struct pktdma_cfg *netcp_pktdma; >> + void *hd; >> + int slave_port; >> + enum link_type link_type; >> + bool emac_open; >> + bool has_mdio; >> +}; >> +#endif >> >> /* MDIO */ >> >> @@ -140,6 +151,7 @@ static int keystone2_mdio_write(struct mii_dev *bus, >> return 0; >> } >> >> +#ifndef CONFIG_DM_ETH >> static void __attribute__((unused)) >> keystone2_eth_gigabit_enable(struct eth_device *dev) >> { >> @@ -163,6 +175,31 @@ static void __attribute__((unused)) >> EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, >> DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); >> } >> +#else >> +static void __attribute__((unused)) >> + keystone2_eth_gigabit_enable(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + u_int16_t data; >> + >> + if (priv->has_mdio) { >> + data = keystone2_mdio_read(priv->mdio_bus, priv->phy_addr, >> + MDIO_DEVAD_NONE, 0); >> + /* speed selection MSB */ >> + if (!(data & (1 << 6))) >> + return; >> + } >> + >> + /* >> + * Check if link detected is giga-bit >> + * If Gigabit mode detected, enable gigbit in MAC >> + */ >> + writel(readl(DEVICE_EMACSL_BASE(priv->slave_port - 1) + >> + CPGMACSL_REG_CTL) | >> + EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, >> + DEVICE_EMACSL_BASE(priv->slave_port - 1) + CPGMACSL_REG_CTL); >> +} >> +#endif >> >> #ifdef CONFIG_SOC_K2G >> int keystone_rgmii_config(struct phy_device *phy_dev) >> @@ -401,6 +438,58 @@ int ethss_stop(void) >> return 0; >> } >> >> +struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { >> + .clk = SERDES_CLOCK_156P25M, >> + .rate = SERDES_RATE_5G, >> + .rate_mode = SERDES_QUARTER_RATE, >> + .intf = SERDES_PHY_SGMII, >> + .loopback = 0, >> +}; >> + >> +#ifndef CONFIG_SOC_K2G >> +static void keystone2_net_serdes_setup(void) >> +{ >> + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, >> + &ks2_serdes_sgmii_156p25mhz, >> + CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + >> +#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) >> + ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, >> + &ks2_serdes_sgmii_156p25mhz, >> + CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> +#endif >> + >> + /* wait till setup */ >> + udelay(5000); >> +} >> +#endif >> + >> +#ifndef CONFIG_DM_ETH >> + >> +int keystone2_eth_read_mac_addr(struct eth_device *dev) >> +{ >> + struct eth_priv_t *eth_priv; >> + u32 maca = 0; >> + u32 macb = 0; >> + >> + eth_priv = (struct eth_priv_t *)dev->priv; >> + >> + /* Read the e-fuse mac address */ >> + if (eth_priv->slave_port == 1) { >> + maca = __raw_readl(MAC_ID_BASE_ADDR); >> + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> + } >> + >> + dev->enetaddr[0] = (macb >> 8) & 0xff; >> + dev->enetaddr[1] = (macb >> 0) & 0xff; >> + dev->enetaddr[2] = (maca >> 24) & 0xff; >> + dev->enetaddr[3] = (maca >> 16) & 0xff; >> + dev->enetaddr[4] = (maca >> 8) & 0xff; >> + dev->enetaddr[5] = (maca >> 0) & 0xff; >> + >> + return 0; >> +} >> + >> int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) >> { >> if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) >> @@ -556,6 +645,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) >> int res; >> struct eth_device *dev; >> struct phy_device *phy_dev; >> + struct mdio_regs *adap_mdio = (struct mdio_regs *)EMAC_MDIO_BASE_ADDR; >> >> dev = malloc(sizeof(struct eth_device)); >> if (dev == NULL) >> @@ -612,28 +702,272 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv) >> return 0; >> } >> >> -struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { >> - .clk = SERDES_CLOCK_156P25M, >> - .rate = SERDES_RATE_5G, >> - .rate_mode = SERDES_QUARTER_RATE, >> - .intf = SERDES_PHY_SGMII, >> - .loopback = 0, >> -}; >> +#else >> >> -#ifndef CONFIG_SOC_K2G >> -static void keystone2_net_serdes_setup(void) >> +int keystone2_eth_read_mac_addr(struct ks2_eth_priv *priv, >> + struct eth_pdata *pdata) >> { >> - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, >> - &ks2_serdes_sgmii_156p25mhz, >> - CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + u32 maca = 0; >> + u32 macb = 0; >> >> -#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) >> - ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, >> - &ks2_serdes_sgmii_156p25mhz, >> - CONFIG_KSNET_SERDES_LANES_PER_SGMII); >> + /* Read the e-fuse mac address */ >> + if (priv->slave_port == 1) { >> + maca = __raw_readl(MAC_ID_BASE_ADDR); >> + macb = __raw_readl(MAC_ID_BASE_ADDR + 4); >> + } >> + >> + pdata->enetaddr[0] = (macb >> 8) & 0xff; >> + pdata->enetaddr[1] = (macb >> 0) & 0xff; >> + pdata->enetaddr[2] = (maca >> 24) & 0xff; >> + pdata->enetaddr[3] = (maca >> 16) & 0xff; >> + pdata->enetaddr[4] = (maca >> 8) & 0xff; >> + pdata->enetaddr[5] = (maca >> 0) & 0xff; >> + >> + return 0; >> +} >> + >> +static int ks2_eth_start(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> +#ifdef CONFIG_SOC_K2G >> + keystone_rgmii_config(priv->phydev); >> +#else >> + keystone_sgmii_config(priv->phydev, priv->slave_port - 1, >> + priv->sgmii_link_type); >> #endif >> >> - /* wait till setup */ >> - udelay(5000); >> + udelay(10000); >> + >> + /* On chip switch configuration */ >> + ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); >> + >> + qm_init(); >> + >> + if (ksnav_init(priv->netcp_pktdma, &priv->net_rx_buffs)) { >> + error("ksnav_init failed\n"); >> + goto err_knav_init; >> + } >> + >> + /* >> + * Streaming switch configuration. If not present this >> + * statement is defined to void in target.h. >> + * If present this is usually defined to a series of register writes >> + */ >> + hw_config_streaming_switch(); >> + >> + if (priv->has_mdio) { >> + phy_startup(priv->phydev); >> + if (priv->phydev->link == 0) { >> + error("phy startup failed\n"); >> + goto err_phy_start; >> + } >> + } >> + >> + emac_gigabit_enable(dev); >> + >> + ethss_start(); >> + >> + priv->emac_open = true; >> + >> + return 0; >> + >> +err_phy_start: >> + ksnav_close(priv->netcp_pktdma); >> +err_knav_init: >> + qm_close(); >> + >> + return -EFAULT; >> +} >> + >> +static int ks2_eth_send(struct udevice *dev, void *packet, int length) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + genphy_update_link(priv->phydev); >> + if (priv->phydev->link == 0) >> + return -1; >> + >> + if (length < EMAC_MIN_ETHERNET_PKT_SIZE) >> + length = EMAC_MIN_ETHERNET_PKT_SIZE; >> + >> + return ksnav_send(priv->netcp_pktdma, (u32 *)packet, >> + length, (priv->slave_port) << 16); >> +} >> + >> +static int ks2_eth_recv(struct udevice *dev, int flags, uchar **packetp) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + int pkt_size; >> + u32 *pkt = NULL; >> + >> + priv->hd = ksnav_recv(priv->netcp_pktdma, &pkt, &pkt_size); >> + if (priv->hd == NULL) >> + return -EAGAIN; >> + >> + *packetp = (uchar *)pkt; >> + >> + return pkt_size; >> +} >> + >> +static int ks2_eth_free_pkt(struct udevice *dev, uchar *packet, >> + int length) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + ksnav_release_rxhd(priv->netcp_pktdma, priv->hd); >> + >> + return 0; >> +} >> + >> +static void ks2_eth_stop(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + >> + if (!priv->emac_open) >> + return; >> + ethss_stop(); >> + >> + ksnav_close(priv->netcp_pktdma); >> + qm_close(); >> + phy_shutdown(priv->phydev); >> + priv->emac_open = false; >> +} >> + >> +static int ks2_eth_probe(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + struct mii_dev *mdio_bus; >> + int ret; >> + >> + priv->dev = dev; >> + >> + /* These clock enables has to be moved to common location */ >> + if (cpu_is_k2g()) >> + writel(KS2_ETHERNET_RGMII, KS2_ETHERNET_CFG); >> + >> + /* By default, select PA PLL clock as PA clock source */ >> +#ifndef CONFIG_SOC_K2G >> + if (psc_enable_module(KS2_LPSC_PA)) >> + return -1; >> +#endif >> + if (psc_enable_module(KS2_LPSC_CPGMAC)) >> + return -1; >> + if (psc_enable_module(KS2_LPSC_CRYPTO)) >> + return -1; >> + >> + if (cpu_is_k2e() || cpu_is_k2l()) >> + pll_pa_clk_sel(); >> + >> + >> + priv->net_rx_buffs.buff_ptr = rx_buffs, >> + priv->net_rx_buffs.num_buffs = RX_BUFF_NUMS, >> + priv->net_rx_buffs.buff_len = RX_BUFF_LEN, >> + >> + /* Register MDIO bus */ >> + mdio_bus = mdio_alloc(); >> + if (!mdio_bus) { >> + error("MDIO alloc failed\n"); >> + return -ENOMEM; >> + } >> + priv->mdio_bus = mdio_bus; >> + mdio_bus->read = keystone2_mdio_read; >> + mdio_bus->write = keystone2_mdio_write; >> + mdio_bus->reset = keystone2_mdio_reset; >> + mdio_bus->priv = priv->mdio_base; >> + sprintf(mdio_bus->name, "ethernet-mdio"); >> + >> + ret = mdio_register(mdio_bus); >> + if (ret) { >> + error("MDIO bus register failed\n"); >> + return ret; >> + } >> + >> +#ifndef CONFIG_SOC_K2G >> + keystone2_net_serdes_setup(); >> +#endif >> + >> + priv->netcp_pktdma = &netcp_pktdma; >> + >> + priv->phydev = phy_connect(mdio_bus, priv->phy_addr, dev, priv->phy_if); >> + phy_config(priv->phydev); >> + >> + return 0; >> } >> + >> +static const struct eth_ops ks2_eth_ops = { >> + .start = ks2_eth_start, >> + .send = ks2_eth_send, >> + .recv = ks2_eth_recv, >> + .free_pkt = ks2_eth_free_pkt, >> + .stop = ks2_eth_stop, >> +}; >> + >> + >> +static int ks2_eth_ofdata_to_platdata(struct udevice *dev) >> +{ >> + struct ks2_eth_priv *priv = dev_get_priv(dev); >> + struct eth_pdata *pdata = dev_get_platdata(dev); >> + const void *fdt = gd->fdt_blob; >> + int interfaces; >> + int interface_0; >> + int netcp_gbe_0; >> + int phy; >> + int mdio; >> + u32 dma_channel[6]; >> + >> + interfaces = fdt_subnode_offset(fdt, dev->of_offset, >> + "netcp-interfaces"); >> + interface_0 = fdt_subnode_offset(fdt, interfaces, "interface-0"); >> + >> + netcp_gbe_0 = fdtdec_lookup_phandle(fdt, interface_0, "netcp-gbe"); >> + priv->link_type = fdtdec_get_int(fdt, netcp_gbe_0, >> + "link-interface", -1); >> + priv->slave_port = fdtdec_get_int(fdt, netcp_gbe_0, "slave-port", -1); >> + /* U-Boot slave port number starts with 1 instead of 0 */ >> + priv->slave_port += 1; >> + >> + phy = fdtdec_lookup_phandle(fdt, netcp_gbe_0, "phy-handle"); >> + priv->phy_addr = fdtdec_get_int(fdt, phy, "reg", -1); >> + >> + mdio = fdt_parent_offset(fdt, phy); >> + if (mdio < 0) { >> + error("mdio dt not found\n"); >> + return -ENODEV; >> + } >> + priv->mdio_base = (void *)fdtdec_get_addr(fdt, mdio, "reg"); >> + >> + keystone2_eth_read_mac_addr(priv, pdata); >> + >> + if (priv->link_type == LINK_TYPE_MAC_TO_PHY_MODE) { >> + priv->phy_if = PHY_INTERFACE_MODE_SGMII; >> + pdata->phy_interface = priv->phy_if; >> + priv->sgmii_link_type = SGMII_LINK_MAC_PHY; >> + priv->has_mdio = true; >> + } >> + pdata->iobase = dev_get_addr(dev); >> + >> + fdtdec_get_int_array(fdt, dev->of_offset, "ti,navigator-dmas", >> + dma_channel, 6); >> + priv->net_rx_buffs.rx_flow = dma_channel[1]; >> + >> + return 0; >> +} >> + >> +static const struct udevice_id ks2_eth_ids[] = { >> + { .compatible = "ti,netcp-1.0" }, >> + { } >> +}; >> + >> +U_BOOT_DRIVER(eth_ks2) = { >> + .name = "eth_ks2", >> + .id = UCLASS_ETH, >> + .of_match = ks2_eth_ids, >> + .ofdata_to_platdata = ks2_eth_ofdata_to_platdata, >> + .probe = ks2_eth_probe, >> + .ops = &ks2_eth_ops, >> + .priv_auto_alloc_size = sizeof(struct ks2_eth_priv), >> + .platdata_auto_alloc_size = sizeof(struct eth_pdata), >> + .flags = DM_FLAG_ALLOC_PRIV_DMA, >> +}; >> #endif >> -- > > Please add .remove op as I see mdio bus is being used. Yeah, will fix in v3. Regards Mugunthan V N ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net driver model 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N ` (2 preceding siblings ...) 2016-01-22 8:23 ` [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:15 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: " Mugunthan V N ` (3 subsequent siblings) 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot enable net driver model for k2hk evm as keystone_net supports driver model Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- configs/k2hk_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/k2hk_evm_defconfig b/configs/k2hk_evm_defconfig index 940d483..f49d820 100644 --- a/configs/k2hk_evm_defconfig +++ b/configs/k2hk_evm_defconfig @@ -13,3 +13,4 @@ CONFIG_DM=y CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SYS_NS16550=y +CONFIG_DM_ETH=y -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net " Mugunthan V N @ 2016-01-22 20:15 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:15 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > enable net driver model for k2hk evm as keystone_net supports > driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: enable net driver model 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N ` (3 preceding siblings ...) 2016-01-22 8:23 ` [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net " Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:16 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: " Mugunthan V N ` (2 subsequent siblings) 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot enable net driver model for k2l evm as keystone_net supports driver model Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- configs/k2l_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/k2l_evm_defconfig b/configs/k2l_evm_defconfig index 1b21ed0..6f5ac18 100644 --- a/configs/k2l_evm_defconfig +++ b/configs/k2l_evm_defconfig @@ -13,3 +13,4 @@ CONFIG_DM=y CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SYS_NS16550=y +CONFIG_DM_ETH=y -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: enable net driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: " Mugunthan V N @ 2016-01-22 20:16 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:16 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > enable net driver model for k2l evm as keystone_net supports > driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: enable net driver model 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N ` (4 preceding siblings ...) 2016-01-22 8:23 ` [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: " Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:16 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model Mugunthan V N 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot enable net driver model for k2e evm as keystone_net supports driver model Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- configs/k2e_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/k2e_evm_defconfig b/configs/k2e_evm_defconfig index 9fb9dac..5616be9 100644 --- a/configs/k2e_evm_defconfig +++ b/configs/k2e_evm_defconfig @@ -13,3 +13,4 @@ CONFIG_DM=y CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SYS_NS16550=y +CONFIG_DM_ETH=y -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: enable net driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: " Mugunthan V N @ 2016-01-22 20:16 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:16 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > enable net driver model for k2e evm as keystone_net supports > driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N ` (5 preceding siblings ...) 2016-01-22 8:23 ` [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: " Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:17 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model Mugunthan V N 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot Add keystone net DT support for k2g evm. Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- arch/arm/dts/k2g-evm.dts | 12 ++++ arch/arm/dts/k2g-netcp.dtsi | 151 ++++++++++++++++++++++++++++++++++++++++++++ arch/arm/dts/k2g.dtsi | 13 ++++ 3 files changed, 176 insertions(+) create mode 100644 arch/arm/dts/k2g-netcp.dtsi diff --git a/arch/arm/dts/k2g-evm.dts b/arch/arm/dts/k2g-evm.dts index de50e8f..0ca36ef 100644 --- a/arch/arm/dts/k2g-evm.dts +++ b/arch/arm/dts/k2g-evm.dts @@ -19,3 +19,15 @@ stdout-path = &uart0; }; }; + +&mdio { + status = "okay"; + ethphy0: ethernet-phy at 0 { + reg = <0>; + phy-mode = "rgmii-id"; + }; +}; + +&gbe0 { + phy-handle = <ðphy0>; +}; diff --git a/arch/arm/dts/k2g-netcp.dtsi b/arch/arm/dts/k2g-netcp.dtsi new file mode 100644 index 0000000..6f0ff86 --- /dev/null +++ b/arch/arm/dts/k2g-netcp.dtsi @@ -0,0 +1,151 @@ +/* + * Device Tree Source for Keystone 2 Galileo Netcp driver + * + * Copyright 2015 Texas Instruments, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +qmss: qmss at 4020000 { + compatible = "ti,keystone-navigator-qmss-l"; + dma-coherent; + #address-cells = <1>; + #size-cells = <1>; + /* power-domains = <&k2g_pds K2G_DEV_NSS0>; */ + /* clocks = <&k2g_clks K2G_DEV_NSS0 K2G_DEV_NSS_VCLK>; */ + clock-names = "nss_vclk"; + ranges; + queue-range = <0 0x80>; + linkram0 = <0x4020000 0x7ff>; + + qmgrs { + #address-cells = <1>; + #size-cells = <1>; + ranges; + qmgr0 { + managed-queues = <0 0x80>; + reg = <0x4100000 0x800>, + <0x4040000 0x100>, + <0x4080000 0x800>, + <0x40c0000 0x800>; + reg-names = "peek", "config", + "region", "push"; + }; + + }; + queue-pools { + qpend { + qpend-0 { + qrange = <77 8>; + interrupts =<0 308 0xf04 0 309 0xf04 0 310 0xf04 + 0 311 0xf04 0 312 0xf04 0 313 0xf04 + 0 314 0xf04 0 315 0xf04>; + qalloc-by-id; + }; + }; + general-purpose { + gp-0 { + qrange = <112 8>; + }; + netcp-tx { + qrange = <5 8>; + qalloc-by-id; + }; + }; + }; + + descriptor-regions { + #address-cells = <1>; + #size-cells = <1>; + ranges; + region-12 { + id = <12>; + region-spec = <1023 128>; /* num_desc desc_size */ + link-index = <0x400>; + }; + }; +}; /* qmss */ + +knav_dmas: knav_dmas at 0 { + compatible = "ti,keystone-navigator-dma"; + #address-cells = <1>; + #size-cells = <1>; + /* power-domains = <&k2g_pds K2G_DEV_NSS0>; */ + /* clocks = <&k2g_clks K2G_DEV_NSS0 K2G_DEV_NSS_VCLK>; */ + clock-names = "nss_vclk"; + ranges; + ti,navigator-cloud-address = <0x40c0000 0x40c0000 0x40c0000 0x40c0000>; + + dma_gbe: dma_gbe at 0 { + reg = <0x4010000 0x100>, + <0x4011000 0x2a0>, /* 21 Tx channels */ + <0x4012000 0x400>, /* 32 Rx channels */ + <0x4010100 0x80>, + <0x4013000 0x400>; /* 32 Rx flows */ + reg-names = "global", "txchan", "rxchan", + "txsched", "rxflow"; + }; + +}; + +gbe_subsys: subsys at 4200000 { + compatible = "syscon"; + reg = <0x4200000 0x100>; +}; + +netcp: netcp at 4000000 { + reg = <0x2620110 0x8>; + reg-names = "efuse"; + compatible = "ti,netcp-1.0"; + #address-cells = <1>; + #size-cells = <1>; + /* power-domains = <&k2g_pds K2G_DEV_NSS0>; */ + /* clocks = <&k2g_clks K2G_DEV_NSS0 K2G_DEV_NSS_ESW_CLK>; */ + clock-names = "ethss_clk"; + + /* NetCP address range */ + ranges = <0 0x4000000 0x1000000>; + + dma-coherent; + + ti,navigator-dmas = <&dma_gbe 0>, <&dma_gbe 5>; + ti,navigator-dma-names = "netrx0", "nettx"; + + netcp-devices { + #address-cells = <1>; + #size-cells = <1>; + ranges; + gbe at 200000 { + label = "netcp-gbe"; + compatible = "ti,netcp-gbe-2"; + syscon-subsys = <&gbe_subsys>; + reg = <0x200100 0xe00>, <0x220000 0x20000>; + /* enable-ale; */ + tx-queue = <5>; + tx-channel = "nettx"; + + interfaces { + gbe0: interface-0 { + slave-port = <0>; + link-interface = <5>; + }; + }; + }; + }; + + netcp-interfaces { + interface-0 { + rx-channel = "netrx0"; + rx-pool = <512 12>; + tx-pool = <511 12>; + rx-queue-depth = <128 128 0 0>; + rx-buffer-size = <1518 4096 0 0>; + rx-queue = <77>; + tx-completion-queue = <78>; + efuse-mac = <1>; + netcp-gbe = <&gbe0>; + }; + }; +}; diff --git a/arch/arm/dts/k2g.dtsi b/arch/arm/dts/k2g.dtsi index 6b79b16..bbc2cf9 100644 --- a/arch/arm/dts/k2g.dtsi +++ b/arch/arm/dts/k2g.dtsi @@ -68,5 +68,18 @@ interrupts = <GIC_SPI 164 IRQ_TYPE_EDGE_RISING>; }; + mdio: mdio at 4200f00 { + compatible = "ti,keystone_mdio", "ti,davinci_mdio"; + #address-cells = <1>; + #size-cells = <0>; + /* power-domains = <&k2g_pds K2G_DEV_NSS0>; */ + /* clocks = <&k2g_clks K2G_DEV_NSS0 K2G_DEV_NSS_ESW_CLK>; */ + clock-names = "fck"; + reg = <0x04200f00 0x100>; + status = "disabled"; + bus_freq = <2500000>; + }; + + #include "k2g-netcp.dtsi" }; }; -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files 2016-01-22 8:23 ` [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files Mugunthan V N @ 2016-01-22 20:17 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:17 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > Add keystone net DT support for k2g evm. > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N ` (6 preceding siblings ...) 2016-01-22 8:23 ` [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files Mugunthan V N @ 2016-01-22 8:23 ` Mugunthan V N 2016-01-22 20:17 ` Joe Hershberger 7 siblings, 1 reply; 20+ messages in thread From: Mugunthan V N @ 2016-01-22 8:23 UTC (permalink / raw) To: u-boot enable net driver model for k2g evm as keystone_net supports driver model Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com> --- configs/k2g_evm_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/k2g_evm_defconfig b/configs/k2g_evm_defconfig index 7bdf7a4..7cebacd 100644 --- a/configs/k2g_evm_defconfig +++ b/configs/k2g_evm_defconfig @@ -12,3 +12,4 @@ CONFIG_DM=y CONFIG_SPI_FLASH=y CONFIG_SPI_FLASH_STMICRO=y CONFIG_SYS_NS16550=y +CONFIG_DM_ETH=y -- 2.7.0.rc3 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model 2016-01-22 8:23 ` [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model Mugunthan V N @ 2016-01-22 20:17 ` Joe Hershberger 0 siblings, 0 replies; 20+ messages in thread From: Joe Hershberger @ 2016-01-22 20:17 UTC (permalink / raw) To: u-boot On Fri, Jan 22, 2016 at 2:23 AM, Mugunthan V N <mugunthanvnm@ti.com> wrote: > enable net driver model for k2g evm as keystone_net supports > driver model > > Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com> ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2016-01-25 10:10 UTC | newest] Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-01-22 8:23 [U-Boot] [PATCH v2 0/8] driver model bring-up of keystone net on k2hk, k2l, k2e and k2g evm Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 1/8] board: ti: ks2_evm: remove board_eth_init when CONFIG_DM_ETH is defined Mugunthan V N 2016-01-22 19:53 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 2/8] drivers: net: phy: micrel: fix build errors with CONFIG_DM_ETH Mugunthan V N 2016-01-22 19:54 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 3/8] drivers: net: keystone_net: convert driver to adopt device driver model Mugunthan V N 2016-01-22 20:15 ` Joe Hershberger 2016-01-25 8:30 ` Mugunthan V N 2016-01-25 8:35 ` Bin Meng 2016-01-25 10:10 ` Mugunthan V N 2016-01-22 8:23 ` [U-Boot] [PATCH v2 4/8] defconfig: k2hk_evm_defconfig: enable net " Mugunthan V N 2016-01-22 20:15 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 5/8] defconfig: k2l_evm_defconfig: " Mugunthan V N 2016-01-22 20:16 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 6/8] defconfig: k2e_evm_defconfig: " Mugunthan V N 2016-01-22 20:16 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 7/8] ARM: dts: k2g: Add keystone net dts files Mugunthan V N 2016-01-22 20:17 ` Joe Hershberger 2016-01-22 8:23 ` [U-Boot] [PATCH v2 8/8] defconfig: k2g_evm_defconfig: enable net driver model Mugunthan V N 2016-01-22 20:17 ` Joe Hershberger
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.