if_hnvar.h revision 322135
1/*- 2 * Copyright (c) 2016 Microsoft Corp. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 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. 14 * 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. 25 * 26 * $FreeBSD: stable/11/sys/dev/hyperv/netvsc/if_hnvar.h 322135 2017-08-07 03:03:40Z sephe $ 27 */ 28 29#ifndef _IF_HNVAR_H_ 30#define _IF_HNVAR_H_ 31 32#define HN_USE_TXDESC_BUFRING 33 34#define HN_CHIM_SIZE (15 * 1024 * 1024) 35 36#define HN_RXBUF_SIZE (16 * 1024 * 1024) 37#define HN_RXBUF_SIZE_COMPAT (15 * 1024 * 1024) 38 39/* Claimed to be 12232B */ 40#define HN_MTU_MAX (9 * 1024) 41 42#define HN_TXBR_SIZE (128 * PAGE_SIZE) 43#define HN_RXBR_SIZE (128 * PAGE_SIZE) 44 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) 49 50#define HN_GPACNT_MAX 32 51 52struct hn_txdesc; 53#ifndef HN_USE_TXDESC_BUFRING 54SLIST_HEAD(hn_txdesc_list, hn_txdesc); 55#else 56struct buf_ring; 57#endif 58struct hn_tx_ring; 59 60struct hn_rx_ring { 61 struct ifnet *hn_ifp; 62 struct ifnet *hn_rxvf_ifp; /* SR-IOV VF for RX */ 63 struct hn_tx_ring *hn_txr; 64 void *hn_pktbuf; 65 int hn_pktbuf_len; 66 uint8_t *hn_rxbuf; /* shadow sc->hn_rxbuf */ 67 int hn_rx_idx; 68 69 /* Trust csum verification on host side */ 70 int hn_trust_hcsum; /* HN_TRUST_HCSUM_ */ 71 struct lro_ctrl hn_lro; 72 73 u_long hn_csum_ip; 74 u_long hn_csum_tcp; 75 u_long hn_csum_udp; 76 u_long hn_csum_trusted; 77 u_long hn_lro_tried; 78 u_long hn_small_pkts; 79 u_long hn_pkts; 80 u_long hn_rss_pkts; 81 u_long hn_ack_failed; 82 83 /* Rarely used stuffs */ 84 struct sysctl_oid *hn_rx_sysctl_tree; 85 int hn_rx_flags; 86 87 void *hn_br; /* TX/RX bufring */ 88 struct hyperv_dma hn_br_dma; 89 90 struct vmbus_channel *hn_chan; 91} __aligned(CACHE_LINE_SIZE); 92 93#define HN_TRUST_HCSUM_IP 0x0001 94#define HN_TRUST_HCSUM_TCP 0x0002 95#define HN_TRUST_HCSUM_UDP 0x0004 96 97#define HN_RX_FLAG_ATTACHED 0x0001 98#define HN_RX_FLAG_BR_REF 0x0002 99 100struct hn_tx_ring { 101#ifndef HN_USE_TXDESC_BUFRING 102 struct mtx hn_txlist_spin; 103 struct hn_txdesc_list hn_txlist; 104#else 105 struct buf_ring *hn_txdesc_br; 106#endif 107 int hn_txdesc_cnt; 108 int hn_txdesc_avail; 109 u_short hn_has_txeof; 110 u_short hn_txdone_cnt; 111 112 int hn_sched_tx; 113 void (*hn_txeof)(struct hn_tx_ring *); 114 struct taskqueue *hn_tx_taskq; 115 struct task hn_tx_task; 116 struct task hn_txeof_task; 117 118 struct buf_ring *hn_mbuf_br; 119 int hn_oactive; 120 int hn_tx_idx; 121 int hn_tx_flags; 122 123 struct mtx hn_tx_lock; 124 struct hn_softc *hn_sc; 125 struct vmbus_channel *hn_chan; 126 127 int hn_direct_tx_size; 128 int hn_chim_size; 129 bus_dma_tag_t hn_tx_data_dtag; 130 uint64_t hn_csum_assist; 131 132 /* Applied packet transmission aggregation limits. */ 133 int hn_agg_szmax; 134 short hn_agg_pktmax; 135 short hn_agg_align; 136 137 /* Packet transmission aggregation states. */ 138 struct hn_txdesc *hn_agg_txd; 139 int hn_agg_szleft; 140 short hn_agg_pktleft; 141 struct rndis_packet_msg *hn_agg_prevpkt; 142 143 /* Temporary stats for each sends. */ 144 int hn_stat_size; 145 short hn_stat_pkts; 146 short hn_stat_mcasts; 147 148 int (*hn_sendpkt)(struct hn_tx_ring *, struct hn_txdesc *); 149 int hn_suspended; 150 int hn_gpa_cnt; 151 struct vmbus_gpa hn_gpa[HN_GPACNT_MAX]; 152 153 u_long hn_no_txdescs; 154 u_long hn_send_failed; 155 u_long hn_txdma_failed; 156 u_long hn_tx_collapsed; 157 u_long hn_tx_chimney_tried; 158 u_long hn_tx_chimney; 159 u_long hn_pkts; 160 u_long hn_sends; 161 u_long hn_flush_failed; 162 163 /* Rarely used stuffs */ 164 struct hn_txdesc *hn_txdesc; 165 bus_dma_tag_t hn_tx_rndis_dtag; 166 struct sysctl_oid *hn_tx_sysctl_tree; 167} __aligned(CACHE_LINE_SIZE); 168 169#define HN_TX_FLAG_ATTACHED 0x0001 170#define HN_TX_FLAG_HASHVAL 0x0002 /* support HASHVAL pktinfo */ 171 172/* 173 * Device-specific softc structure 174 */ 175struct hn_softc { 176 struct ifnet *hn_ifp; 177 struct ifnet *hn_vf_ifp; /* SR-IOV VF */ 178 struct ifmedia hn_media; 179 device_t hn_dev; 180 int hn_if_flags; 181 struct sx hn_lock; 182 struct vmbus_channel *hn_prichan; 183 184 int hn_rx_ring_cnt; 185 int hn_rx_ring_inuse; 186 struct hn_rx_ring *hn_rx_ring; 187 188 int hn_tx_ring_cnt; 189 int hn_tx_ring_inuse; 190 struct hn_tx_ring *hn_tx_ring; 191 192 uint8_t *hn_chim; 193 u_long *hn_chim_bmap; 194 int hn_chim_bmap_cnt; 195 int hn_chim_cnt; 196 int hn_chim_szmax; 197 198 int hn_cpu; 199 struct taskqueue **hn_tx_taskqs; 200 struct sysctl_oid *hn_tx_sysctl_tree; 201 struct sysctl_oid *hn_rx_sysctl_tree; 202 struct vmbus_xact_ctx *hn_xact; 203 uint32_t hn_nvs_ver; 204 uint32_t hn_rx_filter; 205 206 /* Packet transmission aggregation user settings. */ 207 int hn_agg_size; 208 int hn_agg_pkts; 209 210 struct taskqueue *hn_mgmt_taskq; 211 struct taskqueue *hn_mgmt_taskq0; 212 struct task hn_link_task; 213 struct task hn_netchg_init; 214 struct timeout_task hn_netchg_status; 215 uint32_t hn_link_flags; /* HN_LINK_FLAG_ */ 216 217 uint32_t hn_caps; /* HN_CAP_ */ 218 uint32_t hn_flags; /* HN_FLAG_ */ 219 u_int hn_pollhz; 220 221 void *hn_rxbuf; 222 uint32_t hn_rxbuf_gpadl; 223 struct hyperv_dma hn_rxbuf_dma; 224 225 uint32_t hn_chim_gpadl; 226 struct hyperv_dma hn_chim_dma; 227 228 uint32_t hn_rndis_rid; 229 uint32_t hn_ndis_ver; 230 int hn_ndis_tso_szmax; 231 int hn_ndis_tso_sgmin; 232 uint32_t hn_rndis_agg_size; 233 uint32_t hn_rndis_agg_pkts; 234 uint32_t hn_rndis_agg_align; 235 236 int hn_rss_ind_size; 237 uint32_t hn_rss_hash; /* NDIS_HASH_ */ 238 struct ndis_rssprm_toeplitz hn_rss; 239 240 eventhandler_tag hn_ifaddr_evthand; 241 eventhandler_tag hn_ifnet_evthand; 242 eventhandler_tag hn_ifnet_atthand; 243 eventhandler_tag hn_ifnet_dethand; 244}; 245 246#define HN_FLAG_RXBUF_CONNECTED 0x0001 247#define HN_FLAG_CHIM_CONNECTED 0x0002 248#define HN_FLAG_HAS_RSSKEY 0x0004 249#define HN_FLAG_HAS_RSSIND 0x0008 250#define HN_FLAG_SYNTH_ATTACHED 0x0010 251#define HN_FLAG_NO_SLEEPING 0x0020 252#define HN_FLAG_RXBUF_REF 0x0040 253#define HN_FLAG_CHIM_REF 0x0080 254#define HN_FLAG_RXVF 0x0100 255 256#define HN_FLAG_ERRORS (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF) 257 258#define HN_NO_SLEEPING(sc) \ 259do { \ 260 (sc)->hn_flags |= HN_FLAG_NO_SLEEPING; \ 261} while (0) 262 263#define HN_SLEEPING_OK(sc) \ 264do { \ 265 (sc)->hn_flags &= ~HN_FLAG_NO_SLEEPING; \ 266} while (0) 267 268#define HN_CAN_SLEEP(sc) \ 269 (((sc)->hn_flags & HN_FLAG_NO_SLEEPING) == 0) 270 271#define HN_CAP_VLAN 0x0001 272#define HN_CAP_MTU 0x0002 273#define HN_CAP_IPCS 0x0004 274#define HN_CAP_TCP4CS 0x0008 275#define HN_CAP_TCP6CS 0x0010 276#define HN_CAP_UDP4CS 0x0020 277#define HN_CAP_UDP6CS 0x0040 278#define HN_CAP_TSO4 0x0080 279#define HN_CAP_TSO6 0x0100 280#define HN_CAP_HASHVAL 0x0200 281 282/* Capability description for use with printf(9) %b identifier. */ 283#define HN_CAP_BITS \ 284 "\020\1VLAN\2MTU\3IPCS\4TCP4CS\5TCP6CS" \ 285 "\6UDP4CS\7UDP6CS\10TSO4\11TSO6\12HASHVAL" 286 287#define HN_LINK_FLAG_LINKUP 0x0001 288#define HN_LINK_FLAG_NETCHG 0x0002 289 290#endif /* !_IF_HNVAR_H_ */ 291