linux/drivers/net/ethernet/microchip/lan966x/lan966x_main.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2
   3#ifndef __LAN966X_MAIN_H__
   4#define __LAN966X_MAIN_H__
   5
   6#include <linux/etherdevice.h>
   7#include <linux/if_vlan.h>
   8#include <linux/jiffies.h>
   9#include <linux/phy.h>
  10#include <linux/phylink.h>
  11#include <linux/ptp_clock_kernel.h>
  12#include <net/switchdev.h>
  13
  14#include "lan966x_regs.h"
  15#include "lan966x_ifh.h"
  16
  17#define TABLE_UPDATE_SLEEP_US           10
  18#define TABLE_UPDATE_TIMEOUT_US         100000
  19
  20#define LAN966X_BUFFER_CELL_SZ          64
  21#define LAN966X_BUFFER_MEMORY           (160 * 1024)
  22#define LAN966X_BUFFER_MIN_SZ           60
  23
  24#define PGID_AGGR                       64
  25#define PGID_SRC                        80
  26#define PGID_ENTRIES                    89
  27
  28#define UNAWARE_PVID                    0
  29#define HOST_PVID                       4095
  30
  31/* Reserved amount for (SRC, PRIO) at index 8*SRC + PRIO */
  32#define QSYS_Q_RSRV                     95
  33
  34#define CPU_PORT                        8
  35
  36/* Reserved PGIDs */
  37#define PGID_CPU                        (PGID_AGGR - 6)
  38#define PGID_UC                         (PGID_AGGR - 5)
  39#define PGID_BC                         (PGID_AGGR - 4)
  40#define PGID_MC                         (PGID_AGGR - 3)
  41#define PGID_MCIPV4                     (PGID_AGGR - 2)
  42#define PGID_MCIPV6                     (PGID_AGGR - 1)
  43
  44/* Non-reserved PGIDs, used for general purpose */
  45#define PGID_GP_START                   (CPU_PORT + 1)
  46#define PGID_GP_END                     PGID_CPU
  47
  48#define LAN966X_SPEED_NONE              0
  49#define LAN966X_SPEED_2500              1
  50#define LAN966X_SPEED_1000              1
  51#define LAN966X_SPEED_100               2
  52#define LAN966X_SPEED_10                3
  53
  54#define LAN966X_PHC_COUNT               3
  55#define LAN966X_PHC_PORT                0
  56
  57#define IFH_REW_OP_NOOP                 0x0
  58#define IFH_REW_OP_ONE_STEP_PTP         0x3
  59#define IFH_REW_OP_TWO_STEP_PTP         0x4
  60
  61/* MAC table entry types.
  62 * ENTRYTYPE_NORMAL is subject to aging.
  63 * ENTRYTYPE_LOCKED is not subject to aging.
  64 * ENTRYTYPE_MACv4 is not subject to aging. For IPv4 multicast.
  65 * ENTRYTYPE_MACv6 is not subject to aging. For IPv6 multicast.
  66 */
  67enum macaccess_entry_type {
  68        ENTRYTYPE_NORMAL = 0,
  69        ENTRYTYPE_LOCKED,
  70        ENTRYTYPE_MACV4,
  71        ENTRYTYPE_MACV6,
  72};
  73
  74struct lan966x_port;
  75
  76struct lan966x_stat_layout {
  77        u32 offset;
  78        char name[ETH_GSTRING_LEN];
  79};
  80
  81struct lan966x_phc {
  82        struct ptp_clock *clock;
  83        struct ptp_clock_info info;
  84        struct hwtstamp_config hwtstamp_config;
  85        struct lan966x *lan966x;
  86        u8 index;
  87};
  88
  89struct lan966x_skb_cb {
  90        u8 rew_op;
  91        u16 ts_id;
  92        unsigned long jiffies;
  93};
  94
  95#define LAN966X_PTP_TIMEOUT             msecs_to_jiffies(10)
  96#define LAN966X_SKB_CB(skb) \
  97        ((struct lan966x_skb_cb *)((skb)->cb))
  98
  99struct lan966x {
 100        struct device *dev;
 101
 102        u8 num_phys_ports;
 103        struct lan966x_port **ports;
 104
 105        void __iomem *regs[NUM_TARGETS];
 106
 107        int shared_queue_sz;
 108
 109        u8 base_mac[ETH_ALEN];
 110
 111        spinlock_t tx_lock; /* lock for frame transmition */
 112
 113        struct net_device *bridge;
 114        u16 bridge_mask;
 115        u16 bridge_fwd_mask;
 116
 117        struct list_head mac_entries;
 118        spinlock_t mac_lock; /* lock for mac_entries list */
 119
 120        u16 vlan_mask[VLAN_N_VID];
 121        DECLARE_BITMAP(cpu_vlan_mask, VLAN_N_VID);
 122
 123        /* stats */
 124        const struct lan966x_stat_layout *stats_layout;
 125        u32 num_stats;
 126
 127        /* workqueue for reading stats */
 128        struct mutex stats_lock;
 129        u64 *stats;
 130        struct delayed_work stats_work;
 131        struct workqueue_struct *stats_queue;
 132
 133        /* interrupts */
 134        int xtr_irq;
 135        int ana_irq;
 136        int ptp_irq;
 137
 138        /* worqueue for fdb */
 139        struct workqueue_struct *fdb_work;
 140        struct list_head fdb_entries;
 141
 142        /* mdb */
 143        struct list_head mdb_entries;
 144        struct list_head pgid_entries;
 145
 146        /* ptp */
 147        bool ptp;
 148        struct lan966x_phc phc[LAN966X_PHC_COUNT];
 149        spinlock_t ptp_clock_lock; /* lock for phc */
 150        spinlock_t ptp_ts_id_lock; /* lock for ts_id */
 151        struct mutex ptp_lock; /* lock for ptp interface state */
 152        u16 ptp_skbs;
 153};
 154
 155struct lan966x_port_config {
 156        phy_interface_t portmode;
 157        const unsigned long *advertising;
 158        int speed;
 159        int duplex;
 160        u32 pause;
 161        bool inband;
 162        bool autoneg;
 163};
 164
 165struct lan966x_port {
 166        struct net_device *dev;
 167        struct lan966x *lan966x;
 168
 169        u8 chip_port;
 170        u16 pvid;
 171        u16 vid;
 172        bool vlan_aware;
 173
 174        bool learn_ena;
 175        bool mcast_ena;
 176
 177        struct phylink_config phylink_config;
 178        struct phylink_pcs phylink_pcs;
 179        struct lan966x_port_config config;
 180        struct phylink *phylink;
 181        struct phy *serdes;
 182        struct fwnode_handle *fwnode;
 183
 184        u8 ptp_cmd;
 185        u16 ts_id;
 186        struct sk_buff_head tx_skbs;
 187};
 188
 189extern const struct phylink_mac_ops lan966x_phylink_mac_ops;
 190extern const struct phylink_pcs_ops lan966x_phylink_pcs_ops;
 191extern const struct ethtool_ops lan966x_ethtool_ops;
 192
 193bool lan966x_netdevice_check(const struct net_device *dev);
 194
 195void lan966x_register_notifier_blocks(void);
 196void lan966x_unregister_notifier_blocks(void);
 197
 198void lan966x_stats_get(struct net_device *dev,
 199                       struct rtnl_link_stats64 *stats);
 200int lan966x_stats_init(struct lan966x *lan966x);
 201
 202void lan966x_port_config_down(struct lan966x_port *port);
 203void lan966x_port_config_up(struct lan966x_port *port);
 204void lan966x_port_status_get(struct lan966x_port *port,
 205                             struct phylink_link_state *state);
 206int lan966x_port_pcs_set(struct lan966x_port *port,
 207                         struct lan966x_port_config *config);
 208void lan966x_port_init(struct lan966x_port *port);
 209
 210int lan966x_mac_ip_learn(struct lan966x *lan966x,
 211                         bool cpu_copy,
 212                         const unsigned char mac[ETH_ALEN],
 213                         unsigned int vid,
 214                         enum macaccess_entry_type type);
 215int lan966x_mac_learn(struct lan966x *lan966x, int port,
 216                      const unsigned char mac[ETH_ALEN],
 217                      unsigned int vid,
 218                      enum macaccess_entry_type type);
 219int lan966x_mac_forget(struct lan966x *lan966x,
 220                       const unsigned char mac[ETH_ALEN],
 221                       unsigned int vid,
 222                       enum macaccess_entry_type type);
 223int lan966x_mac_cpu_learn(struct lan966x *lan966x, const char *addr, u16 vid);
 224int lan966x_mac_cpu_forget(struct lan966x *lan966x, const char *addr, u16 vid);
 225void lan966x_mac_init(struct lan966x *lan966x);
 226void lan966x_mac_set_ageing(struct lan966x *lan966x,
 227                            u32 ageing);
 228int lan966x_mac_del_entry(struct lan966x *lan966x,
 229                          const unsigned char *addr,
 230                          u16 vid);
 231int lan966x_mac_add_entry(struct lan966x *lan966x,
 232                          struct lan966x_port *port,
 233                          const unsigned char *addr,
 234                          u16 vid);
 235void lan966x_mac_purge_entries(struct lan966x *lan966x);
 236irqreturn_t lan966x_mac_irq_handler(struct lan966x *lan966x);
 237
 238void lan966x_vlan_init(struct lan966x *lan966x);
 239void lan966x_vlan_port_apply(struct lan966x_port *port);
 240bool lan966x_vlan_cpu_member_cpu_vlan_mask(struct lan966x *lan966x, u16 vid);
 241void lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port,
 242                                      bool vlan_aware);
 243int lan966x_vlan_port_set_vid(struct lan966x_port *port,
 244                              u16 vid,
 245                              bool pvid,
 246                              bool untagged);
 247void lan966x_vlan_port_add_vlan(struct lan966x_port *port,
 248                                u16 vid,
 249                                bool pvid,
 250                                bool untagged);
 251void lan966x_vlan_port_del_vlan(struct lan966x_port *port, u16 vid);
 252void lan966x_vlan_cpu_add_vlan(struct lan966x *lan966x, u16 vid);
 253void lan966x_vlan_cpu_del_vlan(struct lan966x *lan966x, u16 vid);
 254
 255void lan966x_fdb_write_entries(struct lan966x *lan966x, u16 vid);
 256void lan966x_fdb_erase_entries(struct lan966x *lan966x, u16 vid);
 257int lan966x_fdb_init(struct lan966x *lan966x);
 258void lan966x_fdb_deinit(struct lan966x *lan966x);
 259int lan966x_handle_fdb(struct net_device *dev,
 260                       struct net_device *orig_dev,
 261                       unsigned long event, const void *ctx,
 262                       const struct switchdev_notifier_fdb_info *fdb_info);
 263
 264void lan966x_mdb_init(struct lan966x *lan966x);
 265void lan966x_mdb_deinit(struct lan966x *lan966x);
 266int lan966x_handle_port_mdb_add(struct lan966x_port *port,
 267                                const struct switchdev_obj *obj);
 268int lan966x_handle_port_mdb_del(struct lan966x_port *port,
 269                                const struct switchdev_obj *obj);
 270void lan966x_mdb_erase_entries(struct lan966x *lan966x, u16 vid);
 271void lan966x_mdb_write_entries(struct lan966x *lan966x, u16 vid);
 272void lan966x_mdb_clear_entries(struct lan966x *lan966x);
 273void lan966x_mdb_restore_entries(struct lan966x *lan966x);
 274
 275int lan966x_ptp_init(struct lan966x *lan966x);
 276void lan966x_ptp_deinit(struct lan966x *lan966x);
 277int lan966x_ptp_hwtstamp_set(struct lan966x_port *port, struct ifreq *ifr);
 278int lan966x_ptp_hwtstamp_get(struct lan966x_port *port, struct ifreq *ifr);
 279void lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
 280                          u64 timestamp);
 281int lan966x_ptp_txtstamp_request(struct lan966x_port *port,
 282                                 struct sk_buff *skb);
 283void lan966x_ptp_txtstamp_release(struct lan966x_port *port,
 284                                  struct sk_buff *skb);
 285irqreturn_t lan966x_ptp_irq_handler(int irq, void *args);
 286
 287static inline void __iomem *lan_addr(void __iomem *base[],
 288                                     int id, int tinst, int tcnt,
 289                                     int gbase, int ginst,
 290                                     int gcnt, int gwidth,
 291                                     int raddr, int rinst,
 292                                     int rcnt, int rwidth)
 293{
 294        WARN_ON((tinst) >= tcnt);
 295        WARN_ON((ginst) >= gcnt);
 296        WARN_ON((rinst) >= rcnt);
 297        return base[id + (tinst)] +
 298                gbase + ((ginst) * gwidth) +
 299                raddr + ((rinst) * rwidth);
 300}
 301
 302static inline u32 lan_rd(struct lan966x *lan966x, int id, int tinst, int tcnt,
 303                         int gbase, int ginst, int gcnt, int gwidth,
 304                         int raddr, int rinst, int rcnt, int rwidth)
 305{
 306        return readl(lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
 307                              gcnt, gwidth, raddr, rinst, rcnt, rwidth));
 308}
 309
 310static inline void lan_wr(u32 val, struct lan966x *lan966x,
 311                          int id, int tinst, int tcnt,
 312                          int gbase, int ginst, int gcnt, int gwidth,
 313                          int raddr, int rinst, int rcnt, int rwidth)
 314{
 315        writel(val, lan_addr(lan966x->regs, id, tinst, tcnt,
 316                             gbase, ginst, gcnt, gwidth,
 317                             raddr, rinst, rcnt, rwidth));
 318}
 319
 320static inline void lan_rmw(u32 val, u32 mask, struct lan966x *lan966x,
 321                           int id, int tinst, int tcnt,
 322                           int gbase, int ginst, int gcnt, int gwidth,
 323                           int raddr, int rinst, int rcnt, int rwidth)
 324{
 325        u32 nval;
 326
 327        nval = readl(lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
 328                              gcnt, gwidth, raddr, rinst, rcnt, rwidth));
 329        nval = (nval & ~mask) | (val & mask);
 330        writel(nval, lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
 331                              gcnt, gwidth, raddr, rinst, rcnt, rwidth));
 332}
 333
 334#endif /* __LAN966X_MAIN_H__ */
 335