2016-03-15 21:35:37 +03:00
# ifndef _SUNVNETCOMMON_H
# define _SUNVNETCOMMON_H
2007-07-10 09:23:51 +04:00
2014-08-13 18:29:41 +04:00
# include <linux/interrupt.h>
2014-09-30 03: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
*/
2016-03-15 21:35:37 +03:00
# define VNET_CLEAN_TIMEOUT ((HZ / 100) + 1)
2014-09-30 03:48:11 +04:00
2014-09-30 03:48:18 +04:00
# define VNET_MAXPACKET (65535ULL + ETH_HLEN + VLAN_HLEN)
2007-07-10 09:23:51 +04:00
# define VNET_TX_RING_SIZE 512
# define VNET_TX_WAKEUP_THRESH(dr) ((dr)->pending / 4)
2014-12-02 23:31:38 +03:00
# define VNET_MINTSO 2048 /* VIO protocol's minimum TSO len */
# define VNET_MAXTSO 65535 /* VIO protocol's maximum TSO len */
2016-10-17 22:54:10 +03:00
# define VNET_MAX_MTU 65535
2007-07-10 09:23:51 +04: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
2016-03-15 21:35:37 +03:00
# define VNET_MAXCOOKIES (VNET_MAXPACKET / PAGE_SIZE + 1)
# define VNET_MAX_TXQS 16
2014-09-30 03:48:18 +04:00
2007-07-10 09:23:51 +04:00
struct vnet_tx_entry {
2014-09-30 03:48:11 +04:00
struct sk_buff * skb ;
2007-07-10 09:23:51 +04:00
unsigned int ncookies ;
2014-09-30 03:48:18 +04:00
struct ldc_trans_cookie cookies [ VNET_MAXCOOKIES ] ;
2007-07-10 09:23:51 +04:00
} ;
struct vnet ;
2016-03-15 21:35:38 +03:00
/* Structure to describe a vnet-port or vsw-port in the MD.
* If the vsw bit is set , this structure represents a vswitch
* port , and the net_device can be found from - > dev . If the
* vsw bit is not set , the net_device is available from - > vp - > dev .
* See the VNET_PORT_TO_NET_DEVICE macro below .
*/
2007-07-10 09:23:51 +04:00
struct vnet_port {
struct vio_driver_state vio ;
struct hlist_node hash ;
u8 raddr [ ETH_ALEN ] ;
2014-12-02 23:31:38 +03:00
unsigned switch_port : 1 ;
unsigned tso : 1 ;
2016-03-15 21:35:38 +03:00
unsigned vsw : 1 ;
unsigned __pad : 13 ;
2007-07-10 09:23:51 +04:00
struct vnet * vp ;
2016-03-15 21:35:38 +03:00
struct net_device * dev ;
2007-07-10 09:23:51 +04:00
struct vnet_tx_entry tx_bufs [ VNET_TX_RING_SIZE ] ;
struct list_head list ;
2014-09-11 17:57:22 +04:00
u32 stop_rx_idx ;
bool stop_rx ;
bool start_cons ;
2014-09-30 03:47:59 +04:00
2014-09-30 03:48:11 +04:00
struct timer_list clean_timer ;
2014-09-30 03:47:59 +04:00
u64 rmtu ;
2014-12-02 23:31:38 +03:00
u16 tsolen ;
2014-10-25 23:12:12 +04:00
struct napi_struct napi ;
u32 napi_stop_idx ;
bool napi_resume ;
int rx_event ;
2014-10-30 19:46:09 +03:00
u16 q_index ;
2007-07-10 09:23:51 +04: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 13:30:25 +04:00
struct vnet_mcast_entry {
u8 addr [ ETH_ALEN ] ;
u8 sent ;
u8 hit ;
struct vnet_mcast_entry * next ;
} ;
2007-07-10 09:23:51 +04: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-18 09:19:10 +04:00
2007-07-20 13:30:25 +04:00
struct vnet_mcast_entry * mcast_list ;
2007-07-18 09:19:10 +04:00
struct list_head list ;
u64 local_mac ;
2014-08-13 18:29:41 +04:00
2014-10-30 19:46:09 +03:00
int nports ;
2007-07-10 09:23:51 +04:00
} ;
2016-03-15 21:35:38 +03:00
/* Def used by common code to get the net_device from the proper location */
# define VNET_PORT_TO_NET_DEVICE(__port) \
( ( __port ) - > vsw ? ( __port ) - > dev : ( __port ) - > vp - > dev )
2016-03-15 21:35:37 +03:00
/* Common funcs */
void sunvnet_clean_timer_expire_common ( unsigned long port0 ) ;
int sunvnet_open_common ( struct net_device * dev ) ;
int sunvnet_close_common ( struct net_device * dev ) ;
2016-03-15 21:35:38 +03:00
void sunvnet_set_rx_mode_common ( struct net_device * dev , struct vnet * vp ) ;
2016-03-15 21:35:37 +03:00
int sunvnet_set_mac_addr_common ( struct net_device * dev , void * p ) ;
void sunvnet_tx_timeout_common ( struct net_device * dev ) ;
2016-03-15 21:35:38 +03:00
int sunvnet_start_xmit_common ( struct sk_buff * skb , struct net_device * dev ,
struct vnet_port * ( * vnet_tx_port )
( struct sk_buff * , struct net_device * ) ) ;
2016-03-15 21:35:37 +03:00
# ifdef CONFIG_NET_POLL_CONTROLLER
2016-03-15 21:35:38 +03:00
void sunvnet_poll_controller_common ( struct net_device * dev , struct vnet * vp ) ;
2016-03-15 21:35:37 +03:00
# endif
void sunvnet_event_common ( void * arg , int event ) ;
int sunvnet_send_attr_common ( struct vio_driver_state * vio ) ;
int sunvnet_handle_attr_common ( struct vio_driver_state * vio , void * arg ) ;
void sunvnet_handshake_complete_common ( struct vio_driver_state * vio ) ;
int sunvnet_poll_common ( struct napi_struct * napi , int budget ) ;
void sunvnet_port_free_tx_bufs_common ( struct vnet_port * port ) ;
2016-03-15 21:35:38 +03:00
bool sunvnet_port_is_up_common ( struct vnet_port * vnet ) ;
2016-03-15 21:35:37 +03:00
void sunvnet_port_add_txq_common ( struct vnet_port * port ) ;
void sunvnet_port_rm_txq_common ( struct vnet_port * port ) ;
# endif /* _SUNVNETCOMMON_H */