net: add rte prefix to ether structures
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index f452a9a..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);
 
@@ -168,8 +168,7 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
        nb_descs++;
        if (++vq->vq_avail_idx >= vq->vq_nentries) {
                vq->vq_avail_idx -= vq->vq_nentries;
-               vq->vq_packed.cached_flags ^=
-                       VRING_DESC_F_AVAIL(1) | VRING_DESC_F_USED(1);
+               vq->vq_packed.cached_flags ^= VRING_PACKED_DESC_F_AVAIL_USED;
        }
 
        for (k = 0; k < pkt_num; k++) {
@@ -185,7 +184,7 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
                if (++vq->vq_avail_idx >= vq->vq_nentries) {
                        vq->vq_avail_idx -= vq->vq_nentries;
                        vq->vq_packed.cached_flags ^=
-                               VRING_DESC_F_AVAIL(1) | VRING_DESC_F_USED(1);
+                               VRING_PACKED_DESC_F_AVAIL_USED;
                }
        }
 
@@ -198,8 +197,7 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
        nb_descs++;
        if (++vq->vq_avail_idx >= vq->vq_nentries) {
                vq->vq_avail_idx -= vq->vq_nentries;
-               vq->vq_packed.cached_flags ^=
-                       VRING_DESC_F_AVAIL(1) | VRING_DESC_F_USED(1);
+               vq->vq_packed.cached_flags ^= VRING_PACKED_DESC_F_AVAIL_USED;
        }
 
        virtio_wmb(vq->hw->weak_barriers);
@@ -237,44 +235,18 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
        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;
@@ -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;
 }
@@ -492,7 +500,7 @@ virtio_init_queue(struct rte_eth_dev *dev, uint16_t vtpci_queue_idx)
        vq->vq_nentries = vq_size;
        if (vtpci_packed_queue(hw)) {
                vq->vq_packed.used_wrap_counter = 1;
-               vq->vq_packed.cached_flags = VRING_DESC_F_AVAIL(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
@@ -905,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)
 {
@@ -1127,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;
 
@@ -1146,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;
@@ -1161,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;
 
@@ -1189,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;
 
@@ -1380,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;
@@ -1647,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",
@@ -1847,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;
 }