• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)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 
vnet_hashfn(u8 * mac)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 
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