2018-07-14 11:45:55 +02:00
/* SPDX-License-Identifier: GPL-2.0+ */
/* Realtek SMI interface driver defines
*
* Copyright ( C ) 2017 Linus Walleij < linus . walleij @ linaro . org >
* Copyright ( C ) 2009 - 2010 Gabor Juhos < juhosg @ openwrt . org >
*/
# ifndef _REALTEK_SMI_H
# define _REALTEK_SMI_H
# include <linux/phy.h>
# include <linux/platform_device.h>
# include <linux/gpio/consumer.h>
# include <net/dsa.h>
struct realtek_smi_ops ;
struct dentry ;
struct inode ;
struct file ;
struct rtl8366_mib_counter {
unsigned int base ;
unsigned int offset ;
unsigned int length ;
const char * name ;
} ;
2020-09-02 00:09:35 +02:00
/**
* struct rtl8366_vlan_mc - Virtual LAN member configuration
*/
2018-07-14 11:45:55 +02:00
struct rtl8366_vlan_mc {
u16 vid ;
u16 untag ;
u16 member ;
u8 fid ;
u8 priority ;
} ;
struct rtl8366_vlan_4k {
u16 vid ;
u16 untag ;
u16 member ;
u8 fid ;
} ;
struct realtek_smi {
struct device * dev ;
struct gpio_desc * reset ;
struct gpio_desc * mdc ;
struct gpio_desc * mdio ;
struct regmap * map ;
struct mii_bus * slave_mii_bus ;
unsigned int clk_delay ;
u8 cmd_read ;
u8 cmd_write ;
spinlock_t lock ; /* Locks around command writes */
struct dsa_switch * ds ;
struct irq_domain * irqdomain ;
bool leds_disabled ;
unsigned int cpu_port ;
unsigned int num_ports ;
unsigned int num_vlan_mc ;
unsigned int num_mib_counters ;
struct rtl8366_mib_counter * mib_counters ;
const struct realtek_smi_ops * ops ;
int vlan_enabled ;
int vlan4k_enabled ;
char buf [ 4096 ] ;
2020-10-08 23:03:40 +02:00
void * chip_data ; /* Per-chip extra variant data */
2018-07-14 11:45:55 +02:00
} ;
/**
* struct realtek_smi_ops - vtable for the per - SMI - chiptype operations
* @ detect : detects the chiptype
*/
struct realtek_smi_ops {
int ( * detect ) ( struct realtek_smi * smi ) ;
int ( * reset_chip ) ( struct realtek_smi * smi ) ;
int ( * setup ) ( struct realtek_smi * smi ) ;
void ( * cleanup ) ( struct realtek_smi * smi ) ;
int ( * get_mib_counter ) ( struct realtek_smi * smi ,
int port ,
struct rtl8366_mib_counter * mib ,
u64 * mibvalue ) ;
int ( * get_vlan_mc ) ( struct realtek_smi * smi , u32 index ,
struct rtl8366_vlan_mc * vlanmc ) ;
int ( * set_vlan_mc ) ( struct realtek_smi * smi , u32 index ,
const struct rtl8366_vlan_mc * vlanmc ) ;
int ( * get_vlan_4k ) ( struct realtek_smi * smi , u32 vid ,
struct rtl8366_vlan_4k * vlan4k ) ;
int ( * set_vlan_4k ) ( struct realtek_smi * smi ,
const struct rtl8366_vlan_4k * vlan4k ) ;
int ( * get_mc_index ) ( struct realtek_smi * smi , int port , int * val ) ;
int ( * set_mc_index ) ( struct realtek_smi * smi , int port , int index ) ;
bool ( * is_vlan_valid ) ( struct realtek_smi * smi , unsigned int vlan ) ;
int ( * enable_vlan ) ( struct realtek_smi * smi , bool enable ) ;
int ( * enable_vlan4k ) ( struct realtek_smi * smi , bool enable ) ;
int ( * enable_port ) ( struct realtek_smi * smi , int port , bool enable ) ;
int ( * phy_read ) ( struct realtek_smi * smi , int phy , int regnum ) ;
int ( * phy_write ) ( struct realtek_smi * smi , int phy , int regnum ,
u16 val ) ;
} ;
struct realtek_smi_variant {
const struct dsa_switch_ops * ds_ops ;
const struct realtek_smi_ops * ops ;
unsigned int clk_delay ;
u8 cmd_read ;
u8 cmd_write ;
2020-10-08 23:03:40 +02:00
size_t chip_data_sz ;
2018-07-14 11:45:55 +02:00
} ;
/* SMI core calls */
int realtek_smi_write_reg_noack ( struct realtek_smi * smi , u32 addr ,
u32 data ) ;
int realtek_smi_setup_mdio ( struct realtek_smi * smi ) ;
/* RTL8366 library helpers */
int rtl8366_mc_is_used ( struct realtek_smi * smi , int mc_index , int * used ) ;
int rtl8366_set_vlan ( struct realtek_smi * smi , int vid , u32 member ,
u32 untag , u32 fid ) ;
int rtl8366_set_pvid ( struct realtek_smi * smi , unsigned int port ,
unsigned int vid ) ;
int rtl8366_enable_vlan4k ( struct realtek_smi * smi , bool enable ) ;
int rtl8366_enable_vlan ( struct realtek_smi * smi , bool enable ) ;
int rtl8366_reset_vlan ( struct realtek_smi * smi ) ;
int rtl8366_init_vlan ( struct realtek_smi * smi ) ;
2021-02-13 22:43:19 +02:00
int rtl8366_vlan_filtering ( struct dsa_switch * ds , int port , bool vlan_filtering ,
struct netlink_ext_ack * extack ) ;
2021-01-09 02:01:53 +02:00
int rtl8366_vlan_add ( struct dsa_switch * ds , int port ,
2021-02-13 22:43:18 +02:00
const struct switchdev_obj_port_vlan * vlan ,
struct netlink_ext_ack * extack ) ;
2018-07-14 11:45:55 +02:00
int rtl8366_vlan_del ( struct dsa_switch * ds , int port ,
const struct switchdev_obj_port_vlan * vlan ) ;
void rtl8366_get_strings ( struct dsa_switch * ds , int port , u32 stringset ,
uint8_t * data ) ;
int rtl8366_get_sset_count ( struct dsa_switch * ds , int port , int sset ) ;
void rtl8366_get_ethtool_stats ( struct dsa_switch * ds , int port , uint64_t * data ) ;
extern const struct realtek_smi_variant rtl8366rb_variant ;
# endif /* _REALTEK_SMI_H */