| David S. Miller | 4c521e4 | 2007-07-09 22:23:51 -0700 | [diff] [blame] | 1 | #ifndef _SUNVNET_H | 
|  | 2 | #define _SUNVNET_H | 
|  | 3 |  | 
|  | 4 | #define DESC_NCOOKIES(entry_size)	\ | 
|  | 5 | ((entry_size) - sizeof(struct vio_net_desc)) | 
|  | 6 |  | 
|  | 7 | /* length of time before we decide the hardware is borked, | 
|  | 8 | * and dev->tx_timeout() should be called to fix the problem | 
|  | 9 | */ | 
|  | 10 | #define VNET_TX_TIMEOUT			(5 * HZ) | 
|  | 11 |  | 
|  | 12 | #define VNET_TX_RING_SIZE		512 | 
|  | 13 | #define VNET_TX_WAKEUP_THRESH(dr)	((dr)->pending / 4) | 
|  | 14 |  | 
|  | 15 | /* VNET packets are sent in buffers with the first 6 bytes skipped | 
|  | 16 | * so that after the ethernet header the IPv4/IPv6 headers are aligned | 
|  | 17 | * properly. | 
|  | 18 | */ | 
|  | 19 | #define VNET_PACKET_SKIP		6 | 
|  | 20 |  | 
|  | 21 | struct vnet_tx_entry { | 
|  | 22 | void			*buf; | 
|  | 23 | unsigned int		ncookies; | 
|  | 24 | struct ldc_trans_cookie	cookies[2]; | 
|  | 25 | }; | 
|  | 26 |  | 
|  | 27 | struct vnet; | 
|  | 28 | struct vnet_port { | 
|  | 29 | struct vio_driver_state	vio; | 
|  | 30 |  | 
|  | 31 | struct hlist_node	hash; | 
|  | 32 | u8			raddr[ETH_ALEN]; | 
| David S. Miller | 028ebff | 2007-07-20 02:30:25 -0700 | [diff] [blame] | 33 | u8			switch_port; | 
|  | 34 | u8			__pad; | 
| David S. Miller | 4c521e4 | 2007-07-09 22:23:51 -0700 | [diff] [blame] | 35 |  | 
|  | 36 | struct vnet		*vp; | 
|  | 37 |  | 
|  | 38 | struct vnet_tx_entry	tx_bufs[VNET_TX_RING_SIZE]; | 
|  | 39 |  | 
|  | 40 | struct list_head	list; | 
|  | 41 | }; | 
|  | 42 |  | 
|  | 43 | static inline struct vnet_port *to_vnet_port(struct vio_driver_state *vio) | 
|  | 44 | { | 
|  | 45 | return container_of(vio, struct vnet_port, vio); | 
|  | 46 | } | 
|  | 47 |  | 
|  | 48 | #define VNET_PORT_HASH_SIZE	16 | 
|  | 49 | #define VNET_PORT_HASH_MASK	(VNET_PORT_HASH_SIZE - 1) | 
|  | 50 |  | 
|  | 51 | static inline unsigned int vnet_hashfn(u8 *mac) | 
|  | 52 | { | 
|  | 53 | unsigned int val = mac[4] ^ mac[5]; | 
|  | 54 |  | 
|  | 55 | return val & (VNET_PORT_HASH_MASK); | 
|  | 56 | } | 
|  | 57 |  | 
| David S. Miller | 028ebff | 2007-07-20 02:30:25 -0700 | [diff] [blame] | 58 | struct vnet_mcast_entry { | 
|  | 59 | u8			addr[ETH_ALEN]; | 
|  | 60 | u8			sent; | 
|  | 61 | u8			hit; | 
|  | 62 | struct vnet_mcast_entry	*next; | 
|  | 63 | }; | 
|  | 64 |  | 
| David S. Miller | 4c521e4 | 2007-07-09 22:23:51 -0700 | [diff] [blame] | 65 | struct vnet { | 
|  | 66 | /* Protects port_list and port_hash.  */ | 
|  | 67 | spinlock_t		lock; | 
|  | 68 |  | 
|  | 69 | struct net_device	*dev; | 
|  | 70 |  | 
|  | 71 | u32			msg_enable; | 
| David S. Miller | 4c521e4 | 2007-07-09 22:23:51 -0700 | [diff] [blame] | 72 |  | 
|  | 73 | struct list_head	port_list; | 
|  | 74 |  | 
|  | 75 | struct hlist_head	port_hash[VNET_PORT_HASH_SIZE]; | 
| David S. Miller | 9184a04 | 2007-07-17 22:19:10 -0700 | [diff] [blame] | 76 |  | 
| David S. Miller | 028ebff | 2007-07-20 02:30:25 -0700 | [diff] [blame] | 77 | struct vnet_mcast_entry	*mcast_list; | 
|  | 78 |  | 
| David S. Miller | 9184a04 | 2007-07-17 22:19:10 -0700 | [diff] [blame] | 79 | struct list_head	list; | 
|  | 80 | u64			local_mac; | 
| David S. Miller | 4c521e4 | 2007-07-09 22:23:51 -0700 | [diff] [blame] | 81 | }; | 
|  | 82 |  | 
|  | 83 | #endif /* _SUNVNET_H */ |