2 * Copyright (c) 2016-2017 Microsoft Corp.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice unmodified, this list of conditions, and the following
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #define HN_USE_TXDESC_BUFRING
34 #define HN_CHIM_SIZE (15 * 1024 * 1024)
36 #define HN_RXBUF_SIZE (16 * 1024 * 1024)
37 #define HN_RXBUF_SIZE_COMPAT (15 * 1024 * 1024)
39 /* Claimed to be 12232B */
40 #define HN_MTU_MAX (9 * 1024)
42 #define HN_TXBR_SIZE (128 * PAGE_SIZE)
43 #define HN_RXBR_SIZE (128 * PAGE_SIZE)
45 #define HN_XACT_REQ_PGCNT 2
46 #define HN_XACT_RESP_PGCNT 2
47 #define HN_XACT_REQ_SIZE (HN_XACT_REQ_PGCNT * PAGE_SIZE)
48 #define HN_XACT_RESP_SIZE (HN_XACT_RESP_PGCNT * PAGE_SIZE)
50 #define HN_GPACNT_MAX 32
53 #ifndef HN_USE_TXDESC_BUFRING
54 SLIST_HEAD(hn_txdesc_list, hn_txdesc);
62 struct ifnet *hn_rxvf_ifp; /* SR-IOV VF for RX */
63 struct hn_tx_ring *hn_txr;
66 int hn_rx_flags; /* HN_RX_FLAG_ */
67 uint8_t *hn_rxbuf; /* shadow sc->hn_rxbuf */
70 /* Trust csum verification on host side */
71 int hn_trust_hcsum; /* HN_TRUST_HCSUM_ */
72 struct lro_ctrl hn_lro;
77 u_long hn_csum_trusted;
84 /* Rarely used stuffs */
85 struct sysctl_oid *hn_rx_sysctl_tree;
87 void *hn_br; /* TX/RX bufring */
88 struct hyperv_dma hn_br_dma;
90 struct vmbus_channel *hn_chan;
91 } __aligned(CACHE_LINE_SIZE);
93 #define HN_TRUST_HCSUM_IP 0x0001
94 #define HN_TRUST_HCSUM_TCP 0x0002
95 #define HN_TRUST_HCSUM_UDP 0x0004
97 #define HN_RX_FLAG_ATTACHED 0x0001
98 #define HN_RX_FLAG_BR_REF 0x0002
99 #define HN_RX_FLAG_XPNT_VF 0x0004
102 #ifndef HN_USE_TXDESC_BUFRING
103 struct mtx hn_txlist_spin;
104 struct hn_txdesc_list hn_txlist;
106 struct buf_ring *hn_txdesc_br;
110 u_short hn_has_txeof;
111 u_short hn_txdone_cnt;
114 void (*hn_txeof)(struct hn_tx_ring *);
115 struct taskqueue *hn_tx_taskq;
116 struct task hn_tx_task;
117 struct task hn_txeof_task;
119 struct buf_ring *hn_mbuf_br;
124 struct mtx hn_tx_lock;
125 struct hn_softc *hn_sc;
126 struct vmbus_channel *hn_chan;
128 int hn_direct_tx_size;
130 bus_dma_tag_t hn_tx_data_dtag;
131 uint64_t hn_csum_assist;
133 /* Applied packet transmission aggregation limits. */
138 /* Packet transmission aggregation states. */
139 struct hn_txdesc *hn_agg_txd;
141 short hn_agg_pktleft;
142 struct rndis_packet_msg *hn_agg_prevpkt;
144 /* Temporary stats for each sends. */
147 short hn_stat_mcasts;
149 int (*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *);
152 struct vmbus_gpa hn_gpa[HN_GPACNT_MAX];
154 u_long hn_no_txdescs;
155 u_long hn_send_failed;
156 u_long hn_txdma_failed;
157 u_long hn_tx_collapsed;
158 u_long hn_tx_chimney_tried;
159 u_long hn_tx_chimney;
162 u_long hn_flush_failed;
164 /* Rarely used stuffs */
165 struct hn_txdesc *hn_txdesc;
166 bus_dma_tag_t hn_tx_rndis_dtag;
167 struct sysctl_oid *hn_tx_sysctl_tree;
168 } __aligned(CACHE_LINE_SIZE);
170 #define HN_TX_FLAG_ATTACHED 0x0001
171 #define HN_TX_FLAG_HASHVAL 0x0002 /* support HASHVAL pktinfo */
174 * Device-specific softc structure
177 struct ifnet *hn_ifp;
178 struct arpcom arpcom;
179 struct ifmedia hn_media;
183 struct vmbus_channel *hn_prichan;
186 int hn_rx_ring_inuse;
187 struct hn_rx_ring *hn_rx_ring;
189 struct rmlock hn_vf_lock;
190 struct ifnet *hn_vf_ifp; /* SR-IOV VF */
191 uint32_t hn_xvf_flags; /* transparent VF flags */
194 int hn_tx_ring_inuse;
195 struct hn_tx_ring *hn_tx_ring;
198 u_long *hn_chim_bmap;
199 int hn_chim_bmap_cnt;
204 struct taskqueue **hn_tx_taskqs;
205 struct sysctl_oid *hn_tx_sysctl_tree;
206 struct sysctl_oid *hn_rx_sysctl_tree;
207 struct vmbus_xact_ctx *hn_xact;
209 uint32_t hn_rx_filter;
211 /* Packet transmission aggregation user settings. */
215 struct taskqueue *hn_mgmt_taskq;
216 struct taskqueue *hn_mgmt_taskq0;
217 struct task hn_link_task;
218 struct task hn_netchg_init;
219 struct timeout_task hn_netchg_status;
220 uint32_t hn_link_flags; /* HN_LINK_FLAG_ */
222 uint32_t hn_caps; /* HN_CAP_ */
223 uint32_t hn_flags; /* HN_FLAG_ */
227 uint32_t hn_rxbuf_gpadl;
228 struct hyperv_dma hn_rxbuf_dma;
230 uint32_t hn_chim_gpadl;
231 struct hyperv_dma hn_chim_dma;
233 uint32_t hn_rndis_rid;
234 uint32_t hn_ndis_ver;
235 int hn_ndis_tso_szmax;
236 int hn_ndis_tso_sgmin;
237 uint32_t hn_rndis_agg_size;
238 uint32_t hn_rndis_agg_pkts;
239 uint32_t hn_rndis_agg_align;
242 uint32_t hn_rss_hash; /* NDIS_HASH_ */
243 struct ndis_rssprm_toeplitz hn_rss;
245 eventhandler_tag hn_ifaddr_evthand;
246 eventhandler_tag hn_ifnet_evthand;
247 eventhandler_tag hn_ifnet_atthand;
248 eventhandler_tag hn_ifnet_dethand;
249 eventhandler_tag hn_ifnet_lnkhand;
252 * Transparent VF delayed initialization.
254 int hn_vf_rdytick; /* ticks, 0 == ready */
255 struct taskqueue *hn_vf_taskq;
256 struct timeout_task hn_vf_init;
259 * Saved information for VF under transparent mode.
262 (struct ifnet *, struct mbuf *);
264 u_int hn_saved_tsomax;
265 u_int hn_saved_tsosegcnt;
266 u_int hn_saved_tsosegsz;
269 #define HN_FLAG_RXBUF_CONNECTED 0x0001
270 #define HN_FLAG_CHIM_CONNECTED 0x0002
271 #define HN_FLAG_HAS_RSSKEY 0x0004
272 #define HN_FLAG_HAS_RSSIND 0x0008
273 #define HN_FLAG_SYNTH_ATTACHED 0x0010
274 #define HN_FLAG_NO_SLEEPING 0x0020
275 #define HN_FLAG_RXBUF_REF 0x0040
276 #define HN_FLAG_CHIM_REF 0x0080
277 #define HN_FLAG_RXVF 0x0100
279 #define HN_FLAG_ERRORS (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)
281 #define HN_XVFFLAG_ENABLED 0x0001
282 #define HN_XVFFLAG_ACCBPF 0x0002
284 #define HN_NO_SLEEPING(sc) \
286 (sc)->hn_flags |= HN_FLAG_NO_SLEEPING; \
289 #define HN_SLEEPING_OK(sc) \
291 (sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING; \
294 #define HN_CAN_SLEEP(sc) \
295 (((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0)
297 #define HN_CAP_VLAN 0x0001
298 #define HN_CAP_MTU 0x0002
299 #define HN_CAP_IPCS 0x0004
300 #define HN_CAP_TCP4CS 0x0008
301 #define HN_CAP_TCP6CS 0x0010
302 #define HN_CAP_UDP4CS 0x0020
303 #define HN_CAP_UDP6CS 0x0040
304 #define HN_CAP_TSO4 0x0080
305 #define HN_CAP_TSO6 0x0100
306 #define HN_CAP_HASHVAL 0x0200
308 /* Capability description for use with printf(9) %b identifier. */
309 #define HN_CAP_BITS \
310 "\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS" \
311 "\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL"
313 #define HN_LINK_FLAG_LINKUP 0x0001
314 #define HN_LINK_FLAG_NETCHG 0x0002
316 #endif /* !_IF_HNVAR_H_ */