2016-03-15 11:35:37 -07:00
# ifndef _SUNVNETCOMMON_H
# define _SUNVNETCOMMON_H
2007-07-09 22:23:51 -07:00
2014-08-13 10:29:41 -04:00
# include <linux/interrupt.h>
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
*/
2016-03-15 11:35:37 -07:00
# define VNET_CLEAN_TIMEOUT ((HZ / 100) + 1)
2014-09-29 19:48:11 -04:00
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 */
2016-10-17 15:54:10 -04:00
# define VNET_MAX_MTU 65535
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
2016-03-15 11:35:37 -07:00
# define VNET_MAXCOOKIES (VNET_MAXPACKET / PAGE_SIZE + 1)
# define VNET_MAX_TXQS 16
2014-09-29 19:48:18 -04:00
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 ;
2016-03-15 11:35:38 -07:00
2017-03-14 10:24:40 -07:00
struct vnet_port_stats {
/* keep them all the same size */
u32 rx_bytes ;
u32 tx_bytes ;
u32 rx_packets ;
u32 tx_packets ;
u32 event_up ;
u32 event_reset ;
u32 q_placeholder ;
} ;
# define NUM_VNET_PORT_STATS (sizeof(struct vnet_port_stats) / sizeof(u32))
2016-03-15 11:35:38 -07: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-09 22:23:51 -07:00
struct vnet_port {
struct vio_driver_state vio ;
2017-03-14 10:24:40 -07:00
struct vnet_port_stats stats ;
2007-07-09 22:23:51 -07:00
struct hlist_node hash ;
u8 raddr [ ETH_ALEN ] ;
2014-12-02 15:31:38 -05:00
unsigned switch_port : 1 ;
unsigned tso : 1 ;
2016-03-15 11:35:38 -07:00
unsigned vsw : 1 ;
unsigned __pad : 13 ;
2007-07-09 22:23:51 -07:00
struct vnet * vp ;
2016-03-15 11:35:38 -07:00
struct net_device * dev ;
2007-07-09 22:23:51 -07:00
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 {
2017-03-14 10:24:41 -07:00
spinlock_t lock ; /* Protects port_list and port_hash. */
2007-07-09 22:23:51 -07:00
struct net_device * dev ;
u32 msg_enable ;
2017-03-14 10:24:41 -07:00
u8 q_used [ VNET_MAX_TXQS ] ;
2007-07-09 22:23:51 -07:00
struct list_head port_list ;
struct hlist_head port_hash [ VNET_PORT_HASH_SIZE ] ;
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-10-30 12:46:09 -04:00
int nports ;
2007-07-09 22:23:51 -07:00
} ;
2016-03-15 11:35:38 -07: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 11:35:37 -07: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 11:35:38 -07:00
void sunvnet_set_rx_mode_common ( struct net_device * dev , struct vnet * vp ) ;
2016-03-15 11:35:37 -07: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 11:35:38 -07: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 11:35:37 -07:00
# ifdef CONFIG_NET_POLL_CONTROLLER
2016-03-15 11:35:38 -07:00
void sunvnet_poll_controller_common ( struct net_device * dev , struct vnet * vp ) ;
2016-03-15 11:35:37 -07: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 ) ;
2017-03-14 10:24:39 -07:00
void vnet_port_reset ( struct vnet_port * port ) ;
2016-03-15 11:35:38 -07:00
bool sunvnet_port_is_up_common ( struct vnet_port * vnet ) ;
2016-03-15 11:35:37 -07:00
void sunvnet_port_add_txq_common ( struct vnet_port * port ) ;
void sunvnet_port_rm_txq_common ( struct vnet_port * port ) ;
# endif /* _SUNVNETCOMMON_H */