linux/drivers/net/dsa/microchip/ksz_priv.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 *
   3 * Microchip KSZ series switch common definitions
   4 *
   5 * Copyright (C) 2017-2019 Microchip Technology Inc.
   6 */
   7
   8#ifndef __KSZ_PRIV_H
   9#define __KSZ_PRIV_H
  10
  11#include <linux/kernel.h>
  12#include <linux/mutex.h>
  13#include <linux/phy.h>
  14#include <linux/etherdevice.h>
  15#include <net/dsa.h>
  16
  17struct vlan_table {
  18        u32 table[3];
  19};
  20
  21struct ksz_port_mib {
  22        struct mutex cnt_mutex;         /* structure access */
  23        u8 cnt_ptr;
  24        u64 *counters;
  25};
  26
  27struct ksz_port {
  28        u16 member;
  29        u16 vid_member;
  30        int stp_state;
  31        struct phy_device phydev;
  32
  33        u32 on:1;                       /* port is not disabled by hardware */
  34        u32 phy:1;                      /* port has a PHY */
  35        u32 fiber:1;                    /* port is fiber */
  36        u32 sgmii:1;                    /* port is SGMII */
  37        u32 force:1;
  38        u32 read:1;                     /* read MIB counters in background */
  39        u32 freeze:1;                   /* MIB counter freeze is enabled */
  40
  41        struct ksz_port_mib mib;
  42};
  43
  44struct ksz_device {
  45        struct dsa_switch *ds;
  46        struct ksz_platform_data *pdata;
  47        const char *name;
  48
  49        struct mutex dev_mutex;         /* device access */
  50        struct mutex stats_mutex;       /* status access */
  51        struct mutex alu_mutex;         /* ALU access */
  52        struct mutex vlan_mutex;        /* vlan access */
  53        const struct ksz_dev_ops *dev_ops;
  54
  55        struct device *dev;
  56        struct regmap *regmap[3];
  57
  58        void *priv;
  59
  60        struct gpio_desc *reset_gpio;   /* Optional reset GPIO */
  61
  62        /* chip specific data */
  63        u32 chip_id;
  64        int num_vlans;
  65        int num_alus;
  66        int num_statics;
  67        int cpu_port;                   /* port connected to CPU */
  68        int cpu_ports;                  /* port bitmap can be cpu port */
  69        int phy_port_cnt;
  70        int port_cnt;
  71        int reg_mib_cnt;
  72        int mib_cnt;
  73        int mib_port_cnt;
  74        int last_port;                  /* ports after that not used */
  75        phy_interface_t interface;
  76        u32 regs_size;
  77        bool phy_errata_9477;
  78        bool synclko_125;
  79
  80        struct vlan_table *vlan_cache;
  81
  82        struct ksz_port *ports;
  83        struct timer_list mib_read_timer;
  84        struct work_struct mib_read;
  85        unsigned long mib_read_interval;
  86        u16 br_member;
  87        u16 member;
  88        u16 live_ports;
  89        u16 on_ports;                   /* ports enabled by DSA */
  90        u16 rx_ports;
  91        u16 tx_ports;
  92        u16 mirror_rx;
  93        u16 mirror_tx;
  94        u32 features;                   /* chip specific features */
  95        u32 overrides;                  /* chip functions set by user */
  96        u16 host_mask;
  97        u16 port_mask;
  98};
  99
 100struct alu_struct {
 101        /* entry 1 */
 102        u8      is_static:1;
 103        u8      is_src_filter:1;
 104        u8      is_dst_filter:1;
 105        u8      prio_age:3;
 106        u32     _reserv_0_1:23;
 107        u8      mstp:3;
 108        /* entry 2 */
 109        u8      is_override:1;
 110        u8      is_use_fid:1;
 111        u32     _reserv_1_1:23;
 112        u8      port_forward:7;
 113        /* entry 3 & 4*/
 114        u32     _reserv_2_1:9;
 115        u8      fid:7;
 116        u8      mac[ETH_ALEN];
 117};
 118
 119struct ksz_dev_ops {
 120        u32 (*get_port_addr)(int port, int offset);
 121        void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member);
 122        void (*flush_dyn_mac_table)(struct ksz_device *dev, int port);
 123        void (*phy_setup)(struct ksz_device *dev, int port,
 124                          struct phy_device *phy);
 125        void (*port_cleanup)(struct ksz_device *dev, int port);
 126        void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
 127        void (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
 128        void (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val);
 129        int (*r_dyn_mac_table)(struct ksz_device *dev, u16 addr, u8 *mac_addr,
 130                               u8 *fid, u8 *src_port, u8 *timestamp,
 131                               u16 *entries);
 132        int (*r_sta_mac_table)(struct ksz_device *dev, u16 addr,
 133                               struct alu_struct *alu);
 134        void (*w_sta_mac_table)(struct ksz_device *dev, u16 addr,
 135                                struct alu_struct *alu);
 136        void (*r_mib_cnt)(struct ksz_device *dev, int port, u16 addr,
 137                          u64 *cnt);
 138        void (*r_mib_pkt)(struct ksz_device *dev, int port, u16 addr,
 139                          u64 *dropped, u64 *cnt);
 140        void (*freeze_mib)(struct ksz_device *dev, int port, bool freeze);
 141        void (*port_init_cnt)(struct ksz_device *dev, int port);
 142        int (*shutdown)(struct ksz_device *dev);
 143        int (*detect)(struct ksz_device *dev);
 144        int (*init)(struct ksz_device *dev);
 145        void (*exit)(struct ksz_device *dev);
 146};
 147
 148struct ksz_device *ksz_switch_alloc(struct device *base, void *priv);
 149int ksz_switch_register(struct ksz_device *dev,
 150                        const struct ksz_dev_ops *ops);
 151void ksz_switch_remove(struct ksz_device *dev);
 152
 153int ksz9477_switch_register(struct ksz_device *dev);
 154
 155#endif
 156