2007-07-09 22:23:51 -07:00
# ifndef _SUNVNET_H
# define _SUNVNET_H
2014-08-13 10:29:41 -04:00
# include <linux/interrupt.h>
2007-07-09 22:23:51 -07:00
# define DESC_NCOOKIES(entry_size) \
( ( entry_size ) - sizeof ( struct vio_net_desc ) )
/* length of time before we decide the hardware is borked,
* and dev - > tx_timeout ( ) should be called to fix the problem
*/
# define VNET_TX_TIMEOUT (5 * HZ)
2014-09-29 19:48:11 -04:00
/* length of time (or less) we expect pending descriptors to be marked
* as VIO_DESC_DONE and skbs ready to be freed
*/
# define VNET_CLEAN_TIMEOUT ((HZ / 100)+1)
2014-09-29 19:48:18 -04:00
# define VNET_MAXPACKET (65535ULL + ETH_HLEN + VLAN_HLEN)
2007-07-09 22:23:51 -07:00
# define VNET_TX_RING_SIZE 512
# define VNET_TX_WAKEUP_THRESH(dr) ((dr)->pending / 4)
2014-12-02 15:31:38 -05:00
# define VNET_MINTSO 2048 /* VIO protocol's minimum TSO len */
# define VNET_MAXTSO 65535 /* VIO protocol's maximum TSO len */
2007-07-09 22:23:51 -07:00
/* VNET packets are sent in buffers with the first 6 bytes skipped
* so that after the ethernet header the IPv4 / IPv6 headers are aligned
* properly .
*/
# define VNET_PACKET_SKIP 6
2014-09-29 19:48:18 -04:00
# define VNET_MAXCOOKIES (VNET_MAXPACKET / PAGE_SIZE + 1)
2007-07-09 22:23:51 -07:00
struct vnet_tx_entry {
2014-09-29 19:48:11 -04:00
struct sk_buff * skb ;
2007-07-09 22:23:51 -07:00
unsigned int ncookies ;
2014-09-29 19:48:18 -04:00
struct ldc_trans_cookie cookies [ VNET_MAXCOOKIES ] ;
2007-07-09 22:23:51 -07:00
} ;
struct vnet ;
struct vnet_port {
struct vio_driver_state vio ;
struct hlist_node hash ;
u8 raddr [ ETH_ALEN ] ;
2014-12-02 15:31:38 -05:00
unsigned switch_port : 1 ;
unsigned tso : 1 ;
unsigned __pad : 14 ;
2007-07-09 22:23:51 -07:00
struct vnet * vp ;
struct vnet_tx_entry tx_bufs [ VNET_TX_RING_SIZE ] ;
struct list_head list ;
2014-09-11 09:57:22 -04:00
u32 stop_rx_idx ;
bool stop_rx ;
bool start_cons ;
2014-09-29 19:47:59 -04:00
2014-09-29 19:48:11 -04:00
struct timer_list clean_timer ;
2014-09-29 19:47:59 -04:00
u64 rmtu ;
2014-12-02 15:31:38 -05:00
u16 tsolen ;
2014-10-25 15:12:12 -04:00
struct napi_struct napi ;
u32 napi_stop_idx ;
bool napi_resume ;
int rx_event ;
2014-10-30 12:46:09 -04:00
u16 q_index ;
2007-07-09 22:23:51 -07:00
} ;
static inline struct vnet_port * to_vnet_port ( struct vio_driver_state * vio )
{
return container_of ( vio , struct vnet_port , vio ) ;
}
# define VNET_PORT_HASH_SIZE 16
# define VNET_PORT_HASH_MASK (VNET_PORT_HASH_SIZE - 1)
static inline unsigned int vnet_hashfn ( u8 * mac )
{
unsigned int val = mac [ 4 ] ^ mac [ 5 ] ;
return val & ( VNET_PORT_HASH_MASK ) ;
}
2007-07-20 02:30:25 -07:00
struct vnet_mcast_entry {
u8 addr [ ETH_ALEN ] ;
u8 sent ;
u8 hit ;
struct vnet_mcast_entry * next ;
} ;
2007-07-09 22:23:51 -07:00
struct vnet {
/* Protects port_list and port_hash. */
spinlock_t lock ;
struct net_device * dev ;
u32 msg_enable ;
struct list_head port_list ;
struct hlist_head port_hash [ VNET_PORT_HASH_SIZE ] ;
2007-07-17 22:19:10 -07:00
2007-07-20 02:30:25 -07:00
struct vnet_mcast_entry * mcast_list ;
2007-07-17 22:19:10 -07:00
struct list_head list ;
u64 local_mac ;
2014-08-13 10:29:41 -04:00
2014-10-30 12:46:09 -04:00
int nports ;
2007-07-09 22:23:51 -07:00
} ;
# endif /* _SUNVNET_H */