diff options
Diffstat (limited to 'drivers/net/xen-netback/common.h')
-rw-r--r-- | drivers/net/xen-netback/common.h | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h new file mode 100644 index 000000000000..5d7bbf2b2ee7 --- /dev/null +++ b/drivers/net/xen-netback/common.h | |||
@@ -0,0 +1,161 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or | ||
3 | * modify it under the terms of the GNU General Public License version 2 | ||
4 | * as published by the Free Software Foundation; or, when distributed | ||
5 | * separately from the Linux kernel or incorporated into other | ||
6 | * software packages, subject to the following license: | ||
7 | * | ||
8 | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||
9 | * of this source file (the "Software"), to deal in the Software without | ||
10 | * restriction, including without limitation the rights to use, copy, modify, | ||
11 | * merge, publish, distribute, sublicense, and/or sell copies of the Software, | ||
12 | * and to permit persons to whom the Software is furnished to do so, subject to | ||
13 | * the following conditions: | ||
14 | * | ||
15 | * The above copyright notice and this permission notice shall be included in | ||
16 | * all copies or substantial portions of the Software. | ||
17 | * | ||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||
24 | * IN THE SOFTWARE. | ||
25 | */ | ||
26 | |||
27 | #ifndef __XEN_NETBACK__COMMON_H__ | ||
28 | #define __XEN_NETBACK__COMMON_H__ | ||
29 | |||
30 | #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__ | ||
31 | |||
32 | #include <linux/module.h> | ||
33 | #include <linux/interrupt.h> | ||
34 | #include <linux/slab.h> | ||
35 | #include <linux/ip.h> | ||
36 | #include <linux/in.h> | ||
37 | #include <linux/io.h> | ||
38 | #include <linux/netdevice.h> | ||
39 | #include <linux/etherdevice.h> | ||
40 | #include <linux/wait.h> | ||
41 | #include <linux/sched.h> | ||
42 | |||
43 | #include <xen/interface/io/netif.h> | ||
44 | #include <xen/interface/grant_table.h> | ||
45 | #include <xen/grant_table.h> | ||
46 | #include <xen/xenbus.h> | ||
47 | |||
48 | struct xen_netbk; | ||
49 | |||
50 | struct xenvif { | ||
51 | /* Unique identifier for this interface. */ | ||
52 | domid_t domid; | ||
53 | unsigned int handle; | ||
54 | |||
55 | /* Reference to netback processing backend. */ | ||
56 | struct xen_netbk *netbk; | ||
57 | |||
58 | u8 fe_dev_addr[6]; | ||
59 | |||
60 | /* Physical parameters of the comms window. */ | ||
61 | grant_handle_t tx_shmem_handle; | ||
62 | grant_ref_t tx_shmem_ref; | ||
63 | grant_handle_t rx_shmem_handle; | ||
64 | grant_ref_t rx_shmem_ref; | ||
65 | unsigned int irq; | ||
66 | |||
67 | /* List of frontends to notify after a batch of frames sent. */ | ||
68 | struct list_head notify_list; | ||
69 | |||
70 | /* The shared rings and indexes. */ | ||
71 | struct xen_netif_tx_back_ring tx; | ||
72 | struct xen_netif_rx_back_ring rx; | ||
73 | struct vm_struct *tx_comms_area; | ||
74 | struct vm_struct *rx_comms_area; | ||
75 | |||
76 | /* Flags that must not be set in dev->features */ | ||
77 | u32 features_disabled; | ||
78 | |||
79 | /* Frontend feature information. */ | ||
80 | u8 can_sg:1; | ||
81 | u8 gso:1; | ||
82 | u8 gso_prefix:1; | ||
83 | u8 csum:1; | ||
84 | |||
85 | /* Internal feature information. */ | ||
86 | u8 can_queue:1; /* can queue packets for receiver? */ | ||
87 | |||
88 | /* | ||
89 | * Allow xenvif_start_xmit() to peek ahead in the rx request | ||
90 | * ring. This is a prediction of what rx_req_cons will be | ||
91 | * once all queued skbs are put on the ring. | ||
92 | */ | ||
93 | RING_IDX rx_req_cons_peek; | ||
94 | |||
95 | /* Transmit shaping: allow 'credit_bytes' every 'credit_usec'. */ | ||
96 | unsigned long credit_bytes; | ||
97 | unsigned long credit_usec; | ||
98 | unsigned long remaining_credit; | ||
99 | struct timer_list credit_timeout; | ||
100 | |||
101 | /* Statistics */ | ||
102 | unsigned long rx_gso_checksum_fixup; | ||
103 | |||
104 | /* Miscellaneous private stuff. */ | ||
105 | struct list_head schedule_list; | ||
106 | atomic_t refcnt; | ||
107 | struct net_device *dev; | ||
108 | |||
109 | wait_queue_head_t waiting_to_free; | ||
110 | }; | ||
111 | |||
112 | #define XEN_NETIF_TX_RING_SIZE __RING_SIZE((struct xen_netif_tx_sring *)0, PAGE_SIZE) | ||
113 | #define XEN_NETIF_RX_RING_SIZE __RING_SIZE((struct xen_netif_rx_sring *)0, PAGE_SIZE) | ||
114 | |||
115 | struct xenvif *xenvif_alloc(struct device *parent, | ||
116 | domid_t domid, | ||
117 | unsigned int handle); | ||
118 | |||
119 | int xenvif_connect(struct xenvif *vif, unsigned long tx_ring_ref, | ||
120 | unsigned long rx_ring_ref, unsigned int evtchn); | ||
121 | void xenvif_disconnect(struct xenvif *vif); | ||
122 | |||
123 | void xenvif_get(struct xenvif *vif); | ||
124 | void xenvif_put(struct xenvif *vif); | ||
125 | |||
126 | int xenvif_xenbus_init(void); | ||
127 | |||
128 | int xenvif_schedulable(struct xenvif *vif); | ||
129 | |||
130 | int xen_netbk_rx_ring_full(struct xenvif *vif); | ||
131 | |||
132 | int xen_netbk_must_stop_queue(struct xenvif *vif); | ||
133 | |||
134 | /* (Un)Map communication rings. */ | ||
135 | void xen_netbk_unmap_frontend_rings(struct xenvif *vif); | ||
136 | int xen_netbk_map_frontend_rings(struct xenvif *vif, | ||
137 | grant_ref_t tx_ring_ref, | ||
138 | grant_ref_t rx_ring_ref); | ||
139 | |||
140 | /* (De)Register a xenvif with the netback backend. */ | ||
141 | void xen_netbk_add_xenvif(struct xenvif *vif); | ||
142 | void xen_netbk_remove_xenvif(struct xenvif *vif); | ||
143 | |||
144 | /* (De)Schedule backend processing for a xenvif */ | ||
145 | void xen_netbk_schedule_xenvif(struct xenvif *vif); | ||
146 | void xen_netbk_deschedule_xenvif(struct xenvif *vif); | ||
147 | |||
148 | /* Check for SKBs from frontend and schedule backend processing */ | ||
149 | void xen_netbk_check_rx_xenvif(struct xenvif *vif); | ||
150 | /* Receive an SKB from the frontend */ | ||
151 | void xenvif_receive_skb(struct xenvif *vif, struct sk_buff *skb); | ||
152 | |||
153 | /* Queue an SKB for transmission to the frontend */ | ||
154 | void xen_netbk_queue_tx_skb(struct xenvif *vif, struct sk_buff *skb); | ||
155 | /* Notify xenvif that ring now has space to send an skb to the frontend */ | ||
156 | void xenvif_notify_tx_completion(struct xenvif *vif); | ||
157 | |||
158 | /* Returns number of ring slots required to send an skb to the frontend */ | ||
159 | unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb); | ||
160 | |||
161 | #endif /* __XEN_NETBACK__COMMON_H__ */ | ||