1 /* 2 * include/net/dsa.h - Driver for Distributed Switch Architecture switch chips 3 * Copyright (c) 2008-2009 Marvell Semiconductor 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 */ 10 11 #ifndef __LINUX_NET_DSA_H 12 #define __LINUX_NET_DSA_H 13 14 #include <linux/if_ether.h> 15 #include <linux/list.h> 16 #include <linux/timer.h> 17 #include <linux/workqueue.h> 18 #include <linux/of.h> 19 #include <linux/phy.h> 20 #include <linux/phy_fixed.h> 21 22 enum dsa_tag_protocol { 23 DSA_TAG_PROTO_NONE = 0, 24 DSA_TAG_PROTO_DSA, 25 DSA_TAG_PROTO_TRAILER, 26 DSA_TAG_PROTO_EDSA, 27 DSA_TAG_PROTO_BRCM, 28 }; 29 30 #define DSA_MAX_SWITCHES 4 31 #define DSA_MAX_PORTS 12 32 33 struct dsa_chip_data { 34 /* 35 * How to access the switch configuration registers. 36 */ 37 struct device *host_dev; 38 int sw_addr; 39 40 /* Device tree node pointer for this specific switch chip 41 * used during switch setup in case additional properties 42 * and resources needs to be used 43 */ 44 struct device_node *of_node; 45 46 /* 47 * The names of the switch's ports. Use "cpu" to 48 * designate the switch port that the cpu is connected to, 49 * "dsa" to indicate that this port is a DSA link to 50 * another switch, NULL to indicate the port is unused, 51 * or any other string to indicate this is a physical port. 52 */ 53 char *port_names[DSA_MAX_PORTS]; 54 struct device_node *port_dn[DSA_MAX_PORTS]; 55 56 /* 57 * An array (with nr_chips elements) of which element [a] 58 * indicates which port on this switch should be used to 59 * send packets to that are destined for switch a. Can be 60 * NULL if there is only one switch chip. 61 */ 62 s8 *rtable; 63 }; 64 65 struct dsa_platform_data { 66 /* 67 * Reference to a Linux network interface that connects 68 * to the root switch chip of the tree. 69 */ 70 struct device *netdev; 71 72 /* 73 * Info structs describing each of the switch chips 74 * connected via this network interface. 75 */ 76 int nr_chips; 77 struct dsa_chip_data *chip; 78 }; 79 80 struct packet_type; 81 82 struct dsa_switch_tree { 83 /* 84 * Configuration data for the platform device that owns 85 * this dsa switch tree instance. 86 */ 87 struct dsa_platform_data *pd; 88 89 /* 90 * Reference to network device to use, and which tagging 91 * protocol to use. 92 */ 93 struct net_device *master_netdev; 94 int (*rcv)(struct sk_buff *skb, 95 struct net_device *dev, 96 struct packet_type *pt, 97 struct net_device *orig_dev); 98 enum dsa_tag_protocol tag_protocol; 99 100 /* 101 * The switch and port to which the CPU is attached. 102 */ 103 s8 cpu_switch; 104 s8 cpu_port; 105 106 /* 107 * Link state polling. 108 */ 109 int link_poll_needed; 110 struct work_struct link_poll_work; 111 struct timer_list link_poll_timer; 112 113 /* 114 * Data for the individual switch chips. 115 */ 116 struct dsa_switch *ds[DSA_MAX_SWITCHES]; 117 }; 118 119 struct dsa_switch { 120 /* 121 * Parent switch tree, and switch index. 122 */ 123 struct dsa_switch_tree *dst; 124 int index; 125 126 /* 127 * Configuration data for this switch. 128 */ 129 struct dsa_chip_data *pd; 130 131 /* 132 * The used switch driver. 133 */ 134 struct dsa_switch_driver *drv; 135 136 /* 137 * Reference to host device to use. 138 */ 139 struct device *master_dev; 140 141 /* 142 * Slave mii_bus and devices for the individual ports. 143 */ 144 u32 dsa_port_mask; 145 u32 phys_port_mask; 146 u32 phys_mii_mask; 147 struct mii_bus *slave_mii_bus; 148 struct net_device *ports[DSA_MAX_PORTS]; 149 }; 150 151 static inline bool dsa_is_cpu_port(struct dsa_switch *ds, int p) 152 { 153 return !!(ds->index == ds->dst->cpu_switch && p == ds->dst->cpu_port); 154 } 155 156 static inline u8 dsa_upstream_port(struct dsa_switch *ds) 157 { 158 struct dsa_switch_tree *dst = ds->dst; 159 160 /* 161 * If this is the root switch (i.e. the switch that connects 162 * to the CPU), return the cpu port number on this switch. 163 * Else return the (DSA) port number that connects to the 164 * switch that is one hop closer to the cpu. 165 */ 166 if (dst->cpu_switch == ds->index) 167 return dst->cpu_port; 168 else 169 return ds->pd->rtable[dst->cpu_switch]; 170 } 171 172 struct dsa_switch_driver { 173 struct list_head list; 174 175 enum dsa_tag_protocol tag_protocol; 176 int priv_size; 177 178 /* 179 * Probing and setup. 180 */ 181 char *(*probe)(struct device *host_dev, int sw_addr); 182 int (*setup)(struct dsa_switch *ds); 183 int (*set_addr)(struct dsa_switch *ds, u8 *addr); 184 u32 (*get_phy_flags)(struct dsa_switch *ds, int port); 185 186 /* 187 * Access to the switch's PHY registers. 188 */ 189 int (*phy_read)(struct dsa_switch *ds, int port, int regnum); 190 int (*phy_write)(struct dsa_switch *ds, int port, 191 int regnum, u16 val); 192 193 /* 194 * Link state polling and IRQ handling. 195 */ 196 void (*poll_link)(struct dsa_switch *ds); 197 198 /* 199 * Link state adjustment (called from libphy) 200 */ 201 void (*adjust_link)(struct dsa_switch *ds, int port, 202 struct phy_device *phydev); 203 void (*fixed_link_update)(struct dsa_switch *ds, int port, 204 struct fixed_phy_status *st); 205 206 /* 207 * ethtool hardware statistics. 208 */ 209 void (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data); 210 void (*get_ethtool_stats)(struct dsa_switch *ds, 211 int port, uint64_t *data); 212 int (*get_sset_count)(struct dsa_switch *ds); 213 214 /* 215 * ethtool Wake-on-LAN 216 */ 217 void (*get_wol)(struct dsa_switch *ds, int port, 218 struct ethtool_wolinfo *w); 219 int (*set_wol)(struct dsa_switch *ds, int port, 220 struct ethtool_wolinfo *w); 221 222 /* 223 * Suspend and resume 224 */ 225 int (*suspend)(struct dsa_switch *ds); 226 int (*resume)(struct dsa_switch *ds); 227 228 /* 229 * Port enable/disable 230 */ 231 int (*port_enable)(struct dsa_switch *ds, int port, 232 struct phy_device *phy); 233 void (*port_disable)(struct dsa_switch *ds, int port, 234 struct phy_device *phy); 235 236 /* 237 * EEE setttings 238 */ 239 int (*set_eee)(struct dsa_switch *ds, int port, 240 struct phy_device *phydev, 241 struct ethtool_eee *e); 242 int (*get_eee)(struct dsa_switch *ds, int port, 243 struct ethtool_eee *e); 244 }; 245 246 void register_switch_driver(struct dsa_switch_driver *type); 247 void unregister_switch_driver(struct dsa_switch_driver *type); 248 struct mii_bus *dsa_host_dev_to_mii_bus(struct device *dev); 249 250 static inline void *ds_to_priv(struct dsa_switch *ds) 251 { 252 return (void *)(ds + 1); 253 } 254 255 static inline bool dsa_uses_tagged_protocol(struct dsa_switch_tree *dst) 256 { 257 return dst->rcv != NULL; 258 } 259 #endif 260