Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6.git] / drivers / net / sunvnet.h
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
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
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 */