2018-11-21 02:55:05 +03:00
/* SPDX-License-Identifier: GPL-2.0
2017-05-31 23:19:19 +03:00
*
2018-11-21 02:55:05 +03:00
* Microchip KSZ series switch common definitions
2017-05-31 23:19:19 +03:00
*
2019-02-23 03:36:47 +03:00
* Copyright ( C ) 2017 - 2019 Microchip Technology Inc .
2017-05-31 23:19:19 +03:00
*/
# ifndef __KSZ_PRIV_H
# define __KSZ_PRIV_H
# include <linux/kernel.h>
# include <linux/mutex.h>
# include <linux/phy.h>
# include <linux/etherdevice.h>
# include <net/dsa.h>
struct vlan_table {
u32 table [ 3 ] ;
} ;
2018-11-21 02:55:09 +03:00
struct ksz_port_mib {
2019-02-23 03:36:48 +03:00
struct mutex cnt_mutex ; /* structure access */
2018-11-21 02:55:09 +03:00
u8 cnt_ptr ;
u64 * counters ;
} ;
struct ksz_port {
u16 member ;
u16 vid_member ;
int stp_state ;
struct phy_device phydev ;
u32 on : 1 ; /* port is not disabled by hardware */
u32 phy : 1 ; /* port has a PHY */
u32 fiber : 1 ; /* port is fiber */
u32 sgmii : 1 ; /* port is SGMII */
u32 force : 1 ;
2019-02-23 03:36:48 +03:00
u32 read : 1 ; /* read MIB counters in background */
u32 freeze : 1 ; /* MIB counter freeze is enabled */
2018-11-21 02:55:09 +03:00
struct ksz_port_mib mib ;
} ;
2017-05-31 23:19:19 +03:00
struct ksz_device {
struct dsa_switch * ds ;
struct ksz_platform_data * pdata ;
const char * name ;
2019-02-23 03:36:51 +03:00
struct mutex dev_mutex ; /* device access */
2017-05-31 23:19:19 +03:00
struct mutex stats_mutex ; /* status access */
struct mutex alu_mutex ; /* ALU access */
struct mutex vlan_mutex ; /* vlan access */
2018-11-21 02:55:09 +03:00
const struct ksz_dev_ops * dev_ops ;
2017-05-31 23:19:19 +03:00
struct device * dev ;
2019-06-26 02:43:45 +03:00
struct regmap * regmap [ 3 ] ;
2017-05-31 23:19:19 +03:00
void * priv ;
2018-12-10 16:43:06 +03:00
struct gpio_desc * reset_gpio ; /* Optional reset GPIO */
2017-05-31 23:19:19 +03:00
/* chip specific data */
u32 chip_id ;
int num_vlans ;
int num_alus ;
int num_statics ;
int cpu_port ; /* port connected to CPU */
int cpu_ports ; /* port bitmap can be cpu port */
2018-11-21 02:55:09 +03:00
int phy_port_cnt ;
2017-05-31 23:19:19 +03:00
int port_cnt ;
2018-11-21 02:55:09 +03:00
int reg_mib_cnt ;
int mib_cnt ;
int mib_port_cnt ;
int last_port ; /* ports after that not used */
phy_interface_t interface ;
u32 regs_size ;
2019-06-12 23:49:05 +03:00
bool phy_errata_9477 ;
2019-06-12 23:49:06 +03:00
bool synclko_125 ;
2017-05-31 23:19:19 +03:00
struct vlan_table * vlan_cache ;
2018-11-21 02:55:09 +03:00
struct ksz_port * ports ;
struct timer_list mib_read_timer ;
struct work_struct mib_read ;
unsigned long mib_read_interval ;
u16 br_member ;
u16 member ;
u16 live_ports ;
u16 on_ports ; /* ports enabled by DSA */
u16 rx_ports ;
u16 tx_ports ;
u16 mirror_rx ;
u16 mirror_tx ;
u32 features ; /* chip specific features */
u32 overrides ; /* chip functions set by user */
u16 host_mask ;
u16 port_mask ;
2017-05-31 23:19:19 +03:00
} ;
2018-11-21 02:55:09 +03:00
struct alu_struct {
/* entry 1 */
u8 is_static : 1 ;
u8 is_src_filter : 1 ;
u8 is_dst_filter : 1 ;
u8 prio_age : 3 ;
u32 _reserv_0_1 : 23 ;
u8 mstp : 3 ;
/* entry 2 */
u8 is_override : 1 ;
u8 is_use_fid : 1 ;
u32 _reserv_1_1 : 23 ;
u8 port_forward : 7 ;
/* entry 3 & 4*/
u32 _reserv_2_1 : 9 ;
u8 fid : 7 ;
u8 mac [ ETH_ALEN ] ;
} ;
struct ksz_dev_ops {
u32 ( * get_port_addr ) ( int port , int offset ) ;
void ( * cfg_port_member ) ( struct ksz_device * dev , int port , u8 member ) ;
void ( * flush_dyn_mac_table ) ( struct ksz_device * dev , int port ) ;
2019-02-23 03:36:47 +03:00
void ( * phy_setup ) ( struct ksz_device * dev , int port ,
struct phy_device * phy ) ;
2019-02-23 03:36:51 +03:00
void ( * port_cleanup ) ( struct ksz_device * dev , int port ) ;
2018-11-21 02:55:09 +03:00
void ( * port_setup ) ( struct ksz_device * dev , int port , bool cpu_port ) ;
void ( * r_phy ) ( struct ksz_device * dev , u16 phy , u16 reg , u16 * val ) ;
void ( * w_phy ) ( struct ksz_device * dev , u16 phy , u16 reg , u16 val ) ;
int ( * r_dyn_mac_table ) ( struct ksz_device * dev , u16 addr , u8 * mac_addr ,
u8 * fid , u8 * src_port , u8 * timestamp ,
u16 * entries ) ;
int ( * r_sta_mac_table ) ( struct ksz_device * dev , u16 addr ,
struct alu_struct * alu ) ;
void ( * w_sta_mac_table ) ( struct ksz_device * dev , u16 addr ,
struct alu_struct * alu ) ;
void ( * r_mib_cnt ) ( struct ksz_device * dev , int port , u16 addr ,
u64 * cnt ) ;
void ( * r_mib_pkt ) ( struct ksz_device * dev , int port , u16 addr ,
u64 * dropped , u64 * cnt ) ;
2019-02-23 03:36:48 +03:00
void ( * freeze_mib ) ( struct ksz_device * dev , int port , bool freeze ) ;
2018-11-21 02:55:09 +03:00
void ( * port_init_cnt ) ( struct ksz_device * dev , int port ) ;
int ( * shutdown ) ( struct ksz_device * dev ) ;
int ( * detect ) ( struct ksz_device * dev ) ;
int ( * init ) ( struct ksz_device * dev ) ;
void ( * exit ) ( struct ksz_device * dev ) ;
2017-05-31 23:19:19 +03:00
} ;
2019-06-26 02:43:46 +03:00
struct ksz_device * ksz_switch_alloc ( struct device * base , void * priv ) ;
2018-11-21 02:55:09 +03:00
int ksz_switch_register ( struct ksz_device * dev ,
const struct ksz_dev_ops * ops ) ;
2017-05-31 23:19:19 +03:00
void ksz_switch_remove ( struct ksz_device * dev ) ;
2018-11-21 02:55:09 +03:00
int ksz9477_switch_register ( struct ksz_device * dev ) ;
2017-05-31 23:19:19 +03:00
# endif