1 /* 2 * net/dsa/dsa_priv.h - Hardware switch handling 3 * Copyright (c) 2008 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 __DSA_PRIV_H 12 #define __DSA_PRIV_H 13 14 #include <linux/list.h> 15 #include <linux/phy.h> 16 #include <linux/timer.h> 17 #include <linux/workqueue.h> 18 #include <net/dsa.h> 19 20 struct dsa_switch { 21 /* 22 * Configuration data for the platform device that owns 23 * this dsa switch instance. 24 */ 25 struct dsa_platform_data *pd; 26 27 /* 28 * References to network device and mii bus to use. 29 */ 30 struct net_device *master_netdev; 31 struct mii_bus *master_mii_bus; 32 33 /* 34 * The used switch driver and frame tagging type. 35 */ 36 struct dsa_switch_driver *drv; 37 __be16 tag_protocol; 38 39 /* 40 * Slave mii_bus and devices for the individual ports. 41 */ 42 int cpu_port; 43 u32 valid_port_mask; 44 struct mii_bus *slave_mii_bus; 45 struct net_device *ports[DSA_MAX_PORTS]; 46 47 /* 48 * Link state polling. 49 */ 50 struct work_struct link_poll_work; 51 struct timer_list link_poll_timer; 52 }; 53 54 struct dsa_slave_priv { 55 struct net_device *dev; 56 struct dsa_switch *parent; 57 int port; 58 struct phy_device *phy; 59 }; 60 61 struct dsa_switch_driver { 62 struct list_head list; 63 64 __be16 tag_protocol; 65 int priv_size; 66 67 /* 68 * Probing and setup. 69 */ 70 char *(*probe)(struct mii_bus *bus, int sw_addr); 71 int (*setup)(struct dsa_switch *ds); 72 int (*set_addr)(struct dsa_switch *ds, u8 *addr); 73 74 /* 75 * Access to the switch's PHY registers. 76 */ 77 int (*phy_read)(struct dsa_switch *ds, int port, int regnum); 78 int (*phy_write)(struct dsa_switch *ds, int port, 79 int regnum, u16 val); 80 81 /* 82 * Link state polling and IRQ handling. 83 */ 84 void (*poll_link)(struct dsa_switch *ds); 85 86 /* 87 * ethtool hardware statistics. 88 */ 89 void (*get_strings)(struct dsa_switch *ds, int port, uint8_t *data); 90 void (*get_ethtool_stats)(struct dsa_switch *ds, 91 int port, uint64_t *data); 92 int (*get_sset_count)(struct dsa_switch *ds); 93 }; 94 95 /* dsa.c */ 96 extern char dsa_driver_version[]; 97 void register_switch_driver(struct dsa_switch_driver *type); 98 void unregister_switch_driver(struct dsa_switch_driver *type); 99 100 /* slave.c */ 101 void dsa_slave_mii_bus_init(struct dsa_switch *ds); 102 struct net_device *dsa_slave_create(struct dsa_switch *ds, 103 struct device *parent, 104 int port, char *name); 105 106 /* tag_dsa.c */ 107 int dsa_xmit(struct sk_buff *skb, struct net_device *dev); 108 109 /* tag_edsa.c */ 110 int edsa_xmit(struct sk_buff *skb, struct net_device *dev); 111 112 /* tag_trailer.c */ 113 int trailer_xmit(struct sk_buff *skb, struct net_device *dev); 114 115 116 #endif 117