Imported Upstream version 16.11.2
[deb_dpdk.git] / drivers / net / virtio / virtio_ethdev.c
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #include <stdint.h>
35 #include <string.h>
36 #include <stdio.h>
37 #include <errno.h>
38 #include <unistd.h>
39
40 #include <rte_ethdev.h>
41 #include <rte_memcpy.h>
42 #include <rte_string_fns.h>
43 #include <rte_memzone.h>
44 #include <rte_malloc.h>
45 #include <rte_atomic.h>
46 #include <rte_branch_prediction.h>
47 #include <rte_pci.h>
48 #include <rte_ether.h>
49 #include <rte_common.h>
50 #include <rte_errno.h>
51
52 #include <rte_memory.h>
53 #include <rte_eal.h>
54 #include <rte_dev.h>
55
56 #include "virtio_ethdev.h"
57 #include "virtio_pci.h"
58 #include "virtio_logs.h"
59 #include "virtqueue.h"
60 #include "virtio_rxtx.h"
61
62 static int eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev);
63 static int  virtio_dev_configure(struct rte_eth_dev *dev);
64 static int  virtio_dev_start(struct rte_eth_dev *dev);
65 static void virtio_dev_stop(struct rte_eth_dev *dev);
66 static void virtio_dev_promiscuous_enable(struct rte_eth_dev *dev);
67 static void virtio_dev_promiscuous_disable(struct rte_eth_dev *dev);
68 static void virtio_dev_allmulticast_enable(struct rte_eth_dev *dev);
69 static void virtio_dev_allmulticast_disable(struct rte_eth_dev *dev);
70 static void virtio_dev_info_get(struct rte_eth_dev *dev,
71                                 struct rte_eth_dev_info *dev_info);
72 static int virtio_dev_link_update(struct rte_eth_dev *dev,
73         __rte_unused int wait_to_complete);
74
75 static void virtio_set_hwaddr(struct virtio_hw *hw);
76 static void virtio_get_hwaddr(struct virtio_hw *hw);
77
78 static void virtio_dev_stats_get(struct rte_eth_dev *dev,
79                                  struct rte_eth_stats *stats);
80 static int virtio_dev_xstats_get(struct rte_eth_dev *dev,
81                                  struct rte_eth_xstat *xstats, unsigned n);
82 static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,
83                                        struct rte_eth_xstat_name *xstats_names,
84                                        unsigned limit);
85 static void virtio_dev_stats_reset(struct rte_eth_dev *dev);
86 static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
87 static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
88                                 uint16_t vlan_id, int on);
89 static void virtio_mac_addr_add(struct rte_eth_dev *dev,
90                                 struct ether_addr *mac_addr,
91                                 uint32_t index, uint32_t vmdq __rte_unused);
92 static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
93 static void virtio_mac_addr_set(struct rte_eth_dev *dev,
94                                 struct ether_addr *mac_addr);
95
96 static int virtio_dev_queue_stats_mapping_set(
97         __rte_unused struct rte_eth_dev *eth_dev,
98         __rte_unused uint16_t queue_id,
99         __rte_unused uint8_t stat_idx,
100         __rte_unused uint8_t is_rx);
101
102 /*
103  * The set of PCI devices this driver supports
104  */
105 static const struct rte_pci_id pci_id_virtio_map[] = {
106         { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_LEGACY_DEVICEID_NET) },
107         { RTE_PCI_DEVICE(VIRTIO_PCI_VENDORID, VIRTIO_PCI_MODERN_DEVICEID_NET) },
108         { .vendor_id = 0, /* sentinel */ },
109 };
110
111 struct rte_virtio_xstats_name_off {
112         char name[RTE_ETH_XSTATS_NAME_SIZE];
113         unsigned offset;
114 };
115
116 /* [rt]x_qX_ is prepended to the name string here */
117 static const struct rte_virtio_xstats_name_off rte_virtio_rxq_stat_strings[] = {
118         {"good_packets",           offsetof(struct virtnet_rx, stats.packets)},
119         {"good_bytes",             offsetof(struct virtnet_rx, stats.bytes)},
120         {"errors",                 offsetof(struct virtnet_rx, stats.errors)},
121         {"multicast_packets",      offsetof(struct virtnet_rx, stats.multicast)},
122         {"broadcast_packets",      offsetof(struct virtnet_rx, stats.broadcast)},
123         {"undersize_packets",      offsetof(struct virtnet_rx, stats.size_bins[0])},
124         {"size_64_packets",        offsetof(struct virtnet_rx, stats.size_bins[1])},
125         {"size_65_127_packets",    offsetof(struct virtnet_rx, stats.size_bins[2])},
126         {"size_128_255_packets",   offsetof(struct virtnet_rx, stats.size_bins[3])},
127         {"size_256_511_packets",   offsetof(struct virtnet_rx, stats.size_bins[4])},
128         {"size_512_1023_packets",  offsetof(struct virtnet_rx, stats.size_bins[5])},
129         {"size_1024_1518_packets", offsetof(struct virtnet_rx, stats.size_bins[6])},
130         {"size_1519_max_packets",  offsetof(struct virtnet_rx, stats.size_bins[7])},
131 };
132
133 /* [rt]x_qX_ is prepended to the name string here */
134 static const struct rte_virtio_xstats_name_off rte_virtio_txq_stat_strings[] = {
135         {"good_packets",           offsetof(struct virtnet_tx, stats.packets)},
136         {"good_bytes",             offsetof(struct virtnet_tx, stats.bytes)},
137         {"errors",                 offsetof(struct virtnet_tx, stats.errors)},
138         {"multicast_packets",      offsetof(struct virtnet_tx, stats.multicast)},
139         {"broadcast_packets",      offsetof(struct virtnet_tx, stats.broadcast)},
140         {"undersize_packets",      offsetof(struct virtnet_tx, stats.size_bins[0])},
141         {"size_64_packets",        offsetof(struct virtnet_tx, stats.size_bins[1])},
142         {"size_65_127_packets",    offsetof(struct virtnet_tx, stats.size_bins[2])},
143         {"size_128_255_packets",   offsetof(struct virtnet_tx, stats.size_bins[3])},
144         {"size_256_511_packets",   offsetof(struct virtnet_tx, stats.size_bins[4])},
145         {"size_512_1023_packets",  offsetof(struct virtnet_tx, stats.size_bins[5])},
146         {"size_1024_1518_packets", offsetof(struct virtnet_tx, stats.size_bins[6])},
147         {"size_1519_max_packets",  offsetof(struct virtnet_tx, stats.size_bins[7])},
148 };
149
150 #define VIRTIO_NB_RXQ_XSTATS (sizeof(rte_virtio_rxq_stat_strings) / \
151                             sizeof(rte_virtio_rxq_stat_strings[0]))
152 #define VIRTIO_NB_TXQ_XSTATS (sizeof(rte_virtio_txq_stat_strings) / \
153                             sizeof(rte_virtio_txq_stat_strings[0]))
154
155 struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS];
156
157 static int
158 virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
159                 int *dlen, int pkt_num)
160 {
161         uint32_t head, i;
162         int k, sum = 0;
163         virtio_net_ctrl_ack status = ~0;
164         struct virtio_pmd_ctrl result;
165         struct virtqueue *vq;
166
167         ctrl->status = status;
168
169         if (!cvq || !cvq->vq) {
170                 PMD_INIT_LOG(ERR, "Control queue is not supported.");
171                 return -1;
172         }
173         vq = cvq->vq;
174         head = vq->vq_desc_head_idx;
175
176         PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, "
177                 "vq->hw->cvq = %p vq = %p",
178                 vq->vq_desc_head_idx, status, vq->hw->cvq, vq);
179
180         if ((vq->vq_free_cnt < ((uint32_t)pkt_num + 2)) || (pkt_num < 1))
181                 return -1;
182
183         memcpy(cvq->virtio_net_hdr_mz->addr, ctrl,
184                 sizeof(struct virtio_pmd_ctrl));
185
186         /*
187          * Format is enforced in qemu code:
188          * One TX packet for header;
189          * At least one TX packet per argument;
190          * One RX packet for ACK.
191          */
192         vq->vq_ring.desc[head].flags = VRING_DESC_F_NEXT;
193         vq->vq_ring.desc[head].addr = cvq->virtio_net_hdr_mem;
194         vq->vq_ring.desc[head].len = sizeof(struct virtio_net_ctrl_hdr);
195         vq->vq_free_cnt--;
196         i = vq->vq_ring.desc[head].next;
197
198         for (k = 0; k < pkt_num; k++) {
199                 vq->vq_ring.desc[i].flags = VRING_DESC_F_NEXT;
200                 vq->vq_ring.desc[i].addr = cvq->virtio_net_hdr_mem
201                         + sizeof(struct virtio_net_ctrl_hdr)
202                         + sizeof(ctrl->status) + sizeof(uint8_t)*sum;
203                 vq->vq_ring.desc[i].len = dlen[k];
204                 sum += dlen[k];
205                 vq->vq_free_cnt--;
206                 i = vq->vq_ring.desc[i].next;
207         }
208
209         vq->vq_ring.desc[i].flags = VRING_DESC_F_WRITE;
210         vq->vq_ring.desc[i].addr = cvq->virtio_net_hdr_mem
211                         + sizeof(struct virtio_net_ctrl_hdr);
212         vq->vq_ring.desc[i].len = sizeof(ctrl->status);
213         vq->vq_free_cnt--;
214
215         vq->vq_desc_head_idx = vq->vq_ring.desc[i].next;
216
217         vq_update_avail_ring(vq, head);
218         vq_update_avail_idx(vq);
219
220         PMD_INIT_LOG(DEBUG, "vq->vq_queue_index = %d", vq->vq_queue_index);
221
222         virtqueue_notify(vq);
223
224         rte_rmb();
225         while (VIRTQUEUE_NUSED(vq) == 0) {
226                 rte_rmb();
227                 usleep(100);
228         }
229
230         while (VIRTQUEUE_NUSED(vq)) {
231                 uint32_t idx, desc_idx, used_idx;
232                 struct vring_used_elem *uep;
233
234                 used_idx = (uint32_t)(vq->vq_used_cons_idx
235                                 & (vq->vq_nentries - 1));
236                 uep = &vq->vq_ring.used->ring[used_idx];
237                 idx = (uint32_t) uep->id;
238                 desc_idx = idx;
239
240                 while (vq->vq_ring.desc[desc_idx].flags & VRING_DESC_F_NEXT) {
241                         desc_idx = vq->vq_ring.desc[desc_idx].next;
242                         vq->vq_free_cnt++;
243                 }
244
245                 vq->vq_ring.desc[desc_idx].next = vq->vq_desc_head_idx;
246                 vq->vq_desc_head_idx = idx;
247
248                 vq->vq_used_cons_idx++;
249                 vq->vq_free_cnt++;
250         }
251
252         PMD_INIT_LOG(DEBUG, "vq->vq_free_cnt=%d\nvq->vq_desc_head_idx=%d",
253                         vq->vq_free_cnt, vq->vq_desc_head_idx);
254
255         memcpy(&result, cvq->virtio_net_hdr_mz->addr,
256                         sizeof(struct virtio_pmd_ctrl));
257
258         return result.status;
259 }
260
261 static int
262 virtio_set_multiple_queues(struct rte_eth_dev *dev, uint16_t nb_queues)
263 {
264         struct virtio_hw *hw = dev->data->dev_private;
265         struct virtio_pmd_ctrl ctrl;
266         int dlen[1];
267         int ret;
268
269         ctrl.hdr.class = VIRTIO_NET_CTRL_MQ;
270         ctrl.hdr.cmd = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET;
271         memcpy(ctrl.data, &nb_queues, sizeof(uint16_t));
272
273         dlen[0] = sizeof(uint16_t);
274
275         ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
276         if (ret) {
277                 PMD_INIT_LOG(ERR, "Multiqueue configured but send command "
278                           "failed, this is too late now...");
279                 return -EINVAL;
280         }
281
282         return 0;
283 }
284
285 static void
286 virtio_dev_queue_release(void *queue __rte_unused)
287 {
288         /* do nothing */
289 }
290
291 static int
292 virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx)
293 {
294         if (vtpci_queue_idx == hw->max_queue_pairs * 2)
295                 return VTNET_CQ;
296         else if (vtpci_queue_idx % 2 == 0)
297                 return VTNET_RQ;
298         else
299                 return VTNET_TQ;
300 }
301
302 static uint16_t
303 virtio_get_nr_vq(struct virtio_hw *hw)
304 {
305         uint16_t nr_vq = hw->max_queue_pairs * 2;
306
307         if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ))
308                 nr_vq += 1;
309
310         return nr_vq;
311 }
312
313 static void
314 virtio_init_vring(struct virtqueue *vq)
315 {
316         int size = vq->vq_nentries;
317         struct vring *vr = &vq->vq_ring;
318         uint8_t *ring_mem = vq->vq_ring_virt_mem;
319
320         PMD_INIT_FUNC_TRACE();
321
322         /*
323          * Reinitialise since virtio port might have been stopped and restarted
324          */
325         memset(ring_mem, 0, vq->vq_ring_size);
326         vring_init(vr, size, ring_mem, VIRTIO_PCI_VRING_ALIGN);
327         vq->vq_used_cons_idx = 0;
328         vq->vq_desc_head_idx = 0;
329         vq->vq_avail_idx = 0;
330         vq->vq_desc_tail_idx = (uint16_t)(vq->vq_nentries - 1);
331         vq->vq_free_cnt = vq->vq_nentries;
332         memset(vq->vq_descx, 0, sizeof(struct vq_desc_extra) * vq->vq_nentries);
333
334         vring_desc_init(vr->desc, size);
335
336         /*
337          * Disable device(host) interrupting guest
338          */
339         virtqueue_disable_intr(vq);
340 }
341
342 static int
343 virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
344 {
345         char vq_name[VIRTQUEUE_MAX_NAME_SZ];
346         char vq_hdr_name[VIRTQUEUE_MAX_NAME_SZ];
347         const struct rte_memzone *mz = NULL, *hdr_mz = NULL;
348         unsigned int vq_size, size;
349         struct virtio_hw *hw = dev->data->dev_private;
350         struct virtnet_rx *rxvq = NULL;
351         struct virtnet_tx *txvq = NULL;
352         struct virtnet_ctl *cvq = NULL;
353         struct virtqueue *vq;
354         size_t sz_hdr_mz = 0;
355         void *sw_ring = NULL;
356         int queue_type = virtio_get_queue_type(hw, vtpci_queue_idx);
357         int ret;
358
359         PMD_INIT_LOG(DEBUG, "setting up queue: %u", vtpci_queue_idx);
360
361         /*
362          * Read the virtqueue size from the Queue Size field
363          * Always power of 2 and if 0 virtqueue does not exist
364          */
365         vq_size = VTPCI_OPS(hw)->get_queue_num(hw, vtpci_queue_idx);
366         PMD_INIT_LOG(DEBUG, "vq_size: %u", vq_size);
367         if (vq_size == 0) {
368                 PMD_INIT_LOG(ERR, "virtqueue does not exist");
369                 return -EINVAL;
370         }
371
372         if (!rte_is_power_of_2(vq_size)) {
373                 PMD_INIT_LOG(ERR, "virtqueue size is not powerof 2");
374                 return -EINVAL;
375         }
376
377         snprintf(vq_name, sizeof(vq_name), "port%d_vq%d",
378                  dev->data->port_id, vtpci_queue_idx);
379
380         size = RTE_ALIGN_CEIL(sizeof(*vq) +
381                                 vq_size * sizeof(struct vq_desc_extra),
382                                 RTE_CACHE_LINE_SIZE);
383         if (queue_type == VTNET_TQ) {
384                 /*
385                  * For each xmit packet, allocate a virtio_net_hdr
386                  * and indirect ring elements
387                  */
388                 sz_hdr_mz = vq_size * sizeof(struct virtio_tx_region);
389         } else if (queue_type == VTNET_CQ) {
390                 /* Allocate a page for control vq command, data and status */
391                 sz_hdr_mz = PAGE_SIZE;
392         }
393
394         vq = rte_zmalloc_socket(vq_name, size, RTE_CACHE_LINE_SIZE,
395                                 SOCKET_ID_ANY);
396         if (vq == NULL) {
397                 PMD_INIT_LOG(ERR, "can not allocate vq");
398                 return -ENOMEM;
399         }
400         hw->vqs[vtpci_queue_idx] = vq;
401
402         vq->hw = hw;
403         vq->vq_queue_index = vtpci_queue_idx;
404         vq->vq_nentries = vq_size;
405
406         /*
407          * Reserve a memzone for vring elements
408          */
409         size = vring_size(vq_size, VIRTIO_PCI_VRING_ALIGN);
410         vq->vq_ring_size = RTE_ALIGN_CEIL(size, VIRTIO_PCI_VRING_ALIGN);
411         PMD_INIT_LOG(DEBUG, "vring_size: %d, rounded_vring_size: %d",
412                      size, vq->vq_ring_size);
413
414         mz = rte_memzone_reserve_aligned(vq_name, vq->vq_ring_size,
415                                          SOCKET_ID_ANY,
416                                          0, VIRTIO_PCI_VRING_ALIGN);
417         if (mz == NULL) {
418                 if (rte_errno == EEXIST)
419                         mz = rte_memzone_lookup(vq_name);
420                 if (mz == NULL) {
421                         ret = -ENOMEM;
422                         goto fail_q_alloc;
423                 }
424         }
425
426         memset(mz->addr, 0, sizeof(mz->len));
427
428         vq->vq_ring_mem = mz->phys_addr;
429         vq->vq_ring_virt_mem = mz->addr;
430         PMD_INIT_LOG(DEBUG, "vq->vq_ring_mem:      0x%" PRIx64,
431                      (uint64_t)mz->phys_addr);
432         PMD_INIT_LOG(DEBUG, "vq->vq_ring_virt_mem: 0x%" PRIx64,
433                      (uint64_t)(uintptr_t)mz->addr);
434
435         virtio_init_vring(vq);
436
437         if (sz_hdr_mz) {
438                 snprintf(vq_hdr_name, sizeof(vq_hdr_name), "port%d_vq%d_hdr",
439                          dev->data->port_id, vtpci_queue_idx);
440                 hdr_mz = rte_memzone_reserve_aligned(vq_hdr_name, sz_hdr_mz,
441                                                      SOCKET_ID_ANY, 0,
442                                                      RTE_CACHE_LINE_SIZE);
443                 if (hdr_mz == NULL) {
444                         if (rte_errno == EEXIST)
445                                 hdr_mz = rte_memzone_lookup(vq_hdr_name);
446                         if (hdr_mz == NULL) {
447                                 ret = -ENOMEM;
448                                 goto fail_q_alloc;
449                         }
450                 }
451         }
452
453         if (queue_type == VTNET_RQ) {
454                 size_t sz_sw = (RTE_PMD_VIRTIO_RX_MAX_BURST + vq_size) *
455                                sizeof(vq->sw_ring[0]);
456
457                 sw_ring = rte_zmalloc_socket("sw_ring", sz_sw,
458                                 RTE_CACHE_LINE_SIZE, SOCKET_ID_ANY);
459                 if (!sw_ring) {
460                         PMD_INIT_LOG(ERR, "can not allocate RX soft ring");
461                         ret = -ENOMEM;
462                         goto fail_q_alloc;
463                 }
464
465                 vq->sw_ring = sw_ring;
466                 rxvq = &vq->rxq;
467                 rxvq->vq = vq;
468                 rxvq->port_id = dev->data->port_id;
469                 rxvq->mz = mz;
470         } else if (queue_type == VTNET_TQ) {
471                 txvq = &vq->txq;
472                 txvq->vq = vq;
473                 txvq->port_id = dev->data->port_id;
474                 txvq->mz = mz;
475                 txvq->virtio_net_hdr_mz = hdr_mz;
476                 txvq->virtio_net_hdr_mem = hdr_mz->phys_addr;
477         } else if (queue_type == VTNET_CQ) {
478                 cvq = &vq->cq;
479                 cvq->vq = vq;
480                 cvq->mz = mz;
481                 cvq->virtio_net_hdr_mz = hdr_mz;
482                 cvq->virtio_net_hdr_mem = hdr_mz->phys_addr;
483                 memset(cvq->virtio_net_hdr_mz->addr, 0, PAGE_SIZE);
484
485                 hw->cvq = cvq;
486         }
487
488         /* For virtio_user case (that is when dev->pci_dev is NULL), we use
489          * virtual address. And we need properly set _offset_, please see
490          * VIRTIO_MBUF_DATA_DMA_ADDR in virtqueue.h for more information.
491          */
492         if (dev->pci_dev)
493                 vq->offset = offsetof(struct rte_mbuf, buf_physaddr);
494         else {
495                 vq->vq_ring_mem = (uintptr_t)mz->addr;
496                 vq->offset = offsetof(struct rte_mbuf, buf_addr);
497                 if (queue_type == VTNET_TQ)
498                         txvq->virtio_net_hdr_mem = (uintptr_t)hdr_mz->addr;
499                 else if (queue_type == VTNET_CQ)
500                         cvq->virtio_net_hdr_mem = (uintptr_t)hdr_mz->addr;
501         }
502
503         if (queue_type == VTNET_TQ) {
504                 struct virtio_tx_region *txr;
505                 unsigned int i;
506
507                 txr = hdr_mz->addr;
508                 memset(txr, 0, vq_size * sizeof(*txr));
509                 for (i = 0; i < vq_size; i++) {
510                         struct vring_desc *start_dp = txr[i].tx_indir;
511
512                         vring_desc_init(start_dp, RTE_DIM(txr[i].tx_indir));
513
514                         /* first indirect descriptor is always the tx header */
515                         start_dp->addr = txvq->virtio_net_hdr_mem
516                                 + i * sizeof(*txr)
517                                 + offsetof(struct virtio_tx_region, tx_hdr);
518
519                         start_dp->len = hw->vtnet_hdr_size;
520                         start_dp->flags = VRING_DESC_F_NEXT;
521                 }
522         }
523
524         if (VTPCI_OPS(hw)->setup_queue(hw, vq) < 0) {
525                 PMD_INIT_LOG(ERR, "setup_queue failed");
526                 return -EINVAL;
527         }
528
529         return 0;
530
531 fail_q_alloc:
532         rte_free(sw_ring);
533         rte_memzone_free(hdr_mz);
534         rte_memzone_free(mz);
535         rte_free(vq);
536
537         return ret;
538 }
539
540 static void
541 virtio_free_queues(struct virtio_hw *hw)
542 {
543         uint16_t nr_vq = virtio_get_nr_vq(hw);
544         struct virtqueue *vq;
545         int queue_type;
546         uint16_t i;
547
548         if (hw->vqs == NULL)
549                 return;
550
551         for (i = 0; i < nr_vq; i++) {
552                 vq = hw->vqs[i];
553                 if (!vq)
554                         continue;
555
556                 queue_type = virtio_get_queue_type(hw, i);
557                 if (queue_type == VTNET_RQ) {
558                         rte_free(vq->sw_ring);
559                         rte_memzone_free(vq->rxq.mz);
560                 } else if (queue_type == VTNET_TQ) {
561                         rte_memzone_free(vq->txq.mz);
562                         rte_memzone_free(vq->txq.virtio_net_hdr_mz);
563                 } else {
564                         rte_memzone_free(vq->cq.mz);
565                         rte_memzone_free(vq->cq.virtio_net_hdr_mz);
566                 }
567
568                 rte_free(vq);
569                 hw->vqs[i] = NULL;
570         }
571
572         rte_free(hw->vqs);
573         hw->vqs = NULL;
574 }
575
576 static int
577 virtio_alloc_queues(struct rte_eth_dev *dev)
578 {
579         struct virtio_hw *hw = dev->data->dev_private;
580         uint16_t nr_vq = virtio_get_nr_vq(hw);
581         uint16_t i;
582         int ret;
583
584         hw->vqs = rte_zmalloc(NULL, sizeof(struct virtqueue *) * nr_vq, 0);
585         if (!hw->vqs) {
586                 PMD_INIT_LOG(ERR, "failed to allocate vqs");
587                 return -ENOMEM;
588         }
589
590         for (i = 0; i < nr_vq; i++) {
591                 ret = virtio_init_queue(dev, i);
592                 if (ret < 0) {
593                         virtio_free_queues(hw);
594                         return ret;
595                 }
596         }
597
598         return 0;
599 }
600
601 static void
602 virtio_dev_close(struct rte_eth_dev *dev)
603 {
604         struct virtio_hw *hw = dev->data->dev_private;
605
606         PMD_INIT_LOG(DEBUG, "virtio_dev_close");
607
608         /* reset the NIC */
609         if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
610                 vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
611         vtpci_reset(hw);
612         virtio_dev_free_mbufs(dev);
613         virtio_free_queues(hw);
614 }
615
616 static void
617 virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)
618 {
619         struct virtio_hw *hw = dev->data->dev_private;
620         struct virtio_pmd_ctrl ctrl;
621         int dlen[1];
622         int ret;
623
624         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
625                 PMD_INIT_LOG(INFO, "host does not support rx control\n");
626                 return;
627         }
628
629         ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
630         ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_PROMISC;
631         ctrl.data[0] = 1;
632         dlen[0] = 1;
633
634         ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
635         if (ret)
636                 PMD_INIT_LOG(ERR, "Failed to enable promisc");
637 }
638
639 static void
640 virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
641 {
642         struct virtio_hw *hw = dev->data->dev_private;
643         struct virtio_pmd_ctrl ctrl;
644         int dlen[1];
645         int ret;
646
647         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
648                 PMD_INIT_LOG(INFO, "host does not support rx control\n");
649                 return;
650         }
651
652         ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
653         ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_PROMISC;
654         ctrl.data[0] = 0;
655         dlen[0] = 1;
656
657         ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
658         if (ret)
659                 PMD_INIT_LOG(ERR, "Failed to disable promisc");
660 }
661
662 static void
663 virtio_dev_allmulticast_enable(struct rte_eth_dev *dev)
664 {
665         struct virtio_hw *hw = dev->data->dev_private;
666         struct virtio_pmd_ctrl ctrl;
667         int dlen[1];
668         int ret;
669
670         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
671                 PMD_INIT_LOG(INFO, "host does not support rx control\n");
672                 return;
673         }
674
675         ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
676         ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_ALLMULTI;
677         ctrl.data[0] = 1;
678         dlen[0] = 1;
679
680         ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
681         if (ret)
682                 PMD_INIT_LOG(ERR, "Failed to enable allmulticast");
683 }
684
685 static void
686 virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)
687 {
688         struct virtio_hw *hw = dev->data->dev_private;
689         struct virtio_pmd_ctrl ctrl;
690         int dlen[1];
691         int ret;
692
693         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_RX)) {
694                 PMD_INIT_LOG(INFO, "host does not support rx control\n");
695                 return;
696         }
697
698         ctrl.hdr.class = VIRTIO_NET_CTRL_RX;
699         ctrl.hdr.cmd = VIRTIO_NET_CTRL_RX_ALLMULTI;
700         ctrl.data[0] = 0;
701         dlen[0] = 1;
702
703         ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
704         if (ret)
705                 PMD_INIT_LOG(ERR, "Failed to disable allmulticast");
706 }
707
708 #define VLAN_TAG_LEN           4    /* 802.3ac tag (not DMA'd) */
709 static int
710 virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
711 {
712         struct virtio_hw *hw = dev->data->dev_private;
713         uint32_t ether_hdr_len = ETHER_HDR_LEN + VLAN_TAG_LEN +
714                                  hw->vtnet_hdr_size;
715         uint32_t frame_size = mtu + ether_hdr_len;
716
717         if (mtu < ETHER_MIN_MTU || frame_size > VIRTIO_MAX_RX_PKTLEN) {
718                 PMD_INIT_LOG(ERR, "MTU should be between %d and %d\n",
719                         ETHER_MIN_MTU, VIRTIO_MAX_RX_PKTLEN - ether_hdr_len);
720                 return -EINVAL;
721         }
722         return 0;
723 }
724
725 /*
726  * dev_ops for virtio, bare necessities for basic operation
727  */
728 static const struct eth_dev_ops virtio_eth_dev_ops = {
729         .dev_configure           = virtio_dev_configure,
730         .dev_start               = virtio_dev_start,
731         .dev_stop                = virtio_dev_stop,
732         .dev_close               = virtio_dev_close,
733         .promiscuous_enable      = virtio_dev_promiscuous_enable,
734         .promiscuous_disable     = virtio_dev_promiscuous_disable,
735         .allmulticast_enable     = virtio_dev_allmulticast_enable,
736         .allmulticast_disable    = virtio_dev_allmulticast_disable,
737         .mtu_set                 = virtio_mtu_set,
738         .dev_infos_get           = virtio_dev_info_get,
739         .stats_get               = virtio_dev_stats_get,
740         .xstats_get              = virtio_dev_xstats_get,
741         .xstats_get_names        = virtio_dev_xstats_get_names,
742         .stats_reset             = virtio_dev_stats_reset,
743         .xstats_reset            = virtio_dev_stats_reset,
744         .link_update             = virtio_dev_link_update,
745         .rx_queue_setup          = virtio_dev_rx_queue_setup,
746         .rx_queue_release        = virtio_dev_queue_release,
747         .tx_queue_setup          = virtio_dev_tx_queue_setup,
748         .tx_queue_release        = virtio_dev_queue_release,
749         /* collect stats per queue */
750         .queue_stats_mapping_set = virtio_dev_queue_stats_mapping_set,
751         .vlan_filter_set         = virtio_vlan_filter_set,
752         .mac_addr_add            = virtio_mac_addr_add,
753         .mac_addr_remove         = virtio_mac_addr_remove,
754         .mac_addr_set            = virtio_mac_addr_set,
755 };
756
757 static inline int
758 virtio_dev_atomic_read_link_status(struct rte_eth_dev *dev,
759                                 struct rte_eth_link *link)
760 {
761         struct rte_eth_link *dst = link;
762         struct rte_eth_link *src = &(dev->data->dev_link);
763
764         if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
765                         *(uint64_t *)src) == 0)
766                 return -1;
767
768         return 0;
769 }
770
771 /**
772  * Atomically writes the link status information into global
773  * structure rte_eth_dev.
774  *
775  * @param dev
776  *   - Pointer to the structure rte_eth_dev to read from.
777  *   - Pointer to the buffer to be saved with the link status.
778  *
779  * @return
780  *   - On success, zero.
781  *   - On failure, negative value.
782  */
783 static inline int
784 virtio_dev_atomic_write_link_status(struct rte_eth_dev *dev,
785                 struct rte_eth_link *link)
786 {
787         struct rte_eth_link *dst = &(dev->data->dev_link);
788         struct rte_eth_link *src = link;
789
790         if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
791                                         *(uint64_t *)src) == 0)
792                 return -1;
793
794         return 0;
795 }
796
797 static void
798 virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
799 {
800         unsigned i;
801
802         for (i = 0; i < dev->data->nb_tx_queues; i++) {
803                 const struct virtnet_tx *txvq = dev->data->tx_queues[i];
804                 if (txvq == NULL)
805                         continue;
806
807                 stats->opackets += txvq->stats.packets;
808                 stats->obytes += txvq->stats.bytes;
809                 stats->oerrors += txvq->stats.errors;
810
811                 if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
812                         stats->q_opackets[i] = txvq->stats.packets;
813                         stats->q_obytes[i] = txvq->stats.bytes;
814                 }
815         }
816
817         for (i = 0; i < dev->data->nb_rx_queues; i++) {
818                 const struct virtnet_rx *rxvq = dev->data->rx_queues[i];
819                 if (rxvq == NULL)
820                         continue;
821
822                 stats->ipackets += rxvq->stats.packets;
823                 stats->ibytes += rxvq->stats.bytes;
824                 stats->ierrors += rxvq->stats.errors;
825
826                 if (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) {
827                         stats->q_ipackets[i] = rxvq->stats.packets;
828                         stats->q_ibytes[i] = rxvq->stats.bytes;
829                 }
830         }
831
832         stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
833 }
834
835 static int virtio_dev_xstats_get_names(struct rte_eth_dev *dev,
836                                        struct rte_eth_xstat_name *xstats_names,
837                                        __rte_unused unsigned limit)
838 {
839         unsigned i;
840         unsigned count = 0;
841         unsigned t;
842
843         unsigned nstats = dev->data->nb_tx_queues * VIRTIO_NB_TXQ_XSTATS +
844                 dev->data->nb_rx_queues * VIRTIO_NB_RXQ_XSTATS;
845
846         if (xstats_names != NULL) {
847                 /* Note: limit checked in rte_eth_xstats_names() */
848
849                 for (i = 0; i < dev->data->nb_rx_queues; i++) {
850                         struct virtqueue *rxvq = dev->data->rx_queues[i];
851                         if (rxvq == NULL)
852                                 continue;
853                         for (t = 0; t < VIRTIO_NB_RXQ_XSTATS; t++) {
854                                 snprintf(xstats_names[count].name,
855                                         sizeof(xstats_names[count].name),
856                                         "rx_q%u_%s", i,
857                                         rte_virtio_rxq_stat_strings[t].name);
858                                 count++;
859                         }
860                 }
861
862                 for (i = 0; i < dev->data->nb_tx_queues; i++) {
863                         struct virtqueue *txvq = dev->data->tx_queues[i];
864                         if (txvq == NULL)
865                                 continue;
866                         for (t = 0; t < VIRTIO_NB_TXQ_XSTATS; t++) {
867                                 snprintf(xstats_names[count].name,
868                                         sizeof(xstats_names[count].name),
869                                         "tx_q%u_%s", i,
870                                         rte_virtio_txq_stat_strings[t].name);
871                                 count++;
872                         }
873                 }
874                 return count;
875         }
876         return nstats;
877 }
878
879 static int
880 virtio_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
881                       unsigned n)
882 {
883         unsigned i;
884         unsigned count = 0;
885
886         unsigned nstats = dev->data->nb_tx_queues * VIRTIO_NB_TXQ_XSTATS +
887                 dev->data->nb_rx_queues * VIRTIO_NB_RXQ_XSTATS;
888
889         if (n < nstats)
890                 return nstats;
891
892         for (i = 0; i < dev->data->nb_rx_queues; i++) {
893                 struct virtnet_rx *rxvq = dev->data->rx_queues[i];
894
895                 if (rxvq == NULL)
896                         continue;
897
898                 unsigned t;
899
900                 for (t = 0; t < VIRTIO_NB_RXQ_XSTATS; t++) {
901                         xstats[count].value = *(uint64_t *)(((char *)rxvq) +
902                                 rte_virtio_rxq_stat_strings[t].offset);
903                         xstats[count].id = count;
904                         count++;
905                 }
906         }
907
908         for (i = 0; i < dev->data->nb_tx_queues; i++) {
909                 struct virtnet_tx *txvq = dev->data->tx_queues[i];
910
911                 if (txvq == NULL)
912                         continue;
913
914                 unsigned t;
915
916                 for (t = 0; t < VIRTIO_NB_TXQ_XSTATS; t++) {
917                         xstats[count].value = *(uint64_t *)(((char *)txvq) +
918                                 rte_virtio_txq_stat_strings[t].offset);
919                         xstats[count].id = count;
920                         count++;
921                 }
922         }
923
924         return count;
925 }
926
927 static void
928 virtio_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
929 {
930         virtio_update_stats(dev, stats);
931 }
932
933 static void
934 virtio_dev_stats_reset(struct rte_eth_dev *dev)
935 {
936         unsigned int i;
937
938         for (i = 0; i < dev->data->nb_tx_queues; i++) {
939                 struct virtnet_tx *txvq = dev->data->tx_queues[i];
940                 if (txvq == NULL)
941                         continue;
942
943                 txvq->stats.packets = 0;
944                 txvq->stats.bytes = 0;
945                 txvq->stats.errors = 0;
946                 txvq->stats.multicast = 0;
947                 txvq->stats.broadcast = 0;
948                 memset(txvq->stats.size_bins, 0,
949                        sizeof(txvq->stats.size_bins[0]) * 8);
950         }
951
952         for (i = 0; i < dev->data->nb_rx_queues; i++) {
953                 struct virtnet_rx *rxvq = dev->data->rx_queues[i];
954                 if (rxvq == NULL)
955                         continue;
956
957                 rxvq->stats.packets = 0;
958                 rxvq->stats.bytes = 0;
959                 rxvq->stats.errors = 0;
960                 rxvq->stats.multicast = 0;
961                 rxvq->stats.broadcast = 0;
962                 memset(rxvq->stats.size_bins, 0,
963                        sizeof(rxvq->stats.size_bins[0]) * 8);
964         }
965 }
966
967 static void
968 virtio_set_hwaddr(struct virtio_hw *hw)
969 {
970         vtpci_write_dev_config(hw,
971                         offsetof(struct virtio_net_config, mac),
972                         &hw->mac_addr, ETHER_ADDR_LEN);
973 }
974
975 static void
976 virtio_get_hwaddr(struct virtio_hw *hw)
977 {
978         if (vtpci_with_feature(hw, VIRTIO_NET_F_MAC)) {
979                 vtpci_read_dev_config(hw,
980                         offsetof(struct virtio_net_config, mac),
981                         &hw->mac_addr, ETHER_ADDR_LEN);
982         } else {
983                 eth_random_addr(&hw->mac_addr[0]);
984                 virtio_set_hwaddr(hw);
985         }
986 }
987
988 static void
989 virtio_mac_table_set(struct virtio_hw *hw,
990                      const struct virtio_net_ctrl_mac *uc,
991                      const struct virtio_net_ctrl_mac *mc)
992 {
993         struct virtio_pmd_ctrl ctrl;
994         int err, len[2];
995
996         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
997                 PMD_DRV_LOG(INFO, "host does not support mac table");
998                 return;
999         }
1000
1001         ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
1002         ctrl.hdr.cmd = VIRTIO_NET_CTRL_MAC_TABLE_SET;
1003
1004         len[0] = uc->entries * ETHER_ADDR_LEN + sizeof(uc->entries);
1005         memcpy(ctrl.data, uc, len[0]);
1006
1007         len[1] = mc->entries * ETHER_ADDR_LEN + sizeof(mc->entries);
1008         memcpy(ctrl.data + len[0], mc, len[1]);
1009
1010         err = virtio_send_command(hw->cvq, &ctrl, len, 2);
1011         if (err != 0)
1012                 PMD_DRV_LOG(NOTICE, "mac table set failed: %d", err);
1013 }
1014
1015 static void
1016 virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
1017                     uint32_t index, uint32_t vmdq __rte_unused)
1018 {
1019         struct virtio_hw *hw = dev->data->dev_private;
1020         const struct ether_addr *addrs = dev->data->mac_addrs;
1021         unsigned int i;
1022         struct virtio_net_ctrl_mac *uc, *mc;
1023
1024         if (index >= VIRTIO_MAX_MAC_ADDRS) {
1025                 PMD_DRV_LOG(ERR, "mac address index %u out of range", index);
1026                 return;
1027         }
1028
1029         uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
1030         uc->entries = 0;
1031         mc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(mc->entries));
1032         mc->entries = 0;
1033
1034         for (i = 0; i < VIRTIO_MAX_MAC_ADDRS; i++) {
1035                 const struct ether_addr *addr
1036                         = (i == index) ? mac_addr : addrs + i;
1037                 struct virtio_net_ctrl_mac *tbl
1038                         = is_multicast_ether_addr(addr) ? mc : uc;
1039
1040                 memcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);
1041         }
1042
1043         virtio_mac_table_set(hw, uc, mc);
1044 }
1045
1046 static void
1047 virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
1048 {
1049         struct virtio_hw *hw = dev->data->dev_private;
1050         struct ether_addr *addrs = dev->data->mac_addrs;
1051         struct virtio_net_ctrl_mac *uc, *mc;
1052         unsigned int i;
1053
1054         if (index >= VIRTIO_MAX_MAC_ADDRS) {
1055                 PMD_DRV_LOG(ERR, "mac address index %u out of range", index);
1056                 return;
1057         }
1058
1059         uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
1060         uc->entries = 0;
1061         mc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(mc->entries));
1062         mc->entries = 0;
1063
1064         for (i = 0; i < VIRTIO_MAX_MAC_ADDRS; i++) {
1065                 struct virtio_net_ctrl_mac *tbl;
1066
1067                 if (i == index || is_zero_ether_addr(addrs + i))
1068                         continue;
1069
1070                 tbl = is_multicast_ether_addr(addrs + i) ? mc : uc;
1071                 memcpy(&tbl->macs[tbl->entries++], addrs + i, ETHER_ADDR_LEN);
1072         }
1073
1074         virtio_mac_table_set(hw, uc, mc);
1075 }
1076
1077 static void
1078 virtio_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
1079 {
1080         struct virtio_hw *hw = dev->data->dev_private;
1081
1082         memcpy(hw->mac_addr, mac_addr, ETHER_ADDR_LEN);
1083
1084         /* Use atomic update if available */
1085         if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
1086                 struct virtio_pmd_ctrl ctrl;
1087                 int len = ETHER_ADDR_LEN;
1088
1089                 ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
1090                 ctrl.hdr.cmd = VIRTIO_NET_CTRL_MAC_ADDR_SET;
1091
1092                 memcpy(ctrl.data, mac_addr, ETHER_ADDR_LEN);
1093                 virtio_send_command(hw->cvq, &ctrl, &len, 1);
1094         } else if (vtpci_with_feature(hw, VIRTIO_NET_F_MAC))
1095                 virtio_set_hwaddr(hw);
1096 }
1097
1098 static int
1099 virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
1100 {
1101         struct virtio_hw *hw = dev->data->dev_private;
1102         struct virtio_pmd_ctrl ctrl;
1103         int len;
1104
1105         if (!vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN))
1106                 return -ENOTSUP;
1107
1108         ctrl.hdr.class = VIRTIO_NET_CTRL_VLAN;
1109         ctrl.hdr.cmd = on ? VIRTIO_NET_CTRL_VLAN_ADD : VIRTIO_NET_CTRL_VLAN_DEL;
1110         memcpy(ctrl.data, &vlan_id, sizeof(vlan_id));
1111         len = sizeof(vlan_id);
1112
1113         return virtio_send_command(hw->cvq, &ctrl, &len, 1);
1114 }
1115
1116 static int
1117 virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features)
1118 {
1119         uint64_t host_features;
1120
1121         /* Prepare guest_features: feature that driver wants to support */
1122         PMD_INIT_LOG(DEBUG, "guest_features before negotiate = %" PRIx64,
1123                 req_features);
1124
1125         /* Read device(host) feature bits */
1126         host_features = VTPCI_OPS(hw)->get_features(hw);
1127         PMD_INIT_LOG(DEBUG, "host_features before negotiate = %" PRIx64,
1128                 host_features);
1129
1130         /*
1131          * Negotiate features: Subset of device feature bits are written back
1132          * guest feature bits.
1133          */
1134         hw->guest_features = req_features;
1135         hw->guest_features = vtpci_negotiate_features(hw, host_features);
1136         PMD_INIT_LOG(DEBUG, "features after negotiate = %" PRIx64,
1137                 hw->guest_features);
1138
1139         if (hw->modern) {
1140                 if (!vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) {
1141                         PMD_INIT_LOG(ERR,
1142                                 "VIRTIO_F_VERSION_1 features is not enabled.");
1143                         return -1;
1144                 }
1145                 vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK);
1146                 if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) {
1147                         PMD_INIT_LOG(ERR,
1148                                 "failed to set FEATURES_OK status!");
1149                         return -1;
1150                 }
1151         }
1152
1153         hw->req_guest_features = req_features;
1154
1155         return 0;
1156 }
1157
1158 /*
1159  * Process Virtio Config changed interrupt and call the callback
1160  * if link state changed.
1161  */
1162 static void
1163 virtio_interrupt_handler(__rte_unused struct rte_intr_handle *handle,
1164                          void *param)
1165 {
1166         struct rte_eth_dev *dev = param;
1167         struct virtio_hw *hw = dev->data->dev_private;
1168         uint8_t isr;
1169
1170         /* Read interrupt status which clears interrupt */
1171         isr = vtpci_isr(hw);
1172         PMD_DRV_LOG(INFO, "interrupt status = %#x", isr);
1173
1174         if (rte_intr_enable(&dev->pci_dev->intr_handle) < 0)
1175                 PMD_DRV_LOG(ERR, "interrupt enable failed");
1176
1177         if (isr & VIRTIO_PCI_ISR_CONFIG) {
1178                 if (virtio_dev_link_update(dev, 0) == 0)
1179                         _rte_eth_dev_callback_process(dev,
1180                                                       RTE_ETH_EVENT_INTR_LSC, NULL);
1181         }
1182
1183 }
1184
1185 static void
1186 rx_func_get(struct rte_eth_dev *eth_dev)
1187 {
1188         struct virtio_hw *hw = eth_dev->data->dev_private;
1189         if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF))
1190                 eth_dev->rx_pkt_burst = &virtio_recv_mergeable_pkts;
1191         else
1192                 eth_dev->rx_pkt_burst = &virtio_recv_pkts;
1193 }
1194
1195 /* reset device and renegotiate features if needed */
1196 static int
1197 virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
1198 {
1199         struct virtio_hw *hw = eth_dev->data->dev_private;
1200         struct virtio_net_config *config;
1201         struct virtio_net_config local_config;
1202         struct rte_pci_device *pci_dev = eth_dev->pci_dev;
1203         int ret;
1204
1205         /* Reset the device although not necessary at startup */
1206         vtpci_reset(hw);
1207
1208         /* Tell the host we've noticed this device. */
1209         vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_ACK);
1210
1211         /* Tell the host we've known how to drive the device. */
1212         vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER);
1213         if (virtio_negotiate_features(hw, req_features) < 0)
1214                 return -1;
1215
1216         rte_eth_copy_pci_info(eth_dev, pci_dev);
1217
1218         /* If host does not support both status and MSI-X then disable LSC */
1219         if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS) && hw->use_msix)
1220                 eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
1221         else
1222                 eth_dev->data->dev_flags &= ~RTE_ETH_DEV_INTR_LSC;
1223
1224         rx_func_get(eth_dev);
1225
1226         /* Setting up rx_header size for the device */
1227         if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF) ||
1228             vtpci_with_feature(hw, VIRTIO_F_VERSION_1))
1229                 hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf);
1230         else
1231                 hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr);
1232
1233         /* Copy the permanent MAC address to: virtio_hw */
1234         virtio_get_hwaddr(hw);
1235         ether_addr_copy((struct ether_addr *) hw->mac_addr,
1236                         &eth_dev->data->mac_addrs[0]);
1237         PMD_INIT_LOG(DEBUG,
1238                      "PORT MAC: %02X:%02X:%02X:%02X:%02X:%02X",
1239                      hw->mac_addr[0], hw->mac_addr[1], hw->mac_addr[2],
1240                      hw->mac_addr[3], hw->mac_addr[4], hw->mac_addr[5]);
1241
1242         if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ)) {
1243                 config = &local_config;
1244
1245                 vtpci_read_dev_config(hw,
1246                         offsetof(struct virtio_net_config, mac),
1247                         &config->mac, sizeof(config->mac));
1248
1249                 if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) {
1250                         vtpci_read_dev_config(hw,
1251                                 offsetof(struct virtio_net_config, status),
1252                                 &config->status, sizeof(config->status));
1253                 } else {
1254                         PMD_INIT_LOG(DEBUG,
1255                                      "VIRTIO_NET_F_STATUS is not supported");
1256                         config->status = 0;
1257                 }
1258
1259                 if (vtpci_with_feature(hw, VIRTIO_NET_F_MQ)) {
1260                         vtpci_read_dev_config(hw,
1261                                 offsetof(struct virtio_net_config, max_virtqueue_pairs),
1262                                 &config->max_virtqueue_pairs,
1263                                 sizeof(config->max_virtqueue_pairs));
1264                 } else {
1265                         PMD_INIT_LOG(DEBUG,
1266                                      "VIRTIO_NET_F_MQ is not supported");
1267                         config->max_virtqueue_pairs = 1;
1268                 }
1269
1270                 hw->max_queue_pairs = config->max_virtqueue_pairs;
1271
1272                 PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=%d",
1273                                 config->max_virtqueue_pairs);
1274                 PMD_INIT_LOG(DEBUG, "config->status=%d", config->status);
1275                 PMD_INIT_LOG(DEBUG,
1276                                 "PORT MAC: %02X:%02X:%02X:%02X:%02X:%02X",
1277                                 config->mac[0], config->mac[1],
1278                                 config->mac[2], config->mac[3],
1279                                 config->mac[4], config->mac[5]);
1280         } else {
1281                 PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=1");
1282                 hw->max_queue_pairs = 1;
1283         }
1284
1285         ret = virtio_alloc_queues(eth_dev);
1286         if (ret < 0)
1287                 return ret;
1288         vtpci_reinit_complete(hw);
1289
1290         if (pci_dev)
1291                 PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",
1292                         eth_dev->data->port_id, pci_dev->id.vendor_id,
1293                         pci_dev->id.device_id);
1294
1295         return 0;
1296 }
1297
1298 /*
1299  * Remap the PCI device again (IO port map for legacy device and
1300  * memory map for modern device), so that the secondary process
1301  * could have the PCI initiated correctly.
1302  */
1303 static int
1304 virtio_remap_pci(struct rte_pci_device *pci_dev, struct virtio_hw *hw)
1305 {
1306         if (hw->modern) {
1307                 /*
1308                  * We don't have to re-parse the PCI config space, since
1309                  * rte_eal_pci_map_device() makes sure the mapped address
1310                  * in secondary process would equal to the one mapped in
1311                  * the primary process: error will be returned if that
1312                  * requirement is not met.
1313                  *
1314                  * That said, we could simply reuse all cap pointers
1315                  * (such as dev_cfg, common_cfg, etc.) parsed from the
1316                  * primary process, which is stored in shared memory.
1317                  */
1318                 if (rte_eal_pci_map_device(pci_dev)) {
1319                         PMD_INIT_LOG(DEBUG, "failed to map pci device!");
1320                         return -1;
1321                 }
1322         } else {
1323                 if (rte_eal_pci_ioport_map(pci_dev, 0, VTPCI_IO(hw)) < 0)
1324                         return -1;
1325         }
1326
1327         return 0;
1328 }
1329
1330 static void
1331 virtio_set_vtpci_ops(struct virtio_hw *hw)
1332 {
1333 #ifdef RTE_VIRTIO_USER
1334         if (hw->virtio_user_dev)
1335                 VTPCI_OPS(hw) = &virtio_user_ops;
1336         else
1337 #endif
1338         if (hw->modern)
1339                 VTPCI_OPS(hw) = &modern_ops;
1340         else
1341                 VTPCI_OPS(hw) = &legacy_ops;
1342 }
1343
1344 /*
1345  * This function is based on probe() function in virtio_pci.c
1346  * It returns 0 on success.
1347  */
1348 int
1349 eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
1350 {
1351         struct virtio_hw *hw = eth_dev->data->dev_private;
1352         struct rte_pci_device *pci_dev;
1353         uint32_t dev_flags = RTE_ETH_DEV_DETACHABLE;
1354         int ret;
1355
1356         RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr_mrg_rxbuf));
1357
1358         eth_dev->dev_ops = &virtio_eth_dev_ops;
1359         eth_dev->tx_pkt_burst = &virtio_xmit_pkts;
1360
1361         if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
1362                 if (!hw->virtio_user_dev) {
1363                         ret = virtio_remap_pci(eth_dev->pci_dev, hw);
1364                         if (ret)
1365                                 return ret;
1366                 }
1367
1368                 virtio_set_vtpci_ops(hw);
1369                 if (hw->use_simple_rxtx) {
1370                         eth_dev->tx_pkt_burst = virtio_xmit_pkts_simple;
1371                         eth_dev->rx_pkt_burst = virtio_recv_pkts_vec;
1372                 } else {
1373                         rx_func_get(eth_dev);
1374                 }
1375                 return 0;
1376         }
1377
1378         /* Allocate memory for storing MAC addresses */
1379         eth_dev->data->mac_addrs = rte_zmalloc("virtio", VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN, 0);
1380         if (eth_dev->data->mac_addrs == NULL) {
1381                 PMD_INIT_LOG(ERR,
1382                         "Failed to allocate %d bytes needed to store MAC addresses",
1383                         VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN);
1384                 return -ENOMEM;
1385         }
1386
1387         pci_dev = eth_dev->pci_dev;
1388         hw->port_id = eth_dev->data->port_id;
1389
1390         if (pci_dev) {
1391                 ret = vtpci_init(pci_dev, hw, &dev_flags);
1392                 if (ret)
1393                         return ret;
1394         }
1395
1396         eth_dev->data->dev_flags = dev_flags;
1397
1398         /* reset device and negotiate default features */
1399         ret = virtio_init_device(eth_dev, VIRTIO_PMD_DEFAULT_GUEST_FEATURES);
1400         if (ret < 0)
1401                 return ret;
1402
1403         /* Setup interrupt callback  */
1404         if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
1405                 rte_intr_callback_register(&pci_dev->intr_handle,
1406                         virtio_interrupt_handler, eth_dev);
1407
1408         return 0;
1409 }
1410
1411 static int
1412 eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
1413 {
1414         struct rte_pci_device *pci_dev;
1415
1416         PMD_INIT_FUNC_TRACE();
1417
1418         if (rte_eal_process_type() == RTE_PROC_SECONDARY)
1419                 return -EPERM;
1420
1421         virtio_dev_stop(eth_dev);
1422         virtio_dev_close(eth_dev);
1423         pci_dev = eth_dev->pci_dev;
1424
1425         eth_dev->dev_ops = NULL;
1426         eth_dev->tx_pkt_burst = NULL;
1427         eth_dev->rx_pkt_burst = NULL;
1428
1429         rte_free(eth_dev->data->mac_addrs);
1430         eth_dev->data->mac_addrs = NULL;
1431
1432         /* reset interrupt callback  */
1433         if (eth_dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
1434                 rte_intr_callback_unregister(&pci_dev->intr_handle,
1435                                                 virtio_interrupt_handler,
1436                                                 eth_dev);
1437         rte_eal_pci_unmap_device(pci_dev);
1438
1439         PMD_INIT_LOG(DEBUG, "dev_uninit completed");
1440
1441         return 0;
1442 }
1443
1444 static struct eth_driver rte_virtio_pmd = {
1445         .pci_drv = {
1446                 .driver = {
1447                         .name = "net_virtio",
1448                 },
1449                 .id_table = pci_id_virtio_map,
1450                 .drv_flags = RTE_PCI_DRV_DETACHABLE,
1451                 .probe = rte_eth_dev_pci_probe,
1452                 .remove = rte_eth_dev_pci_remove,
1453         },
1454         .eth_dev_init = eth_virtio_dev_init,
1455         .eth_dev_uninit = eth_virtio_dev_uninit,
1456         .dev_private_size = sizeof(struct virtio_hw),
1457 };
1458
1459 RTE_INIT(rte_virtio_pmd_init);
1460 static void
1461 rte_virtio_pmd_init(void)
1462 {
1463         if (rte_eal_iopl_init() != 0) {
1464                 PMD_INIT_LOG(ERR, "IOPL call failed - cannot use virtio PMD");
1465                 return;
1466         }
1467
1468         rte_eal_pci_register(&rte_virtio_pmd.pci_drv);
1469 }
1470
1471 /*
1472  * Configure virtio device
1473  * It returns 0 on success.
1474  */
1475 static int
1476 virtio_dev_configure(struct rte_eth_dev *dev)
1477 {
1478         const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
1479         struct virtio_hw *hw = dev->data->dev_private;
1480         uint64_t req_features;
1481         int ret;
1482
1483         PMD_INIT_LOG(DEBUG, "configure");
1484         req_features = VIRTIO_PMD_DEFAULT_GUEST_FEATURES;
1485         if (rxmode->hw_ip_checksum)
1486                 req_features |= (1ULL << VIRTIO_NET_F_GUEST_CSUM);
1487         if (rxmode->enable_lro)
1488                 req_features |=
1489                         (1ULL << VIRTIO_NET_F_GUEST_TSO4) |
1490                         (1ULL << VIRTIO_NET_F_GUEST_TSO6);
1491
1492         /* if request features changed, reinit the device */
1493         if (req_features != hw->req_guest_features) {
1494                 ret = virtio_init_device(dev, req_features);
1495                 if (ret < 0)
1496                         return ret;
1497         }
1498
1499         if (rxmode->hw_ip_checksum &&
1500                 !vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_CSUM)) {
1501                 PMD_DRV_LOG(NOTICE,
1502                         "rx ip checksum not available on this host");
1503                 return -ENOTSUP;
1504         }
1505
1506         if (rxmode->enable_lro &&
1507                 (!vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4) ||
1508                         !vtpci_with_feature(hw, VIRTIO_NET_F_GUEST_TSO4))) {
1509                 PMD_DRV_LOG(NOTICE,
1510                         "lro not available on this host");
1511                 return -ENOTSUP;
1512         }
1513
1514         /* start control queue */
1515         if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VQ))
1516                 virtio_dev_cq_start(dev);
1517
1518         hw->vlan_strip = rxmode->hw_vlan_strip;
1519
1520         if (rxmode->hw_vlan_filter
1521             && !vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_VLAN)) {
1522                 PMD_DRV_LOG(NOTICE,
1523                             "vlan filtering not available on this host");
1524                 return -ENOTSUP;
1525         }
1526
1527         if (dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)
1528                 if (vtpci_irq_config(hw, 0) == VIRTIO_MSI_NO_VECTOR) {
1529                         PMD_DRV_LOG(ERR, "failed to set config vector");
1530                         return -EBUSY;
1531                 }
1532
1533         return 0;
1534 }
1535
1536
1537 static int
1538 virtio_dev_start(struct rte_eth_dev *dev)
1539 {
1540         uint16_t nb_queues, i;
1541         struct virtnet_rx *rxvq;
1542         struct virtnet_tx *txvq __rte_unused;
1543         struct virtio_hw *hw = dev->data->dev_private;
1544
1545         /* check if lsc interrupt feature is enabled */
1546         if (dev->data->dev_conf.intr_conf.lsc) {
1547                 if (!(dev->data->dev_flags & RTE_ETH_DEV_INTR_LSC)) {
1548                         PMD_DRV_LOG(ERR, "link status not supported by host");
1549                         return -ENOTSUP;
1550                 }
1551
1552                 if (rte_intr_enable(&dev->pci_dev->intr_handle) < 0) {
1553                         PMD_DRV_LOG(ERR, "interrupt enable failed");
1554                         return -EIO;
1555                 }
1556         }
1557
1558         /*Notify the backend
1559          *Otherwise the tap backend might already stop its queue due to fullness.
1560          *vhost backend will have no chance to be waked up
1561          */
1562         nb_queues = RTE_MAX(dev->data->nb_rx_queues, dev->data->nb_tx_queues);
1563         if (hw->max_queue_pairs > 1) {
1564                 if (virtio_set_multiple_queues(dev, nb_queues) != 0)
1565                         return -EINVAL;
1566         }
1567
1568         PMD_INIT_LOG(DEBUG, "nb_queues=%d", nb_queues);
1569
1570         for (i = 0; i < dev->data->nb_rx_queues; i++) {
1571                 rxvq = dev->data->rx_queues[i];
1572                 virtqueue_notify(rxvq->vq);
1573         }
1574
1575         PMD_INIT_LOG(DEBUG, "Notified backend at initialization");
1576
1577         for (i = 0; i < dev->data->nb_rx_queues; i++) {
1578                 rxvq = dev->data->rx_queues[i];
1579                 VIRTQUEUE_DUMP(rxvq->vq);
1580         }
1581
1582         for (i = 0; i < dev->data->nb_tx_queues; i++) {
1583                 txvq = dev->data->tx_queues[i];
1584                 VIRTQUEUE_DUMP(txvq->vq);
1585         }
1586
1587         hw->started = 1;
1588
1589         /* Initialize Link state */
1590         virtio_dev_link_update(dev, 0);
1591
1592         return 0;
1593 }
1594
1595 static void virtio_dev_free_mbufs(struct rte_eth_dev *dev)
1596 {
1597         struct rte_mbuf *buf;
1598         int i, mbuf_num = 0;
1599
1600         for (i = 0; i < dev->data->nb_rx_queues; i++) {
1601                 struct virtnet_rx *rxvq = dev->data->rx_queues[i];
1602
1603                 PMD_INIT_LOG(DEBUG,
1604                              "Before freeing rxq[%d] used and unused buf", i);
1605                 VIRTQUEUE_DUMP(rxvq->vq);
1606
1607                 PMD_INIT_LOG(DEBUG, "rx_queues[%d]=%p", i, rxvq);
1608                 while ((buf = virtqueue_detatch_unused(rxvq->vq)) != NULL) {
1609                         rte_pktmbuf_free(buf);
1610                         mbuf_num++;
1611                 }
1612
1613                 PMD_INIT_LOG(DEBUG, "free %d mbufs", mbuf_num);
1614                 PMD_INIT_LOG(DEBUG,
1615                              "After freeing rxq[%d] used and unused buf", i);
1616                 VIRTQUEUE_DUMP(rxvq->vq);
1617         }
1618
1619         for (i = 0; i < dev->data->nb_tx_queues; i++) {
1620                 struct virtnet_tx *txvq = dev->data->tx_queues[i];
1621
1622                 PMD_INIT_LOG(DEBUG,
1623                              "Before freeing txq[%d] used and unused bufs",
1624                              i);
1625                 VIRTQUEUE_DUMP(txvq->vq);
1626
1627                 mbuf_num = 0;
1628                 while ((buf = virtqueue_detatch_unused(txvq->vq)) != NULL) {
1629                         rte_pktmbuf_free(buf);
1630                         mbuf_num++;
1631                 }
1632
1633                 PMD_INIT_LOG(DEBUG, "free %d mbufs", mbuf_num);
1634                 PMD_INIT_LOG(DEBUG,
1635                              "After freeing txq[%d] used and unused buf", i);
1636                 VIRTQUEUE_DUMP(txvq->vq);
1637         }
1638 }
1639
1640 /*
1641  * Stop device: disable interrupt and mark link down
1642  */
1643 static void
1644 virtio_dev_stop(struct rte_eth_dev *dev)
1645 {
1646         struct virtio_hw *hw = dev->data->dev_private;
1647         struct rte_eth_link link;
1648
1649         PMD_INIT_LOG(DEBUG, "stop");
1650
1651         if (dev->data->dev_conf.intr_conf.lsc)
1652                 rte_intr_disable(&dev->pci_dev->intr_handle);
1653
1654         hw->started = 0;
1655         memset(&link, 0, sizeof(link));
1656         virtio_dev_atomic_write_link_status(dev, &link);
1657 }
1658
1659 static int
1660 virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete)
1661 {
1662         struct rte_eth_link link, old;
1663         uint16_t status;
1664         struct virtio_hw *hw = dev->data->dev_private;
1665         memset(&link, 0, sizeof(link));
1666         virtio_dev_atomic_read_link_status(dev, &link);
1667         old = link;
1668         link.link_duplex = ETH_LINK_FULL_DUPLEX;
1669         link.link_speed  = SPEED_10G;
1670
1671         if (hw->started == 0) {
1672                 link.link_status = ETH_LINK_DOWN;
1673         } else if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) {
1674                 PMD_INIT_LOG(DEBUG, "Get link status from hw");
1675                 vtpci_read_dev_config(hw,
1676                                 offsetof(struct virtio_net_config, status),
1677                                 &status, sizeof(status));
1678                 if ((status & VIRTIO_NET_S_LINK_UP) == 0) {
1679                         link.link_status = ETH_LINK_DOWN;
1680                         PMD_INIT_LOG(DEBUG, "Port %d is down",
1681                                      dev->data->port_id);
1682                 } else {
1683                         link.link_status = ETH_LINK_UP;
1684                         PMD_INIT_LOG(DEBUG, "Port %d is up",
1685                                      dev->data->port_id);
1686                 }
1687         } else {
1688                 link.link_status = ETH_LINK_UP;
1689         }
1690         virtio_dev_atomic_write_link_status(dev, &link);
1691
1692         return (old.link_status == link.link_status) ? -1 : 0;
1693 }
1694
1695 static void
1696 virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
1697 {
1698         uint64_t tso_mask;
1699         struct virtio_hw *hw = dev->data->dev_private;
1700
1701         if (dev->pci_dev)
1702                 dev_info->driver_name = dev->driver->pci_drv.driver.name;
1703         else
1704                 dev_info->driver_name = "virtio_user PMD";
1705         dev_info->max_rx_queues =
1706                 RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES);
1707         dev_info->max_tx_queues =
1708                 RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_TX_QUEUES);
1709         dev_info->min_rx_bufsize = VIRTIO_MIN_RX_BUFSIZE;
1710         dev_info->max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN;
1711         dev_info->max_mac_addrs = VIRTIO_MAX_MAC_ADDRS;
1712         dev_info->default_txconf = (struct rte_eth_txconf) {
1713                 .txq_flags = ETH_TXQ_FLAGS_NOOFFLOADS
1714         };
1715         dev_info->rx_offload_capa =
1716                 DEV_RX_OFFLOAD_TCP_CKSUM |
1717                 DEV_RX_OFFLOAD_UDP_CKSUM |
1718                 DEV_RX_OFFLOAD_TCP_LRO;
1719         dev_info->tx_offload_capa = 0;
1720
1721         if (hw->guest_features & (1ULL << VIRTIO_NET_F_CSUM)) {
1722                 dev_info->tx_offload_capa |=
1723                         DEV_TX_OFFLOAD_UDP_CKSUM |
1724                         DEV_TX_OFFLOAD_TCP_CKSUM;
1725         }
1726
1727         tso_mask = (1ULL << VIRTIO_NET_F_HOST_TSO4) |
1728                 (1ULL << VIRTIO_NET_F_HOST_TSO6);
1729         if ((hw->guest_features & tso_mask) == tso_mask)
1730                 dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_TCP_TSO;
1731 }
1732
1733 /*
1734  * It enables testpmd to collect per queue stats.
1735  */
1736 static int
1737 virtio_dev_queue_stats_mapping_set(__rte_unused struct rte_eth_dev *eth_dev,
1738 __rte_unused uint16_t queue_id, __rte_unused uint8_t stat_idx,
1739 __rte_unused uint8_t is_rx)
1740 {
1741         return 0;
1742 }
1743
1744 RTE_PMD_EXPORT_NAME(net_virtio, __COUNTER__);
1745 RTE_PMD_REGISTER_PCI_TABLE(net_virtio, pci_id_virtio_map);