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]; 33 u8 switch_port; 34 u8 __pad; 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 to_vnet_port(struct vio_driver_state * vio)43static 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 vnet_hashfn(u8 * mac)51static 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 58 struct vnet_mcast_entry { 59 u8 addr[ETH_ALEN]; 60 u8 sent; 61 u8 hit; 62 struct vnet_mcast_entry *next; 63 }; 64 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; 72 73 struct list_head port_list; 74 75 struct hlist_head port_hash[VNET_PORT_HASH_SIZE]; 76 77 struct vnet_mcast_entry *mcast_list; 78 79 struct list_head list; 80 u64 local_mac; 81 }; 82 83 #endif /* _SUNVNET_H */ 84