| From b0481fbc0d853fd164055293002c621827eba5ad Mon Sep 17 00:00:00 2001 |
| From: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Date: Sat, 9 Nov 2019 15:02:53 +0200 |
| Subject: [PATCH] net: mscc: ocelot: separate net_device related items out of |
| ocelot_port |
| |
| The ocelot and ocelot_port structures will be used by a new DSA driver, |
| so the ocelot_board.c file will have to allocate and work with a private |
| structure (ocelot_port_private), which embeds the generic struct |
| ocelot_port. This is because in DSA, at least one interface does not |
| have a net_device, and the DSA driver API does not interact with that |
| anyway. |
| |
| The ocelot_port structure is equivalent to dsa_port, and ocelot to |
| dsa_switch. The members of ocelot_port which have an equivalent in |
| dsa_port (such as dp->vlan_filtering) have been moved to |
| ocelot_port_private. |
| |
| We want to enforce the coding convention that "ocelot_port" refers to |
| the structure, and "port" refers to the integer index. One can retrieve |
| the structure at any time from ocelot->ports[port]. |
| |
| The patch is large but only contains variable renaming and mechanical |
| movement of fields from one structure to another. |
| |
| Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| --- |
| drivers/net/ethernet/mscc/ocelot.c | 288 ++++++++++++++++-------------- |
| drivers/net/ethernet/mscc/ocelot.h | 21 ++- |
| drivers/net/ethernet/mscc/ocelot_ace.h | 4 +- |
| drivers/net/ethernet/mscc/ocelot_board.c | 25 ++- |
| drivers/net/ethernet/mscc/ocelot_flower.c | 32 ++-- |
| drivers/net/ethernet/mscc/ocelot_tc.c | 57 +++--- |
| 6 files changed, 235 insertions(+), 192 deletions(-) |
| |
| --- a/drivers/net/ethernet/mscc/ocelot.c |
| +++ b/drivers/net/ethernet/mscc/ocelot.c |
| @@ -229,8 +229,6 @@ static void ocelot_port_vlan_filtering(s |
| ocelot_rmw_gix(ocelot, val, |
| REW_TAG_CFG_TAG_CFG_M, |
| REW_TAG_CFG, port); |
| - |
| - ocelot_port->vlan_aware = vlan_aware; |
| } |
| |
| static int ocelot_port_set_native_vlan(struct ocelot *ocelot, int port, |
| @@ -297,9 +295,10 @@ static int ocelot_vlan_add(struct ocelot |
| static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid, |
| bool untagged) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + int port = priv->chip_port; |
| int ret; |
| |
| ret = ocelot_vlan_add(ocelot, port, vid, pvid, untagged); |
| @@ -337,9 +336,9 @@ static int ocelot_vlan_del(struct ocelot |
| |
| static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| int ret; |
| |
| /* 8021q removes VID 0 on module unload for all interfaces |
| @@ -412,10 +411,11 @@ static u16 ocelot_wm_enc(u16 value) |
| |
| static void ocelot_port_adjust_link(struct net_device *dev) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| - u8 p = port->chip_port; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| int speed, atop_wm, mode = 0; |
| + u8 port = priv->chip_port; |
| |
| switch (dev->phydev->speed) { |
| case SPEED_10: |
| @@ -444,62 +444,66 @@ static void ocelot_port_adjust_link(stru |
| return; |
| |
| /* Only full duplex supported for now */ |
| - ocelot_port_writel(port, DEV_MAC_MODE_CFG_FDX_ENA | |
| + ocelot_port_writel(ocelot_port, DEV_MAC_MODE_CFG_FDX_ENA | |
| mode, DEV_MAC_MODE_CFG); |
| |
| /* Set MAC IFG Gaps |
| * FDX: TX_IFG = 5, RX_IFG1 = RX_IFG2 = 0 |
| * !FDX: TX_IFG = 5, RX_IFG1 = RX_IFG2 = 5 |
| */ |
| - ocelot_port_writel(port, DEV_MAC_IFG_CFG_TX_IFG(5), DEV_MAC_IFG_CFG); |
| + ocelot_port_writel(ocelot_port, DEV_MAC_IFG_CFG_TX_IFG(5), |
| + DEV_MAC_IFG_CFG); |
| |
| /* Load seed (0) and set MAC HDX late collision */ |
| - ocelot_port_writel(port, DEV_MAC_HDX_CFG_LATE_COL_POS(67) | |
| + ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67) | |
| DEV_MAC_HDX_CFG_SEED_LOAD, |
| DEV_MAC_HDX_CFG); |
| mdelay(1); |
| - ocelot_port_writel(port, DEV_MAC_HDX_CFG_LATE_COL_POS(67), |
| + ocelot_port_writel(ocelot_port, DEV_MAC_HDX_CFG_LATE_COL_POS(67), |
| DEV_MAC_HDX_CFG); |
| |
| /* Disable HDX fast control */ |
| - ocelot_port_writel(port, DEV_PORT_MISC_HDX_FAST_DIS, DEV_PORT_MISC); |
| + ocelot_port_writel(ocelot_port, DEV_PORT_MISC_HDX_FAST_DIS, |
| + DEV_PORT_MISC); |
| |
| /* SGMII only for now */ |
| - ocelot_port_writel(port, PCS1G_MODE_CFG_SGMII_MODE_ENA, PCS1G_MODE_CFG); |
| - ocelot_port_writel(port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG); |
| + ocelot_port_writel(ocelot_port, PCS1G_MODE_CFG_SGMII_MODE_ENA, |
| + PCS1G_MODE_CFG); |
| + ocelot_port_writel(ocelot_port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG); |
| |
| /* Enable PCS */ |
| - ocelot_port_writel(port, PCS1G_CFG_PCS_ENA, PCS1G_CFG); |
| + ocelot_port_writel(ocelot_port, PCS1G_CFG_PCS_ENA, PCS1G_CFG); |
| |
| /* No aneg on SGMII */ |
| - ocelot_port_writel(port, 0, PCS1G_ANEG_CFG); |
| + ocelot_port_writel(ocelot_port, 0, PCS1G_ANEG_CFG); |
| |
| /* No loopback */ |
| - ocelot_port_writel(port, 0, PCS1G_LB_CFG); |
| + ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG); |
| |
| /* Set Max Length and maximum tags allowed */ |
| - ocelot_port_writel(port, VLAN_ETH_FRAME_LEN, DEV_MAC_MAXLEN_CFG); |
| - ocelot_port_writel(port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) | |
| + ocelot_port_writel(ocelot_port, VLAN_ETH_FRAME_LEN, |
| + DEV_MAC_MAXLEN_CFG); |
| + ocelot_port_writel(ocelot_port, DEV_MAC_TAGS_CFG_TAG_ID(ETH_P_8021AD) | |
| DEV_MAC_TAGS_CFG_VLAN_AWR_ENA | |
| DEV_MAC_TAGS_CFG_VLAN_LEN_AWR_ENA, |
| DEV_MAC_TAGS_CFG); |
| |
| /* Enable MAC module */ |
| - ocelot_port_writel(port, DEV_MAC_ENA_CFG_RX_ENA | |
| + ocelot_port_writel(ocelot_port, DEV_MAC_ENA_CFG_RX_ENA | |
| DEV_MAC_ENA_CFG_TX_ENA, DEV_MAC_ENA_CFG); |
| |
| /* Take MAC, Port, Phy (intern) and PCS (SGMII/Serdes) clock out of |
| * reset */ |
| - ocelot_port_writel(port, DEV_CLOCK_CFG_LINK_SPEED(speed), |
| + ocelot_port_writel(ocelot_port, DEV_CLOCK_CFG_LINK_SPEED(speed), |
| DEV_CLOCK_CFG); |
| |
| /* Set SMAC of Pause frame (00:00:00:00:00:00) */ |
| - ocelot_port_writel(port, 0, DEV_MAC_FC_MAC_HIGH_CFG); |
| - ocelot_port_writel(port, 0, DEV_MAC_FC_MAC_LOW_CFG); |
| + ocelot_port_writel(ocelot_port, 0, DEV_MAC_FC_MAC_HIGH_CFG); |
| + ocelot_port_writel(ocelot_port, 0, DEV_MAC_FC_MAC_LOW_CFG); |
| |
| /* No PFC */ |
| ocelot_write_gix(ocelot, ANA_PFC_PFC_CFG_FC_LINK_SPEED(speed), |
| - ANA_PFC_PFC_CFG, p); |
| + ANA_PFC_PFC_CFG, port); |
| |
| /* Set Pause WM hysteresis |
| * 152 = 6 * VLAN_ETH_FRAME_LEN / OCELOT_BUFFER_CELL_SZ |
| @@ -507,13 +511,13 @@ static void ocelot_port_adjust_link(stru |
| */ |
| ocelot_write_rix(ocelot, SYS_PAUSE_CFG_PAUSE_ENA | |
| SYS_PAUSE_CFG_PAUSE_STOP(101) | |
| - SYS_PAUSE_CFG_PAUSE_START(152), SYS_PAUSE_CFG, p); |
| + SYS_PAUSE_CFG_PAUSE_START(152), SYS_PAUSE_CFG, port); |
| |
| /* Core: Enable port for frame transfer */ |
| ocelot_write_rix(ocelot, QSYS_SWITCH_PORT_MODE_INGRESS_DROP_MODE | |
| QSYS_SWITCH_PORT_MODE_SCH_NEXT_CFG(1) | |
| QSYS_SWITCH_PORT_MODE_PORT_ENA, |
| - QSYS_SWITCH_PORT_MODE, p); |
| + QSYS_SWITCH_PORT_MODE, port); |
| |
| /* Flow control */ |
| ocelot_write_rix(ocelot, SYS_MAC_FC_CFG_PAUSE_VAL_CFG(0xffff) | |
| @@ -521,20 +525,21 @@ static void ocelot_port_adjust_link(stru |
| SYS_MAC_FC_CFG_ZERO_PAUSE_ENA | |
| SYS_MAC_FC_CFG_FC_LATENCY_CFG(0x7) | |
| SYS_MAC_FC_CFG_FC_LINK_SPEED(speed), |
| - SYS_MAC_FC_CFG, p); |
| - ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, p); |
| + SYS_MAC_FC_CFG, port); |
| + ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, port); |
| |
| /* Tail dropping watermark */ |
| atop_wm = (ocelot->shared_queue_sz - 9 * VLAN_ETH_FRAME_LEN) / OCELOT_BUFFER_CELL_SZ; |
| ocelot_write_rix(ocelot, ocelot_wm_enc(9 * VLAN_ETH_FRAME_LEN), |
| - SYS_ATOP, p); |
| + SYS_ATOP, port); |
| ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); |
| } |
| |
| static int ocelot_port_open(struct net_device *dev) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| int err; |
| |
| /* Enable receiving frames on the port, and activate auto-learning of |
| @@ -542,43 +547,44 @@ static int ocelot_port_open(struct net_d |
| */ |
| ocelot_write_gix(ocelot, ANA_PORT_PORT_CFG_LEARNAUTO | |
| ANA_PORT_PORT_CFG_RECV_ENA | |
| - ANA_PORT_PORT_CFG_PORTID_VAL(port->chip_port), |
| - ANA_PORT_PORT_CFG, port->chip_port); |
| + ANA_PORT_PORT_CFG_PORTID_VAL(port), |
| + ANA_PORT_PORT_CFG, port); |
| |
| - if (port->serdes) { |
| - err = phy_set_mode_ext(port->serdes, PHY_MODE_ETHERNET, |
| - port->phy_mode); |
| + if (priv->serdes) { |
| + err = phy_set_mode_ext(priv->serdes, PHY_MODE_ETHERNET, |
| + priv->phy_mode); |
| if (err) { |
| netdev_err(dev, "Could not set mode of SerDes\n"); |
| return err; |
| } |
| } |
| |
| - err = phy_connect_direct(dev, port->phy, &ocelot_port_adjust_link, |
| - port->phy_mode); |
| + err = phy_connect_direct(dev, priv->phy, &ocelot_port_adjust_link, |
| + priv->phy_mode); |
| if (err) { |
| netdev_err(dev, "Could not attach to PHY\n"); |
| return err; |
| } |
| |
| - dev->phydev = port->phy; |
| + dev->phydev = priv->phy; |
| |
| - phy_attached_info(port->phy); |
| - phy_start(port->phy); |
| + phy_attached_info(priv->phy); |
| + phy_start(priv->phy); |
| return 0; |
| } |
| |
| static int ocelot_port_stop(struct net_device *dev) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *port = &priv->port; |
| |
| - phy_disconnect(port->phy); |
| + phy_disconnect(priv->phy); |
| |
| dev->phydev = NULL; |
| |
| ocelot_port_writel(port, 0, DEV_MAC_ENA_CFG); |
| ocelot_rmw_rix(port->ocelot, 0, QSYS_SWITCH_PORT_MODE_PORT_ENA, |
| - QSYS_SWITCH_PORT_MODE, port->chip_port); |
| + QSYS_SWITCH_PORT_MODE, priv->chip_port); |
| return 0; |
| } |
| |
| @@ -604,13 +610,15 @@ static int ocelot_gen_ifh(u32 *ifh, stru |
| |
| static int ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev) |
| { |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| struct skb_shared_info *shinfo = skb_shinfo(skb); |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| - u32 val, ifh[IFH_LEN]; |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| struct frame_info info = {}; |
| u8 grp = 0; /* Send everything on CPU group 0 */ |
| unsigned int i, count, last; |
| + int port = priv->chip_port; |
| + u32 val, ifh[IFH_LEN]; |
| |
| val = ocelot_read(ocelot, QS_INJ_STATUS); |
| if (!(val & QS_INJ_STATUS_FIFO_RDY(BIT(grp))) || |
| @@ -620,15 +628,15 @@ static int ocelot_port_xmit(struct sk_bu |
| ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | |
| QS_INJ_CTRL_SOF, QS_INJ_CTRL, grp); |
| |
| - info.port = BIT(port->chip_port); |
| + info.port = BIT(port); |
| info.tag_type = IFH_TAG_TYPE_C; |
| info.vid = skb_vlan_tag_get(skb); |
| |
| /* Check if timestamping is needed */ |
| if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP) { |
| - info.rew_op = port->ptp_cmd; |
| - if (port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) |
| - info.rew_op |= (port->ts_id % 4) << 3; |
| + info.rew_op = ocelot_port->ptp_cmd; |
| + if (ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) |
| + info.rew_op |= (ocelot_port->ts_id % 4) << 3; |
| } |
| |
| ocelot_gen_ifh(ifh, &info); |
| @@ -663,7 +671,7 @@ static int ocelot_port_xmit(struct sk_bu |
| dev->stats.tx_bytes += skb->len; |
| |
| if (ocelot->ptp && shinfo->tx_flags & SKBTX_HW_TSTAMP && |
| - port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) { |
| + ocelot_port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) { |
| struct ocelot_skb *oskb = |
| kzalloc(sizeof(struct ocelot_skb), GFP_ATOMIC); |
| |
| @@ -673,10 +681,10 @@ static int ocelot_port_xmit(struct sk_bu |
| skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; |
| |
| oskb->skb = skb; |
| - oskb->id = port->ts_id % 4; |
| - port->ts_id++; |
| + oskb->id = ocelot_port->ts_id % 4; |
| + ocelot_port->ts_id++; |
| |
| - list_add_tail(&oskb->head, &port->skbs); |
| + list_add_tail(&oskb->head, &ocelot_port->skbs); |
| |
| return NETDEV_TX_OK; |
| } |
| @@ -715,25 +723,29 @@ EXPORT_SYMBOL(ocelot_get_hwtimestamp); |
| |
| static int ocelot_mc_unsync(struct net_device *dev, const unsigned char *addr) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| |
| - return ocelot_mact_forget(port->ocelot, addr, port->pvid); |
| + return ocelot_mact_forget(ocelot, addr, ocelot_port->pvid); |
| } |
| |
| static int ocelot_mc_sync(struct net_device *dev, const unsigned char *addr) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| |
| - return ocelot_mact_learn(port->ocelot, PGID_CPU, addr, port->pvid, |
| + return ocelot_mact_learn(ocelot, PGID_CPU, addr, ocelot_port->pvid, |
| ENTRYTYPE_LOCKED); |
| } |
| |
| static void ocelot_set_rx_mode(struct net_device *dev) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| - int i; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| u32 val; |
| + int i; |
| |
| /* This doesn't handle promiscuous mode because the bridge core is |
| * setting IFF_PROMISC on all slave interfaces and all frames would be |
| @@ -749,10 +761,11 @@ static void ocelot_set_rx_mode(struct ne |
| static int ocelot_port_get_phys_port_name(struct net_device *dev, |
| char *buf, size_t len) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + int port = priv->chip_port; |
| int ret; |
| |
| - ret = snprintf(buf, len, "p%d", port->chip_port); |
| + ret = snprintf(buf, len, "p%d", port); |
| if (ret >= len) |
| return -EINVAL; |
| |
| @@ -761,15 +774,16 @@ static int ocelot_port_get_phys_port_nam |
| |
| static int ocelot_port_set_mac_address(struct net_device *dev, void *p) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| const struct sockaddr *addr = p; |
| |
| /* Learn the new net device MAC address in the mac table. */ |
| - ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data, port->pvid, |
| + ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data, ocelot_port->pvid, |
| ENTRYTYPE_LOCKED); |
| /* Then forget the previous one. */ |
| - ocelot_mact_forget(ocelot, dev->dev_addr, port->pvid); |
| + ocelot_mact_forget(ocelot, dev->dev_addr, ocelot_port->pvid); |
| |
| ether_addr_copy(dev->dev_addr, addr->sa_data); |
| return 0; |
| @@ -778,11 +792,12 @@ static int ocelot_port_set_mac_address(s |
| static void ocelot_get_stats64(struct net_device *dev, |
| struct rtnl_link_stats64 *stats) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| |
| /* Configure the port to read the stats from */ |
| - ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port->chip_port), |
| + ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(port), |
| SYS_STAT_CFG); |
| |
| /* Get Rx stats */ |
| @@ -814,12 +829,13 @@ static void ocelot_get_stats64(struct ne |
| } |
| |
| static int ocelot_fdb_add(struct ocelot *ocelot, int port, |
| - const unsigned char *addr, u16 vid) |
| + const unsigned char *addr, u16 vid, |
| + bool vlan_aware) |
| { |
| struct ocelot_port *ocelot_port = ocelot->ports[port]; |
| |
| if (!vid) { |
| - if (!ocelot_port->vlan_aware) |
| + if (!vlan_aware) |
| /* If the bridge is not VLAN aware and no VID was |
| * provided, set it to pvid to ensure the MAC entry |
| * matches incoming untagged packets |
| @@ -841,10 +857,11 @@ static int ocelot_port_fdb_add(struct nd |
| u16 vid, u16 flags, |
| struct netlink_ext_ack *extack) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| |
| - return ocelot_fdb_add(ocelot, ocelot_port->chip_port, addr, vid); |
| + return ocelot_fdb_add(ocelot, port, addr, vid, priv->vlan_aware); |
| } |
| |
| static int ocelot_fdb_del(struct ocelot *ocelot, int port, |
| @@ -857,10 +874,11 @@ static int ocelot_port_fdb_del(struct nd |
| struct net_device *dev, |
| const unsigned char *addr, u16 vid) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| |
| - return ocelot_fdb_del(ocelot, ocelot_port->chip_port, addr, vid); |
| + return ocelot_fdb_del(ocelot, port, addr, vid); |
| } |
| |
| struct ocelot_dump_ctx { |
| @@ -999,18 +1017,18 @@ static int ocelot_port_fdb_dump(struct s |
| struct net_device *dev, |
| struct net_device *filter_dev, int *idx) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| struct ocelot_dump_ctx dump = { |
| .dev = dev, |
| .skb = skb, |
| .cb = cb, |
| .idx = *idx, |
| }; |
| + int port = priv->chip_port; |
| int ret; |
| |
| - ret = ocelot_fdb_dump(ocelot, ocelot_port->chip_port, |
| - ocelot_port_fdb_do_dump, &dump); |
| + ret = ocelot_fdb_dump(ocelot, port, ocelot_port_fdb_do_dump, &dump); |
| |
| *idx = dump.idx; |
| |
| @@ -1033,12 +1051,12 @@ static int ocelot_set_features(struct ne |
| netdev_features_t features) |
| { |
| netdev_features_t changed = dev->features ^ features; |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| |
| if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC) && |
| - ocelot_port->tc.offload_cnt) { |
| + priv->tc.offload_cnt) { |
| netdev_err(dev, |
| "Cannot disable HW TC offload while offloads active\n"); |
| return -EBUSY; |
| @@ -1053,8 +1071,8 @@ static int ocelot_set_features(struct ne |
| static int ocelot_get_port_parent_id(struct net_device *dev, |
| struct netdev_phys_item_id *ppid) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| |
| ppid->id_len = sizeof(ocelot->base_mac); |
| memcpy(&ppid->id, &ocelot->base_mac, ppid->id_len); |
| @@ -1130,9 +1148,9 @@ static int ocelot_hwstamp_set(struct oce |
| |
| static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| |
| /* The function is only used for PTP operations for now */ |
| if (!ocelot->ptp) |
| @@ -1169,8 +1187,8 @@ static const struct net_device_ops ocelo |
| |
| static void ocelot_get_strings(struct net_device *netdev, u32 sset, u8 *data) |
| { |
| - struct ocelot_port *port = netdev_priv(netdev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(netdev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| int i; |
| |
| if (sset != ETH_SS_STATS) |
| @@ -1224,8 +1242,9 @@ static void ocelot_check_stats_work(stru |
| static void ocelot_get_ethtool_stats(struct net_device *dev, |
| struct ethtool_stats *stats, u64 *data) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| int i; |
| |
| /* check and update now */ |
| @@ -1233,13 +1252,13 @@ static void ocelot_get_ethtool_stats(str |
| |
| /* Copy all counters */ |
| for (i = 0; i < ocelot->num_stats; i++) |
| - *data++ = ocelot->stats[port->chip_port * ocelot->num_stats + i]; |
| + *data++ = ocelot->stats[port * ocelot->num_stats + i]; |
| } |
| |
| static int ocelot_get_sset_count(struct net_device *dev, int sset) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| |
| if (sset != ETH_SS_STATS) |
| return -EOPNOTSUPP; |
| @@ -1249,8 +1268,8 @@ static int ocelot_get_sset_count(struct |
| static int ocelot_get_ts_info(struct net_device *dev, |
| struct ethtool_ts_info *info) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| |
| if (!ocelot->ptp) |
| return ethtool_op_get_ts_info(dev, info); |
| @@ -1385,9 +1404,9 @@ static int ocelot_port_attr_set(struct n |
| const struct switchdev_attr *attr, |
| struct switchdev_trans *trans) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| - struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot *ocelot = priv->port.ocelot; |
| + int port = priv->chip_port; |
| int err = 0; |
| |
| switch (attr->id) { |
| @@ -1399,8 +1418,8 @@ static int ocelot_port_attr_set(struct n |
| ocelot_port_attr_ageing_set(ocelot, port, attr->u.ageing_time); |
| break; |
| case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING: |
| - ocelot_port_vlan_filtering(ocelot, port, |
| - attr->u.vlan_filtering); |
| + priv->vlan_aware = attr->u.vlan_filtering; |
| + ocelot_port_vlan_filtering(ocelot, port, priv->vlan_aware); |
| break; |
| case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED: |
| ocelot_port_attr_mc_set(ocelot, port, !attr->u.mc_disabled); |
| @@ -1465,15 +1484,17 @@ static int ocelot_port_obj_add_mdb(struc |
| const struct switchdev_obj_port_mdb *mdb, |
| struct switchdev_trans *trans) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| - struct ocelot_multicast *mc; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| unsigned char addr[ETH_ALEN]; |
| + struct ocelot_multicast *mc; |
| + int port = priv->chip_port; |
| u16 vid = mdb->vid; |
| bool new = false; |
| |
| if (!vid) |
| - vid = port->pvid; |
| + vid = ocelot_port->pvid; |
| |
| mc = ocelot_multicast_get(ocelot, mdb->addr, vid); |
| if (!mc) { |
| @@ -1497,7 +1518,7 @@ static int ocelot_port_obj_add_mdb(struc |
| ocelot_mact_forget(ocelot, addr, vid); |
| } |
| |
| - mc->ports |= BIT(port->chip_port); |
| + mc->ports |= BIT(port); |
| addr[2] = mc->ports << 0; |
| addr[1] = mc->ports << 8; |
| |
| @@ -1507,14 +1528,16 @@ static int ocelot_port_obj_add_mdb(struc |
| static int ocelot_port_obj_del_mdb(struct net_device *dev, |
| const struct switchdev_obj_port_mdb *mdb) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| - struct ocelot *ocelot = port->ocelot; |
| - struct ocelot_multicast *mc; |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| + struct ocelot *ocelot = ocelot_port->ocelot; |
| unsigned char addr[ETH_ALEN]; |
| + struct ocelot_multicast *mc; |
| + int port = priv->chip_port; |
| u16 vid = mdb->vid; |
| |
| if (!vid) |
| - vid = port->pvid; |
| + vid = ocelot_port->pvid; |
| |
| mc = ocelot_multicast_get(ocelot, mdb->addr, vid); |
| if (!mc) |
| @@ -1526,7 +1549,7 @@ static int ocelot_port_obj_del_mdb(struc |
| addr[0] = 0; |
| ocelot_mact_forget(ocelot, addr, vid); |
| |
| - mc->ports &= ~BIT(port->chip_port); |
| + mc->ports &= ~BIT(port); |
| if (!mc->ports) { |
| list_del(&mc->list); |
| devm_kfree(ocelot->dev, mc); |
| @@ -1680,9 +1703,9 @@ static int ocelot_port_lag_join(struct o |
| |
| rcu_read_lock(); |
| for_each_netdev_in_bond_rcu(bond, ndev) { |
| - struct ocelot_port *port = netdev_priv(ndev); |
| + struct ocelot_port_private *priv = netdev_priv(ndev); |
| |
| - bond_mask |= BIT(port->chip_port); |
| + bond_mask |= BIT(priv->chip_port); |
| } |
| rcu_read_unlock(); |
| |
| @@ -1750,20 +1773,23 @@ static int ocelot_netdevice_port_event(s |
| unsigned long event, |
| struct netdev_notifier_changeupper_info *info) |
| { |
| - struct ocelot_port *ocelot_port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| + struct ocelot_port *ocelot_port = &priv->port; |
| struct ocelot *ocelot = ocelot_port->ocelot; |
| - int port = ocelot_port->chip_port; |
| + int port = priv->chip_port; |
| int err = 0; |
| |
| switch (event) { |
| case NETDEV_CHANGEUPPER: |
| if (netif_is_bridge_master(info->upper_dev)) { |
| - if (info->linking) |
| + if (info->linking) { |
| err = ocelot_port_bridge_join(ocelot, port, |
| info->upper_dev); |
| - else |
| + } else { |
| err = ocelot_port_bridge_leave(ocelot, port, |
| info->upper_dev); |
| + priv->vlan_aware = false; |
| + } |
| } |
| if (netif_is_lag_master(info->upper_dev)) { |
| if (info->linking) |
| @@ -2079,21 +2105,23 @@ int ocelot_probe_port(struct ocelot *oce |
| void __iomem *regs, |
| struct phy_device *phy) |
| { |
| + struct ocelot_port_private *priv; |
| struct ocelot_port *ocelot_port; |
| struct net_device *dev; |
| u32 val; |
| int err; |
| |
| - dev = alloc_etherdev(sizeof(struct ocelot_port)); |
| + dev = alloc_etherdev(sizeof(struct ocelot_port_private)); |
| if (!dev) |
| return -ENOMEM; |
| SET_NETDEV_DEV(dev, ocelot->dev); |
| - ocelot_port = netdev_priv(dev); |
| - ocelot_port->dev = dev; |
| + priv = netdev_priv(dev); |
| + priv->dev = dev; |
| + priv->phy = phy; |
| + priv->chip_port = port; |
| + ocelot_port = &priv->port; |
| ocelot_port->ocelot = ocelot; |
| ocelot_port->regs = regs; |
| - ocelot_port->chip_port = port; |
| - ocelot_port->phy = phy; |
| ocelot->ports[port] = ocelot_port; |
| |
| dev->netdev_ops = &ocelot_port_netdev_ops; |
| --- a/drivers/net/ethernet/mscc/ocelot.h |
| +++ b/drivers/net/ethernet/mscc/ocelot.h |
| @@ -479,11 +479,9 @@ struct ocelot { |
| }; |
| |
| struct ocelot_port { |
| - struct net_device *dev; |
| struct ocelot *ocelot; |
| - struct phy_device *phy; |
| + |
| void __iomem *regs; |
| - u8 chip_port; |
| |
| /* Ingress default VLAN (pvid) */ |
| u16 pvid; |
| @@ -491,18 +489,23 @@ struct ocelot_port { |
| /* Egress default VLAN (vid) */ |
| u16 vid; |
| |
| - u8 vlan_aware; |
| + u8 ptp_cmd; |
| + struct list_head skbs; |
| + u8 ts_id; |
| +}; |
| |
| - u64 *stats; |
| +struct ocelot_port_private { |
| + struct ocelot_port port; |
| + struct net_device *dev; |
| + struct phy_device *phy; |
| + u8 chip_port; |
| + |
| + u8 vlan_aware; |
| |
| phy_interface_t phy_mode; |
| struct phy *serdes; |
| |
| struct ocelot_port_tc tc; |
| - |
| - u8 ptp_cmd; |
| - struct list_head skbs; |
| - u8 ts_id; |
| }; |
| |
| struct ocelot_skb { |
| --- a/drivers/net/ethernet/mscc/ocelot_ace.h |
| +++ b/drivers/net/ethernet/mscc/ocelot_ace.h |
| @@ -224,9 +224,9 @@ int ocelot_ace_rule_stats_update(struct |
| int ocelot_ace_init(struct ocelot *ocelot); |
| void ocelot_ace_deinit(void); |
| |
| -int ocelot_setup_tc_block_flower_bind(struct ocelot_port *port, |
| +int ocelot_setup_tc_block_flower_bind(struct ocelot_port_private *priv, |
| struct flow_block_offload *f); |
| -void ocelot_setup_tc_block_flower_unbind(struct ocelot_port *port, |
| +void ocelot_setup_tc_block_flower_unbind(struct ocelot_port_private *priv, |
| struct flow_block_offload *f); |
| |
| #endif /* _MSCC_OCELOT_ACE_H_ */ |
| --- a/drivers/net/ethernet/mscc/ocelot_board.c |
| +++ b/drivers/net/ethernet/mscc/ocelot_board.c |
| @@ -95,6 +95,8 @@ static irqreturn_t ocelot_xtr_irq_handle |
| |
| do { |
| struct skb_shared_hwtstamps *shhwtstamps; |
| + struct ocelot_port_private *priv; |
| + struct ocelot_port *ocelot_port; |
| u64 tod_in_ns, full_ts_in_ns; |
| struct frame_info info = {}; |
| struct net_device *dev; |
| @@ -122,7 +124,10 @@ static irqreturn_t ocelot_xtr_irq_handle |
| |
| ocelot_parse_ifh(ifh, &info); |
| |
| - dev = ocelot->ports[info.port]->dev; |
| + ocelot_port = ocelot->ports[info.port]; |
| + priv = container_of(ocelot_port, struct ocelot_port_private, |
| + port); |
| + dev = priv->dev; |
| |
| skb = netdev_alloc_skb(dev, info.len); |
| |
| @@ -371,6 +376,8 @@ static int mscc_ocelot_probe(struct plat |
| ocelot_init(ocelot); |
| |
| for_each_available_child_of_node(ports, portnp) { |
| + struct ocelot_port_private *priv; |
| + struct ocelot_port *ocelot_port; |
| struct device_node *phy_node; |
| struct phy_device *phy; |
| struct resource *res; |
| @@ -406,13 +413,17 @@ static int mscc_ocelot_probe(struct plat |
| goto out_put_ports; |
| } |
| |
| + ocelot_port = ocelot->ports[port]; |
| + priv = container_of(ocelot_port, struct ocelot_port_private, |
| + port); |
| + |
| phy_mode = of_get_phy_mode(portnp); |
| if (phy_mode < 0) |
| - ocelot->ports[port]->phy_mode = PHY_INTERFACE_MODE_NA; |
| - else |
| - ocelot->ports[port]->phy_mode = phy_mode; |
| + phy_mode = PHY_INTERFACE_MODE_NA; |
| + |
| + priv->phy_mode = phy_mode; |
| |
| - switch (ocelot->ports[port]->phy_mode) { |
| + switch (priv->phy_mode) { |
| case PHY_INTERFACE_MODE_NA: |
| continue; |
| case PHY_INTERFACE_MODE_SGMII: |
| @@ -421,7 +432,7 @@ static int mscc_ocelot_probe(struct plat |
| /* Ensure clock signals and speed is set on all |
| * QSGMII links |
| */ |
| - ocelot_port_writel(ocelot->ports[port], |
| + ocelot_port_writel(ocelot_port, |
| DEV_CLOCK_CFG_LINK_SPEED |
| (OCELOT_SPEED_1000), |
| DEV_CLOCK_CFG); |
| @@ -449,7 +460,7 @@ static int mscc_ocelot_probe(struct plat |
| goto out_put_ports; |
| } |
| |
| - ocelot->ports[port]->serdes = serdes; |
| + priv->serdes = serdes; |
| } |
| |
| register_netdevice_notifier(&ocelot_netdevice_nb); |
| --- a/drivers/net/ethernet/mscc/ocelot_flower.c |
| +++ b/drivers/net/ethernet/mscc/ocelot_flower.c |
| @@ -10,7 +10,7 @@ |
| |
| struct ocelot_port_block { |
| struct ocelot_acl_block *block; |
| - struct ocelot_port *port; |
| + struct ocelot_port_private *priv; |
| }; |
| |
| static int ocelot_flower_parse_action(struct flow_cls_offload *f, |
| @@ -177,8 +177,8 @@ struct ocelot_ace_rule *ocelot_ace_rule_ |
| if (!rule) |
| return NULL; |
| |
| - rule->port = block->port; |
| - rule->chip_port = block->port->chip_port; |
| + rule->port = &block->priv->port; |
| + rule->chip_port = block->priv->chip_port; |
| return rule; |
| } |
| |
| @@ -202,7 +202,7 @@ static int ocelot_flower_replace(struct |
| if (ret) |
| return ret; |
| |
| - port_block->port->tc.offload_cnt++; |
| + port_block->priv->tc.offload_cnt++; |
| return 0; |
| } |
| |
| @@ -213,14 +213,14 @@ static int ocelot_flower_destroy(struct |
| int ret; |
| |
| rule.prio = f->common.prio; |
| - rule.port = port_block->port; |
| + rule.port = &port_block->priv->port; |
| rule.id = f->cookie; |
| |
| ret = ocelot_ace_rule_offload_del(&rule); |
| if (ret) |
| return ret; |
| |
| - port_block->port->tc.offload_cnt--; |
| + port_block->priv->tc.offload_cnt--; |
| return 0; |
| } |
| |
| @@ -231,7 +231,7 @@ static int ocelot_flower_stats_update(st |
| int ret; |
| |
| rule.prio = f->common.prio; |
| - rule.port = port_block->port; |
| + rule.port = &port_block->priv->port; |
| rule.id = f->cookie; |
| ret = ocelot_ace_rule_stats_update(&rule); |
| if (ret) |
| @@ -261,7 +261,7 @@ static int ocelot_setup_tc_block_cb_flow |
| { |
| struct ocelot_port_block *port_block = cb_priv; |
| |
| - if (!tc_cls_can_offload_and_chain0(port_block->port->dev, type_data)) |
| + if (!tc_cls_can_offload_and_chain0(port_block->priv->dev, type_data)) |
| return -EOPNOTSUPP; |
| |
| switch (type) { |
| @@ -275,7 +275,7 @@ static int ocelot_setup_tc_block_cb_flow |
| } |
| |
| static struct ocelot_port_block* |
| -ocelot_port_block_create(struct ocelot_port *port) |
| +ocelot_port_block_create(struct ocelot_port_private *priv) |
| { |
| struct ocelot_port_block *port_block; |
| |
| @@ -283,7 +283,7 @@ ocelot_port_block_create(struct ocelot_p |
| if (!port_block) |
| return NULL; |
| |
| - port_block->port = port; |
| + port_block->priv = priv; |
| |
| return port_block; |
| } |
| @@ -300,7 +300,7 @@ static void ocelot_tc_block_unbind(void |
| ocelot_port_block_destroy(port_block); |
| } |
| |
| -int ocelot_setup_tc_block_flower_bind(struct ocelot_port *port, |
| +int ocelot_setup_tc_block_flower_bind(struct ocelot_port_private *priv, |
| struct flow_block_offload *f) |
| { |
| struct ocelot_port_block *port_block; |
| @@ -311,14 +311,14 @@ int ocelot_setup_tc_block_flower_bind(st |
| return -EOPNOTSUPP; |
| |
| block_cb = flow_block_cb_lookup(f->block, |
| - ocelot_setup_tc_block_cb_flower, port); |
| + ocelot_setup_tc_block_cb_flower, priv); |
| if (!block_cb) { |
| - port_block = ocelot_port_block_create(port); |
| + port_block = ocelot_port_block_create(priv); |
| if (!port_block) |
| return -ENOMEM; |
| |
| block_cb = flow_block_cb_alloc(ocelot_setup_tc_block_cb_flower, |
| - port, port_block, |
| + priv, port_block, |
| ocelot_tc_block_unbind); |
| if (IS_ERR(block_cb)) { |
| ret = PTR_ERR(block_cb); |
| @@ -339,13 +339,13 @@ err_cb_register: |
| return ret; |
| } |
| |
| -void ocelot_setup_tc_block_flower_unbind(struct ocelot_port *port, |
| +void ocelot_setup_tc_block_flower_unbind(struct ocelot_port_private *priv, |
| struct flow_block_offload *f) |
| { |
| struct flow_block_cb *block_cb; |
| |
| block_cb = flow_block_cb_lookup(f->block, |
| - ocelot_setup_tc_block_cb_flower, port); |
| + ocelot_setup_tc_block_cb_flower, priv); |
| if (!block_cb) |
| return; |
| |
| --- a/drivers/net/ethernet/mscc/ocelot_tc.c |
| +++ b/drivers/net/ethernet/mscc/ocelot_tc.c |
| @@ -9,17 +9,19 @@ |
| #include "ocelot_ace.h" |
| #include <net/pkt_cls.h> |
| |
| -static int ocelot_setup_tc_cls_matchall(struct ocelot_port *port, |
| +static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv, |
| struct tc_cls_matchall_offload *f, |
| bool ingress) |
| { |
| struct netlink_ext_ack *extack = f->common.extack; |
| + struct ocelot *ocelot = priv->port.ocelot; |
| struct ocelot_policer pol = { 0 }; |
| struct flow_action_entry *action; |
| + int port = priv->chip_port; |
| int err; |
| |
| - netdev_dbg(port->dev, "%s: port %u command %d cookie %lu\n", |
| - __func__, port->chip_port, f->command, f->cookie); |
| + netdev_dbg(priv->dev, "%s: port %u command %d cookie %lu\n", |
| + __func__, port, f->command, f->cookie); |
| |
| if (!ingress) { |
| NL_SET_ERR_MSG_MOD(extack, "Only ingress is supported"); |
| @@ -34,7 +36,7 @@ static int ocelot_setup_tc_cls_matchall( |
| return -EOPNOTSUPP; |
| } |
| |
| - if (port->tc.block_shared) { |
| + if (priv->tc.block_shared) { |
| NL_SET_ERR_MSG_MOD(extack, |
| "Rate limit is not supported on shared blocks"); |
| return -EOPNOTSUPP; |
| @@ -47,7 +49,7 @@ static int ocelot_setup_tc_cls_matchall( |
| return -EOPNOTSUPP; |
| } |
| |
| - if (port->tc.police_id && port->tc.police_id != f->cookie) { |
| + if (priv->tc.police_id && priv->tc.police_id != f->cookie) { |
| NL_SET_ERR_MSG_MOD(extack, |
| "Only one policer per port is supported\n"); |
| return -EEXIST; |
| @@ -58,28 +60,27 @@ static int ocelot_setup_tc_cls_matchall( |
| PSCHED_NS2TICKS(action->police.burst), |
| PSCHED_TICKS_PER_SEC); |
| |
| - err = ocelot_port_policer_add(port->ocelot, port->chip_port, |
| - &pol); |
| + err = ocelot_port_policer_add(ocelot, port, &pol); |
| if (err) { |
| NL_SET_ERR_MSG_MOD(extack, "Could not add policer\n"); |
| return err; |
| } |
| |
| - port->tc.police_id = f->cookie; |
| - port->tc.offload_cnt++; |
| + priv->tc.police_id = f->cookie; |
| + priv->tc.offload_cnt++; |
| return 0; |
| case TC_CLSMATCHALL_DESTROY: |
| - if (port->tc.police_id != f->cookie) |
| + if (priv->tc.police_id != f->cookie) |
| return -ENOENT; |
| |
| - err = ocelot_port_policer_del(port->ocelot, port->chip_port); |
| + err = ocelot_port_policer_del(ocelot, port); |
| if (err) { |
| NL_SET_ERR_MSG_MOD(extack, |
| "Could not delete policer\n"); |
| return err; |
| } |
| - port->tc.police_id = 0; |
| - port->tc.offload_cnt--; |
| + priv->tc.police_id = 0; |
| + priv->tc.offload_cnt--; |
| return 0; |
| case TC_CLSMATCHALL_STATS: /* fall through */ |
| default: |
| @@ -91,21 +92,21 @@ static int ocelot_setup_tc_block_cb(enum |
| void *type_data, |
| void *cb_priv, bool ingress) |
| { |
| - struct ocelot_port *port = cb_priv; |
| + struct ocelot_port_private *priv = cb_priv; |
| |
| - if (!tc_cls_can_offload_and_chain0(port->dev, type_data)) |
| + if (!tc_cls_can_offload_and_chain0(priv->dev, type_data)) |
| return -EOPNOTSUPP; |
| |
| switch (type) { |
| case TC_SETUP_CLSMATCHALL: |
| - netdev_dbg(port->dev, "tc_block_cb: TC_SETUP_CLSMATCHALL %s\n", |
| + netdev_dbg(priv->dev, "tc_block_cb: TC_SETUP_CLSMATCHALL %s\n", |
| ingress ? "ingress" : "egress"); |
| |
| - return ocelot_setup_tc_cls_matchall(port, type_data, ingress); |
| + return ocelot_setup_tc_cls_matchall(priv, type_data, ingress); |
| case TC_SETUP_CLSFLOWER: |
| return 0; |
| default: |
| - netdev_dbg(port->dev, "tc_block_cb: type %d %s\n", |
| + netdev_dbg(priv->dev, "tc_block_cb: type %d %s\n", |
| type, |
| ingress ? "ingress" : "egress"); |
| |
| @@ -131,19 +132,19 @@ static int ocelot_setup_tc_block_cb_eg(e |
| |
| static LIST_HEAD(ocelot_block_cb_list); |
| |
| -static int ocelot_setup_tc_block(struct ocelot_port *port, |
| +static int ocelot_setup_tc_block(struct ocelot_port_private *priv, |
| struct flow_block_offload *f) |
| { |
| struct flow_block_cb *block_cb; |
| flow_setup_cb_t *cb; |
| int err; |
| |
| - netdev_dbg(port->dev, "tc_block command %d, binder_type %d\n", |
| + netdev_dbg(priv->dev, "tc_block command %d, binder_type %d\n", |
| f->command, f->binder_type); |
| |
| if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) { |
| cb = ocelot_setup_tc_block_cb_ig; |
| - port->tc.block_shared = f->block_shared; |
| + priv->tc.block_shared = f->block_shared; |
| } else if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS) { |
| cb = ocelot_setup_tc_block_cb_eg; |
| } else { |
| @@ -154,14 +155,14 @@ static int ocelot_setup_tc_block(struct |
| |
| switch (f->command) { |
| case FLOW_BLOCK_BIND: |
| - if (flow_block_cb_is_busy(cb, port, &ocelot_block_cb_list)) |
| + if (flow_block_cb_is_busy(cb, priv, &ocelot_block_cb_list)) |
| return -EBUSY; |
| |
| - block_cb = flow_block_cb_alloc(cb, port, port, NULL); |
| + block_cb = flow_block_cb_alloc(cb, priv, priv, NULL); |
| if (IS_ERR(block_cb)) |
| return PTR_ERR(block_cb); |
| |
| - err = ocelot_setup_tc_block_flower_bind(port, f); |
| + err = ocelot_setup_tc_block_flower_bind(priv, f); |
| if (err < 0) { |
| flow_block_cb_free(block_cb); |
| return err; |
| @@ -170,11 +171,11 @@ static int ocelot_setup_tc_block(struct |
| list_add_tail(&block_cb->driver_list, f->driver_block_list); |
| return 0; |
| case FLOW_BLOCK_UNBIND: |
| - block_cb = flow_block_cb_lookup(f->block, cb, port); |
| + block_cb = flow_block_cb_lookup(f->block, cb, priv); |
| if (!block_cb) |
| return -ENOENT; |
| |
| - ocelot_setup_tc_block_flower_unbind(port, f); |
| + ocelot_setup_tc_block_flower_unbind(priv, f); |
| flow_block_cb_remove(block_cb, f); |
| list_del(&block_cb->driver_list); |
| return 0; |
| @@ -186,11 +187,11 @@ static int ocelot_setup_tc_block(struct |
| int ocelot_setup_tc(struct net_device *dev, enum tc_setup_type type, |
| void *type_data) |
| { |
| - struct ocelot_port *port = netdev_priv(dev); |
| + struct ocelot_port_private *priv = netdev_priv(dev); |
| |
| switch (type) { |
| case TC_SETUP_BLOCK: |
| - return ocelot_setup_tc_block(port, type_data); |
| + return ocelot_setup_tc_block(priv, type_data); |
| default: |
| return -EOPNOTSUPP; |
| } |