Lines Matching +full:slave +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0
7 * Sandeep Paulraj <s-paulraj@ti.com>
10 * Wingman Kwok <w-kwok2@ti.com>
37 #define GBE_MODULE_NAME "netcp-gbe"
56 #define GBENU_MODULE_NAME "netcp-gbenu"
61 ((GBE_IDENT((d)->ss_version) == GBE_SS_ID_NU) || \
62 (GBE_IDENT((d)->ss_version) == GBE_SS_ID_2U))
65 (GBE_IDENT((d)->ss_version) == GBE_SS_ID_NU)
68 (GBE_IDENT((d)->ss_version) == GBE_SS_VERSION_14)
70 (GBE_IDENT((d)->ss_version) == GBE_SS_ID_2U)
85 #define XGBE_MODULE_NAME "netcp-xgbe"
94 #define IS_SS_ID_XGBE(d) ((d)->ss_version == XGBE_SS_VERSION_10)
110 #define GMACSL_RET_WARN_RESET_INCOMPLETE -2
126 #define GBE_PORT_MASK(x) (BIT(x) - 1)
156 /* s: 0-based slave_port */
158 (((s) < 2) ? (d)->sgmii_port_regs : (d)->sgmii_port34_regs)
164 #define SLAVE_LINK_IS_XGMII(s) ((s)->link_interface >= XGMII_LINK_MAC_PHY)
166 (((s)->link_interface >= RGMII_LINK_MAC_PHY) && \
167 ((s)->link_interface <= RGMII_LINK_MAC_PHY_NO_MDIO))
169 ((s)->link_interface <= SGMII_LINK_MAC_PHY_NO_MDIO)
170 #define NETCP_LINK_STATE_INVALID -1
172 #define GBE_SET_REG_OFS(p, rb, rn) p->rb##_ofs.rn = \
174 #define GBENU_SET_REG_OFS(p, rb, rn) p->rb##_ofs.rn = \
176 #define XGBE_SET_REG_OFS(p, rb, rn) p->rb##_ofs.rn = \
178 #define GBE_REG_ADDR(p, rb, rn) (p->rb + p->rb##_ofs.rn)
182 #if IS_ENABLED(CONFIG_TI_CPTS)
228 /* The PTP event messages - Sync, Delay_Req, Pdelay_Req, and Pdelay_Resp. */
451 /* Some hw stat regs are applicable to slave port only.
459 u32 rx_pause_frames; /* slave */
461 u32 rx_align_code_errors; /* slave */
463 u32 rx_jabber_frames; /* slave */
465 u32 rx_fragments; /* slave */
472 u32 tx_pause_frames; /* slave */
473 u32 tx_deferred_frames; /* slave */
474 u32 tx_collision_frames; /* slave */
475 u32 tx_single_coll_frames; /* slave */
476 u32 tx_mult_coll_frames; /* slave */
477 u32 tx_excessive_collisions; /* slave */
478 u32 tx_late_collisions; /* slave */
479 u32 rx_ipg_error; /* slave 10G only */
480 u32 tx_carrier_sense_errors; /* slave */
764 struct gbe_slave *slave; member
1726 list_for_each_entry((i), &(priv)->gbe_intf_head, gbe_intf_list)
1728 #define for_each_sec_slave(slave, priv) \ argument
1729 list_for_each_entry((slave), &(priv)->secondary_slaves, slave_list)
1732 list_first_entry(&priv->secondary_slaves, \
1738 strscpy(info->driver, NETCP_DRIVER_NAME, sizeof(info->driver)); in keystone_get_drvinfo()
1739 strscpy(info->version, NETCP_DRIVER_VERSION, sizeof(info->version)); in keystone_get_drvinfo()
1746 return netcp->msg_enable; in keystone_get_msglevel()
1753 netcp->msg_enable = value; in keystone_set_msglevel()
1761 if (!gbe_intf) in keystone_get_intf_data()
1776 if (!gbe_intf) in keystone_get_stat_strings()
1778 gbe_dev = gbe_intf->gbe_dev; in keystone_get_stat_strings()
1782 for (i = 0; i < gbe_dev->num_et_stats; i++) { in keystone_get_stat_strings()
1783 memcpy(data, gbe_dev->et_stats[i].desc, in keystone_get_stat_strings()
1800 if (!gbe_intf) in keystone_get_sset_count()
1801 return -EINVAL; in keystone_get_sset_count()
1802 gbe_dev = gbe_intf->gbe_dev; in keystone_get_sset_count()
1808 return gbe_dev->num_et_stats; in keystone_get_sset_count()
1810 return -EINVAL; in keystone_get_sset_count()
1816 void __iomem *base = gbe_dev->hw_stats_regs[stats_mod]; in gbe_reset_mod_stats()
1820 for (i = 0; i < gbe_dev->num_et_stats; i++) { in gbe_reset_mod_stats()
1821 if (gbe_dev->et_stats[i].type == stats_mod) { in gbe_reset_mod_stats()
1822 p_stats_entry = base + gbe_dev->et_stats[i].offset; in gbe_reset_mod_stats()
1823 gbe_dev->hw_stats[i] = 0; in gbe_reset_mod_stats()
1824 gbe_dev->hw_stats_prev[i] = readl(p_stats_entry); in gbe_reset_mod_stats()
1839 base = gbe_dev->hw_stats_regs[gbe_dev->et_stats[et_stats_entry].type]; in gbe_update_hw_stats_entry()
1840 p_stats_entry = base + gbe_dev->et_stats[et_stats_entry].offset; in gbe_update_hw_stats_entry()
1842 delta = curr - gbe_dev->hw_stats_prev[et_stats_entry]; in gbe_update_hw_stats_entry()
1843 gbe_dev->hw_stats_prev[et_stats_entry] = curr; in gbe_update_hw_stats_entry()
1844 gbe_dev->hw_stats[et_stats_entry] += delta; in gbe_update_hw_stats_entry()
1851 for (i = 0; i < gbe_dev->num_et_stats; i++) { in gbe_update_stats()
1854 if (data) in gbe_update_stats()
1855 data[i] = gbe_dev->hw_stats[i]; in gbe_update_stats()
1891 u32 half_num_et_stats = (gbe_dev->num_et_stats / 2); in gbe_update_stats_ver14()
1903 if (data) in gbe_update_stats_ver14()
1904 data[et_entry] = gbe_dev->hw_stats[et_entry]; in gbe_update_stats_ver14()
1918 if (!gbe_intf) in keystone_get_ethtool_stats()
1921 gbe_dev = gbe_intf->gbe_dev; in keystone_get_ethtool_stats()
1922 spin_lock_bh(&gbe_dev->hw_stats_lock); in keystone_get_ethtool_stats()
1923 if (IS_SS_ID_VER_14(gbe_dev)) in keystone_get_ethtool_stats()
1927 spin_unlock_bh(&gbe_dev->hw_stats_lock); in keystone_get_ethtool_stats()
1934 struct phy_device *phy = ndev->phydev; in keystone_get_link_ksettings()
1937 if (!phy) in keystone_get_link_ksettings()
1938 return -EINVAL; in keystone_get_link_ksettings()
1941 if (!gbe_intf) in keystone_get_link_ksettings()
1942 return -EINVAL; in keystone_get_link_ksettings()
1944 if (!gbe_intf->slave) in keystone_get_link_ksettings()
1945 return -EINVAL; in keystone_get_link_ksettings()
1948 cmd->base.port = gbe_intf->slave->phy_port_t; in keystone_get_link_ksettings()
1957 struct phy_device *phy = ndev->phydev; in keystone_set_link_ksettings()
1959 u8 port = cmd->base.port; in keystone_set_link_ksettings()
1964 cmd->link_modes.advertising); in keystone_set_link_ksettings()
1966 cmd->link_modes.supported); in keystone_set_link_ksettings()
1969 if (!phy) in keystone_set_link_ksettings()
1970 return -EINVAL; in keystone_set_link_ksettings()
1973 if (!gbe_intf) in keystone_set_link_ksettings()
1974 return -EINVAL; in keystone_set_link_ksettings()
1976 if (!gbe_intf->slave) in keystone_set_link_ksettings()
1977 return -EINVAL; in keystone_set_link_ksettings()
1979 if (port != gbe_intf->slave->phy_port_t) { in keystone_set_link_ksettings()
1980 if ((port == PORT_TP) && !(features & ADVERTISED_TP)) in keystone_set_link_ksettings()
1981 return -EINVAL; in keystone_set_link_ksettings()
1983 if ((port == PORT_AUI) && !(features & ADVERTISED_AUI)) in keystone_set_link_ksettings()
1984 return -EINVAL; in keystone_set_link_ksettings()
1986 if ((port == PORT_BNC) && !(features & ADVERTISED_BNC)) in keystone_set_link_ksettings()
1987 return -EINVAL; in keystone_set_link_ksettings()
1989 if ((port == PORT_MII) && !(features & ADVERTISED_MII)) in keystone_set_link_ksettings()
1990 return -EINVAL; in keystone_set_link_ksettings()
1992 if ((port == PORT_FIBRE) && !(features & ADVERTISED_FIBRE)) in keystone_set_link_ksettings()
1993 return -EINVAL; in keystone_set_link_ksettings()
1996 gbe_intf->slave->phy_port_t = port; in keystone_set_link_ksettings()
2000 #if IS_ENABLED(CONFIG_TI_CPTS)
2008 if (!gbe_intf || !gbe_intf->gbe_dev->cpts) in keystone_get_ts_info()
2009 return -EINVAL; in keystone_get_ts_info()
2011 info->so_timestamping = in keystone_get_ts_info()
2016 info->phc_index = gbe_intf->gbe_dev->cpts->phc_index; in keystone_get_ts_info()
2017 info->tx_types = in keystone_get_ts_info()
2020 info->rx_filters = in keystone_get_ts_info()
2030 info->so_timestamping = in keystone_get_ts_info()
2032 info->tx_types = 0; in keystone_get_ts_info()
2033 info->rx_filters = 0; in keystone_get_ts_info()
2051 static void gbe_set_slave_mac(struct gbe_slave *slave, in gbe_set_slave_mac() argument
2054 struct net_device *ndev = gbe_intf->ndev; in gbe_set_slave_mac()
2056 writel(mac_hi(ndev->dev_addr), GBE_REG_ADDR(slave, port_regs, sa_hi)); in gbe_set_slave_mac()
2057 writel(mac_lo(ndev->dev_addr), GBE_REG_ADDR(slave, port_regs, sa_lo)); in gbe_set_slave_mac()
2062 if (priv->host_port == 0) in gbe_get_slave_port()
2070 struct gbe_slave *slave, in netcp_ethss_link_state_action() argument
2073 struct phy_device *phy = slave->phy; in netcp_ethss_link_state_action()
2076 if (up) { in netcp_ethss_link_state_action()
2077 mac_control = slave->mac_control; in netcp_ethss_link_state_action()
2078 if (phy && (phy->speed == SPEED_1000)) { in netcp_ethss_link_state_action()
2081 } else if (phy && (phy->speed == SPEED_10000)) { in netcp_ethss_link_state_action()
2086 writel(mac_control, GBE_REG_ADDR(slave, emac_regs, in netcp_ethss_link_state_action()
2089 cpsw_ale_control_set(gbe_dev->ale, slave->port_num, in netcp_ethss_link_state_action()
2093 if (ndev && slave->open && in netcp_ethss_link_state_action()
2094 ((slave->link_interface != SGMII_LINK_MAC_PHY) && in netcp_ethss_link_state_action()
2095 (slave->link_interface != RGMII_LINK_MAC_PHY) && in netcp_ethss_link_state_action()
2096 (slave->link_interface != XGMII_LINK_MAC_PHY))) in netcp_ethss_link_state_action()
2099 writel(mac_control, GBE_REG_ADDR(slave, emac_regs, in netcp_ethss_link_state_action()
2101 cpsw_ale_control_set(gbe_dev->ale, slave->port_num, in netcp_ethss_link_state_action()
2104 if (ndev && in netcp_ethss_link_state_action()
2105 ((slave->link_interface != SGMII_LINK_MAC_PHY) && in netcp_ethss_link_state_action()
2106 (slave->link_interface != RGMII_LINK_MAC_PHY) && in netcp_ethss_link_state_action()
2107 (slave->link_interface != XGMII_LINK_MAC_PHY))) in netcp_ethss_link_state_action()
2111 if (phy) in netcp_ethss_link_state_action()
2115 static bool gbe_phy_link_status(struct gbe_slave *slave) in gbe_phy_link_status() argument
2117 return !slave->phy || slave->phy->link; in gbe_phy_link_status()
2131 struct gbe_slave *slave, in netcp_ethss_update_link_state() argument
2135 int sp = slave->slave_num, link_state; in netcp_ethss_update_link_state()
2137 if (!slave->open) in netcp_ethss_update_link_state()
2140 if (SLAVE_LINK_IS_RGMII(slave)) in netcp_ethss_update_link_state()
2143 if (SLAVE_LINK_IS_SGMII(slave)) in netcp_ethss_update_link_state()
2147 phy_link_state = gbe_phy_link_status(slave); in netcp_ethss_update_link_state()
2150 if (atomic_xchg(&slave->link_state, link_state) != link_state) in netcp_ethss_update_link_state()
2151 netcp_ethss_link_state_action(gbe_dev, ndev, slave, in netcp_ethss_update_link_state()
2161 if (!gbe_intf) in xgbe_adjust_link()
2164 netcp_ethss_update_link_state(gbe_intf->gbe_dev, gbe_intf->slave, in xgbe_adjust_link()
2174 if (!gbe_intf) in gbe_adjust_link()
2177 netcp_ethss_update_link_state(gbe_intf->gbe_dev, gbe_intf->slave, in gbe_adjust_link()
2184 struct gbe_slave *slave; in gbe_adjust_link_sec_slaves() local
2186 for_each_sec_slave(slave, gbe_dev) in gbe_adjust_link_sec_slaves()
2187 netcp_ethss_update_link_state(gbe_dev, slave, NULL); in gbe_adjust_link_sec_slaves()
2193 static int gbe_port_reset(struct gbe_slave *slave) in gbe_port_reset() argument
2198 writel(SOFT_RESET, GBE_REG_ADDR(slave, emac_regs, soft_reset)); in gbe_port_reset()
2202 v = readl(GBE_REG_ADDR(slave, emac_regs, soft_reset)); in gbe_port_reset()
2203 if ((v & SOFT_RESET_MASK) != SOFT_RESET) in gbe_port_reset()
2212 static void gbe_port_config(struct gbe_priv *gbe_dev, struct gbe_slave *slave, in gbe_port_config() argument
2218 if (max_rx_len > NETCP_MAX_FRAME_SIZE) in gbe_port_config()
2222 if (IS_SS_ID_XGBE(gbe_dev) && in gbe_port_config()
2223 (slave->link_interface >= XGMII_LINK_MAC_PHY)) { in gbe_port_config()
2225 xgmii_mode |= (1 << slave->slave_num); in gbe_port_config()
2229 if (IS_SS_ID_MU(gbe_dev)) in gbe_port_config()
2230 rx_maxlen_reg = GBE_REG_ADDR(slave, port_regs, rx_maxlen); in gbe_port_config()
2232 rx_maxlen_reg = GBE_REG_ADDR(slave, emac_regs, rx_maxlen); in gbe_port_config()
2235 writel(slave->mac_control, GBE_REG_ADDR(slave, emac_regs, mac_control)); in gbe_port_config()
2239 struct gbe_slave *slave, bool set) in gbe_sgmii_rtreset() argument
2241 if (SLAVE_LINK_IS_XGMII(slave)) in gbe_sgmii_rtreset()
2244 netcp_sgmii_rtreset(SGMII_BASE(priv, slave->slave_num), in gbe_sgmii_rtreset()
2245 slave->slave_num, set); in gbe_sgmii_rtreset()
2250 struct gbe_priv *gbe_dev = intf->gbe_dev; in gbe_slave_stop()
2251 struct gbe_slave *slave = intf->slave; in gbe_slave_stop() local
2253 if (!IS_SS_ID_2U(gbe_dev)) in gbe_slave_stop()
2254 gbe_sgmii_rtreset(gbe_dev, slave, true); in gbe_slave_stop()
2255 gbe_port_reset(slave); in gbe_slave_stop()
2257 cpsw_ale_control_set(gbe_dev->ale, slave->port_num, in gbe_slave_stop()
2259 cpsw_ale_del_mcast(gbe_dev->ale, intf->ndev->broadcast, in gbe_slave_stop()
2260 1 << slave->port_num, 0, 0); in gbe_slave_stop()
2262 if (!slave->phy) in gbe_slave_stop()
2265 phy_stop(slave->phy); in gbe_slave_stop()
2266 phy_disconnect(slave->phy); in gbe_slave_stop()
2267 slave->phy = NULL; in gbe_slave_stop()
2270 static void gbe_sgmii_config(struct gbe_priv *priv, struct gbe_slave *slave) in gbe_sgmii_config() argument
2272 if (SLAVE_LINK_IS_XGMII(slave)) in gbe_sgmii_config()
2275 netcp_sgmii_reset(SGMII_BASE(priv, slave->slave_num), slave->slave_num); in gbe_sgmii_config()
2276 netcp_sgmii_config(SGMII_BASE(priv, slave->slave_num), slave->slave_num, in gbe_sgmii_config()
2277 slave->link_interface); in gbe_sgmii_config()
2282 struct gbe_priv *priv = gbe_intf->gbe_dev; in gbe_slave_open()
2283 struct gbe_slave *slave = gbe_intf->slave; in gbe_slave_open() local
2290 if (!IS_SS_ID_2U(priv)) in gbe_slave_open()
2291 gbe_sgmii_config(priv, slave); in gbe_slave_open()
2292 gbe_port_reset(slave); in gbe_slave_open()
2293 if (!IS_SS_ID_2U(priv)) in gbe_slave_open()
2294 gbe_sgmii_rtreset(priv, slave, false); in gbe_slave_open()
2295 gbe_port_config(priv, slave, priv->rx_packet_max); in gbe_slave_open()
2296 gbe_set_slave_mac(slave, gbe_intf); in gbe_slave_open()
2300 if (IS_SS_ID_MU(priv)) in gbe_slave_open()
2302 GBE_REG_ADDR(slave, port_regs, rx_pri_map)); in gbe_slave_open()
2305 cpsw_ale_control_set(priv->ale, slave->port_num, in gbe_slave_open()
2307 cpsw_ale_add_mcast(priv->ale, gbe_intf->ndev->broadcast, in gbe_slave_open()
2308 1 << slave->port_num, 0, 0, ALE_MCAST_FWD_2); in gbe_slave_open()
2310 if (slave->link_interface == SGMII_LINK_MAC_PHY) { in gbe_slave_open()
2313 slave->phy_port_t = PORT_MII; in gbe_slave_open()
2314 } else if (slave->link_interface == RGMII_LINK_MAC_PHY) { in gbe_slave_open()
2316 err = of_get_phy_mode(slave->node, &phy_mode); in gbe_slave_open()
2317 /* if phy-mode is not present, default to in gbe_slave_open()
2320 if (err) in gbe_slave_open()
2323 if (!phy_interface_mode_is_rgmii(phy_mode)) { in gbe_slave_open()
2324 dev_err(priv->dev, in gbe_slave_open()
2326 return -EINVAL; in gbe_slave_open()
2328 slave->phy_port_t = PORT_MII; in gbe_slave_open()
2329 } else if (slave->link_interface == XGMII_LINK_MAC_PHY) { in gbe_slave_open()
2332 slave->phy_port_t = PORT_FIBRE; in gbe_slave_open()
2335 if (has_phy) { in gbe_slave_open()
2336 if (IS_SS_ID_XGBE(priv)) in gbe_slave_open()
2339 slave->phy = of_phy_connect(gbe_intf->ndev, in gbe_slave_open()
2340 slave->phy_node, in gbe_slave_open()
2343 if (!slave->phy) { in gbe_slave_open()
2344 dev_err(priv->dev, "phy not found on slave %d\n", in gbe_slave_open()
2345 slave->slave_num); in gbe_slave_open()
2346 return -ENODEV; in gbe_slave_open()
2348 dev_dbg(priv->dev, "phy found: id is: 0x%s\n", in gbe_slave_open()
2349 phydev_name(slave->phy)); in gbe_slave_open()
2350 phy_start(slave->phy); in gbe_slave_open()
2360 if (IS_SS_ID_NU(priv) || IS_SS_ID_XGBE(priv)) in gbe_init_host_port()
2368 cpsw_ale_start(priv->ale); in gbe_init_host_port()
2370 if (priv->enable_ale) in gbe_init_host_port()
2373 cpsw_ale_control_set(priv->ale, 0, ALE_BYPASS, bypass_en); in gbe_init_host_port()
2375 cpsw_ale_control_set(priv->ale, 0, ALE_NO_PORT_VLAN, 1); in gbe_init_host_port()
2377 cpsw_ale_control_set(priv->ale, priv->host_port, in gbe_init_host_port()
2380 cpsw_ale_control_set(priv->ale, 0, in gbe_init_host_port()
2382 GBE_PORT_MASK(priv->ale_ports)); in gbe_init_host_port()
2384 cpsw_ale_control_set(priv->ale, 0, in gbe_init_host_port()
2386 GBE_PORT_MASK(priv->ale_ports - 1)); in gbe_init_host_port()
2388 cpsw_ale_control_set(priv->ale, 0, in gbe_init_host_port()
2390 GBE_PORT_MASK(priv->ale_ports)); in gbe_init_host_port()
2392 cpsw_ale_control_set(priv->ale, 0, in gbe_init_host_port()
2394 GBE_PORT_MASK(priv->ale_ports)); in gbe_init_host_port()
2399 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_add_mcast_addr()
2402 cpsw_ale_add_mcast(gbe_dev->ale, addr, in gbe_add_mcast_addr()
2403 GBE_PORT_MASK(gbe_dev->ale_ports), 0, 0, in gbe_add_mcast_addr()
2405 for_each_set_bit(vlan_id, gbe_intf->active_vlans, VLAN_N_VID) { in gbe_add_mcast_addr()
2406 cpsw_ale_add_mcast(gbe_dev->ale, addr, in gbe_add_mcast_addr()
2407 GBE_PORT_MASK(gbe_dev->ale_ports), in gbe_add_mcast_addr()
2414 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_add_ucast_addr()
2417 cpsw_ale_add_ucast(gbe_dev->ale, addr, gbe_dev->host_port, 0, 0); in gbe_add_ucast_addr()
2419 for_each_set_bit(vlan_id, gbe_intf->active_vlans, VLAN_N_VID) in gbe_add_ucast_addr()
2420 cpsw_ale_add_ucast(gbe_dev->ale, addr, gbe_dev->host_port, in gbe_add_ucast_addr()
2426 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_del_mcast_addr()
2429 cpsw_ale_del_mcast(gbe_dev->ale, addr, 0, 0, 0); in gbe_del_mcast_addr()
2431 for_each_set_bit(vlan_id, gbe_intf->active_vlans, VLAN_N_VID) { in gbe_del_mcast_addr()
2432 cpsw_ale_del_mcast(gbe_dev->ale, addr, 0, ALE_VLAN, vlan_id); in gbe_del_mcast_addr()
2438 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_del_ucast_addr()
2441 cpsw_ale_del_ucast(gbe_dev->ale, addr, gbe_dev->host_port, 0, 0); in gbe_del_ucast_addr()
2443 for_each_set_bit(vlan_id, gbe_intf->active_vlans, VLAN_N_VID) { in gbe_del_ucast_addr()
2444 cpsw_ale_del_ucast(gbe_dev->ale, addr, gbe_dev->host_port, in gbe_del_ucast_addr()
2452 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_add_addr()
2454 dev_dbg(gbe_dev->dev, "ethss adding address %pM, type %d\n", in gbe_add_addr()
2455 naddr->addr, naddr->type); in gbe_add_addr()
2457 switch (naddr->type) { in gbe_add_addr()
2460 gbe_add_mcast_addr(gbe_intf, naddr->addr); in gbe_add_addr()
2464 gbe_add_ucast_addr(gbe_intf, naddr->addr); in gbe_add_addr()
2478 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_del_addr()
2480 dev_dbg(gbe_dev->dev, "ethss deleting address %pM, type %d\n", in gbe_del_addr()
2481 naddr->addr, naddr->type); in gbe_del_addr()
2483 switch (naddr->type) { in gbe_del_addr()
2486 gbe_del_mcast_addr(gbe_intf, naddr->addr); in gbe_del_addr()
2490 gbe_del_ucast_addr(gbe_intf, naddr->addr); in gbe_del_addr()
2504 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_add_vid()
2506 set_bit(vid, gbe_intf->active_vlans); in gbe_add_vid()
2508 cpsw_ale_add_vlan(gbe_dev->ale, vid, in gbe_add_vid()
2509 GBE_PORT_MASK(gbe_dev->ale_ports), in gbe_add_vid()
2511 GBE_PORT_MASK(gbe_dev->ale_ports), in gbe_add_vid()
2512 GBE_PORT_MASK(gbe_dev->ale_ports - 1)); in gbe_add_vid()
2520 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_del_vid()
2522 cpsw_ale_del_vlan(gbe_dev->ale, vid, 0); in gbe_del_vid()
2523 clear_bit(vid, gbe_intf->active_vlans); in gbe_del_vid()
2527 #if IS_ENABLED(CONFIG_TI_CPTS)
2532 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_txtstamp()
2534 cpts_tx_timestamp(gbe_dev->cpts, skb); in gbe_txtstamp()
2540 struct sk_buff *skb = p_info->skb; in gbe_need_txtstamp()
2542 return cpts_can_timestamp(gbe_intf->gbe_dev->cpts, skb); in gbe_need_txtstamp()
2548 struct phy_device *phydev = p_info->skb->dev->phydev; in gbe_txtstamp_mark_pkt()
2549 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_txtstamp_mark_pkt()
2551 if (!(skb_shinfo(p_info->skb)->tx_flags & SKBTX_HW_TSTAMP) || in gbe_txtstamp_mark_pkt()
2552 !gbe_dev->tx_ts_enabled) in gbe_txtstamp_mark_pkt()
2555 /* If phy has the txtstamp api, assume it will do it. in gbe_txtstamp_mark_pkt()
2559 if (phy_has_txtstamp(phydev)) { in gbe_txtstamp_mark_pkt()
2560 skb_shinfo(p_info->skb)->tx_flags |= SKBTX_IN_PROGRESS; in gbe_txtstamp_mark_pkt()
2564 if (gbe_need_txtstamp(gbe_intf, p_info)) { in gbe_txtstamp_mark_pkt()
2565 p_info->txtstamp = gbe_txtstamp; in gbe_txtstamp_mark_pkt()
2566 p_info->ts_context = (void *)gbe_intf; in gbe_txtstamp_mark_pkt()
2567 skb_shinfo(p_info->skb)->tx_flags |= SKBTX_IN_PROGRESS; in gbe_txtstamp_mark_pkt()
2575 struct phy_device *phydev = p_info->skb->dev->phydev; in gbe_rxtstamp()
2576 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_rxtstamp()
2578 if (p_info->rxtstamp_complete) in gbe_rxtstamp()
2581 if (phy_has_rxtstamp(phydev)) { in gbe_rxtstamp()
2582 p_info->rxtstamp_complete = true; in gbe_rxtstamp()
2586 if (gbe_dev->rx_ts_enabled) in gbe_rxtstamp()
2587 cpts_rx_timestamp(gbe_dev->cpts, p_info->skb); in gbe_rxtstamp()
2589 p_info->rxtstamp_complete = true; in gbe_rxtstamp()
2596 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_hwtstamp_get()
2597 struct cpts *cpts = gbe_dev->cpts; in gbe_hwtstamp_get()
2600 if (!cpts) in gbe_hwtstamp_get()
2601 return -EOPNOTSUPP; in gbe_hwtstamp_get()
2604 cfg.tx_type = gbe_dev->tx_ts_enabled ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; in gbe_hwtstamp_get()
2605 cfg.rx_filter = gbe_dev->rx_ts_enabled; in gbe_hwtstamp_get()
2607 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in gbe_hwtstamp_get()
2612 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_hwtstamp()
2613 struct gbe_slave *slave = gbe_intf->slave; in gbe_hwtstamp() local
2616 if (!gbe_dev->rx_ts_enabled && in gbe_hwtstamp()
2617 !gbe_dev->tx_ts_enabled) { in gbe_hwtstamp()
2618 writel(0, GBE_REG_ADDR(slave, port_regs, ts_ctl)); in gbe_hwtstamp()
2625 (slave->ts_ctl.dst_port_map << TS_CTL_DST_PORT_SHIFT) | in gbe_hwtstamp()
2626 (slave->ts_ctl.uni ? TS_UNI_EN : in gbe_hwtstamp()
2627 slave->ts_ctl.maddr_map << TS_CTL_MADDR_SHIFT); in gbe_hwtstamp()
2629 if (gbe_dev->tx_ts_enabled) in gbe_hwtstamp()
2632 if (gbe_dev->rx_ts_enabled) in gbe_hwtstamp()
2635 writel(ts_en, GBE_REG_ADDR(slave, port_regs, ts_ctl)); in gbe_hwtstamp()
2636 writel(seq_id, GBE_REG_ADDR(slave, port_regs, ts_seq_ltype)); in gbe_hwtstamp()
2637 writel(ctl, GBE_REG_ADDR(slave, port_regs, ts_ctl_ltype2)); in gbe_hwtstamp()
2642 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_hwtstamp_set()
2643 struct cpts *cpts = gbe_dev->cpts; in gbe_hwtstamp_set()
2646 if (!cpts) in gbe_hwtstamp_set()
2647 return -EOPNOTSUPP; in gbe_hwtstamp_set()
2649 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in gbe_hwtstamp_set()
2650 return -EFAULT; in gbe_hwtstamp_set()
2654 gbe_dev->tx_ts_enabled = 0; in gbe_hwtstamp_set()
2657 gbe_dev->tx_ts_enabled = 1; in gbe_hwtstamp_set()
2660 return -ERANGE; in gbe_hwtstamp_set()
2665 gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_NONE; in gbe_hwtstamp_set()
2670 gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_PTP_V1_L4_EVENT; in gbe_hwtstamp_set()
2682 gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_PTP_V2_EVENT; in gbe_hwtstamp_set()
2686 return -ERANGE; in gbe_hwtstamp_set()
2691 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in gbe_hwtstamp_set()
2696 if (!gbe_dev->cpts) in gbe_register_cpts()
2699 if (gbe_dev->cpts_registered > 0) in gbe_register_cpts()
2702 if (cpts_register(gbe_dev->cpts)) { in gbe_register_cpts()
2703 dev_err(gbe_dev->dev, "error registering cpts device\n"); in gbe_register_cpts()
2708 ++gbe_dev->cpts_registered; in gbe_register_cpts()
2713 if (!gbe_dev->cpts || (gbe_dev->cpts_registered <= 0)) in gbe_unregister_cpts()
2716 if (--gbe_dev->cpts_registered) in gbe_unregister_cpts()
2719 cpts_unregister(gbe_dev->cpts); in gbe_unregister_cpts()
2737 return -EOPNOTSUPP; in gbe_hwtstamp()
2750 return -EOPNOTSUPP; in gbe_hwtstamp_get()
2755 return -EOPNOTSUPP; in gbe_hwtstamp_set()
2762 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_set_rx_mode()
2763 struct cpsw_ale *ale = gbe_dev->ale; in gbe_set_rx_mode()
2765 int i, ret = -ETIMEDOUT; in gbe_set_rx_mode()
2770 for (i = 0; i <= gbe_dev->num_slaves; i++) { in gbe_set_rx_mode()
2777 if (!promisc) { in gbe_set_rx_mode()
2780 dev_vdbg(gbe_dev->dev, "promiscuous mode disabled\n"); in gbe_set_rx_mode()
2790 if (cpsw_ale_control_get(ale, 0, ALE_AGEOUT)) { in gbe_set_rx_mode()
2798 if (ret && !cpsw_ale_control_get(ale, 0, ALE_AGEOUT)) in gbe_set_rx_mode()
2805 GBE_PORT_MASK(gbe_dev->ale_ports), in gbe_set_rx_mode()
2806 -1); in gbe_set_rx_mode()
2810 dev_vdbg(gbe_dev->dev, "promiscuous mode enabled\n"); in gbe_set_rx_mode()
2817 struct phy_device *phy = gbe_intf->slave->phy; in gbe_ioctl()
2819 if (!phy_has_hwtstamp(phy)) { in gbe_ioctl()
2828 if (phy) in gbe_ioctl()
2831 return -EOPNOTSUPP; in gbe_ioctl()
2838 struct gbe_slave *slave; in netcp_ethss_timer() local
2842 if (!gbe_intf->slave->open) in netcp_ethss_timer()
2844 netcp_ethss_update_link_state(gbe_dev, gbe_intf->slave, in netcp_ethss_timer()
2845 gbe_intf->ndev); in netcp_ethss_timer()
2849 for_each_sec_slave(slave, gbe_dev) { in netcp_ethss_timer()
2850 netcp_ethss_update_link_state(gbe_dev, slave, NULL); in netcp_ethss_timer()
2854 spin_lock(&gbe_dev->hw_stats_lock); in netcp_ethss_timer()
2856 if (IS_SS_ID_VER_14(gbe_dev)) in netcp_ethss_timer()
2861 spin_unlock(&gbe_dev->hw_stats_lock); in netcp_ethss_timer()
2863 gbe_dev->timer.expires = jiffies + GBE_TIMER_INTERVAL; in netcp_ethss_timer()
2864 add_timer(&gbe_dev->timer); in netcp_ethss_timer()
2871 p_info->tx_pipe = &gbe_intf->tx_pipe; in gbe_txhook()
2886 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_open()
2888 struct gbe_slave *slave = gbe_intf->slave; in gbe_open() local
2889 int port_num = slave->port_num; in gbe_open()
2894 dev_dbg(gbe_dev->dev, "initializing gbe version %d.%d (%d) GBE identification value 0x%x\n", in gbe_open()
2899 if (IS_SS_ID_XGBE(gbe_dev) || IS_SS_ID_MU(gbe_dev)) in gbe_open()
2900 gbe_intf->tx_pipe.flags = SWITCH_TO_PORT_IN_TAGINFO; in gbe_open()
2902 if (gbe_dev->enable_ale) in gbe_open()
2903 gbe_intf->tx_pipe.switch_to_port = 0; in gbe_open()
2905 gbe_intf->tx_pipe.switch_to_port = port_num; in gbe_open()
2907 dev_dbg(gbe_dev->dev, in gbe_open()
2909 gbe_intf->tx_pipe.dma_chan_name, in gbe_open()
2910 gbe_intf->tx_pipe.dma_channel, in gbe_open()
2911 gbe_intf->tx_pipe.switch_to_port, in gbe_open()
2912 gbe_intf->tx_pipe.flags); in gbe_open()
2921 if (IS_SS_ID_MU(gbe_dev)) { in gbe_open()
2923 netcp->hw_cap = ETH_SW_CAN_REMOVE_ETH_FCS; in gbe_open()
2928 writel(gbe_dev->stats_en_mask, GBE_REG_ADDR(gbe_dev, switch_regs, in gbe_open()
2932 if (ret) in gbe_open()
2938 slave->open = true; in gbe_open()
2939 netcp_ethss_update_link_state(gbe_dev, slave, ndev); in gbe_open()
2954 struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; in gbe_close()
2963 gbe_intf->slave->open = false; in gbe_close()
2964 atomic_set(&gbe_intf->slave->link_state, NETCP_LINK_STATE_INVALID); in gbe_close()
2968 #if IS_ENABLED(CONFIG_TI_CPTS)
2969 static void init_slave_ts_ctl(struct gbe_slave *slave) in init_slave_ts_ctl() argument
2971 slave->ts_ctl.uni = 1; in init_slave_ts_ctl()
2972 slave->ts_ctl.dst_port_map = in init_slave_ts_ctl()
2974 slave->ts_ctl.maddr_map = in init_slave_ts_ctl()
2979 static void init_slave_ts_ctl(struct gbe_slave *slave) in init_slave_ts_ctl() argument
2984 static int init_slave(struct gbe_priv *gbe_dev, struct gbe_slave *slave, in init_slave() argument
2991 if (of_property_read_u32(node, "slave-port", &slave->slave_num)) { in init_slave()
2992 dev_err(gbe_dev->dev, "missing slave-port parameter\n"); in init_slave()
2993 return -EINVAL; in init_slave()
2996 if (of_property_read_u32(node, "link-interface", in init_slave()
2997 &slave->link_interface)) { in init_slave()
2998 dev_warn(gbe_dev->dev, in init_slave()
2999 "missing link-interface value defaulting to 1G mac-phy link\n"); in init_slave()
3000 slave->link_interface = SGMII_LINK_MAC_PHY; in init_slave()
3003 slave->node = node; in init_slave()
3004 slave->open = false; in init_slave()
3005 if ((slave->link_interface == SGMII_LINK_MAC_PHY) || in init_slave()
3006 (slave->link_interface == RGMII_LINK_MAC_PHY) || in init_slave()
3007 (slave->link_interface == XGMII_LINK_MAC_PHY)) in init_slave()
3008 slave->phy_node = of_parse_phandle(node, "phy-handle", 0); in init_slave()
3009 slave->port_num = gbe_get_slave_port(gbe_dev, slave->slave_num); in init_slave()
3011 if (slave->link_interface >= XGMII_LINK_MAC_PHY) in init_slave()
3012 slave->mac_control = GBE_DEF_10G_MAC_CONTROL; in init_slave()
3014 slave->mac_control = GBE_DEF_1G_MAC_CONTROL; in init_slave()
3017 port_reg_num = slave->slave_num; in init_slave()
3018 if (IS_SS_ID_VER_14(gbe_dev)) { in init_slave()
3019 if (slave->slave_num > 1) { in init_slave()
3021 port_reg_num -= 2; in init_slave()
3028 } else if (IS_SS_ID_MU(gbe_dev)) { in init_slave()
3033 } else if (IS_SS_ID_XGBE(gbe_dev)) { in init_slave()
3039 dev_err(gbe_dev->dev, "unknown ethss(0x%x)\n", in init_slave()
3040 gbe_dev->ss_version); in init_slave()
3041 return -EINVAL; in init_slave()
3044 slave->port_regs = gbe_dev->switch_regs + port_reg_ofs + in init_slave()
3046 slave->emac_regs = gbe_dev->switch_regs + emac_reg_ofs + in init_slave()
3047 (emac_reg_blk_sz * slave->slave_num); in init_slave()
3049 if (IS_SS_ID_VER_14(gbe_dev)) { in init_slave()
3050 /* Initialize slave port register offsets */ in init_slave()
3051 GBE_SET_REG_OFS(slave, port_regs, port_vlan); in init_slave()
3052 GBE_SET_REG_OFS(slave, port_regs, tx_pri_map); in init_slave()
3053 GBE_SET_REG_OFS(slave, port_regs, sa_lo); in init_slave()
3054 GBE_SET_REG_OFS(slave, port_regs, sa_hi); in init_slave()
3055 GBE_SET_REG_OFS(slave, port_regs, ts_ctl); in init_slave()
3056 GBE_SET_REG_OFS(slave, port_regs, ts_seq_ltype); in init_slave()
3057 GBE_SET_REG_OFS(slave, port_regs, ts_vlan); in init_slave()
3058 GBE_SET_REG_OFS(slave, port_regs, ts_ctl_ltype2); in init_slave()
3059 GBE_SET_REG_OFS(slave, port_regs, ts_ctl2); in init_slave()
3062 GBE_SET_REG_OFS(slave, emac_regs, mac_control); in init_slave()
3063 GBE_SET_REG_OFS(slave, emac_regs, soft_reset); in init_slave()
3064 GBE_SET_REG_OFS(slave, emac_regs, rx_maxlen); in init_slave()
3066 } else if (IS_SS_ID_MU(gbe_dev)) { in init_slave()
3067 /* Initialize slave port register offsets */ in init_slave()
3068 GBENU_SET_REG_OFS(slave, port_regs, port_vlan); in init_slave()
3069 GBENU_SET_REG_OFS(slave, port_regs, tx_pri_map); in init_slave()
3070 GBENU_SET_REG_OFS(slave, port_regs, rx_pri_map); in init_slave()
3071 GBENU_SET_REG_OFS(slave, port_regs, sa_lo); in init_slave()
3072 GBENU_SET_REG_OFS(slave, port_regs, sa_hi); in init_slave()
3073 GBENU_SET_REG_OFS(slave, port_regs, ts_ctl); in init_slave()
3074 GBENU_SET_REG_OFS(slave, port_regs, ts_seq_ltype); in init_slave()
3075 GBENU_SET_REG_OFS(slave, port_regs, ts_vlan); in init_slave()
3076 GBENU_SET_REG_OFS(slave, port_regs, ts_ctl_ltype2); in init_slave()
3077 GBENU_SET_REG_OFS(slave, port_regs, ts_ctl2); in init_slave()
3078 GBENU_SET_REG_OFS(slave, port_regs, rx_maxlen); in init_slave()
3081 GBENU_SET_REG_OFS(slave, emac_regs, mac_control); in init_slave()
3082 GBENU_SET_REG_OFS(slave, emac_regs, soft_reset); in init_slave()
3084 } else if (IS_SS_ID_XGBE(gbe_dev)) { in init_slave()
3085 /* Initialize slave port register offsets */ in init_slave()
3086 XGBE_SET_REG_OFS(slave, port_regs, port_vlan); in init_slave()
3087 XGBE_SET_REG_OFS(slave, port_regs, tx_pri_map); in init_slave()
3088 XGBE_SET_REG_OFS(slave, port_regs, sa_lo); in init_slave()
3089 XGBE_SET_REG_OFS(slave, port_regs, sa_hi); in init_slave()
3090 XGBE_SET_REG_OFS(slave, port_regs, ts_ctl); in init_slave()
3091 XGBE_SET_REG_OFS(slave, port_regs, ts_seq_ltype); in init_slave()
3092 XGBE_SET_REG_OFS(slave, port_regs, ts_vlan); in init_slave()
3093 XGBE_SET_REG_OFS(slave, port_regs, ts_ctl_ltype2); in init_slave()
3094 XGBE_SET_REG_OFS(slave, port_regs, ts_ctl2); in init_slave()
3097 XGBE_SET_REG_OFS(slave, emac_regs, mac_control); in init_slave()
3098 XGBE_SET_REG_OFS(slave, emac_regs, soft_reset); in init_slave()
3099 XGBE_SET_REG_OFS(slave, emac_regs, rx_maxlen); in init_slave()
3102 atomic_set(&slave->link_state, NETCP_LINK_STATE_INVALID); in init_slave()
3104 init_slave_ts_ctl(slave); in init_slave()
3111 struct device *dev = gbe_dev->dev; in init_secondary_ports()
3115 struct gbe_slave *slave; in init_secondary_ports() local
3119 slave = devm_kzalloc(dev, sizeof(*slave), GFP_KERNEL); in init_secondary_ports()
3120 if (!slave) { in init_secondary_ports()
3126 if (init_slave(gbe_dev, slave, port)) { in init_secondary_ports()
3130 devm_kfree(dev, slave); in init_secondary_ports()
3134 if (!IS_SS_ID_2U(gbe_dev)) in init_secondary_ports()
3135 gbe_sgmii_config(gbe_dev, slave); in init_secondary_ports()
3136 gbe_port_reset(slave); in init_secondary_ports()
3137 gbe_port_config(gbe_dev, slave, gbe_dev->rx_packet_max); in init_secondary_ports()
3138 list_add_tail(&slave->slave_list, &gbe_dev->secondary_slaves); in init_secondary_ports()
3139 gbe_dev->num_slaves++; in init_secondary_ports()
3140 if ((slave->link_interface == SGMII_LINK_MAC_PHY) || in init_secondary_ports()
3141 (slave->link_interface == XGMII_LINK_MAC_PHY)) in init_secondary_ports()
3144 slave->open = true; in init_secondary_ports()
3145 if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves) { in init_secondary_ports()
3151 /* of_phy_connect() is needed only for MAC-PHY interface */ in init_secondary_ports()
3152 if (!mac_phy_link) in init_secondary_ports()
3156 gbe_dev->dummy_ndev = alloc_netdev(sizeof(gbe_dev), "dummy", in init_secondary_ports()
3158 if (!gbe_dev->dummy_ndev) { in init_secondary_ports()
3163 priv = netdev_priv(gbe_dev->dummy_ndev); in init_secondary_ports()
3166 if (slave->link_interface == SGMII_LINK_MAC_PHY) { in init_secondary_ports()
3168 slave->phy_port_t = PORT_MII; in init_secondary_ports()
3169 } else if (slave->link_interface == RGMII_LINK_MAC_PHY) { in init_secondary_ports()
3171 slave->phy_port_t = PORT_MII; in init_secondary_ports()
3174 slave->phy_port_t = PORT_FIBRE; in init_secondary_ports()
3177 for_each_sec_slave(slave, gbe_dev) { in init_secondary_ports()
3178 if ((slave->link_interface != SGMII_LINK_MAC_PHY) && in init_secondary_ports()
3179 (slave->link_interface != RGMII_LINK_MAC_PHY) && in init_secondary_ports()
3180 (slave->link_interface != XGMII_LINK_MAC_PHY)) in init_secondary_ports()
3182 slave->phy = in init_secondary_ports()
3183 of_phy_connect(gbe_dev->dummy_ndev, in init_secondary_ports()
3184 slave->phy_node, in init_secondary_ports()
3187 if (!slave->phy) { in init_secondary_ports()
3188 dev_err(dev, "phy not found for slave %d\n", in init_secondary_ports()
3189 slave->slave_num); in init_secondary_ports()
3192 phydev_name(slave->phy)); in init_secondary_ports()
3193 phy_start(slave->phy); in init_secondary_ports()
3200 struct gbe_slave *slave; in free_secondary_ports() local
3202 while (!list_empty(&gbe_dev->secondary_slaves)) { in free_secondary_ports()
3203 slave = first_sec_slave(gbe_dev); in free_secondary_ports()
3205 if (slave->phy) in free_secondary_ports()
3206 phy_disconnect(slave->phy); in free_secondary_ports()
3207 list_del(&slave->slave_list); in free_secondary_ports()
3209 if (gbe_dev->dummy_ndev) in free_secondary_ports()
3210 free_netdev(gbe_dev->dummy_ndev); in free_secondary_ports()
3221 if (ret) { in set_xgbe_ethss10_priv()
3222 dev_err(gbe_dev->dev, in set_xgbe_ethss10_priv()
3228 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_xgbe_ethss10_priv()
3229 if (IS_ERR(regs)) { in set_xgbe_ethss10_priv()
3230 dev_err(gbe_dev->dev, "Failed to map xgbe ss register base\n"); in set_xgbe_ethss10_priv()
3233 gbe_dev->ss_regs = regs; in set_xgbe_ethss10_priv()
3236 if (ret) { in set_xgbe_ethss10_priv()
3237 dev_err(gbe_dev->dev, in set_xgbe_ethss10_priv()
3243 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_xgbe_ethss10_priv()
3244 if (IS_ERR(regs)) { in set_xgbe_ethss10_priv()
3245 dev_err(gbe_dev->dev, "Failed to map xgbe sm register base\n"); in set_xgbe_ethss10_priv()
3248 gbe_dev->switch_regs = regs; in set_xgbe_ethss10_priv()
3251 if (ret) { in set_xgbe_ethss10_priv()
3252 dev_err(gbe_dev->dev, in set_xgbe_ethss10_priv()
3258 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_xgbe_ethss10_priv()
3259 if (IS_ERR(regs)) { in set_xgbe_ethss10_priv()
3260 dev_err(gbe_dev->dev, "Failed to map xgbe serdes register base\n"); in set_xgbe_ethss10_priv()
3263 gbe_dev->xgbe_serdes_regs = regs; in set_xgbe_ethss10_priv()
3265 gbe_dev->num_stats_mods = gbe_dev->max_num_ports; in set_xgbe_ethss10_priv()
3266 gbe_dev->et_stats = xgbe10_et_stats; in set_xgbe_ethss10_priv()
3267 gbe_dev->num_et_stats = ARRAY_SIZE(xgbe10_et_stats); in set_xgbe_ethss10_priv()
3269 gbe_dev->hw_stats = devm_kcalloc(gbe_dev->dev, in set_xgbe_ethss10_priv()
3270 gbe_dev->num_et_stats, sizeof(u64), in set_xgbe_ethss10_priv()
3272 if (!gbe_dev->hw_stats) { in set_xgbe_ethss10_priv()
3273 dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n"); in set_xgbe_ethss10_priv()
3274 return -ENOMEM; in set_xgbe_ethss10_priv()
3277 gbe_dev->hw_stats_prev = in set_xgbe_ethss10_priv()
3278 devm_kcalloc(gbe_dev->dev, in set_xgbe_ethss10_priv()
3279 gbe_dev->num_et_stats, sizeof(u32), in set_xgbe_ethss10_priv()
3281 if (!gbe_dev->hw_stats_prev) { in set_xgbe_ethss10_priv()
3282 dev_err(gbe_dev->dev, in set_xgbe_ethss10_priv()
3284 return -ENOMEM; in set_xgbe_ethss10_priv()
3287 gbe_dev->ss_version = XGBE_SS_VERSION_10; in set_xgbe_ethss10_priv()
3288 gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + in set_xgbe_ethss10_priv()
3290 gbe_dev->host_port_regs = gbe_dev->ss_regs + XGBE10_HOST_PORT_OFFSET; in set_xgbe_ethss10_priv()
3292 for (i = 0; i < gbe_dev->max_num_ports; i++) in set_xgbe_ethss10_priv()
3293 gbe_dev->hw_stats_regs[i] = gbe_dev->switch_regs + in set_xgbe_ethss10_priv()
3296 gbe_dev->ale_reg = gbe_dev->switch_regs + XGBE10_ALE_OFFSET; in set_xgbe_ethss10_priv()
3297 gbe_dev->cpts_reg = gbe_dev->switch_regs + XGBE10_CPTS_OFFSET; in set_xgbe_ethss10_priv()
3298 gbe_dev->ale_ports = gbe_dev->max_num_ports; in set_xgbe_ethss10_priv()
3299 gbe_dev->host_port = XGBE10_HOST_PORT_NUM; in set_xgbe_ethss10_priv()
3300 gbe_dev->stats_en_mask = (1 << (gbe_dev->max_num_ports)) - 1; in set_xgbe_ethss10_priv()
3328 if (ret) { in get_gbe_resource_version()
3329 dev_err(gbe_dev->dev, in get_gbe_resource_version()
3335 regs = devm_ioremap_resource(gbe_dev->dev, &res); in get_gbe_resource_version()
3336 if (IS_ERR(regs)) { in get_gbe_resource_version()
3337 dev_err(gbe_dev->dev, "Failed to map gbe register base\n"); in get_gbe_resource_version()
3340 gbe_dev->ss_regs = regs; in get_gbe_resource_version()
3341 gbe_dev->ss_version = readl(gbe_dev->ss_regs); in get_gbe_resource_version()
3353 if (ret) { in set_gbe_ethss14_priv()
3354 dev_err(gbe_dev->dev, in set_gbe_ethss14_priv()
3360 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_gbe_ethss14_priv()
3361 if (IS_ERR(regs)) { in set_gbe_ethss14_priv()
3362 dev_err(gbe_dev->dev, in set_gbe_ethss14_priv()
3366 gbe_dev->sgmii_port34_regs = regs; in set_gbe_ethss14_priv()
3369 if (ret) { in set_gbe_ethss14_priv()
3370 dev_err(gbe_dev->dev, in set_gbe_ethss14_priv()
3376 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_gbe_ethss14_priv()
3377 if (IS_ERR(regs)) { in set_gbe_ethss14_priv()
3378 dev_err(gbe_dev->dev, in set_gbe_ethss14_priv()
3382 gbe_dev->switch_regs = regs; in set_gbe_ethss14_priv()
3384 gbe_dev->num_stats_mods = gbe_dev->max_num_slaves; in set_gbe_ethss14_priv()
3385 gbe_dev->et_stats = gbe13_et_stats; in set_gbe_ethss14_priv()
3386 gbe_dev->num_et_stats = ARRAY_SIZE(gbe13_et_stats); in set_gbe_ethss14_priv()
3388 gbe_dev->hw_stats = devm_kcalloc(gbe_dev->dev, in set_gbe_ethss14_priv()
3389 gbe_dev->num_et_stats, sizeof(u64), in set_gbe_ethss14_priv()
3391 if (!gbe_dev->hw_stats) { in set_gbe_ethss14_priv()
3392 dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n"); in set_gbe_ethss14_priv()
3393 return -ENOMEM; in set_gbe_ethss14_priv()
3396 gbe_dev->hw_stats_prev = in set_gbe_ethss14_priv()
3397 devm_kcalloc(gbe_dev->dev, in set_gbe_ethss14_priv()
3398 gbe_dev->num_et_stats, sizeof(u32), in set_gbe_ethss14_priv()
3400 if (!gbe_dev->hw_stats_prev) { in set_gbe_ethss14_priv()
3401 dev_err(gbe_dev->dev, in set_gbe_ethss14_priv()
3403 return -ENOMEM; in set_gbe_ethss14_priv()
3406 gbe_dev->sgmii_port_regs = gbe_dev->ss_regs + GBE13_SGMII_MODULE_OFFSET; in set_gbe_ethss14_priv()
3407 gbe_dev->host_port_regs = gbe_dev->switch_regs + GBE13_HOST_PORT_OFFSET; in set_gbe_ethss14_priv()
3413 for (i = 0; i < gbe_dev->max_num_slaves; i++) { in set_gbe_ethss14_priv()
3414 gbe_dev->hw_stats_regs[i] = in set_gbe_ethss14_priv()
3415 gbe_dev->switch_regs + GBE13_HW_STATS_OFFSET + in set_gbe_ethss14_priv()
3419 gbe_dev->cpts_reg = gbe_dev->switch_regs + GBE13_CPTS_OFFSET; in set_gbe_ethss14_priv()
3420 gbe_dev->ale_reg = gbe_dev->switch_regs + GBE13_ALE_OFFSET; in set_gbe_ethss14_priv()
3421 gbe_dev->ale_ports = gbe_dev->max_num_ports; in set_gbe_ethss14_priv()
3422 gbe_dev->host_port = GBE13_HOST_PORT_NUM; in set_gbe_ethss14_priv()
3423 gbe_dev->stats_en_mask = GBE13_REG_VAL_STAT_ENABLE_ALL; in set_gbe_ethss14_priv()
3449 gbe_dev->num_stats_mods = gbe_dev->max_num_ports; in set_gbenu_ethss_priv()
3450 gbe_dev->et_stats = gbenu_et_stats; in set_gbenu_ethss_priv()
3452 if (IS_SS_ID_MU(gbe_dev)) in set_gbenu_ethss_priv()
3453 gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE + in set_gbenu_ethss_priv()
3454 (gbe_dev->max_num_slaves * GBENU_ET_STATS_PORT_SIZE); in set_gbenu_ethss_priv()
3456 gbe_dev->num_et_stats = GBENU_ET_STATS_HOST_SIZE + in set_gbenu_ethss_priv()
3459 gbe_dev->hw_stats = devm_kcalloc(gbe_dev->dev, in set_gbenu_ethss_priv()
3460 gbe_dev->num_et_stats, sizeof(u64), in set_gbenu_ethss_priv()
3462 if (!gbe_dev->hw_stats) { in set_gbenu_ethss_priv()
3463 dev_err(gbe_dev->dev, "hw_stats memory allocation failed\n"); in set_gbenu_ethss_priv()
3464 return -ENOMEM; in set_gbenu_ethss_priv()
3467 gbe_dev->hw_stats_prev = in set_gbenu_ethss_priv()
3468 devm_kcalloc(gbe_dev->dev, in set_gbenu_ethss_priv()
3469 gbe_dev->num_et_stats, sizeof(u32), in set_gbenu_ethss_priv()
3471 if (!gbe_dev->hw_stats_prev) { in set_gbenu_ethss_priv()
3472 dev_err(gbe_dev->dev, in set_gbenu_ethss_priv()
3474 return -ENOMEM; in set_gbenu_ethss_priv()
3478 if (ret) { in set_gbenu_ethss_priv()
3479 dev_err(gbe_dev->dev, in set_gbenu_ethss_priv()
3485 regs = devm_ioremap_resource(gbe_dev->dev, &res); in set_gbenu_ethss_priv()
3486 if (IS_ERR(regs)) { in set_gbenu_ethss_priv()
3487 dev_err(gbe_dev->dev, in set_gbenu_ethss_priv()
3491 gbe_dev->switch_regs = regs; in set_gbenu_ethss_priv()
3493 if (!IS_SS_ID_2U(gbe_dev)) in set_gbenu_ethss_priv()
3494 gbe_dev->sgmii_port_regs = in set_gbenu_ethss_priv()
3495 gbe_dev->ss_regs + GBENU_SGMII_MODULE_OFFSET; in set_gbenu_ethss_priv()
3501 gbe_dev->sgmii_port34_regs = gbe_dev->sgmii_port_regs + in set_gbenu_ethss_priv()
3504 gbe_dev->host_port_regs = gbe_dev->switch_regs + GBENU_HOST_PORT_OFFSET; in set_gbenu_ethss_priv()
3506 for (i = 0; i < (gbe_dev->max_num_ports); i++) in set_gbenu_ethss_priv()
3507 gbe_dev->hw_stats_regs[i] = gbe_dev->switch_regs + in set_gbenu_ethss_priv()
3510 gbe_dev->cpts_reg = gbe_dev->switch_regs + GBENU_CPTS_OFFSET; in set_gbenu_ethss_priv()
3511 gbe_dev->ale_reg = gbe_dev->switch_regs + GBENU_ALE_OFFSET; in set_gbenu_ethss_priv()
3512 gbe_dev->ale_ports = gbe_dev->max_num_ports; in set_gbenu_ethss_priv()
3513 gbe_dev->host_port = GBENU_HOST_PORT_NUM; in set_gbenu_ethss_priv()
3514 gbe_dev->stats_en_mask = (1 << (gbe_dev->max_num_ports)) - 1; in set_gbenu_ethss_priv()
3532 * NU cppi port 0 tx pkt streaming interface has (n-1)*8 egress threads in set_gbenu_ethss_priv()
3549 if (!node) { in gbe_probe()
3551 return -ENODEV; in gbe_probe()
3555 if (!gbe_dev) in gbe_probe()
3556 return -ENOMEM; in gbe_probe()
3558 if (of_device_is_compatible(node, "ti,netcp-gbe-5") || in gbe_probe()
3559 of_device_is_compatible(node, "ti,netcp-gbe")) { in gbe_probe()
3560 gbe_dev->max_num_slaves = 4; in gbe_probe()
3561 } else if (of_device_is_compatible(node, "ti,netcp-gbe-9")) { in gbe_probe()
3562 gbe_dev->max_num_slaves = 8; in gbe_probe()
3563 } else if (of_device_is_compatible(node, "ti,netcp-gbe-2")) { in gbe_probe()
3564 gbe_dev->max_num_slaves = 1; in gbe_probe()
3566 } else if (of_device_is_compatible(node, "ti,netcp-xgbe")) { in gbe_probe()
3567 gbe_dev->max_num_slaves = 2; in gbe_probe()
3570 return -EINVAL; in gbe_probe()
3572 gbe_dev->max_num_ports = gbe_dev->max_num_slaves + 1; in gbe_probe()
3574 gbe_dev->dev = dev; in gbe_probe()
3575 gbe_dev->netcp_device = netcp_device; in gbe_probe()
3576 gbe_dev->rx_packet_max = NETCP_MAX_FRAME_SIZE; in gbe_probe()
3579 spin_lock_init(&gbe_dev->hw_stats_lock); in gbe_probe()
3581 gbe_dev->enable_ale = of_property_read_bool(node, "enable-ale"); in gbe_probe()
3582 if (gbe_dev->enable_ale) in gbe_probe()
3587 ret = of_property_read_u32(node, "tx-queue", in gbe_probe()
3588 &gbe_dev->tx_queue_id); in gbe_probe()
3589 if (ret < 0) { in gbe_probe()
3591 gbe_dev->tx_queue_id = GBE_TX_QUEUE; in gbe_probe()
3594 ret = of_property_read_string(node, "tx-channel", in gbe_probe()
3595 &gbe_dev->dma_chan_name); in gbe_probe()
3596 if (ret < 0) { in gbe_probe()
3597 dev_err(dev, "missing \"tx-channel\" parameter\n"); in gbe_probe()
3598 return -EINVAL; in gbe_probe()
3601 if (of_node_name_eq(node, "gbe")) { in gbe_probe()
3603 if (ret) in gbe_probe()
3606 dev_dbg(dev, "ss_version: 0x%08x\n", gbe_dev->ss_version); in gbe_probe()
3608 if (IS_SS_ID_VER_14(gbe_dev)) in gbe_probe()
3610 else if (IS_SS_ID_MU(gbe_dev)) in gbe_probe()
3613 ret = -ENODEV; in gbe_probe()
3615 } else if (of_node_name_eq(node, "xgbe")) { in gbe_probe()
3617 if (ret) in gbe_probe()
3619 ret = netcp_xgbe_serdes_init(gbe_dev->xgbe_serdes_regs, in gbe_probe()
3620 gbe_dev->ss_regs); in gbe_probe()
3623 ret = -ENODEV; in gbe_probe()
3626 if (ret) in gbe_probe()
3630 if (!interfaces) in gbe_probe()
3633 ret = netcp_txpipe_init(&gbe_dev->tx_pipe, netcp_device, in gbe_probe()
3634 gbe_dev->dma_chan_name, gbe_dev->tx_queue_id); in gbe_probe()
3635 if (ret) { in gbe_probe()
3640 ret = netcp_txpipe_open(&gbe_dev->tx_pipe); in gbe_probe()
3641 if (ret) { in gbe_probe()
3647 INIT_LIST_HEAD(&gbe_dev->gbe_intf_head); in gbe_probe()
3649 ret = of_property_read_u32(interface, "slave-port", &slave_num); in gbe_probe()
3650 if (ret) { in gbe_probe()
3651 dev_err(dev, "missing slave-port parameter, skipping interface configuration for %pOFn\n", in gbe_probe()
3655 gbe_dev->num_slaves++; in gbe_probe()
3656 if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves) { in gbe_probe()
3663 if (!gbe_dev->num_slaves) in gbe_probe()
3666 /* Initialize Secondary slave ports */ in gbe_probe()
3667 secondary_ports = of_get_child_by_name(node, "secondary-slave-ports"); in gbe_probe()
3668 INIT_LIST_HEAD(&gbe_dev->secondary_slaves); in gbe_probe()
3669 if (secondary_ports && (gbe_dev->num_slaves < gbe_dev->max_num_slaves)) in gbe_probe()
3673 if (!gbe_dev->num_slaves) { in gbe_probe()
3676 ret = -ENODEV; in gbe_probe()
3681 ale_params.dev = gbe_dev->dev; in gbe_probe()
3682 ale_params.ale_regs = gbe_dev->ale_reg; in gbe_probe()
3684 ale_params.ale_ports = gbe_dev->ale_ports; in gbe_probe()
3686 if (IS_SS_ID_NU(gbe_dev)) in gbe_probe()
3688 else if (IS_SS_ID_2U(gbe_dev)) in gbe_probe()
3690 else if (IS_SS_ID_XGBE(gbe_dev)) in gbe_probe()
3691 ale_params.dev_id = "66ak2h-xgbe"; in gbe_probe()
3693 gbe_dev->ale = cpsw_ale_create(&ale_params); in gbe_probe()
3694 if (IS_ERR(gbe_dev->ale)) { in gbe_probe()
3695 dev_err(gbe_dev->dev, "error initializing ale engine\n"); in gbe_probe()
3696 ret = PTR_ERR(gbe_dev->ale); in gbe_probe()
3699 dev_dbg(gbe_dev->dev, "Created a gbe ale engine\n"); in gbe_probe()
3703 if (!cpts_node) in gbe_probe()
3706 gbe_dev->cpts = cpts_create(gbe_dev->dev, gbe_dev->cpts_reg, in gbe_probe()
3709 if (IS_ENABLED(CONFIG_TI_CPTS) && IS_ERR(gbe_dev->cpts)) { in gbe_probe()
3710 ret = PTR_ERR(gbe_dev->cpts); in gbe_probe()
3717 spin_lock_bh(&gbe_dev->hw_stats_lock); in gbe_probe()
3718 for (i = 0; i < gbe_dev->num_stats_mods; i++) { in gbe_probe()
3719 if (IS_SS_ID_VER_14(gbe_dev)) in gbe_probe()
3724 spin_unlock_bh(&gbe_dev->hw_stats_lock); in gbe_probe()
3726 timer_setup(&gbe_dev->timer, netcp_ethss_timer, 0); in gbe_probe()
3727 gbe_dev->timer.expires = jiffies + GBE_TIMER_INTERVAL; in gbe_probe()
3728 add_timer(&gbe_dev->timer); in gbe_probe()
3744 if (!node) { in gbe_attach()
3745 dev_err(gbe_dev->dev, "interface node not available\n"); in gbe_attach()
3746 return -ENODEV; in gbe_attach()
3749 gbe_intf = devm_kzalloc(gbe_dev->dev, sizeof(*gbe_intf), GFP_KERNEL); in gbe_attach()
3750 if (!gbe_intf) in gbe_attach()
3751 return -ENOMEM; in gbe_attach()
3753 gbe_intf->ndev = ndev; in gbe_attach()
3754 gbe_intf->dev = gbe_dev->dev; in gbe_attach()
3755 gbe_intf->gbe_dev = gbe_dev; in gbe_attach()
3757 gbe_intf->slave = devm_kzalloc(gbe_dev->dev, in gbe_attach()
3758 sizeof(*gbe_intf->slave), in gbe_attach()
3760 if (!gbe_intf->slave) { in gbe_attach()
3761 ret = -ENOMEM; in gbe_attach()
3765 if (init_slave(gbe_dev, gbe_intf->slave, node)) { in gbe_attach()
3766 ret = -ENODEV; in gbe_attach()
3770 gbe_intf->tx_pipe = gbe_dev->tx_pipe; in gbe_attach()
3771 ndev->ethtool_ops = &keystone_ethtool_ops; in gbe_attach()
3772 list_add_tail(&gbe_intf->gbe_intf_list, &gbe_dev->gbe_intf_head); in gbe_attach()
3777 if (gbe_intf->slave) in gbe_attach()
3778 devm_kfree(gbe_dev->dev, gbe_intf->slave); in gbe_attach()
3779 if (gbe_intf) in gbe_attach()
3780 devm_kfree(gbe_dev->dev, gbe_intf); in gbe_attach()
3788 gbe_intf->ndev->ethtool_ops = NULL; in gbe_release()
3789 list_del(&gbe_intf->gbe_intf_list); in gbe_release()
3790 devm_kfree(gbe_intf->dev, gbe_intf->slave); in gbe_release()
3791 devm_kfree(gbe_intf->dev, gbe_intf); in gbe_release()
3799 del_timer_sync(&gbe_dev->timer); in gbe_remove()
3800 cpts_release(gbe_dev->cpts); in gbe_remove()
3801 cpsw_ale_stop(gbe_dev->ale); in gbe_remove()
3802 netcp_txpipe_close(&gbe_dev->tx_pipe); in gbe_remove()
3805 if (!list_empty(&gbe_dev->gbe_intf_head)) in gbe_remove()
3806 dev_alert(gbe_dev->dev, in gbe_remove()
3851 if (ret) in keystone_gbe_init()
3855 if (ret) in keystone_gbe_init()