| 1 | /* |
| 2 | * Realtek RTL8366 SMI interface driver defines |
| 3 | * |
| 4 | * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify it |
| 7 | * under the terms of the GNU General Public License version 2 as published |
| 8 | * by the Free Software Foundation. |
| 9 | */ |
| 10 | |
| 11 | #ifndef _RTL8366_SMI_H |
| 12 | #define _RTL8366_SMI_H |
| 13 | |
| 14 | #include <linux/phy.h> |
| 15 | #include <linux/switch.h> |
| 16 | |
| 17 | struct rtl8366_smi_ops; |
| 18 | struct rtl8366_vlan_ops; |
| 19 | struct mii_bus; |
| 20 | struct dentry; |
| 21 | struct inode; |
| 22 | struct file; |
| 23 | |
| 24 | struct rtl8366_mib_counter { |
| 25 | unsigned base; |
| 26 | unsigned offset; |
| 27 | unsigned length; |
| 28 | const char *name; |
| 29 | }; |
| 30 | |
| 31 | struct rtl8366_smi { |
| 32 | struct device *parent; |
| 33 | unsigned int gpio_sda; |
| 34 | unsigned int gpio_sck; |
| 35 | unsigned int clk_delay; /* ns */ |
| 36 | u8 cmd_read; |
| 37 | u8 cmd_write; |
| 38 | spinlock_t lock; |
| 39 | struct mii_bus *mii_bus; |
| 40 | int mii_irq[PHY_MAX_ADDR]; |
| 41 | struct switch_dev sw_dev; |
| 42 | |
| 43 | unsigned int cpu_port; |
| 44 | unsigned int num_ports; |
| 45 | unsigned int num_vlan_mc; |
| 46 | unsigned int num_mib_counters; |
| 47 | struct rtl8366_mib_counter *mib_counters; |
| 48 | |
| 49 | struct rtl8366_smi_ops *ops; |
| 50 | |
| 51 | int vlan_enabled; |
| 52 | int vlan4k_enabled; |
| 53 | |
| 54 | char buf[4096]; |
| 55 | #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS |
| 56 | struct dentry *debugfs_root; |
| 57 | u16 dbg_reg; |
| 58 | u8 dbg_vlan_4k_page; |
| 59 | #endif |
| 60 | }; |
| 61 | |
| 62 | struct rtl8366_vlan_mc { |
| 63 | u16 vid; |
| 64 | u16 untag; |
| 65 | u16 member; |
| 66 | u8 fid; |
| 67 | u8 priority; |
| 68 | }; |
| 69 | |
| 70 | struct rtl8366_vlan_4k { |
| 71 | u16 vid; |
| 72 | u16 untag; |
| 73 | u16 member; |
| 74 | u8 fid; |
| 75 | }; |
| 76 | |
| 77 | struct rtl8366_smi_ops { |
| 78 | int (*detect)(struct rtl8366_smi *smi); |
| 79 | int (*setup)(struct rtl8366_smi *smi); |
| 80 | |
| 81 | int (*mii_read)(struct mii_bus *bus, int addr, int reg); |
| 82 | int (*mii_write)(struct mii_bus *bus, int addr, int reg, u16 val); |
| 83 | |
| 84 | int (*get_vlan_mc)(struct rtl8366_smi *smi, u32 index, |
| 85 | struct rtl8366_vlan_mc *vlanmc); |
| 86 | int (*set_vlan_mc)(struct rtl8366_smi *smi, u32 index, |
| 87 | const struct rtl8366_vlan_mc *vlanmc); |
| 88 | int (*get_vlan_4k)(struct rtl8366_smi *smi, u32 vid, |
| 89 | struct rtl8366_vlan_4k *vlan4k); |
| 90 | int (*set_vlan_4k)(struct rtl8366_smi *smi, |
| 91 | const struct rtl8366_vlan_4k *vlan4k); |
| 92 | int (*get_mc_index)(struct rtl8366_smi *smi, int port, int *val); |
| 93 | int (*set_mc_index)(struct rtl8366_smi *smi, int port, int index); |
| 94 | int (*get_mib_counter)(struct rtl8366_smi *smi, int counter, |
| 95 | int port, unsigned long long *val); |
| 96 | int (*is_vlan_valid)(struct rtl8366_smi *smi, unsigned vlan); |
| 97 | int (*enable_vlan)(struct rtl8366_smi *smi, int enable); |
| 98 | int (*enable_vlan4k)(struct rtl8366_smi *smi, int enable); |
| 99 | int (*enable_port)(struct rtl8366_smi *smi, int port, int enable); |
| 100 | }; |
| 101 | |
| 102 | struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent); |
| 103 | int rtl8366_smi_init(struct rtl8366_smi *smi); |
| 104 | void rtl8366_smi_cleanup(struct rtl8366_smi *smi); |
| 105 | int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data); |
| 106 | int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data); |
| 107 | int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data); |
| 108 | int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data); |
| 109 | |
| 110 | int rtl8366_reset_vlan(struct rtl8366_smi *smi); |
| 111 | int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable); |
| 112 | int rtl8366_enable_all_ports(struct rtl8366_smi *smi, int enable); |
| 113 | |
| 114 | #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS |
| 115 | int rtl8366_debugfs_open(struct inode *inode, struct file *file); |
| 116 | #endif |
| 117 | |
| 118 | static inline struct rtl8366_smi *sw_to_rtl8366_smi(struct switch_dev *sw) |
| 119 | { |
| 120 | return container_of(sw, struct rtl8366_smi, sw_dev); |
| 121 | } |
| 122 | |
| 123 | int rtl8366_sw_get_port_pvid(struct switch_dev *dev, int port, int *val); |
| 124 | int rtl8366_sw_set_port_pvid(struct switch_dev *dev, int port, int val); |
| 125 | int rtl8366_sw_get_port_mib(struct switch_dev *dev, |
| 126 | const struct switch_attr *attr, |
| 127 | struct switch_val *val); |
| 128 | int rtl8366_sw_get_vlan_info(struct switch_dev *dev, |
| 129 | const struct switch_attr *attr, |
| 130 | struct switch_val *val); |
| 131 | int rtl8366_sw_get_vlan_fid(struct switch_dev *dev, |
| 132 | const struct switch_attr *attr, |
| 133 | struct switch_val *val); |
| 134 | int rtl8366_sw_set_vlan_fid(struct switch_dev *dev, |
| 135 | const struct switch_attr *attr, |
| 136 | struct switch_val *val); |
| 137 | int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val); |
| 138 | int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val); |
| 139 | int rtl8366_sw_get_vlan_enable(struct switch_dev *dev, |
| 140 | const struct switch_attr *attr, |
| 141 | struct switch_val *val); |
| 142 | int rtl8366_sw_set_vlan_enable(struct switch_dev *dev, |
| 143 | const struct switch_attr *attr, |
| 144 | struct switch_val *val); |
| 145 | |
| 146 | #endif /* _RTL8366_SMI_H */ |
| 147 | |