root/include/net/dsa.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dsa_to_port
  2. dsa_is_unused_port
  3. dsa_is_cpu_port
  4. dsa_is_dsa_port
  5. dsa_is_user_port
  6. dsa_user_ports
  7. dsa_towards_port
  8. dsa_upstream_port
  9. dsa_port_is_vlan_filtering
  10. netdev_uses_dsa
  11. dsa_can_decode
  12. dsa_switch_suspend
  13. dsa_switch_resume
  14. dsa_notifier_info_to_dev
  15. register_dsa_notifier
  16. unregister_dsa_notifier
  17. call_dsa_notifiers

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

/* [<][>][^][v][top][bottom][index][help] */