net: add rte prefix to ether structures
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index 78ba7bd..9b99bf3 100644 (file)
@@ -65,11 +65,11 @@ static void virtio_dev_free_mbufs(struct rte_eth_dev *dev);
 static int virtio_vlan_filter_set(struct rte_eth_dev *dev,
                                uint16_t vlan_id, int on);
 static int virtio_mac_addr_add(struct rte_eth_dev *dev,
-                               struct ether_addr *mac_addr,
+                               struct rte_ether_addr *mac_addr,
                                uint32_t index, uint32_t vmdq);
 static void virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index);
 static int virtio_mac_addr_set(struct rte_eth_dev *dev,
-                               struct ether_addr *mac_addr);
+                               struct rte_ether_addr *mac_addr);
 
 static int virtio_intr_disable(struct rte_eth_dev *dev);
 
@@ -147,9 +147,9 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
 {
        struct virtqueue *vq = cvq->vq;
        int head;
-       struct vring_packed_desc *desc = vq->ring_packed.desc_packed;
+       struct vring_packed_desc *desc = vq->vq_packed.ring.desc;
        struct virtio_pmd_ctrl *result;
-       bool avail_wrap_counter;
+       uint16_t flags;
        int sum = 0;
        int nb_descs = 0;
        int k;
@@ -161,14 +161,14 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
         * One RX packet for ACK.
         */
        head = vq->vq_avail_idx;
-       avail_wrap_counter = vq->avail_wrap_counter;
+       flags = vq->vq_packed.cached_flags;
        desc[head].addr = cvq->virtio_net_hdr_mem;
        desc[head].len = sizeof(struct virtio_net_ctrl_hdr);
        vq->vq_free_cnt--;
        nb_descs++;
        if (++vq->vq_avail_idx >= vq->vq_nentries) {
                vq->vq_avail_idx -= vq->vq_nentries;
-               vq->avail_wrap_counter ^= 1;
+               vq->vq_packed.cached_flags ^= VRING_PACKED_DESC_F_AVAIL_USED;
        }
 
        for (k = 0; k < pkt_num; k++) {
@@ -177,14 +177,14 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
                        + sizeof(ctrl->status) + sizeof(uint8_t) * sum;
                desc[vq->vq_avail_idx].len = dlen[k];
                desc[vq->vq_avail_idx].flags = VRING_DESC_F_NEXT |
-                       VRING_DESC_F_AVAIL(vq->avail_wrap_counter) |
-                       VRING_DESC_F_USED(!vq->avail_wrap_counter);
+                       vq->vq_packed.cached_flags;
                sum += dlen[k];
                vq->vq_free_cnt--;
                nb_descs++;
                if (++vq->vq_avail_idx >= vq->vq_nentries) {
                        vq->vq_avail_idx -= vq->vq_nentries;
-                       vq->avail_wrap_counter ^= 1;
+                       vq->vq_packed.cached_flags ^=
+                               VRING_PACKED_DESC_F_AVAIL_USED;
                }
        }
 
@@ -192,19 +192,16 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
                + sizeof(struct virtio_net_ctrl_hdr);
        desc[vq->vq_avail_idx].len = sizeof(ctrl->status);
        desc[vq->vq_avail_idx].flags = VRING_DESC_F_WRITE |
-               VRING_DESC_F_AVAIL(vq->avail_wrap_counter) |
-               VRING_DESC_F_USED(!vq->avail_wrap_counter);
+               vq->vq_packed.cached_flags;
        vq->vq_free_cnt--;
        nb_descs++;
        if (++vq->vq_avail_idx >= vq->vq_nentries) {
                vq->vq_avail_idx -= vq->vq_nentries;
-               vq->avail_wrap_counter ^= 1;
+               vq->vq_packed.cached_flags ^= VRING_PACKED_DESC_F_AVAIL_USED;
        }
 
        virtio_wmb(vq->hw->weak_barriers);
-       desc[head].flags = VRING_DESC_F_NEXT |
-               VRING_DESC_F_AVAIL(avail_wrap_counter) |
-               VRING_DESC_F_USED(!avail_wrap_counter);
+       desc[head].flags = VRING_DESC_F_NEXT | flags;
 
        virtio_wmb(vq->hw->weak_barriers);
        virtqueue_notify(vq);
@@ -220,92 +217,66 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
        vq->vq_used_cons_idx += nb_descs;
        if (vq->vq_used_cons_idx >= vq->vq_nentries) {
                vq->vq_used_cons_idx -= vq->vq_nentries;
-               vq->used_wrap_counter ^= 1;
+               vq->vq_packed.used_wrap_counter ^= 1;
        }
 
        PMD_INIT_LOG(DEBUG, "vq->vq_free_cnt=%d\n"
                        "vq->vq_avail_idx=%d\n"
                        "vq->vq_used_cons_idx=%d\n"
-                       "vq->avail_wrap_counter=%d\n"
-                       "vq->used_wrap_counter=%d\n",
+                       "vq->vq_packed.cached_flags=0x%x\n"
+                       "vq->vq_packed.used_wrap_counter=%d\n",
                        vq->vq_free_cnt,
                        vq->vq_avail_idx,
                        vq->vq_used_cons_idx,
-                       vq->avail_wrap_counter,
-                       vq->used_wrap_counter);
+                       vq->vq_packed.cached_flags,
+                       vq->vq_packed.used_wrap_counter);
 
        result = cvq->virtio_net_hdr_mz->addr;
        return result;
 }
 
-static int
-virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
-               int *dlen, int pkt_num)
+static struct virtio_pmd_ctrl *
+virtio_send_command_split(struct virtnet_ctl *cvq,
+                         struct virtio_pmd_ctrl *ctrl,
+                         int *dlen, int pkt_num)
 {
+       struct virtio_pmd_ctrl *result;
+       struct virtqueue *vq = cvq->vq;
        uint32_t head, i;
        int k, sum = 0;
-       virtio_net_ctrl_ack status = ~0;
-       struct virtio_pmd_ctrl *result;
-       struct virtqueue *vq;
-
-       ctrl->status = status;
-
-       if (!cvq || !cvq->vq) {
-               PMD_INIT_LOG(ERR, "Control queue is not supported.");
-               return -1;
-       }
 
-       rte_spinlock_lock(&cvq->lock);
-       vq = cvq->vq;
        head = vq->vq_desc_head_idx;
 
-       PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, "
-               "vq->hw->cvq = %p vq = %p",
-               vq->vq_desc_head_idx, status, vq->hw->cvq, vq);
-
-       if (vq->vq_free_cnt < pkt_num + 2 || pkt_num < 1) {
-               rte_spinlock_unlock(&cvq->lock);
-               return -1;
-       }
-
-       memcpy(cvq->virtio_net_hdr_mz->addr, ctrl,
-               sizeof(struct virtio_pmd_ctrl));
-
-       if (vtpci_packed_queue(vq->hw)) {
-               result = virtio_send_command_packed(cvq, ctrl, dlen, pkt_num);
-               goto out_unlock;
-       }
-
        /*
         * Format is enforced in qemu code:
         * One TX packet for header;
         * At least one TX packet per argument;
         * One RX packet for ACK.
         */
-       vq->vq_ring.desc[head].flags = VRING_DESC_F_NEXT;
-       vq->vq_ring.desc[head].addr = cvq->virtio_net_hdr_mem;
-       vq->vq_ring.desc[head].len = sizeof(struct virtio_net_ctrl_hdr);
+       vq->vq_split.ring.desc[head].flags = VRING_DESC_F_NEXT;
+       vq->vq_split.ring.desc[head].addr = cvq->virtio_net_hdr_mem;
+       vq->vq_split.ring.desc[head].len = sizeof(struct virtio_net_ctrl_hdr);
        vq->vq_free_cnt--;
-       i = vq->vq_ring.desc[head].next;
+       i = vq->vq_split.ring.desc[head].next;
 
        for (k = 0; k < pkt_num; k++) {
-               vq->vq_ring.desc[i].flags = VRING_DESC_F_NEXT;
-               vq->vq_ring.desc[i].addr = cvq->virtio_net_hdr_mem
+               vq->vq_split.ring.desc[i].flags = VRING_DESC_F_NEXT;
+               vq->vq_split.ring.desc[i].addr = cvq->virtio_net_hdr_mem
                        + sizeof(struct virtio_net_ctrl_hdr)
                        + sizeof(ctrl->status) + sizeof(uint8_t)*sum;
-               vq->vq_ring.desc[i].len = dlen[k];
+               vq->vq_split.ring.desc[i].len = dlen[k];
                sum += dlen[k];
                vq->vq_free_cnt--;
-               i = vq->vq_ring.desc[i].next;
+               i = vq->vq_split.ring.desc[i].next;
        }
 
-       vq->vq_ring.desc[i].flags = VRING_DESC_F_WRITE;
-       vq->vq_ring.desc[i].addr = cvq->virtio_net_hdr_mem
+       vq->vq_split.ring.desc[i].flags = VRING_DESC_F_WRITE;
+       vq->vq_split.ring.desc[i].addr = cvq->virtio_net_hdr_mem
                        + sizeof(struct virtio_net_ctrl_hdr);
-       vq->vq_ring.desc[i].len = sizeof(ctrl->status);
+       vq->vq_split.ring.desc[i].len = sizeof(ctrl->status);
        vq->vq_free_cnt--;
 
-       vq->vq_desc_head_idx = vq->vq_ring.desc[i].next;
+       vq->vq_desc_head_idx = vq->vq_split.ring.desc[i].next;
 
        vq_update_avail_ring(vq, head);
        vq_update_avail_idx(vq);
@@ -326,16 +297,17 @@ virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
 
                used_idx = (uint32_t)(vq->vq_used_cons_idx
                                & (vq->vq_nentries - 1));
-               uep = &vq->vq_ring.used->ring[used_idx];
+               uep = &vq->vq_split.ring.used->ring[used_idx];
                idx = (uint32_t) uep->id;
                desc_idx = idx;
 
-               while (vq->vq_ring.desc[desc_idx].flags & VRING_DESC_F_NEXT) {
-                       desc_idx = vq->vq_ring.desc[desc_idx].next;
+               while (vq->vq_split.ring.desc[desc_idx].flags &
+                               VRING_DESC_F_NEXT) {
+                       desc_idx = vq->vq_split.ring.desc[desc_idx].next;
                        vq->vq_free_cnt++;
                }
 
-               vq->vq_ring.desc[desc_idx].next = vq->vq_desc_head_idx;
+               vq->vq_split.ring.desc[desc_idx].next = vq->vq_desc_head_idx;
                vq->vq_desc_head_idx = idx;
 
                vq->vq_used_cons_idx++;
@@ -346,8 +318,44 @@ virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
                        vq->vq_free_cnt, vq->vq_desc_head_idx);
 
        result = cvq->virtio_net_hdr_mz->addr;
+       return result;
+}
+
+static int
+virtio_send_command(struct virtnet_ctl *cvq, struct virtio_pmd_ctrl *ctrl,
+                   int *dlen, int pkt_num)
+{
+       virtio_net_ctrl_ack status = ~0;
+       struct virtio_pmd_ctrl *result;
+       struct virtqueue *vq;
+
+       ctrl->status = status;
+
+       if (!cvq || !cvq->vq) {
+               PMD_INIT_LOG(ERR, "Control queue is not supported.");
+               return -1;
+       }
+
+       rte_spinlock_lock(&cvq->lock);
+       vq = cvq->vq;
+
+       PMD_INIT_LOG(DEBUG, "vq->vq_desc_head_idx = %d, status = %d, "
+               "vq->hw->cvq = %p vq = %p",
+               vq->vq_desc_head_idx, status, vq->hw->cvq, vq);
+
+       if (vq->vq_free_cnt < pkt_num + 2 || pkt_num < 1) {
+               rte_spinlock_unlock(&cvq->lock);
+               return -1;
+       }
+
+       memcpy(cvq->virtio_net_hdr_mz->addr, ctrl,
+               sizeof(struct virtio_pmd_ctrl));
+
+       if (vtpci_packed_queue(vq->hw))
+               result = virtio_send_command_packed(cvq, ctrl, dlen, pkt_num);
+       else
+               result = virtio_send_command_split(cvq, ctrl, dlen, pkt_num);
 
-out_unlock:
        rte_spinlock_unlock(&cvq->lock);
        return result->status;
 }
@@ -397,7 +405,6 @@ static void
 virtio_init_vring(struct virtqueue *vq)
 {
        int size = vq->vq_nentries;
-       struct vring *vr = &vq->vq_ring;
        uint8_t *ring_mem = vq->vq_ring_virt_mem;
 
        PMD_INIT_FUNC_TRACE();
@@ -411,10 +418,12 @@ virtio_init_vring(struct virtqueue *vq)
        vq->vq_free_cnt = vq->vq_nentries;
        memset(vq->vq_descx, 0, sizeof(struct vq_desc_extra) * vq->vq_nentries);
        if (vtpci_packed_queue(vq->hw)) {
-               vring_init_packed(&vq->ring_packed, ring_mem,
+               vring_init_packed(&vq->vq_packed.ring, ring_mem,
                                  VIRTIO_PCI_VRING_ALIGN, size);
                vring_desc_init_packed(vq, size);
        } else {
+               struct vring *vr = &vq->vq_split.ring;
+
                vring_init_split(vr, ring_mem, VIRTIO_PCI_VRING_ALIGN, size);
                vring_desc_init_split(vr->desc, size);
        }
@@ -489,13 +498,12 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
        vq->hw = hw;
        vq->vq_queue_index = vtpci_queue_idx;
        vq->vq_nentries = vq_size;
-       vq->event_flags_shadow = 0;
        if (vtpci_packed_queue(hw)) {
-               vq->avail_wrap_counter = 1;
-               vq->used_wrap_counter = 1;
-               vq->avail_used_flags =
-                       VRING_DESC_F_AVAIL(vq->avail_wrap_counter) |
-                       VRING_DESC_F_USED(!vq->avail_wrap_counter);
+               vq->vq_packed.used_wrap_counter = 1;
+               vq->vq_packed.cached_flags = VRING_PACKED_DESC_F_AVAIL;
+               vq->vq_packed.event_flags_shadow = 0;
+               if (queue_type == VTNET_RQ)
+                       vq->vq_packed.cached_flags |= VRING_DESC_F_WRITE;
        }
 
        /*
@@ -603,17 +611,9 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
                memset(txr, 0, vq_size * sizeof(*txr));
                for (i = 0; i < vq_size; i++) {
                        struct vring_desc *start_dp = txr[i].tx_indir;
-                       struct vring_packed_desc *start_dp_packed =
-                               txr[i].tx_indir_pq;
 
                        /* first indirect descriptor is always the tx header */
-                       if (vtpci_packed_queue(hw)) {
-                               start_dp_packed->addr = txvq->virtio_net_hdr_mem
-                                       + i * sizeof(*txr)
-                                       + offsetof(struct virtio_tx_region,
-                                                  tx_hdr);
-                               start_dp_packed->len = hw->vtnet_hdr_size;
-                       } else {
+                       if (!vtpci_packed_queue(hw)) {
                                vring_desc_init_split(start_dp,
                                                      RTE_DIM(txr[i].tx_indir));
                                start_dp->addr = txvq->virtio_net_hdr_mem
@@ -850,10 +850,12 @@ virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 static int
 virtio_dev_rx_queue_intr_enable(struct rte_eth_dev *dev, uint16_t queue_id)
 {
+       struct virtio_hw *hw = dev->data->dev_private;
        struct virtnet_rx *rxvq = dev->data->rx_queues[queue_id];
        struct virtqueue *vq = rxvq->vq;
 
        virtqueue_enable_intr(vq);
+       virtio_mb(hw->weak_barriers);
        return 0;
 }
 
@@ -903,6 +905,21 @@ static const struct eth_dev_ops virtio_eth_dev_ops = {
        .mac_addr_set            = virtio_mac_addr_set,
 };
 
+/*
+ * dev_ops for virtio-user in secondary processes, as we just have
+ * some limited supports currently.
+ */
+const struct eth_dev_ops virtio_user_secondary_eth_dev_ops = {
+       .dev_infos_get           = virtio_dev_info_get,
+       .stats_get               = virtio_dev_stats_get,
+       .xstats_get              = virtio_dev_xstats_get,
+       .xstats_get_names        = virtio_dev_xstats_get_names,
+       .stats_reset             = virtio_dev_stats_reset,
+       .xstats_reset            = virtio_dev_stats_reset,
+       /* collect stats per queue */
+       .queue_stats_mapping_set = virtio_dev_queue_stats_mapping_set,
+};
+
 static void
 virtio_update_stats(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
@@ -1125,11 +1142,11 @@ virtio_mac_table_set(struct virtio_hw *hw,
 }
 
 static int
-virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
+virtio_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,
                    uint32_t index, uint32_t vmdq __rte_unused)
 {
        struct virtio_hw *hw = dev->data->dev_private;
-       const struct ether_addr *addrs = dev->data->mac_addrs;
+       const struct rte_ether_addr *addrs = dev->data->mac_addrs;
        unsigned int i;
        struct virtio_net_ctrl_mac *uc, *mc;
 
@@ -1144,7 +1161,7 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
        mc->entries = 0;
 
        for (i = 0; i < VIRTIO_MAX_MAC_ADDRS; i++) {
-               const struct ether_addr *addr
+               const struct rte_ether_addr *addr
                        = (i == index) ? mac_addr : addrs + i;
                struct virtio_net_ctrl_mac *tbl
                        = is_multicast_ether_addr(addr) ? mc : uc;
@@ -1159,7 +1176,7 @@ static void
 virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
 {
        struct virtio_hw *hw = dev->data->dev_private;
-       struct ether_addr *addrs = dev->data->mac_addrs;
+       struct rte_ether_addr *addrs = dev->data->mac_addrs;
        struct virtio_net_ctrl_mac *uc, *mc;
        unsigned int i;
 
@@ -1187,7 +1204,7 @@ virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
 }
 
 static int
-virtio_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
+virtio_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr)
 {
        struct virtio_hw *hw = dev->data->dev_private;
 
@@ -1378,7 +1395,7 @@ virtio_notify_peers(struct rte_eth_dev *dev)
                return;
 
        rarp_mbuf = rte_net_make_rarp_packet(rxvq->mpool,
-                       (struct ether_addr *)hw->mac_addr);
+                       (struct rte_ether_addr *)hw->mac_addr);
        if (rarp_mbuf == NULL) {
                PMD_DRV_LOG(ERR, "failed to make RARP packet.");
                return;
@@ -1645,7 +1662,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
 
        /* Copy the permanent MAC address to: virtio_hw */
        virtio_get_hwaddr(hw);
-       ether_addr_copy((struct ether_addr *) hw->mac_addr,
+       ether_addr_copy((struct rte_ether_addr *)hw->mac_addr,
                        &eth_dev->data->mac_addrs[0]);
        PMD_INIT_LOG(DEBUG,
                     "PORT MAC: %02X:%02X:%02X:%02X:%02X:%02X",
@@ -1845,6 +1862,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 
 out:
        rte_free(eth_dev->data->mac_addrs);
+       eth_dev->data->mac_addrs = NULL;
        return ret;
 }