1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2009-2018 Microsoft Corp.
3 * Copyright (c) 2016 Brocade Communications Systems, Inc.
4 * Copyright (c) 2012 NetApp Inc.
5 * Copyright (c) 2012 Citrix Inc.
10 * Tunable ethdev params
12 #define HN_MIN_RX_BUF_SIZE 1024
13 #define HN_MAX_XFER_LEN 2048
14 #define HN_MAX_MAC_ADDRS 1
15 #define HN_MAX_CHANNELS 64
17 /* Claimed to be 12232B */
18 #define HN_MTU_MAX (9 * 1024)
21 #define HN_CHAN_INTERVAL_US 100
23 /* Buffers need to be aligned */
25 #define PAGE_SIZE 4096
29 #define PAGE_MASK (PAGE_SIZE - 1)
42 /* Size bins in array as RFC 2819, undersized [0], 64 [1], etc */
43 uint64_t size_bins
[8];
48 struct vmbus_channel
*chan
;
53 /* Applied packet transmission aggregation limits. */
58 /* Packet transmission aggregation states */
59 struct hn_txdesc
*agg_txd
;
62 struct rndis_packet_msg
*agg_prevpkt
;
64 struct hn_stats stats
;
69 struct vmbus_channel
*chan
;
70 struct rte_mempool
*mb_pool
;
71 struct rte_ring
*rx_ring
;
73 rte_spinlock_t ring_lock
;
77 struct hn_stats stats
;
84 /* multi-packet data from host */
85 struct hn_rx_bufinfo
{
86 struct vmbus_channel
*chan
;
89 struct rte_mbuf_ext_shared_info shinfo
;
90 } __rte_cache_aligned
;
93 struct rte_vmbus_device
*vmbus
;
94 struct hn_rx_queue
*primary
;
100 struct rte_mem_resource
*rxbuf_res
; /* UIO resource for Rx */
101 struct hn_rx_bufinfo
*rxbuf_info
;
102 uint32_t rxbuf_section_cnt
; /* # of Rx sections */
103 volatile uint32_t rxbuf_outstanding
;
104 uint16_t max_queues
; /* Max available queues */
106 uint64_t rss_offloads
;
108 struct rte_mem_resource
*chim_res
; /* UIO resource for Tx */
109 struct rte_mempool
*tx_pool
; /* Tx descriptors */
110 uint32_t chim_szmax
; /* Max size per buffer */
111 uint32_t chim_cnt
; /* Max packets per buffer */
115 uint32_t rndis_agg_size
;
116 uint32_t rndis_agg_pkts
;
117 uint32_t rndis_agg_align
;
119 volatile uint32_t rndis_pending
;
120 rte_atomic32_t rndis_req_id
;
121 uint8_t rndis_resp
[256];
123 struct ether_addr mac_addr
;
124 struct vmbus_channel
*channels
[HN_MAX_CHANNELS
];
127 static inline struct vmbus_channel
*
128 hn_primary_chan(const struct hn_data
*hv
)
130 return hv
->channels
[0];
133 void hn_process_events(struct hn_data
*hv
, uint16_t queue_id
);
135 uint16_t hn_xmit_pkts(void *tx_queue
, struct rte_mbuf
**tx_pkts
,
137 uint16_t hn_recv_pkts(void *rx_queue
, struct rte_mbuf
**rx_pkts
,
140 int hn_tx_pool_init(struct rte_eth_dev
*dev
);
141 int hn_dev_tx_queue_setup(struct rte_eth_dev
*dev
, uint16_t queue_idx
,
142 uint16_t nb_desc
, unsigned int socket_id
,
143 const struct rte_eth_txconf
*tx_conf
);
144 void hn_dev_tx_queue_release(void *arg
);
145 void hn_dev_tx_queue_info(struct rte_eth_dev
*dev
, uint16_t queue_idx
,
146 struct rte_eth_txq_info
*qinfo
);
148 struct hn_rx_queue
*hn_rx_queue_alloc(struct hn_data
*hv
,
150 unsigned int socket_id
);
151 int hn_dev_rx_queue_setup(struct rte_eth_dev
*dev
,
152 uint16_t queue_idx
, uint16_t nb_desc
,
153 unsigned int socket_id
,
154 const struct rte_eth_rxconf
*rx_conf
,
155 struct rte_mempool
*mp
);
156 void hn_dev_rx_queue_release(void *arg
);
157 void hn_dev_rx_queue_info(struct rte_eth_dev
*dev
, uint16_t queue_idx
,
158 struct rte_eth_rxq_info
*qinfo
);