diff options
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0260-net-mscc-ocelot-publish-structure-definitions-to-inc.patch')
-rw-r--r-- | target/linux/layerscape/patches-5.4/701-net-0260-net-mscc-ocelot-publish-structure-definitions-to-inc.patch | 1414 |
1 files changed, 0 insertions, 1414 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0260-net-mscc-ocelot-publish-structure-definitions-to-inc.patch b/target/linux/layerscape/patches-5.4/701-net-0260-net-mscc-ocelot-publish-structure-definitions-to-inc.patch deleted file mode 100644 index 8529e9825c..0000000000 --- a/target/linux/layerscape/patches-5.4/701-net-0260-net-mscc-ocelot-publish-structure-definitions-to-inc.patch +++ /dev/null @@ -1,1414 +0,0 @@ -From 417b5a156ca8ab4c986c9deacf58309ce4e09410 Mon Sep 17 00:00:00 2001 -From: Vladimir Oltean <vladimir.oltean@nxp.com> -Date: Thu, 14 Nov 2019 17:03:27 +0200 -Subject: [PATCH] net: mscc: ocelot: publish structure definitions to - include/soc/mscc/ocelot.h - -We will be registering another switch driver based on ocelot, which -lives under drivers/net/dsa. - -Make sure the Felix DSA front-end has the necessary abstractions to -implement a new Ocelot driver instantiation. This includes the function -prototypes for implementing DSA callbacks. - -Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> -Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> -Signed-off-by: David S. Miller <davem@davemloft.net> ---- - drivers/net/ethernet/mscc/ocelot.c | 78 +++--- - drivers/net/ethernet/mscc/ocelot.h | 482 +-------------------------------- - include/soc/mscc/ocelot.h | 539 +++++++++++++++++++++++++++++++++++++ - 3 files changed, 588 insertions(+), 511 deletions(-) - create mode 100644 include/soc/mscc/ocelot.h - ---- a/drivers/net/ethernet/mscc/ocelot.c -+++ b/drivers/net/ethernet/mscc/ocelot.c -@@ -21,7 +21,6 @@ - #include <net/netevent.h> - #include <net/rtnetlink.h> - #include <net/switchdev.h> --#include <net/dsa.h> - - #include "ocelot.h" - #include "ocelot_ace.h" -@@ -184,8 +183,8 @@ static void ocelot_vlan_mode(struct ocel - ocelot_write(ocelot, val, ANA_VLANMASK); - } - --static void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, -- bool vlan_aware) -+void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, -+ bool vlan_aware) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - u32 val; -@@ -230,6 +229,7 @@ static void ocelot_port_vlan_filtering(s - REW_TAG_CFG_TAG_CFG_M, - REW_TAG_CFG, port); - } -+EXPORT_SYMBOL(ocelot_port_vlan_filtering); - - static int ocelot_port_set_native_vlan(struct ocelot *ocelot, int port, - u16 vid) -@@ -267,8 +267,8 @@ static void ocelot_port_set_pvid(struct - ocelot_port->pvid = pvid; - } - --static int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, -- bool untagged) -+int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, -+ bool untagged) - { - int ret; - -@@ -291,6 +291,7 @@ static int ocelot_vlan_add(struct ocelot - - return 0; - } -+EXPORT_SYMBOL(ocelot_vlan_add); - - static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid, - bool untagged) -@@ -312,7 +313,7 @@ static int ocelot_vlan_vid_add(struct ne - return 0; - } - --static int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) -+int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - int ret; -@@ -333,6 +334,7 @@ static int ocelot_vlan_del(struct ocelot - - return 0; - } -+EXPORT_SYMBOL(ocelot_vlan_del); - - static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid) - { -@@ -404,8 +406,8 @@ static u16 ocelot_wm_enc(u16 value) - return value; - } - --static void ocelot_adjust_link(struct ocelot *ocelot, int port, -- struct phy_device *phydev) -+void ocelot_adjust_link(struct ocelot *ocelot, int port, -+ struct phy_device *phydev) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - int speed, mode = 0; -@@ -471,6 +473,7 @@ static void ocelot_adjust_link(struct oc - SYS_MAC_FC_CFG, port); - ocelot_write_rix(ocelot, 0, ANA_POL_FLOWC, port); - } -+EXPORT_SYMBOL(ocelot_adjust_link); - - static void ocelot_port_adjust_link(struct net_device *dev) - { -@@ -481,8 +484,8 @@ static void ocelot_port_adjust_link(stru - ocelot_adjust_link(ocelot, port, dev->phydev); - } - --static void ocelot_port_enable(struct ocelot *ocelot, int port, -- struct phy_device *phy) -+void ocelot_port_enable(struct ocelot *ocelot, int port, -+ struct phy_device *phy) - { - /* Enable receiving frames on the port, and activate auto-learning of - * MAC addresses. -@@ -492,6 +495,7 @@ static void ocelot_port_enable(struct oc - ANA_PORT_PORT_CFG_PORTID_VAL(port), - ANA_PORT_PORT_CFG, port); - } -+EXPORT_SYMBOL(ocelot_port_enable); - - static int ocelot_port_open(struct net_device *dev) - { -@@ -526,7 +530,7 @@ static int ocelot_port_open(struct net_d - return 0; - } - --static void ocelot_port_disable(struct ocelot *ocelot, int port) -+void ocelot_port_disable(struct ocelot *ocelot, int port) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - -@@ -534,6 +538,7 @@ static void ocelot_port_disable(struct o - ocelot_rmw_rix(ocelot, 0, QSYS_SWITCH_PORT_MODE_PORT_ENA, - QSYS_SWITCH_PORT_MODE, port); - } -+EXPORT_SYMBOL(ocelot_port_disable); - - static int ocelot_port_stop(struct net_device *dev) - { -@@ -790,9 +795,8 @@ static void ocelot_get_stats64(struct ne - stats->collisions = ocelot_read(ocelot, SYS_COUNT_TX_COLLISION); - } - --static int ocelot_fdb_add(struct ocelot *ocelot, int port, -- const unsigned char *addr, u16 vid, -- bool vlan_aware) -+int ocelot_fdb_add(struct ocelot *ocelot, int port, -+ const unsigned char *addr, u16 vid, bool vlan_aware) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - -@@ -812,6 +816,7 @@ static int ocelot_fdb_add(struct ocelot - - return ocelot_mact_learn(ocelot, port, addr, vid, ENTRYTYPE_LOCKED); - } -+EXPORT_SYMBOL(ocelot_fdb_add); - - static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], - struct net_device *dev, -@@ -826,11 +831,12 @@ static int ocelot_port_fdb_add(struct nd - return ocelot_fdb_add(ocelot, port, addr, vid, priv->vlan_aware); - } - --static int ocelot_fdb_del(struct ocelot *ocelot, int port, -- const unsigned char *addr, u16 vid) -+int ocelot_fdb_del(struct ocelot *ocelot, int port, -+ const unsigned char *addr, u16 vid) - { - return ocelot_mact_forget(ocelot, addr, vid); - } -+EXPORT_SYMBOL(ocelot_fdb_del); - - static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[], - struct net_device *dev, -@@ -940,8 +946,8 @@ static int ocelot_mact_read(struct ocelo - return 0; - } - --static int ocelot_fdb_dump(struct ocelot *ocelot, int port, -- dsa_fdb_dump_cb_t *cb, void *data) -+int ocelot_fdb_dump(struct ocelot *ocelot, int port, -+ dsa_fdb_dump_cb_t *cb, void *data) - { - int i, j; - -@@ -973,6 +979,7 @@ static int ocelot_fdb_dump(struct ocelot - - return 0; - } -+EXPORT_SYMBOL(ocelot_fdb_dump); - - static int ocelot_port_fdb_dump(struct sk_buff *skb, - struct netlink_callback *cb, -@@ -1147,8 +1154,7 @@ static const struct net_device_ops ocelo - .ndo_do_ioctl = ocelot_ioctl, - }; - --static void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, -- u8 *data) -+void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data) - { - int i; - -@@ -1159,6 +1165,7 @@ static void ocelot_get_strings(struct oc - memcpy(data + i * ETH_GSTRING_LEN, ocelot->stats_layout[i].name, - ETH_GSTRING_LEN); - } -+EXPORT_SYMBOL(ocelot_get_strings); - - static void ocelot_port_get_strings(struct net_device *netdev, u32 sset, - u8 *data) -@@ -1210,7 +1217,7 @@ static void ocelot_check_stats_work(stru - OCELOT_STATS_CHECK_DELAY); - } - --static void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) -+void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data) - { - int i; - -@@ -1221,6 +1228,7 @@ static void ocelot_get_ethtool_stats(str - for (i = 0; i < ocelot->num_stats; i++) - *data++ = ocelot->stats[port * ocelot->num_stats + i]; - } -+EXPORT_SYMBOL(ocelot_get_ethtool_stats); - - static void ocelot_port_get_ethtool_stats(struct net_device *dev, - struct ethtool_stats *stats, -@@ -1233,13 +1241,14 @@ static void ocelot_port_get_ethtool_stat - ocelot_get_ethtool_stats(ocelot, port, data); - } - --static int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) -+int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset) - { - if (sset != ETH_SS_STATS) - return -EOPNOTSUPP; - - return ocelot->num_stats; - } -+EXPORT_SYMBOL(ocelot_get_sset_count); - - static int ocelot_port_get_sset_count(struct net_device *dev, int sset) - { -@@ -1250,8 +1259,8 @@ static int ocelot_port_get_sset_count(st - return ocelot_get_sset_count(ocelot, port, sset); - } - --static int ocelot_get_ts_info(struct ocelot *ocelot, int port, -- struct ethtool_ts_info *info) -+int ocelot_get_ts_info(struct ocelot *ocelot, int port, -+ struct ethtool_ts_info *info) - { - info->phc_index = ocelot->ptp_clock ? - ptp_clock_index(ocelot->ptp_clock) : -1; -@@ -1270,6 +1279,7 @@ static int ocelot_get_ts_info(struct oce - - return 0; - } -+EXPORT_SYMBOL(ocelot_get_ts_info); - - static int ocelot_port_get_ts_info(struct net_device *dev, - struct ethtool_ts_info *info) -@@ -1293,8 +1303,7 @@ static const struct ethtool_ops ocelot_e - .get_ts_info = ocelot_port_get_ts_info, - }; - --static void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, -- u8 state) -+void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state) - { - u32 port_cfg; - int p, i; -@@ -1355,6 +1364,7 @@ static void ocelot_bridge_stp_state_set( - } - } - } -+EXPORT_SYMBOL(ocelot_bridge_stp_state_set); - - static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port, - struct switchdev_trans *trans, -@@ -1366,11 +1376,12 @@ static void ocelot_port_attr_stp_state_s - ocelot_bridge_stp_state_set(ocelot, port, state); - } - --static void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs) -+void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs) - { - ocelot_write(ocelot, ANA_AUTOAGE_AGE_PERIOD(msecs / 2), - ANA_AUTOAGE); - } -+EXPORT_SYMBOL(ocelot_set_ageing_time); - - static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port, - unsigned long ageing_clock_t) -@@ -1601,8 +1612,8 @@ static int ocelot_port_obj_del(struct ne - return ret; - } - --static int ocelot_port_bridge_join(struct ocelot *ocelot, int port, -- struct net_device *bridge) -+int ocelot_port_bridge_join(struct ocelot *ocelot, int port, -+ struct net_device *bridge) - { - if (!ocelot->bridge_mask) { - ocelot->hw_bridge_dev = bridge; -@@ -1617,9 +1628,10 @@ static int ocelot_port_bridge_join(struc - - return 0; - } -+EXPORT_SYMBOL(ocelot_port_bridge_join); - --static int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, -- struct net_device *bridge) -+int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, -+ struct net_device *bridge) - { - ocelot->bridge_mask &= ~BIT(port); - -@@ -1630,6 +1642,7 @@ static int ocelot_port_bridge_leave(stru - ocelot_port_set_pvid(ocelot, port, 0); - return ocelot_port_set_native_vlan(ocelot, port, 0); - } -+EXPORT_SYMBOL(ocelot_port_bridge_leave); - - static void ocelot_set_aggr_pgids(struct ocelot *ocelot) - { -@@ -2118,7 +2131,7 @@ static void ocelot_port_set_mtu(struct o - ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG); - } - --static void ocelot_init_port(struct ocelot *ocelot, int port) -+void ocelot_init_port(struct ocelot *ocelot, int port) - { - struct ocelot_port *ocelot_port = ocelot->ports[port]; - -@@ -2165,6 +2178,7 @@ static void ocelot_init_port(struct ocel - /* Enable vcap lookups */ - ocelot_vcap_enable(ocelot, port); - } -+EXPORT_SYMBOL(ocelot_init_port); - - int ocelot_probe_port(struct ocelot *ocelot, u8 port, - void __iomem *regs, ---- a/drivers/net/ethernet/mscc/ocelot.h -+++ b/drivers/net/ethernet/mscc/ocelot.h -@@ -18,6 +18,7 @@ - #include <linux/ptp_clock_kernel.h> - #include <linux/regmap.h> - -+#include <soc/mscc/ocelot.h> - #include "ocelot_ana.h" - #include "ocelot_dev.h" - #include "ocelot_qsys.h" -@@ -52,376 +53,6 @@ struct frame_info { - u32 timestamp; /* rew_val */ - }; - --#define IFH_INJ_BYPASS BIT(31) --#define IFH_INJ_POP_CNT_DISABLE (3 << 28) -- --#define IFH_TAG_TYPE_C 0 --#define IFH_TAG_TYPE_S 1 -- --#define IFH_REW_OP_NOOP 0x0 --#define IFH_REW_OP_DSCP 0x1 --#define IFH_REW_OP_ONE_STEP_PTP 0x2 --#define IFH_REW_OP_TWO_STEP_PTP 0x3 --#define IFH_REW_OP_ORIGIN_PTP 0x5 -- --#define OCELOT_TAG_LEN 16 --#define OCELOT_SHORT_PREFIX_LEN 4 --#define OCELOT_LONG_PREFIX_LEN 16 -- --#define OCELOT_SPEED_2500 0 --#define OCELOT_SPEED_1000 1 --#define OCELOT_SPEED_100 2 --#define OCELOT_SPEED_10 3 -- --#define TARGET_OFFSET 24 --#define REG_MASK GENMASK(TARGET_OFFSET - 1, 0) --#define REG(reg, offset) [reg & REG_MASK] = offset -- --enum ocelot_target { -- ANA = 1, -- QS, -- QSYS, -- REW, -- SYS, -- S2, -- HSIO, -- PTP, -- TARGET_MAX, --}; -- --enum ocelot_reg { -- ANA_ADVLEARN = ANA << TARGET_OFFSET, -- ANA_VLANMASK, -- ANA_PORT_B_DOMAIN, -- ANA_ANAGEFIL, -- ANA_ANEVENTS, -- ANA_STORMLIMIT_BURST, -- ANA_STORMLIMIT_CFG, -- ANA_ISOLATED_PORTS, -- ANA_COMMUNITY_PORTS, -- ANA_AUTOAGE, -- ANA_MACTOPTIONS, -- ANA_LEARNDISC, -- ANA_AGENCTRL, -- ANA_MIRRORPORTS, -- ANA_EMIRRORPORTS, -- ANA_FLOODING, -- ANA_FLOODING_IPMC, -- ANA_SFLOW_CFG, -- ANA_PORT_MODE, -- ANA_CUT_THRU_CFG, -- ANA_PGID_PGID, -- ANA_TABLES_ANMOVED, -- ANA_TABLES_MACHDATA, -- ANA_TABLES_MACLDATA, -- ANA_TABLES_STREAMDATA, -- ANA_TABLES_MACACCESS, -- ANA_TABLES_MACTINDX, -- ANA_TABLES_VLANACCESS, -- ANA_TABLES_VLANTIDX, -- ANA_TABLES_ISDXACCESS, -- ANA_TABLES_ISDXTIDX, -- ANA_TABLES_ENTRYLIM, -- ANA_TABLES_PTP_ID_HIGH, -- ANA_TABLES_PTP_ID_LOW, -- ANA_TABLES_STREAMACCESS, -- ANA_TABLES_STREAMTIDX, -- ANA_TABLES_SEQ_HISTORY, -- ANA_TABLES_SEQ_MASK, -- ANA_TABLES_SFID_MASK, -- ANA_TABLES_SFIDACCESS, -- ANA_TABLES_SFIDTIDX, -- ANA_MSTI_STATE, -- ANA_OAM_UPM_LM_CNT, -- ANA_SG_ACCESS_CTRL, -- ANA_SG_CONFIG_REG_1, -- ANA_SG_CONFIG_REG_2, -- ANA_SG_CONFIG_REG_3, -- ANA_SG_CONFIG_REG_4, -- ANA_SG_CONFIG_REG_5, -- ANA_SG_GCL_GS_CONFIG, -- ANA_SG_GCL_TI_CONFIG, -- ANA_SG_STATUS_REG_1, -- ANA_SG_STATUS_REG_2, -- ANA_SG_STATUS_REG_3, -- ANA_PORT_VLAN_CFG, -- ANA_PORT_DROP_CFG, -- ANA_PORT_QOS_CFG, -- ANA_PORT_VCAP_CFG, -- ANA_PORT_VCAP_S1_KEY_CFG, -- ANA_PORT_VCAP_S2_CFG, -- ANA_PORT_PCP_DEI_MAP, -- ANA_PORT_CPU_FWD_CFG, -- ANA_PORT_CPU_FWD_BPDU_CFG, -- ANA_PORT_CPU_FWD_GARP_CFG, -- ANA_PORT_CPU_FWD_CCM_CFG, -- ANA_PORT_PORT_CFG, -- ANA_PORT_POL_CFG, -- ANA_PORT_PTP_CFG, -- ANA_PORT_PTP_DLY1_CFG, -- ANA_PORT_PTP_DLY2_CFG, -- ANA_PORT_SFID_CFG, -- ANA_PFC_PFC_CFG, -- ANA_PFC_PFC_TIMER, -- ANA_IPT_OAM_MEP_CFG, -- ANA_IPT_IPT, -- ANA_PPT_PPT, -- ANA_FID_MAP_FID_MAP, -- ANA_AGGR_CFG, -- ANA_CPUQ_CFG, -- ANA_CPUQ_CFG2, -- ANA_CPUQ_8021_CFG, -- ANA_DSCP_CFG, -- ANA_DSCP_REWR_CFG, -- ANA_VCAP_RNG_TYPE_CFG, -- ANA_VCAP_RNG_VAL_CFG, -- ANA_VRAP_CFG, -- ANA_VRAP_HDR_DATA, -- ANA_VRAP_HDR_MASK, -- ANA_DISCARD_CFG, -- ANA_FID_CFG, -- ANA_POL_PIR_CFG, -- ANA_POL_CIR_CFG, -- ANA_POL_MODE_CFG, -- ANA_POL_PIR_STATE, -- ANA_POL_CIR_STATE, -- ANA_POL_STATE, -- ANA_POL_FLOWC, -- ANA_POL_HYST, -- ANA_POL_MISC_CFG, -- QS_XTR_GRP_CFG = QS << TARGET_OFFSET, -- QS_XTR_RD, -- QS_XTR_FRM_PRUNING, -- QS_XTR_FLUSH, -- QS_XTR_DATA_PRESENT, -- QS_XTR_CFG, -- QS_INJ_GRP_CFG, -- QS_INJ_WR, -- QS_INJ_CTRL, -- QS_INJ_STATUS, -- QS_INJ_ERR, -- QS_INH_DBG, -- QSYS_PORT_MODE = QSYS << TARGET_OFFSET, -- QSYS_SWITCH_PORT_MODE, -- QSYS_STAT_CNT_CFG, -- QSYS_EEE_CFG, -- QSYS_EEE_THRES, -- QSYS_IGR_NO_SHARING, -- QSYS_EGR_NO_SHARING, -- QSYS_SW_STATUS, -- QSYS_EXT_CPU_CFG, -- QSYS_PAD_CFG, -- QSYS_CPU_GROUP_MAP, -- QSYS_QMAP, -- QSYS_ISDX_SGRP, -- QSYS_TIMED_FRAME_ENTRY, -- QSYS_TFRM_MISC, -- QSYS_TFRM_PORT_DLY, -- QSYS_TFRM_TIMER_CFG_1, -- QSYS_TFRM_TIMER_CFG_2, -- QSYS_TFRM_TIMER_CFG_3, -- QSYS_TFRM_TIMER_CFG_4, -- QSYS_TFRM_TIMER_CFG_5, -- QSYS_TFRM_TIMER_CFG_6, -- QSYS_TFRM_TIMER_CFG_7, -- QSYS_TFRM_TIMER_CFG_8, -- QSYS_RED_PROFILE, -- QSYS_RES_QOS_MODE, -- QSYS_RES_CFG, -- QSYS_RES_STAT, -- QSYS_EGR_DROP_MODE, -- QSYS_EQ_CTRL, -- QSYS_EVENTS_CORE, -- QSYS_QMAXSDU_CFG_0, -- QSYS_QMAXSDU_CFG_1, -- QSYS_QMAXSDU_CFG_2, -- QSYS_QMAXSDU_CFG_3, -- QSYS_QMAXSDU_CFG_4, -- QSYS_QMAXSDU_CFG_5, -- QSYS_QMAXSDU_CFG_6, -- QSYS_QMAXSDU_CFG_7, -- QSYS_PREEMPTION_CFG, -- QSYS_CIR_CFG, -- QSYS_EIR_CFG, -- QSYS_SE_CFG, -- QSYS_SE_DWRR_CFG, -- QSYS_SE_CONNECT, -- QSYS_SE_DLB_SENSE, -- QSYS_CIR_STATE, -- QSYS_EIR_STATE, -- QSYS_SE_STATE, -- QSYS_HSCH_MISC_CFG, -- QSYS_TAG_CONFIG, -- QSYS_TAS_PARAM_CFG_CTRL, -- QSYS_PORT_MAX_SDU, -- QSYS_PARAM_CFG_REG_1, -- QSYS_PARAM_CFG_REG_2, -- QSYS_PARAM_CFG_REG_3, -- QSYS_PARAM_CFG_REG_4, -- QSYS_PARAM_CFG_REG_5, -- QSYS_GCL_CFG_REG_1, -- QSYS_GCL_CFG_REG_2, -- QSYS_PARAM_STATUS_REG_1, -- QSYS_PARAM_STATUS_REG_2, -- QSYS_PARAM_STATUS_REG_3, -- QSYS_PARAM_STATUS_REG_4, -- QSYS_PARAM_STATUS_REG_5, -- QSYS_PARAM_STATUS_REG_6, -- QSYS_PARAM_STATUS_REG_7, -- QSYS_PARAM_STATUS_REG_8, -- QSYS_PARAM_STATUS_REG_9, -- QSYS_GCL_STATUS_REG_1, -- QSYS_GCL_STATUS_REG_2, -- REW_PORT_VLAN_CFG = REW << TARGET_OFFSET, -- REW_TAG_CFG, -- REW_PORT_CFG, -- REW_DSCP_CFG, -- REW_PCP_DEI_QOS_MAP_CFG, -- REW_PTP_CFG, -- REW_PTP_DLY1_CFG, -- REW_RED_TAG_CFG, -- REW_DSCP_REMAP_DP1_CFG, -- REW_DSCP_REMAP_CFG, -- REW_STAT_CFG, -- REW_REW_STICKY, -- REW_PPT, -- SYS_COUNT_RX_OCTETS = SYS << TARGET_OFFSET, -- SYS_COUNT_RX_UNICAST, -- SYS_COUNT_RX_MULTICAST, -- SYS_COUNT_RX_BROADCAST, -- SYS_COUNT_RX_SHORTS, -- SYS_COUNT_RX_FRAGMENTS, -- SYS_COUNT_RX_JABBERS, -- SYS_COUNT_RX_CRC_ALIGN_ERRS, -- SYS_COUNT_RX_SYM_ERRS, -- SYS_COUNT_RX_64, -- SYS_COUNT_RX_65_127, -- SYS_COUNT_RX_128_255, -- SYS_COUNT_RX_256_1023, -- SYS_COUNT_RX_1024_1526, -- SYS_COUNT_RX_1527_MAX, -- SYS_COUNT_RX_PAUSE, -- SYS_COUNT_RX_CONTROL, -- SYS_COUNT_RX_LONGS, -- SYS_COUNT_RX_CLASSIFIED_DROPS, -- SYS_COUNT_TX_OCTETS, -- SYS_COUNT_TX_UNICAST, -- SYS_COUNT_TX_MULTICAST, -- SYS_COUNT_TX_BROADCAST, -- SYS_COUNT_TX_COLLISION, -- SYS_COUNT_TX_DROPS, -- SYS_COUNT_TX_PAUSE, -- SYS_COUNT_TX_64, -- SYS_COUNT_TX_65_127, -- SYS_COUNT_TX_128_511, -- SYS_COUNT_TX_512_1023, -- SYS_COUNT_TX_1024_1526, -- SYS_COUNT_TX_1527_MAX, -- SYS_COUNT_TX_AGING, -- SYS_RESET_CFG, -- SYS_SR_ETYPE_CFG, -- SYS_VLAN_ETYPE_CFG, -- SYS_PORT_MODE, -- SYS_FRONT_PORT_MODE, -- SYS_FRM_AGING, -- SYS_STAT_CFG, -- SYS_SW_STATUS, -- SYS_MISC_CFG, -- SYS_REW_MAC_HIGH_CFG, -- SYS_REW_MAC_LOW_CFG, -- SYS_TIMESTAMP_OFFSET, -- SYS_CMID, -- SYS_PAUSE_CFG, -- SYS_PAUSE_TOT_CFG, -- SYS_ATOP, -- SYS_ATOP_TOT_CFG, -- SYS_MAC_FC_CFG, -- SYS_MMGT, -- SYS_MMGT_FAST, -- SYS_EVENTS_DIF, -- SYS_EVENTS_CORE, -- SYS_CNT, -- SYS_PTP_STATUS, -- SYS_PTP_TXSTAMP, -- SYS_PTP_NXT, -- SYS_PTP_CFG, -- SYS_RAM_INIT, -- SYS_CM_ADDR, -- SYS_CM_DATA_WR, -- SYS_CM_DATA_RD, -- SYS_CM_OP, -- SYS_CM_DATA, -- S2_CORE_UPDATE_CTRL = S2 << TARGET_OFFSET, -- S2_CORE_MV_CFG, -- S2_CACHE_ENTRY_DAT, -- S2_CACHE_MASK_DAT, -- S2_CACHE_ACTION_DAT, -- S2_CACHE_CNT_DAT, -- S2_CACHE_TG_DAT, -- PTP_PIN_CFG = PTP << TARGET_OFFSET, -- PTP_PIN_TOD_SEC_MSB, -- PTP_PIN_TOD_SEC_LSB, -- PTP_PIN_TOD_NSEC, -- PTP_CFG_MISC, -- PTP_CLK_CFG_ADJ_CFG, -- PTP_CLK_CFG_ADJ_FREQ, --}; -- --enum ocelot_regfield { -- ANA_ADVLEARN_VLAN_CHK, -- ANA_ADVLEARN_LEARN_MIRROR, -- ANA_ANEVENTS_FLOOD_DISCARD, -- ANA_ANEVENTS_MSTI_DROP, -- ANA_ANEVENTS_ACLKILL, -- ANA_ANEVENTS_ACLUSED, -- ANA_ANEVENTS_AUTOAGE, -- ANA_ANEVENTS_VS2TTL1, -- ANA_ANEVENTS_STORM_DROP, -- ANA_ANEVENTS_LEARN_DROP, -- ANA_ANEVENTS_AGED_ENTRY, -- ANA_ANEVENTS_CPU_LEARN_FAILED, -- ANA_ANEVENTS_AUTO_LEARN_FAILED, -- ANA_ANEVENTS_LEARN_REMOVE, -- ANA_ANEVENTS_AUTO_LEARNED, -- ANA_ANEVENTS_AUTO_MOVED, -- ANA_ANEVENTS_DROPPED, -- ANA_ANEVENTS_CLASSIFIED_DROP, -- ANA_ANEVENTS_CLASSIFIED_COPY, -- ANA_ANEVENTS_VLAN_DISCARD, -- ANA_ANEVENTS_FWD_DISCARD, -- ANA_ANEVENTS_MULTICAST_FLOOD, -- ANA_ANEVENTS_UNICAST_FLOOD, -- ANA_ANEVENTS_DEST_KNOWN, -- ANA_ANEVENTS_BUCKET3_MATCH, -- ANA_ANEVENTS_BUCKET2_MATCH, -- ANA_ANEVENTS_BUCKET1_MATCH, -- ANA_ANEVENTS_BUCKET0_MATCH, -- ANA_ANEVENTS_CPU_OPERATION, -- ANA_ANEVENTS_DMAC_LOOKUP, -- ANA_ANEVENTS_SMAC_LOOKUP, -- ANA_ANEVENTS_SEQ_GEN_ERR_0, -- ANA_ANEVENTS_SEQ_GEN_ERR_1, -- ANA_TABLES_MACACCESS_B_DOM, -- ANA_TABLES_MACTINDX_BUCKET, -- ANA_TABLES_MACTINDX_M_INDEX, -- QSYS_TIMED_FRAME_ENTRY_TFRM_VLD, -- QSYS_TIMED_FRAME_ENTRY_TFRM_FP, -- QSYS_TIMED_FRAME_ENTRY_TFRM_PORTNO, -- QSYS_TIMED_FRAME_ENTRY_TFRM_TM_SEL, -- QSYS_TIMED_FRAME_ENTRY_TFRM_TM_T, -- SYS_RESET_CFG_CORE_ENA, -- SYS_RESET_CFG_MEM_ENA, -- SYS_RESET_CFG_MEM_INIT, -- REGFIELD_MAX --}; -- --enum ocelot_clk_pins { -- ALT_PPS_PIN = 1, -- EXT_CLK_PIN, -- ALT_LDST_PIN, -- TOD_ACC_PIN --}; -- - struct ocelot_multicast { - struct list_head list; - unsigned char addr[ETH_ALEN]; -@@ -429,88 +60,6 @@ struct ocelot_multicast { - u16 ports; - }; - --enum ocelot_tag_prefix { -- OCELOT_TAG_PREFIX_DISABLED = 0, -- OCELOT_TAG_PREFIX_NONE, -- OCELOT_TAG_PREFIX_SHORT, -- OCELOT_TAG_PREFIX_LONG, --}; -- --struct ocelot_port; --struct ocelot; -- --struct ocelot_stat_layout { -- u32 offset; -- char name[ETH_GSTRING_LEN]; --}; -- --struct ocelot_ops { -- void (*pcs_init)(struct ocelot *ocelot, int port); -- int (*reset)(struct ocelot *ocelot); --}; -- --struct ocelot { -- const struct ocelot_ops *ops; -- struct device *dev; -- -- struct regmap *targets[TARGET_MAX]; -- struct regmap_field *regfields[REGFIELD_MAX]; -- const u32 *const *map; -- const struct ocelot_stat_layout *stats_layout; -- unsigned int num_stats; -- -- u8 base_mac[ETH_ALEN]; -- -- struct net_device *hw_bridge_dev; -- u16 bridge_mask; -- u16 bridge_fwd_mask; -- -- struct workqueue_struct *ocelot_owq; -- -- int shared_queue_sz; -- -- u8 num_phys_ports; -- u8 num_cpu_ports; -- u8 cpu; -- struct ocelot_port **ports; -- -- u32 *lags; -- -- /* Keep track of the vlan port masks */ -- u32 vlan_mask[VLAN_N_VID]; -- -- struct list_head multicast; -- -- /* Workqueue to check statistics for overflow with its lock */ -- struct mutex stats_lock; -- u64 *stats; -- struct delayed_work stats_work; -- struct workqueue_struct *stats_queue; -- -- u8 ptp:1; -- struct ptp_clock *ptp_clock; -- struct ptp_clock_info ptp_info; -- struct hwtstamp_config hwtstamp_config; -- struct mutex ptp_lock; /* Protects the PTP interface state */ -- spinlock_t ptp_clock_lock; /* Protects the PTP clock */ --}; -- --struct ocelot_port { -- struct ocelot *ocelot; -- -- void __iomem *regs; -- -- /* Ingress default VLAN (pvid) */ -- u16 pvid; -- -- /* Egress default VLAN (vid) */ -- u16 vid; -- -- u8 ptp_cmd; -- struct list_head skbs; -- u8 ts_id; --}; -- - struct ocelot_port_private { - struct ocelot_port port; - struct net_device *dev; -@@ -531,37 +80,12 @@ struct ocelot_skb { - u8 id; - }; - --u32 __ocelot_read_ix(struct ocelot *ocelot, u32 reg, u32 offset); --#define ocelot_read_ix(ocelot, reg, gi, ri) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) --#define ocelot_read_gix(ocelot, reg, gi) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi)) --#define ocelot_read_rix(ocelot, reg, ri) __ocelot_read_ix(ocelot, reg, reg##_RSZ * (ri)) --#define ocelot_read(ocelot, reg) __ocelot_read_ix(ocelot, reg, 0) -- --void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset); --#define ocelot_write_ix(ocelot, val, reg, gi, ri) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) --#define ocelot_write_gix(ocelot, val, reg, gi) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi)) --#define ocelot_write_rix(ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri)) --#define ocelot_write(ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) -- --void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, -- u32 offset); --#define ocelot_rmw_ix(ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) --#define ocelot_rmw_gix(ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi)) --#define ocelot_rmw_rix(ocelot, val, m, reg, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_RSZ * (ri)) --#define ocelot_rmw(ocelot, val, m, reg) __ocelot_rmw_ix(ocelot, val, m, reg, 0) -- - u32 ocelot_port_readl(struct ocelot_port *port, u32 reg); - void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg); - --int ocelot_regfields_init(struct ocelot *ocelot, -- const struct reg_field *const regfields); --struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res); -- - #define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val)) - #define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val)) - --int ocelot_init(struct ocelot *ocelot); --void ocelot_deinit(struct ocelot *ocelot); - int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops); - int ocelot_probe_port(struct ocelot *ocelot, u8 port, - void __iomem *regs, -@@ -575,7 +99,7 @@ extern struct notifier_block ocelot_netd - extern struct notifier_block ocelot_switchdev_nb; - extern struct notifier_block ocelot_switchdev_blocking_nb; - --int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts); --void ocelot_get_hwtimestamp(struct ocelot *ocelot, struct timespec64 *ts); -+#define ocelot_field_write(ocelot, reg, val) regmap_field_write((ocelot)->regfields[(reg)], (val)) -+#define ocelot_field_read(ocelot, reg, val) regmap_field_read((ocelot)->regfields[(reg)], (val)) - - #endif ---- /dev/null -+++ b/include/soc/mscc/ocelot.h -@@ -0,0 +1,539 @@ -+/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ -+/* Copyright (c) 2017 Microsemi Corporation -+ */ -+ -+#ifndef _SOC_MSCC_OCELOT_H -+#define _SOC_MSCC_OCELOT_H -+ -+#include <linux/ptp_clock_kernel.h> -+#include <linux/net_tstamp.h> -+#include <linux/if_vlan.h> -+#include <linux/regmap.h> -+#include <net/dsa.h> -+ -+#define IFH_INJ_BYPASS BIT(31) -+#define IFH_INJ_POP_CNT_DISABLE (3 << 28) -+ -+#define IFH_TAG_TYPE_C 0 -+#define IFH_TAG_TYPE_S 1 -+ -+#define IFH_REW_OP_NOOP 0x0 -+#define IFH_REW_OP_DSCP 0x1 -+#define IFH_REW_OP_ONE_STEP_PTP 0x2 -+#define IFH_REW_OP_TWO_STEP_PTP 0x3 -+#define IFH_REW_OP_ORIGIN_PTP 0x5 -+ -+#define OCELOT_TAG_LEN 16 -+#define OCELOT_SHORT_PREFIX_LEN 4 -+#define OCELOT_LONG_PREFIX_LEN 16 -+ -+#define OCELOT_SPEED_2500 0 -+#define OCELOT_SPEED_1000 1 -+#define OCELOT_SPEED_100 2 -+#define OCELOT_SPEED_10 3 -+ -+#define TARGET_OFFSET 24 -+#define REG_MASK GENMASK(TARGET_OFFSET - 1, 0) -+#define REG(reg, offset) [reg & REG_MASK] = offset -+ -+#define REG_RESERVED_ADDR 0xffffffff -+#define REG_RESERVED(reg) REG(reg, REG_RESERVED_ADDR) -+ -+enum ocelot_target { -+ ANA = 1, -+ QS, -+ QSYS, -+ REW, -+ SYS, -+ S2, -+ HSIO, -+ PTP, -+ GCB, -+ TARGET_MAX, -+}; -+ -+enum ocelot_reg { -+ ANA_ADVLEARN = ANA << TARGET_OFFSET, -+ ANA_VLANMASK, -+ ANA_PORT_B_DOMAIN, -+ ANA_ANAGEFIL, -+ ANA_ANEVENTS, -+ ANA_STORMLIMIT_BURST, -+ ANA_STORMLIMIT_CFG, -+ ANA_ISOLATED_PORTS, -+ ANA_COMMUNITY_PORTS, -+ ANA_AUTOAGE, -+ ANA_MACTOPTIONS, -+ ANA_LEARNDISC, -+ ANA_AGENCTRL, -+ ANA_MIRRORPORTS, -+ ANA_EMIRRORPORTS, -+ ANA_FLOODING, -+ ANA_FLOODING_IPMC, -+ ANA_SFLOW_CFG, -+ ANA_PORT_MODE, -+ ANA_CUT_THRU_CFG, -+ ANA_PGID_PGID, -+ ANA_TABLES_ANMOVED, -+ ANA_TABLES_MACHDATA, -+ ANA_TABLES_MACLDATA, -+ ANA_TABLES_STREAMDATA, -+ ANA_TABLES_MACACCESS, -+ ANA_TABLES_MACTINDX, -+ ANA_TABLES_VLANACCESS, -+ ANA_TABLES_VLANTIDX, -+ ANA_TABLES_ISDXACCESS, -+ ANA_TABLES_ISDXTIDX, -+ ANA_TABLES_ENTRYLIM, -+ ANA_TABLES_PTP_ID_HIGH, -+ ANA_TABLES_PTP_ID_LOW, -+ ANA_TABLES_STREAMACCESS, -+ ANA_TABLES_STREAMTIDX, -+ ANA_TABLES_SEQ_HISTORY, -+ ANA_TABLES_SEQ_MASK, -+ ANA_TABLES_SFID_MASK, -+ ANA_TABLES_SFIDACCESS, -+ ANA_TABLES_SFIDTIDX, -+ ANA_MSTI_STATE, -+ ANA_OAM_UPM_LM_CNT, -+ ANA_SG_ACCESS_CTRL, -+ ANA_SG_CONFIG_REG_1, -+ ANA_SG_CONFIG_REG_2, -+ ANA_SG_CONFIG_REG_3, -+ ANA_SG_CONFIG_REG_4, -+ ANA_SG_CONFIG_REG_5, -+ ANA_SG_GCL_GS_CONFIG, -+ ANA_SG_GCL_TI_CONFIG, -+ ANA_SG_STATUS_REG_1, -+ ANA_SG_STATUS_REG_2, -+ ANA_SG_STATUS_REG_3, -+ ANA_PORT_VLAN_CFG, -+ ANA_PORT_DROP_CFG, -+ ANA_PORT_QOS_CFG, -+ ANA_PORT_VCAP_CFG, -+ ANA_PORT_VCAP_S1_KEY_CFG, -+ ANA_PORT_VCAP_S2_CFG, -+ ANA_PORT_PCP_DEI_MAP, -+ ANA_PORT_CPU_FWD_CFG, -+ ANA_PORT_CPU_FWD_BPDU_CFG, -+ ANA_PORT_CPU_FWD_GARP_CFG, -+ ANA_PORT_CPU_FWD_CCM_CFG, -+ ANA_PORT_PORT_CFG, -+ ANA_PORT_POL_CFG, -+ ANA_PORT_PTP_CFG, -+ ANA_PORT_PTP_DLY1_CFG, -+ ANA_PORT_PTP_DLY2_CFG, -+ ANA_PORT_SFID_CFG, -+ ANA_PFC_PFC_CFG, -+ ANA_PFC_PFC_TIMER, -+ ANA_IPT_OAM_MEP_CFG, -+ ANA_IPT_IPT, -+ ANA_PPT_PPT, -+ ANA_FID_MAP_FID_MAP, -+ ANA_AGGR_CFG, -+ ANA_CPUQ_CFG, -+ ANA_CPUQ_CFG2, -+ ANA_CPUQ_8021_CFG, -+ ANA_DSCP_CFG, -+ ANA_DSCP_REWR_CFG, -+ ANA_VCAP_RNG_TYPE_CFG, -+ ANA_VCAP_RNG_VAL_CFG, -+ ANA_VRAP_CFG, -+ ANA_VRAP_HDR_DATA, -+ ANA_VRAP_HDR_MASK, -+ ANA_DISCARD_CFG, -+ ANA_FID_CFG, -+ ANA_POL_PIR_CFG, -+ ANA_POL_CIR_CFG, -+ ANA_POL_MODE_CFG, -+ ANA_POL_PIR_STATE, -+ ANA_POL_CIR_STATE, -+ ANA_POL_STATE, -+ ANA_POL_FLOWC, -+ ANA_POL_HYST, -+ ANA_POL_MISC_CFG, -+ QS_XTR_GRP_CFG = QS << TARGET_OFFSET, -+ QS_XTR_RD, -+ QS_XTR_FRM_PRUNING, -+ QS_XTR_FLUSH, -+ QS_XTR_DATA_PRESENT, -+ QS_XTR_CFG, -+ QS_INJ_GRP_CFG, -+ QS_INJ_WR, -+ QS_INJ_CTRL, -+ QS_INJ_STATUS, -+ QS_INJ_ERR, -+ QS_INH_DBG, -+ QSYS_PORT_MODE = QSYS << TARGET_OFFSET, -+ QSYS_SWITCH_PORT_MODE, -+ QSYS_STAT_CNT_CFG, -+ QSYS_EEE_CFG, -+ QSYS_EEE_THRES, -+ QSYS_IGR_NO_SHARING, -+ QSYS_EGR_NO_SHARING, -+ QSYS_SW_STATUS, -+ QSYS_EXT_CPU_CFG, -+ QSYS_PAD_CFG, -+ QSYS_CPU_GROUP_MAP, -+ QSYS_QMAP, -+ QSYS_ISDX_SGRP, -+ QSYS_TIMED_FRAME_ENTRY, -+ QSYS_TFRM_MISC, -+ QSYS_TFRM_PORT_DLY, -+ QSYS_TFRM_TIMER_CFG_1, -+ QSYS_TFRM_TIMER_CFG_2, -+ QSYS_TFRM_TIMER_CFG_3, -+ QSYS_TFRM_TIMER_CFG_4, -+ QSYS_TFRM_TIMER_CFG_5, -+ QSYS_TFRM_TIMER_CFG_6, -+ QSYS_TFRM_TIMER_CFG_7, -+ QSYS_TFRM_TIMER_CFG_8, -+ QSYS_RED_PROFILE, -+ QSYS_RES_QOS_MODE, -+ QSYS_RES_CFG, -+ QSYS_RES_STAT, -+ QSYS_EGR_DROP_MODE, -+ QSYS_EQ_CTRL, -+ QSYS_EVENTS_CORE, -+ QSYS_QMAXSDU_CFG_0, -+ QSYS_QMAXSDU_CFG_1, -+ QSYS_QMAXSDU_CFG_2, -+ QSYS_QMAXSDU_CFG_3, -+ QSYS_QMAXSDU_CFG_4, -+ QSYS_QMAXSDU_CFG_5, -+ QSYS_QMAXSDU_CFG_6, -+ QSYS_QMAXSDU_CFG_7, -+ QSYS_PREEMPTION_CFG, -+ QSYS_CIR_CFG, -+ QSYS_EIR_CFG, -+ QSYS_SE_CFG, -+ QSYS_SE_DWRR_CFG, -+ QSYS_SE_CONNECT, -+ QSYS_SE_DLB_SENSE, -+ QSYS_CIR_STATE, -+ QSYS_EIR_STATE, -+ QSYS_SE_STATE, -+ QSYS_HSCH_MISC_CFG, -+ QSYS_TAG_CONFIG, -+ QSYS_TAS_PARAM_CFG_CTRL, -+ QSYS_PORT_MAX_SDU, -+ QSYS_PARAM_CFG_REG_1, -+ QSYS_PARAM_CFG_REG_2, -+ QSYS_PARAM_CFG_REG_3, -+ QSYS_PARAM_CFG_REG_4, -+ QSYS_PARAM_CFG_REG_5, -+ QSYS_GCL_CFG_REG_1, -+ QSYS_GCL_CFG_REG_2, -+ QSYS_PARAM_STATUS_REG_1, -+ QSYS_PARAM_STATUS_REG_2, -+ QSYS_PARAM_STATUS_REG_3, -+ QSYS_PARAM_STATUS_REG_4, -+ QSYS_PARAM_STATUS_REG_5, -+ QSYS_PARAM_STATUS_REG_6, -+ QSYS_PARAM_STATUS_REG_7, -+ QSYS_PARAM_STATUS_REG_8, -+ QSYS_PARAM_STATUS_REG_9, -+ QSYS_GCL_STATUS_REG_1, -+ QSYS_GCL_STATUS_REG_2, -+ REW_PORT_VLAN_CFG = REW << TARGET_OFFSET, -+ REW_TAG_CFG, -+ REW_PORT_CFG, -+ REW_DSCP_CFG, -+ REW_PCP_DEI_QOS_MAP_CFG, -+ REW_PTP_CFG, -+ REW_PTP_DLY1_CFG, -+ REW_RED_TAG_CFG, -+ REW_DSCP_REMAP_DP1_CFG, -+ REW_DSCP_REMAP_CFG, -+ REW_STAT_CFG, -+ REW_REW_STICKY, -+ REW_PPT, -+ SYS_COUNT_RX_OCTETS = SYS << TARGET_OFFSET, -+ SYS_COUNT_RX_UNICAST, -+ SYS_COUNT_RX_MULTICAST, -+ SYS_COUNT_RX_BROADCAST, -+ SYS_COUNT_RX_SHORTS, -+ SYS_COUNT_RX_FRAGMENTS, -+ SYS_COUNT_RX_JABBERS, -+ SYS_COUNT_RX_CRC_ALIGN_ERRS, -+ SYS_COUNT_RX_SYM_ERRS, -+ SYS_COUNT_RX_64, -+ SYS_COUNT_RX_65_127, -+ SYS_COUNT_RX_128_255, -+ SYS_COUNT_RX_256_1023, -+ SYS_COUNT_RX_1024_1526, -+ SYS_COUNT_RX_1527_MAX, -+ SYS_COUNT_RX_PAUSE, -+ SYS_COUNT_RX_CONTROL, -+ SYS_COUNT_RX_LONGS, -+ SYS_COUNT_RX_CLASSIFIED_DROPS, -+ SYS_COUNT_TX_OCTETS, -+ SYS_COUNT_TX_UNICAST, -+ SYS_COUNT_TX_MULTICAST, -+ SYS_COUNT_TX_BROADCAST, -+ SYS_COUNT_TX_COLLISION, -+ SYS_COUNT_TX_DROPS, -+ SYS_COUNT_TX_PAUSE, -+ SYS_COUNT_TX_64, -+ SYS_COUNT_TX_65_127, -+ SYS_COUNT_TX_128_511, -+ SYS_COUNT_TX_512_1023, -+ SYS_COUNT_TX_1024_1526, -+ SYS_COUNT_TX_1527_MAX, -+ SYS_COUNT_TX_AGING, -+ SYS_RESET_CFG, -+ SYS_SR_ETYPE_CFG, -+ SYS_VLAN_ETYPE_CFG, -+ SYS_PORT_MODE, -+ SYS_FRONT_PORT_MODE, -+ SYS_FRM_AGING, -+ SYS_STAT_CFG, -+ SYS_SW_STATUS, -+ SYS_MISC_CFG, -+ SYS_REW_MAC_HIGH_CFG, -+ SYS_REW_MAC_LOW_CFG, -+ SYS_TIMESTAMP_OFFSET, -+ SYS_CMID, -+ SYS_PAUSE_CFG, -+ SYS_PAUSE_TOT_CFG, -+ SYS_ATOP, -+ SYS_ATOP_TOT_CFG, -+ SYS_MAC_FC_CFG, -+ SYS_MMGT, -+ SYS_MMGT_FAST, -+ SYS_EVENTS_DIF, -+ SYS_EVENTS_CORE, -+ SYS_CNT, -+ SYS_PTP_STATUS, -+ SYS_PTP_TXSTAMP, -+ SYS_PTP_NXT, -+ SYS_PTP_CFG, -+ SYS_RAM_INIT, -+ SYS_CM_ADDR, -+ SYS_CM_DATA_WR, -+ SYS_CM_DATA_RD, -+ SYS_CM_OP, -+ SYS_CM_DATA, -+ S2_CORE_UPDATE_CTRL = S2 << TARGET_OFFSET, -+ S2_CORE_MV_CFG, -+ S2_CACHE_ENTRY_DAT, -+ S2_CACHE_MASK_DAT, -+ S2_CACHE_ACTION_DAT, -+ S2_CACHE_CNT_DAT, -+ S2_CACHE_TG_DAT, -+ PTP_PIN_CFG = PTP << TARGET_OFFSET, -+ PTP_PIN_TOD_SEC_MSB, -+ PTP_PIN_TOD_SEC_LSB, -+ PTP_PIN_TOD_NSEC, -+ PTP_CFG_MISC, -+ PTP_CLK_CFG_ADJ_CFG, -+ PTP_CLK_CFG_ADJ_FREQ, -+ GCB_SOFT_RST = GCB << TARGET_OFFSET, -+}; -+ -+enum ocelot_regfield { -+ ANA_ADVLEARN_VLAN_CHK, -+ ANA_ADVLEARN_LEARN_MIRROR, -+ ANA_ANEVENTS_FLOOD_DISCARD, -+ ANA_ANEVENTS_MSTI_DROP, -+ ANA_ANEVENTS_ACLKILL, -+ ANA_ANEVENTS_ACLUSED, -+ ANA_ANEVENTS_AUTOAGE, -+ ANA_ANEVENTS_VS2TTL1, -+ ANA_ANEVENTS_STORM_DROP, -+ ANA_ANEVENTS_LEARN_DROP, -+ ANA_ANEVENTS_AGED_ENTRY, -+ ANA_ANEVENTS_CPU_LEARN_FAILED, -+ ANA_ANEVENTS_AUTO_LEARN_FAILED, -+ ANA_ANEVENTS_LEARN_REMOVE, -+ ANA_ANEVENTS_AUTO_LEARNED, -+ ANA_ANEVENTS_AUTO_MOVED, -+ ANA_ANEVENTS_DROPPED, -+ ANA_ANEVENTS_CLASSIFIED_DROP, -+ ANA_ANEVENTS_CLASSIFIED_COPY, -+ ANA_ANEVENTS_VLAN_DISCARD, -+ ANA_ANEVENTS_FWD_DISCARD, -+ ANA_ANEVENTS_MULTICAST_FLOOD, -+ ANA_ANEVENTS_UNICAST_FLOOD, -+ ANA_ANEVENTS_DEST_KNOWN, -+ ANA_ANEVENTS_BUCKET3_MATCH, -+ ANA_ANEVENTS_BUCKET2_MATCH, -+ ANA_ANEVENTS_BUCKET1_MATCH, -+ ANA_ANEVENTS_BUCKET0_MATCH, -+ ANA_ANEVENTS_CPU_OPERATION, -+ ANA_ANEVENTS_DMAC_LOOKUP, -+ ANA_ANEVENTS_SMAC_LOOKUP, -+ ANA_ANEVENTS_SEQ_GEN_ERR_0, -+ ANA_ANEVENTS_SEQ_GEN_ERR_1, -+ ANA_TABLES_MACACCESS_B_DOM, -+ ANA_TABLES_MACTINDX_BUCKET, -+ ANA_TABLES_MACTINDX_M_INDEX, -+ QSYS_TIMED_FRAME_ENTRY_TFRM_VLD, -+ QSYS_TIMED_FRAME_ENTRY_TFRM_FP, -+ QSYS_TIMED_FRAME_ENTRY_TFRM_PORTNO, -+ QSYS_TIMED_FRAME_ENTRY_TFRM_TM_SEL, -+ QSYS_TIMED_FRAME_ENTRY_TFRM_TM_T, -+ SYS_RESET_CFG_CORE_ENA, -+ SYS_RESET_CFG_MEM_ENA, -+ SYS_RESET_CFG_MEM_INIT, -+ GCB_SOFT_RST_SWC_RST, -+ REGFIELD_MAX -+}; -+ -+enum ocelot_clk_pins { -+ ALT_PPS_PIN = 1, -+ EXT_CLK_PIN, -+ ALT_LDST_PIN, -+ TOD_ACC_PIN -+}; -+ -+struct ocelot_stat_layout { -+ u32 offset; -+ char name[ETH_GSTRING_LEN]; -+}; -+ -+enum ocelot_tag_prefix { -+ OCELOT_TAG_PREFIX_DISABLED = 0, -+ OCELOT_TAG_PREFIX_NONE, -+ OCELOT_TAG_PREFIX_SHORT, -+ OCELOT_TAG_PREFIX_LONG, -+}; -+ -+struct ocelot; -+ -+struct ocelot_ops { -+ void (*pcs_init)(struct ocelot *ocelot, int port); -+ int (*reset)(struct ocelot *ocelot); -+}; -+ -+struct ocelot_port { -+ struct ocelot *ocelot; -+ -+ void __iomem *regs; -+ -+ /* Ingress default VLAN (pvid) */ -+ u16 pvid; -+ -+ /* Egress default VLAN (vid) */ -+ u16 vid; -+ -+ u8 ptp_cmd; -+ struct list_head skbs; -+ u8 ts_id; -+}; -+ -+struct ocelot { -+ struct device *dev; -+ -+ const struct ocelot_ops *ops; -+ struct regmap *targets[TARGET_MAX]; -+ struct regmap_field *regfields[REGFIELD_MAX]; -+ const u32 *const *map; -+ const struct ocelot_stat_layout *stats_layout; -+ unsigned int num_stats; -+ -+ int shared_queue_sz; -+ -+ struct net_device *hw_bridge_dev; -+ u16 bridge_mask; -+ u16 bridge_fwd_mask; -+ -+ struct ocelot_port **ports; -+ -+ u8 base_mac[ETH_ALEN]; -+ -+ /* Keep track of the vlan port masks */ -+ u32 vlan_mask[VLAN_N_VID]; -+ -+ u8 num_phys_ports; -+ u8 num_cpu_ports; -+ u8 cpu; -+ -+ u32 *lags; -+ -+ struct list_head multicast; -+ -+ /* Workqueue to check statistics for overflow with its lock */ -+ struct mutex stats_lock; -+ u64 *stats; -+ struct delayed_work stats_work; -+ struct workqueue_struct *stats_queue; -+ -+ u8 ptp:1; -+ struct ptp_clock *ptp_clock; -+ struct ptp_clock_info ptp_info; -+ struct hwtstamp_config hwtstamp_config; -+ /* Protects the PTP interface state */ -+ struct mutex ptp_lock; -+ /* Protects the PTP clock */ -+ spinlock_t ptp_clock_lock; -+ -+ void (*port_pcs_init)(struct ocelot_port *port); -+}; -+ -+#define ocelot_read_ix(ocelot, reg, gi, ri) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) -+#define ocelot_read_gix(ocelot, reg, gi) __ocelot_read_ix(ocelot, reg, reg##_GSZ * (gi)) -+#define ocelot_read_rix(ocelot, reg, ri) __ocelot_read_ix(ocelot, reg, reg##_RSZ * (ri)) -+#define ocelot_read(ocelot, reg) __ocelot_read_ix(ocelot, reg, 0) -+ -+#define ocelot_write_ix(ocelot, val, reg, gi, ri) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) -+#define ocelot_write_gix(ocelot, val, reg, gi) __ocelot_write_ix(ocelot, val, reg, reg##_GSZ * (gi)) -+#define ocelot_write_rix(ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri)) -+#define ocelot_write(ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) -+ -+#define ocelot_rmw_ix(ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) -+#define ocelot_rmw_gix(ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi)) -+#define ocelot_rmw_rix(ocelot, val, m, reg, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_RSZ * (ri)) -+#define ocelot_rmw(ocelot, val, m, reg) __ocelot_rmw_ix(ocelot, val, m, reg, 0) -+ -+/* I/O */ -+u32 ocelot_port_readl(struct ocelot_port *port, u32 reg); -+void ocelot_port_writel(struct ocelot_port *port, u32 val, u32 reg); -+u32 __ocelot_read_ix(struct ocelot *ocelot, u32 reg, u32 offset); -+void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset); -+void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, -+ u32 offset); -+ -+/* Hardware initialization */ -+int ocelot_regfields_init(struct ocelot *ocelot, -+ const struct reg_field *const regfields); -+struct regmap *ocelot_regmap_init(struct ocelot *ocelot, struct resource *res); -+void ocelot_set_cpu_port(struct ocelot *ocelot, int cpu, -+ enum ocelot_tag_prefix injection, -+ enum ocelot_tag_prefix extraction); -+int ocelot_init(struct ocelot *ocelot); -+void ocelot_deinit(struct ocelot *ocelot); -+void ocelot_init_port(struct ocelot *ocelot, int port); -+ -+/* DSA callbacks */ -+void ocelot_port_enable(struct ocelot *ocelot, int port, -+ struct phy_device *phy); -+void ocelot_port_disable(struct ocelot *ocelot, int port); -+void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data); -+void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data); -+int ocelot_get_sset_count(struct ocelot *ocelot, int port, int sset); -+int ocelot_get_ts_info(struct ocelot *ocelot, int port, -+ struct ethtool_ts_info *info); -+void ocelot_set_ageing_time(struct ocelot *ocelot, unsigned int msecs); -+void ocelot_adjust_link(struct ocelot *ocelot, int port, -+ struct phy_device *phydev); -+void ocelot_port_vlan_filtering(struct ocelot *ocelot, int port, -+ bool vlan_aware); -+void ocelot_bridge_stp_state_set(struct ocelot *ocelot, int port, u8 state); -+int ocelot_port_bridge_join(struct ocelot *ocelot, int port, -+ struct net_device *bridge); -+int ocelot_port_bridge_leave(struct ocelot *ocelot, int port, -+ struct net_device *bridge); -+int ocelot_fdb_dump(struct ocelot *ocelot, int port, -+ dsa_fdb_dump_cb_t *cb, void *data); -+int ocelot_fdb_add(struct ocelot *ocelot, int port, -+ const unsigned char *addr, u16 vid, bool vlan_aware); -+int ocelot_fdb_del(struct ocelot *ocelot, int port, -+ const unsigned char *addr, u16 vid); -+int ocelot_vlan_add(struct ocelot *ocelot, int port, u16 vid, bool pvid, -+ bool untagged); -+int ocelot_vlan_del(struct ocelot *ocelot, int port, u16 vid); -+int ocelot_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts); -+void ocelot_get_hwtimestamp(struct ocelot *ocelot, struct timespec64 *ts); -+ -+#endif |