LCOV - code coverage report
Current view: top level - include/net - dsa.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 2 0.0 %
Date: 2022-03-28 15:32:58 Functions: 0 0 -
Branches: 0 2 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2                 :            : /*
       3                 :            :  * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips
       4                 :            :  * Copyright (c) 2008-2009 Marvell Semiconductor
       5                 :            :  */
       6                 :            : 
       7                 :            : #ifndef __LINUX_NET_DSA_H
       8                 :            : #define __LINUX_NET_DSA_H
       9                 :            : 
      10                 :            : #include <linux/if.h>
      11                 :            : #include <linux/if_ether.h>
      12                 :            : #include <linux/list.h>
      13                 :            : #include <linux/notifier.h>
      14                 :            : #include <linux/timer.h>
      15                 :            : #include <linux/workqueue.h>
      16                 :            : #include <linux/of.h>
      17                 :            : #include <linux/ethtool.h>
      18                 :            : #include <linux/net_tstamp.h>
      19                 :            : #include <linux/phy.h>
      20                 :            : #include <linux/platform_data/dsa.h>
      21                 :            : #include <linux/phylink.h>
      22                 :            : #include <net/devlink.h>
      23                 :            : #include <net/switchdev.h>
      24                 :            : 
      25                 :            : struct tc_action;
      26                 :            : struct phy_device;
      27                 :            : struct fixed_phy_status;
      28                 :            : struct phylink_link_state;
      29                 :            : 
      30                 :            : #define DSA_TAG_PROTO_NONE_VALUE                0
      31                 :            : #define DSA_TAG_PROTO_BRCM_VALUE                1
      32                 :            : #define DSA_TAG_PROTO_BRCM_PREPEND_VALUE        2
      33                 :            : #define DSA_TAG_PROTO_DSA_VALUE                 3
      34                 :            : #define DSA_TAG_PROTO_EDSA_VALUE                4
      35                 :            : #define DSA_TAG_PROTO_GSWIP_VALUE               5
      36                 :            : #define DSA_TAG_PROTO_KSZ9477_VALUE             6
      37                 :            : #define DSA_TAG_PROTO_KSZ9893_VALUE             7
      38                 :            : #define DSA_TAG_PROTO_LAN9303_VALUE             8
      39                 :            : #define DSA_TAG_PROTO_MTK_VALUE                 9
      40                 :            : #define DSA_TAG_PROTO_QCA_VALUE                 10
      41                 :            : #define DSA_TAG_PROTO_TRAILER_VALUE             11
      42                 :            : #define DSA_TAG_PROTO_8021Q_VALUE               12
      43                 :            : #define DSA_TAG_PROTO_SJA1105_VALUE             13
      44                 :            : #define DSA_TAG_PROTO_KSZ8795_VALUE             14
      45                 :            : #define DSA_TAG_PROTO_OCELOT_VALUE              15
      46                 :            : #define DSA_TAG_PROTO_AR9331_VALUE              16
      47                 :            : 
      48                 :            : enum dsa_tag_protocol {
      49                 :            :         DSA_TAG_PROTO_NONE              = DSA_TAG_PROTO_NONE_VALUE,
      50                 :            :         DSA_TAG_PROTO_BRCM              = DSA_TAG_PROTO_BRCM_VALUE,
      51                 :            :         DSA_TAG_PROTO_BRCM_PREPEND      = DSA_TAG_PROTO_BRCM_PREPEND_VALUE,
      52                 :            :         DSA_TAG_PROTO_DSA               = DSA_TAG_PROTO_DSA_VALUE,
      53                 :            :         DSA_TAG_PROTO_EDSA              = DSA_TAG_PROTO_EDSA_VALUE,
      54                 :            :         DSA_TAG_PROTO_GSWIP             = DSA_TAG_PROTO_GSWIP_VALUE,
      55                 :            :         DSA_TAG_PROTO_KSZ9477           = DSA_TAG_PROTO_KSZ9477_VALUE,
      56                 :            :         DSA_TAG_PROTO_KSZ9893           = DSA_TAG_PROTO_KSZ9893_VALUE,
      57                 :            :         DSA_TAG_PROTO_LAN9303           = DSA_TAG_PROTO_LAN9303_VALUE,
      58                 :            :         DSA_TAG_PROTO_MTK               = DSA_TAG_PROTO_MTK_VALUE,
      59                 :            :         DSA_TAG_PROTO_QCA               = DSA_TAG_PROTO_QCA_VALUE,
      60                 :            :         DSA_TAG_PROTO_TRAILER           = DSA_TAG_PROTO_TRAILER_VALUE,
      61                 :            :         DSA_TAG_PROTO_8021Q             = DSA_TAG_PROTO_8021Q_VALUE,
      62                 :            :         DSA_TAG_PROTO_SJA1105           = DSA_TAG_PROTO_SJA1105_VALUE,
      63                 :            :         DSA_TAG_PROTO_KSZ8795           = DSA_TAG_PROTO_KSZ8795_VALUE,
      64                 :            :         DSA_TAG_PROTO_OCELOT            = DSA_TAG_PROTO_OCELOT_VALUE,
      65                 :            :         DSA_TAG_PROTO_AR9331            = DSA_TAG_PROTO_AR9331_VALUE,
      66                 :            : };
      67                 :            : 
      68                 :            : struct packet_type;
      69                 :            : struct dsa_switch;
      70                 :            : 
      71                 :            : struct dsa_device_ops {
      72                 :            :         struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev);
      73                 :            :         struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
      74                 :            :                                struct packet_type *pt);
      75                 :            :         int (*flow_dissect)(const struct sk_buff *skb, __be16 *proto,
      76                 :            :                             int *offset);
      77                 :            :         /* Used to determine which traffic should match the DSA filter in
      78                 :            :          * eth_type_trans, and which, if any, should bypass it and be processed
      79                 :            :          * as regular on the master net device.
      80                 :            :          */
      81                 :            :         bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
      82                 :            :         unsigned int overhead;
      83                 :            :         const char *name;
      84                 :            :         enum dsa_tag_protocol proto;
      85                 :            : };
      86                 :            : 
      87                 :            : #define DSA_TAG_DRIVER_ALIAS "dsa_tag-"
      88                 :            : #define MODULE_ALIAS_DSA_TAG_DRIVER(__proto)                            \
      89                 :            :         MODULE_ALIAS(DSA_TAG_DRIVER_ALIAS __stringify(__proto##_VALUE))
      90                 :            : 
      91                 :            : struct dsa_skb_cb {
      92                 :            :         struct sk_buff *clone;
      93                 :            : };
      94                 :            : 
      95                 :            : struct __dsa_skb_cb {
      96                 :            :         struct dsa_skb_cb cb;
      97                 :            :         u8 priv[48 - sizeof(struct dsa_skb_cb)];
      98                 :            : };
      99                 :            : 
     100                 :            : #define DSA_SKB_CB(skb) ((struct dsa_skb_cb *)((skb)->cb))
     101                 :            : 
     102                 :            : #define DSA_SKB_CB_PRIV(skb)                    \
     103                 :            :         ((void *)(skb)->cb + offsetof(struct __dsa_skb_cb, priv))
     104                 :            : 
     105                 :            : struct dsa_switch_tree {
     106                 :            :         struct list_head        list;
     107                 :            : 
     108                 :            :         /* Notifier chain for switch-wide events */
     109                 :            :         struct raw_notifier_head        nh;
     110                 :            : 
     111                 :            :         /* Tree identifier */
     112                 :            :         unsigned int index;
     113                 :            : 
     114                 :            :         /* Number of switches attached to this tree */
     115                 :            :         struct kref refcount;
     116                 :            : 
     117                 :            :         /* Has this tree been applied to the hardware? */
     118                 :            :         bool setup;
     119                 :            : 
     120                 :            :         /*
     121                 :            :          * Configuration data for the platform device that owns
     122                 :            :          * this dsa switch tree instance.
     123                 :            :          */
     124                 :            :         struct dsa_platform_data        *pd;
     125                 :            : 
     126                 :            :         /* List of switch ports */
     127                 :            :         struct list_head ports;
     128                 :            : 
     129                 :            :         /* List of DSA links composing the routing table */
     130                 :            :         struct list_head rtable;
     131                 :            : };
     132                 :            : 
     133                 :            : /* TC matchall action types, only mirroring for now */
     134                 :            : enum dsa_port_mall_action_type {
     135                 :            :         DSA_PORT_MALL_MIRROR,
     136                 :            : };
     137                 :            : 
     138                 :            : /* TC mirroring entry */
     139                 :            : struct dsa_mall_mirror_tc_entry {
     140                 :            :         u8 to_local_port;
     141                 :            :         bool ingress;
     142                 :            : };
     143                 :            : 
     144                 :            : /* TC matchall entry */
     145                 :            : struct dsa_mall_tc_entry {
     146                 :            :         struct list_head list;
     147                 :            :         unsigned long cookie;
     148                 :            :         enum dsa_port_mall_action_type type;
     149                 :            :         union {
     150                 :            :                 struct dsa_mall_mirror_tc_entry mirror;
     151                 :            :         };
     152                 :            : };
     153                 :            : 
     154                 :            : 
     155                 :            : struct dsa_port {
     156                 :            :         /* A CPU port is physically connected to a master device.
     157                 :            :          * A user port exposed to userspace has a slave device.
     158                 :            :          */
     159                 :            :         union {
     160                 :            :                 struct net_device *master;
     161                 :            :                 struct net_device *slave;
     162                 :            :         };
     163                 :            : 
     164                 :            :         /* CPU port tagging operations used by master or slave devices */
     165                 :            :         const struct dsa_device_ops *tag_ops;
     166                 :            : 
     167                 :            :         /* Copies for faster access in master receive hot path */
     168                 :            :         struct dsa_switch_tree *dst;
     169                 :            :         struct sk_buff *(*rcv)(struct sk_buff *skb, struct net_device *dev,
     170                 :            :                                struct packet_type *pt);
     171                 :            :         bool (*filter)(const struct sk_buff *skb, struct net_device *dev);
     172                 :            : 
     173                 :            :         enum {
     174                 :            :                 DSA_PORT_TYPE_UNUSED = 0,
     175                 :            :                 DSA_PORT_TYPE_CPU,
     176                 :            :                 DSA_PORT_TYPE_DSA,
     177                 :            :                 DSA_PORT_TYPE_USER,
     178                 :            :         } type;
     179                 :            : 
     180                 :            :         struct dsa_switch       *ds;
     181                 :            :         unsigned int            index;
     182                 :            :         const char              *name;
     183                 :            :         struct dsa_port         *cpu_dp;
     184                 :            :         const char              *mac;
     185                 :            :         struct device_node      *dn;
     186                 :            :         unsigned int            ageing_time;
     187                 :            :         bool                    vlan_filtering;
     188                 :            :         u8                      stp_state;
     189                 :            :         struct net_device       *bridge_dev;
     190                 :            :         struct devlink_port     devlink_port;
     191                 :            :         struct phylink          *pl;
     192                 :            :         struct phylink_config   pl_config;
     193                 :            : 
     194                 :            :         struct list_head list;
     195                 :            : 
     196                 :            :         /*
     197                 :            :          * Give the switch driver somewhere to hang its per-port private data
     198                 :            :          * structures (accessible from the tagger).
     199                 :            :          */
     200                 :            :         void *priv;
     201                 :            : 
     202                 :            :         /*
     203                 :            :          * Original copy of the master netdev ethtool_ops
     204                 :            :          */
     205                 :            :         const struct ethtool_ops *orig_ethtool_ops;
     206                 :            : 
     207                 :            :         /*
     208                 :            :          * Original copy of the master netdev net_device_ops
     209                 :            :          */
     210                 :            :         const struct net_device_ops *orig_ndo_ops;
     211                 :            : 
     212                 :            :         bool setup;
     213                 :            : };
     214                 :            : 
     215                 :            : /* TODO: ideally DSA ports would have a single dp->link_dp member,
     216                 :            :  * and no dst->rtable nor this struct dsa_link would be needed,
     217                 :            :  * but this would require some more complex tree walking,
     218                 :            :  * so keep it stupid at the moment and list them all.
     219                 :            :  */
     220                 :            : struct dsa_link {
     221                 :            :         struct dsa_port *dp;
     222                 :            :         struct dsa_port *link_dp;
     223                 :            :         struct list_head list;
     224                 :            : };
     225                 :            : 
     226                 :            : struct dsa_switch {
     227                 :            :         bool setup;
     228                 :            : 
     229                 :            :         struct device *dev;
     230                 :            : 
     231                 :            :         /*
     232                 :            :          * Parent switch tree, and switch index.
     233                 :            :          */
     234                 :            :         struct dsa_switch_tree  *dst;
     235                 :            :         unsigned int            index;
     236                 :            : 
     237                 :            :         /* Listener for switch fabric events */
     238                 :            :         struct notifier_block   nb;
     239                 :            : 
     240                 :            :         /*
     241                 :            :          * Give the switch driver somewhere to hang its private data
     242                 :            :          * structure.
     243                 :            :          */
     244                 :            :         void *priv;
     245                 :            : 
     246                 :            :         /*
     247                 :            :          * Configuration data for this switch.
     248                 :            :          */
     249                 :            :         struct dsa_chip_data    *cd;
     250                 :            : 
     251                 :            :         /*
     252                 :            :          * The switch operations.
     253                 :            :          */
     254                 :            :         const struct dsa_switch_ops     *ops;
     255                 :            : 
     256                 :            :         /*
     257                 :            :          * Slave mii_bus and devices for the individual ports.
     258                 :            :          */
     259                 :            :         u32                     phys_mii_mask;
     260                 :            :         struct mii_bus          *slave_mii_bus;
     261                 :            : 
     262                 :            :         /* Ageing Time limits in msecs */
     263                 :            :         unsigned int ageing_time_min;
     264                 :            :         unsigned int ageing_time_max;
     265                 :            : 
     266                 :            :         /* devlink used to represent this switch device */
     267                 :            :         struct devlink          *devlink;
     268                 :            : 
     269                 :            :         /* Number of switch port queues */
     270                 :            :         unsigned int            num_tx_queues;
     271                 :            : 
     272                 :            :         /* Disallow bridge core from requesting different VLAN awareness
     273                 :            :          * settings on ports if not hardware-supported
     274                 :            :          */
     275                 :            :         bool                    vlan_filtering_is_global;
     276                 :            : 
     277                 :            :         /* In case vlan_filtering_is_global is set, the VLAN awareness state
     278                 :            :          * should be retrieved from here and not from the per-port settings.
     279                 :            :          */
     280                 :            :         bool                    vlan_filtering;
     281                 :            : 
     282                 :            :         /* MAC PCS does not provide link state change interrupt, and requires
     283                 :            :          * polling. Flag passed on to PHYLINK.
     284                 :            :          */
     285                 :            :         bool                    pcs_poll;
     286                 :            : 
     287                 :            :         size_t num_ports;
     288                 :            : };
     289                 :            : 
     290                 :            : static inline struct dsa_port *dsa_to_port(struct dsa_switch *ds, int p)
     291                 :            : {
     292                 :            :         struct dsa_switch_tree *dst = ds->dst;
     293                 :            :         struct dsa_port *dp;
     294                 :            : 
     295                 :            :         list_for_each_entry(dp, &dst->ports, list)
     296                 :            :                 if (dp->ds == ds && dp->index == p)
     297                 :            :                         return dp;
     298                 :            : 
     299                 :            :         return NULL;
     300                 :            : }
     301                 :            : 
     302                 :            : static inline bool dsa_is_unused_port(struct dsa_switch *ds, int p)
     303                 :            : {
     304                 :            :         return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_UNUSED;
     305                 :            : }
     306                 :            : 
     307                 :            : static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p)
     308                 :            : {
     309                 :            :         return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_CPU;
     310                 :            : }
     311                 :            : 
     312                 :            : static inline bool dsa_is_dsa_port(struct dsa_switch *ds, int p)
     313                 :            : {
     314                 :            :         return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_DSA;
     315                 :            : }
     316                 :            : 
     317                 :            : static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)
     318                 :            : {
     319                 :            :         return dsa_to_port(ds, p)->type == DSA_PORT_TYPE_USER;
     320                 :            : }
     321                 :            : 
     322                 :            : static inline u32 dsa_user_ports(struct dsa_switch *ds)
     323                 :            : {
     324                 :            :         u32 mask = 0;
     325                 :            :         int p;
     326                 :            : 
     327                 :            :         for (p = 0; p < ds->num_ports; p++)
     328                 :            :                 if (dsa_is_user_port(ds, p))
     329                 :            :                         mask |= BIT(p);
     330                 :            : 
     331                 :            :         return mask;
     332                 :            : }
     333                 :            : 
     334                 :            : /* Return the local port used to reach an arbitrary switch device */
     335                 :            : static inline unsigned int dsa_routing_port(struct dsa_switch *ds, int device)
     336                 :            : {
     337                 :            :         struct dsa_switch_tree *dst = ds->dst;
     338                 :            :         struct dsa_link *dl;
     339                 :            : 
     340                 :            :         list_for_each_entry(dl, &dst->rtable, list)
     341                 :            :                 if (dl->dp->ds == ds && dl->link_dp->ds->index == device)
     342                 :            :                         return dl->dp->index;
     343                 :            : 
     344                 :            :         return ds->num_ports;
     345                 :            : }
     346                 :            : 
     347                 :            : /* Return the local port used to reach an arbitrary switch port */
     348                 :            : static inline unsigned int dsa_towards_port(struct dsa_switch *ds, int device,
     349                 :            :                                             int port)
     350                 :            : {
     351                 :            :         if (device == ds->index)
     352                 :            :                 return port;
     353                 :            :         else
     354                 :            :                 return dsa_routing_port(ds, device);
     355                 :            : }
     356                 :            : 
     357                 :            : /* Return the local port used to reach the dedicated CPU port */
     358                 :            : static inline unsigned int dsa_upstream_port(struct dsa_switch *ds, int port)
     359                 :            : {
     360                 :            :         const struct dsa_port *dp = dsa_to_port(ds, port);
     361                 :            :         const struct dsa_port *cpu_dp = dp->cpu_dp;
     362                 :            : 
     363                 :            :         if (!cpu_dp)
     364                 :            :                 return port;
     365                 :            : 
     366                 :            :         return dsa_towards_port(ds, cpu_dp->ds->index, cpu_dp->index);
     367                 :            : }
     368                 :            : 
     369                 :            : static inline bool dsa_port_is_vlan_filtering(const struct dsa_port *dp)
     370                 :            : {
     371                 :            :         const struct dsa_switch *ds = dp->ds;
     372                 :            : 
     373                 :            :         if (ds->vlan_filtering_is_global)
     374                 :            :                 return ds->vlan_filtering;
     375                 :            :         else
     376                 :            :                 return dp->vlan_filtering;
     377                 :            : }
     378                 :            : 
     379                 :            : typedef int dsa_fdb_dump_cb_t(const unsigned char *addr, u16 vid,
     380                 :            :                               bool is_static, void *data);
     381                 :            : struct dsa_switch_ops {
     382                 :            :         enum dsa_tag_protocol (*get_tag_protocol)(struct dsa_switch *ds,
     383                 :            :                                                   int port,
     384                 :            :                                                   enum dsa_tag_protocol mprot);
     385                 :            : 
     386                 :            :         int     (*setup)(struct dsa_switch *ds);
     387                 :            :         void    (*teardown)(struct dsa_switch *ds);
     388                 :            :         u32     (*get_phy_flags)(struct dsa_switch *ds, int port);
     389                 :            : 
     390                 :            :         /*
     391                 :            :          * Access to the switch's PHY registers.
     392                 :            :          */
     393                 :            :         int     (*phy_read)(struct dsa_switch *ds, int port, int regnum);
     394                 :            :         int     (*phy_write)(struct dsa_switch *ds, int port,
     395                 :            :                              int regnum, u16 val);
     396                 :            : 
     397                 :            :         /*
     398                 :            :          * Link state adjustment (called from libphy)
     399                 :            :          */
     400                 :            :         void    (*adjust_link)(struct dsa_switch *ds, int port,
     401                 :            :                                 struct phy_device *phydev);
     402                 :            :         void    (*fixed_link_update)(struct dsa_switch *ds, int port,
     403                 :            :                                 struct fixed_phy_status *st);
     404                 :            : 
     405                 :            :         /*
     406                 :            :          * PHYLINK integration
     407                 :            :          */
     408                 :            :         void    (*phylink_validate)(struct dsa_switch *ds, int port,
     409                 :            :                                     unsigned long *supported,
     410                 :            :                                     struct phylink_link_state *state);
     411                 :            :         int     (*phylink_mac_link_state)(struct dsa_switch *ds, int port,
     412                 :            :                                           struct phylink_link_state *state);
     413                 :            :         void    (*phylink_mac_config)(struct dsa_switch *ds, int port,
     414                 :            :                                       unsigned int mode,
     415                 :            :                                       const struct phylink_link_state *state);
     416                 :            :         void    (*phylink_mac_an_restart)(struct dsa_switch *ds, int port);
     417                 :            :         void    (*phylink_mac_link_down)(struct dsa_switch *ds, int port,
     418                 :            :                                          unsigned int mode,
     419                 :            :                                          phy_interface_t interface);
     420                 :            :         void    (*phylink_mac_link_up)(struct dsa_switch *ds, int port,
     421                 :            :                                        unsigned int mode,
     422                 :            :                                        phy_interface_t interface,
     423                 :            :                                        struct phy_device *phydev);
     424                 :            :         void    (*phylink_fixed_state)(struct dsa_switch *ds, int port,
     425                 :            :                                        struct phylink_link_state *state);
     426                 :            :         /*
     427                 :            :          * ethtool hardware statistics.
     428                 :            :          */
     429                 :            :         void    (*get_strings)(struct dsa_switch *ds, int port,
     430                 :            :                                u32 stringset, uint8_t *data);
     431                 :            :         void    (*get_ethtool_stats)(struct dsa_switch *ds,
     432                 :            :                                      int port, uint64_t *data);
     433                 :            :         int     (*get_sset_count)(struct dsa_switch *ds, int port, int sset);
     434                 :            :         void    (*get_ethtool_phy_stats)(struct dsa_switch *ds,
     435                 :            :                                          int port, uint64_t *data);
     436                 :            : 
     437                 :            :         /*
     438                 :            :          * ethtool Wake-on-LAN
     439                 :            :          */
     440                 :            :         void    (*get_wol)(struct dsa_switch *ds, int port,
     441                 :            :                            struct ethtool_wolinfo *w);
     442                 :            :         int     (*set_wol)(struct dsa_switch *ds, int port,
     443                 :            :                            struct ethtool_wolinfo *w);
     444                 :            : 
     445                 :            :         /*
     446                 :            :          * ethtool timestamp info
     447                 :            :          */
     448                 :            :         int     (*get_ts_info)(struct dsa_switch *ds, int port,
     449                 :            :                                struct ethtool_ts_info *ts);
     450                 :            : 
     451                 :            :         /*
     452                 :            :          * Suspend and resume
     453                 :            :          */
     454                 :            :         int     (*suspend)(struct dsa_switch *ds);
     455                 :            :         int     (*resume)(struct dsa_switch *ds);
     456                 :            : 
     457                 :            :         /*
     458                 :            :          * Port enable/disable
     459                 :            :          */
     460                 :            :         int     (*port_enable)(struct dsa_switch *ds, int port,
     461                 :            :                                struct phy_device *phy);
     462                 :            :         void    (*port_disable)(struct dsa_switch *ds, int port);
     463                 :            : 
     464                 :            :         /*
     465                 :            :          * Port's MAC EEE settings
     466                 :            :          */
     467                 :            :         int     (*set_mac_eee)(struct dsa_switch *ds, int port,
     468                 :            :                                struct ethtool_eee *e);
     469                 :            :         int     (*get_mac_eee)(struct dsa_switch *ds, int port,
     470                 :            :                                struct ethtool_eee *e);
     471                 :            : 
     472                 :            :         /* EEPROM access */
     473                 :            :         int     (*get_eeprom_len)(struct dsa_switch *ds);
     474                 :            :         int     (*get_eeprom)(struct dsa_switch *ds,
     475                 :            :                               struct ethtool_eeprom *eeprom, u8 *data);
     476                 :            :         int     (*set_eeprom)(struct dsa_switch *ds,
     477                 :            :                               struct ethtool_eeprom *eeprom, u8 *data);
     478                 :            : 
     479                 :            :         /*
     480                 :            :          * Register access.
     481                 :            :          */
     482                 :            :         int     (*get_regs_len)(struct dsa_switch *ds, int port);
     483                 :            :         void    (*get_regs)(struct dsa_switch *ds, int port,
     484                 :            :                             struct ethtool_regs *regs, void *p);
     485                 :            : 
     486                 :            :         /*
     487                 :            :          * Bridge integration
     488                 :            :          */
     489                 :            :         int     (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
     490                 :            :         int     (*port_bridge_join)(struct dsa_switch *ds, int port,
     491                 :            :                                     struct net_device *bridge);
     492                 :            :         void    (*port_bridge_leave)(struct dsa_switch *ds, int port,
     493                 :            :                                      struct net_device *bridge);
     494                 :            :         void    (*port_stp_state_set)(struct dsa_switch *ds, int port,
     495                 :            :                                       u8 state);
     496                 :            :         void    (*port_fast_age)(struct dsa_switch *ds, int port);
     497                 :            :         int     (*port_egress_floods)(struct dsa_switch *ds, int port,
     498                 :            :                                       bool unicast, bool multicast);
     499                 :            : 
     500                 :            :         /*
     501                 :            :          * VLAN support
     502                 :            :          */
     503                 :            :         int     (*port_vlan_filtering)(struct dsa_switch *ds, int port,
     504                 :            :                                        bool vlan_filtering);
     505                 :            :         int (*port_vlan_prepare)(struct dsa_switch *ds, int port,
     506                 :            :                                  const struct switchdev_obj_port_vlan *vlan);
     507                 :            :         void (*port_vlan_add)(struct dsa_switch *ds, int port,
     508                 :            :                               const struct switchdev_obj_port_vlan *vlan);
     509                 :            :         int     (*port_vlan_del)(struct dsa_switch *ds, int port,
     510                 :            :                                  const struct switchdev_obj_port_vlan *vlan);
     511                 :            :         /*
     512                 :            :          * Forwarding database
     513                 :            :          */
     514                 :            :         int     (*port_fdb_add)(struct dsa_switch *ds, int port,
     515                 :            :                                 const unsigned char *addr, u16 vid);
     516                 :            :         int     (*port_fdb_del)(struct dsa_switch *ds, int port,
     517                 :            :                                 const unsigned char *addr, u16 vid);
     518                 :            :         int     (*port_fdb_dump)(struct dsa_switch *ds, int port,
     519                 :            :                                  dsa_fdb_dump_cb_t *cb, void *data);
     520                 :            : 
     521                 :            :         /*
     522                 :            :          * Multicast database
     523                 :            :          */
     524                 :            :         int (*port_mdb_prepare)(struct dsa_switch *ds, int port,
     525                 :            :                                 const struct switchdev_obj_port_mdb *mdb);
     526                 :            :         void (*port_mdb_add)(struct dsa_switch *ds, int port,
     527                 :            :                              const struct switchdev_obj_port_mdb *mdb);
     528                 :            :         int     (*port_mdb_del)(struct dsa_switch *ds, int port,
     529                 :            :                                 const struct switchdev_obj_port_mdb *mdb);
     530                 :            :         /*
     531                 :            :          * RXNFC
     532                 :            :          */
     533                 :            :         int     (*get_rxnfc)(struct dsa_switch *ds, int port,
     534                 :            :                              struct ethtool_rxnfc *nfc, u32 *rule_locs);
     535                 :            :         int     (*set_rxnfc)(struct dsa_switch *ds, int port,
     536                 :            :                              struct ethtool_rxnfc *nfc);
     537                 :            : 
     538                 :            :         /*
     539                 :            :          * TC integration
     540                 :            :          */
     541                 :            :         int     (*port_mirror_add)(struct dsa_switch *ds, int port,
     542                 :            :                                    struct dsa_mall_mirror_tc_entry *mirror,
     543                 :            :                                    bool ingress);
     544                 :            :         void    (*port_mirror_del)(struct dsa_switch *ds, int port,
     545                 :            :                                    struct dsa_mall_mirror_tc_entry *mirror);
     546                 :            :         int     (*port_setup_tc)(struct dsa_switch *ds, int port,
     547                 :            :                                  enum tc_setup_type type, void *type_data);
     548                 :            : 
     549                 :            :         /*
     550                 :            :          * Cross-chip operations
     551                 :            :          */
     552                 :            :         int     (*crosschip_bridge_join)(struct dsa_switch *ds, int sw_index,
     553                 :            :                                          int port, struct net_device *br);
     554                 :            :         void    (*crosschip_bridge_leave)(struct dsa_switch *ds, int sw_index,
     555                 :            :                                           int port, struct net_device *br);
     556                 :            : 
     557                 :            :         /*
     558                 :            :          * PTP functionality
     559                 :            :          */
     560                 :            :         int     (*port_hwtstamp_get)(struct dsa_switch *ds, int port,
     561                 :            :                                      struct ifreq *ifr);
     562                 :            :         int     (*port_hwtstamp_set)(struct dsa_switch *ds, int port,
     563                 :            :                                      struct ifreq *ifr);
     564                 :            :         bool    (*port_txtstamp)(struct dsa_switch *ds, int port,
     565                 :            :                                  struct sk_buff *clone, unsigned int type);
     566                 :            :         bool    (*port_rxtstamp)(struct dsa_switch *ds, int port,
     567                 :            :                                  struct sk_buff *skb, unsigned int type);
     568                 :            : 
     569                 :            :         /* Devlink parameters */
     570                 :            :         int     (*devlink_param_get)(struct dsa_switch *ds, u32 id,
     571                 :            :                                      struct devlink_param_gset_ctx *ctx);
     572                 :            :         int     (*devlink_param_set)(struct dsa_switch *ds, u32 id,
     573                 :            :                                      struct devlink_param_gset_ctx *ctx);
     574                 :            : };
     575                 :            : 
     576                 :            : #define DSA_DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes)            \
     577                 :            :         DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes,                \
     578                 :            :                              dsa_devlink_param_get, dsa_devlink_param_set, NULL)
     579                 :            : 
     580                 :            : int dsa_devlink_param_get(struct devlink *dl, u32 id,
     581                 :            :                           struct devlink_param_gset_ctx *ctx);
     582                 :            : int dsa_devlink_param_set(struct devlink *dl, u32 id,
     583                 :            :                           struct devlink_param_gset_ctx *ctx);
     584                 :            : int dsa_devlink_params_register(struct dsa_switch *ds,
     585                 :            :                                 const struct devlink_param *params,
     586                 :            :                                 size_t params_count);
     587                 :            : void dsa_devlink_params_unregister(struct dsa_switch *ds,
     588                 :            :                                    const struct devlink_param *params,
     589                 :            :                                    size_t params_count);
     590                 :            : int dsa_devlink_resource_register(struct dsa_switch *ds,
     591                 :            :                                   const char *resource_name,
     592                 :            :                                   u64 resource_size,
     593                 :            :                                   u64 resource_id,
     594                 :            :                                   u64 parent_resource_id,
     595                 :            :                                   const struct devlink_resource_size_params *size_params);
     596                 :            : 
     597                 :            : void dsa_devlink_resources_unregister(struct dsa_switch *ds);
     598                 :            : 
     599                 :            : void dsa_devlink_resource_occ_get_register(struct dsa_switch *ds,
     600                 :            :                                            u64 resource_id,
     601                 :            :                                            devlink_resource_occ_get_t *occ_get,
     602                 :            :                                            void *occ_get_priv);
     603                 :            : void dsa_devlink_resource_occ_get_unregister(struct dsa_switch *ds,
     604                 :            :                                              u64 resource_id);
     605                 :            : 
     606                 :            : struct dsa_devlink_priv {
     607                 :            :         struct dsa_switch *ds;
     608                 :            : };
     609                 :            : 
     610                 :            : struct dsa_switch_driver {
     611                 :            :         struct list_head        list;
     612                 :            :         const struct dsa_switch_ops *ops;
     613                 :            : };
     614                 :            : 
     615                 :            : struct net_device *dsa_dev_to_net_device(struct device *dev);
     616                 :            : 
     617                 :            : /* Keep inline for faster access in hot path */
     618                 :          0 : static inline bool netdev_uses_dsa(struct net_device *dev)
     619                 :            : {
     620                 :            : #if IS_ENABLED(CONFIG_NET_DSA)
     621                 :            :         return dev->dsa_ptr && dev->dsa_ptr->rcv;
     622                 :            : #endif
     623         [ #  # ]:          0 :         return false;
     624                 :            : }
     625                 :            : 
     626                 :            : static inline bool dsa_can_decode(const struct sk_buff *skb,
     627                 :            :                                   struct net_device *dev)
     628                 :            : {
     629                 :            : #if IS_ENABLED(CONFIG_NET_DSA)
     630                 :            :         return !dev->dsa_ptr->filter || dev->dsa_ptr->filter(skb, dev);
     631                 :            : #endif
     632                 :            :         return false;
     633                 :            : }
     634                 :            : 
     635                 :            : void dsa_unregister_switch(struct dsa_switch *ds);
     636                 :            : int dsa_register_switch(struct dsa_switch *ds);
     637                 :            : #ifdef CONFIG_PM_SLEEP
     638                 :            : int dsa_switch_suspend(struct dsa_switch *ds);
     639                 :            : int dsa_switch_resume(struct dsa_switch *ds);
     640                 :            : #else
     641                 :            : static inline int dsa_switch_suspend(struct dsa_switch *ds)
     642                 :            : {
     643                 :            :         return 0;
     644                 :            : }
     645                 :            : static inline int dsa_switch_resume(struct dsa_switch *ds)
     646                 :            : {
     647                 :            :         return 0;
     648                 :            : }
     649                 :            : #endif /* CONFIG_PM_SLEEP */
     650                 :            : 
     651                 :            : enum dsa_notifier_type {
     652                 :            :         DSA_PORT_REGISTER,
     653                 :            :         DSA_PORT_UNREGISTER,
     654                 :            : };
     655                 :            : 
     656                 :            : struct dsa_notifier_info {
     657                 :            :         struct net_device *dev;
     658                 :            : };
     659                 :            : 
     660                 :            : struct dsa_notifier_register_info {
     661                 :            :         struct dsa_notifier_info info;  /* must be first */
     662                 :            :         struct net_device *master;
     663                 :            :         unsigned int port_number;
     664                 :            :         unsigned int switch_number;
     665                 :            : };
     666                 :            : 
     667                 :            : static inline struct net_device *
     668                 :            : dsa_notifier_info_to_dev(const struct dsa_notifier_info *info)
     669                 :            : {
     670                 :            :         return info->dev;
     671                 :            : }
     672                 :            : 
     673                 :            : #if IS_ENABLED(CONFIG_NET_DSA)
     674                 :            : int register_dsa_notifier(struct notifier_block *nb);
     675                 :            : int unregister_dsa_notifier(struct notifier_block *nb);
     676                 :            : int call_dsa_notifiers(unsigned long val, struct net_device *dev,
     677                 :            :                        struct dsa_notifier_info *info);
     678                 :            : #else
     679                 :            : static inline int register_dsa_notifier(struct notifier_block *nb)
     680                 :            : {
     681                 :            :         return 0;
     682                 :            : }
     683                 :            : 
     684                 :            : static inline int unregister_dsa_notifier(struct notifier_block *nb)
     685                 :            : {
     686                 :            :         return 0;
     687                 :            : }
     688                 :            : 
     689                 :            : static inline int call_dsa_notifiers(unsigned long val, struct net_device *dev,
     690                 :            :                                      struct dsa_notifier_info *info)
     691                 :            : {
     692                 :            :         return NOTIFY_DONE;
     693                 :            : }
     694                 :            : #endif
     695                 :            : 
     696                 :            : /* Broadcom tag specific helpers to insert and extract queue/port number */
     697                 :            : #define BRCM_TAG_SET_PORT_QUEUE(p, q)   ((p) << 8 | q)
     698                 :            : #define BRCM_TAG_GET_PORT(v)            ((v) >> 8)
     699                 :            : #define BRCM_TAG_GET_QUEUE(v)           ((v) & 0xff)
     700                 :            : 
     701                 :            : 
     702                 :            : netdev_tx_t dsa_enqueue_skb(struct sk_buff *skb, struct net_device *dev);
     703                 :            : int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data);
     704                 :            : int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data);
     705                 :            : int dsa_port_get_phy_sset_count(struct dsa_port *dp);
     706                 :            : void dsa_port_phylink_mac_change(struct dsa_switch *ds, int port, bool up);
     707                 :            : 
     708                 :            : struct dsa_tag_driver {
     709                 :            :         const struct dsa_device_ops *ops;
     710                 :            :         struct list_head list;
     711                 :            :         struct module *owner;
     712                 :            : };
     713                 :            : 
     714                 :            : void dsa_tag_drivers_register(struct dsa_tag_driver *dsa_tag_driver_array[],
     715                 :            :                               unsigned int count,
     716                 :            :                               struct module *owner);
     717                 :            : void dsa_tag_drivers_unregister(struct dsa_tag_driver *dsa_tag_driver_array[],
     718                 :            :                                 unsigned int count);
     719                 :            : 
     720                 :            : #define dsa_tag_driver_module_drivers(__dsa_tag_drivers_array, __count) \
     721                 :            : static int __init dsa_tag_driver_module_init(void)                      \
     722                 :            : {                                                                       \
     723                 :            :         dsa_tag_drivers_register(__dsa_tag_drivers_array, __count,      \
     724                 :            :                                  THIS_MODULE);                          \
     725                 :            :         return 0;                                                       \
     726                 :            : }                                                                       \
     727                 :            : module_init(dsa_tag_driver_module_init);                                \
     728                 :            :                                                                         \
     729                 :            : static void __exit dsa_tag_driver_module_exit(void)                     \
     730                 :            : {                                                                       \
     731                 :            :         dsa_tag_drivers_unregister(__dsa_tag_drivers_array, __count);   \
     732                 :            : }                                                                       \
     733                 :            : module_exit(dsa_tag_driver_module_exit)
     734                 :            : 
     735                 :            : /**
     736                 :            :  * module_dsa_tag_drivers() - Helper macro for registering DSA tag
     737                 :            :  * drivers
     738                 :            :  * @__ops_array: Array of tag driver strucutres
     739                 :            :  *
     740                 :            :  * Helper macro for DSA tag drivers which do not do anything special
     741                 :            :  * in module init/exit. Each module may only use this macro once, and
     742                 :            :  * calling it replaces module_init() and module_exit().
     743                 :            :  */
     744                 :            : #define module_dsa_tag_drivers(__ops_array)                             \
     745                 :            : dsa_tag_driver_module_drivers(__ops_array, ARRAY_SIZE(__ops_array))
     746                 :            : 
     747                 :            : #define DSA_TAG_DRIVER_NAME(__ops) dsa_tag_driver ## _ ## __ops
     748                 :            : 
     749                 :            : /* Create a static structure we can build a linked list of dsa_tag
     750                 :            :  * drivers
     751                 :            :  */
     752                 :            : #define DSA_TAG_DRIVER(__ops)                                           \
     753                 :            : static struct dsa_tag_driver DSA_TAG_DRIVER_NAME(__ops) = {             \
     754                 :            :         .ops = &__ops,                                                      \
     755                 :            : }
     756                 :            : 
     757                 :            : /**
     758                 :            :  * module_dsa_tag_driver() - Helper macro for registering a single DSA tag
     759                 :            :  * driver
     760                 :            :  * @__ops: Single tag driver structures
     761                 :            :  *
     762                 :            :  * Helper macro for DSA tag drivers which do not do anything special
     763                 :            :  * in module init/exit. Each module may only use this macro once, and
     764                 :            :  * calling it replaces module_init() and module_exit().
     765                 :            :  */
     766                 :            : #define module_dsa_tag_driver(__ops)                                    \
     767                 :            : DSA_TAG_DRIVER(__ops);                                                  \
     768                 :            :                                                                         \
     769                 :            : static struct dsa_tag_driver *dsa_tag_driver_array[] =  {               \
     770                 :            :         &DSA_TAG_DRIVER_NAME(__ops)                                 \
     771                 :            : };                                                                      \
     772                 :            : module_dsa_tag_drivers(dsa_tag_driver_array)
     773                 :            : #endif
     774                 :            : 

Generated by: LCOV version 1.14