net: add rte prefix to ether defines
[dpdk.git] / drivers / net / virtio / virtio_ethdev.c
index bc91ad4..c4570bb 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,7 +147,7 @@ virtio_send_command_packed(struct virtnet_ctl *cvq,
 {
        struct virtqueue *vq = cvq->vq;
        int head;
-       struct vring_packed_desc *desc = vq->vq_packed.ring.desc_packed;
+       struct vring_packed_desc *desc = vq->vq_packed.ring.desc;
        struct virtio_pmd_ctrl *result;
        uint16_t flags;
        int sum = 0;
@@ -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
@@ -832,16 +832,16 @@ static int
 virtio_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
 {
        struct virtio_hw *hw = dev->data->dev_private;
-       uint32_t ether_hdr_len = ETHER_HDR_LEN + VLAN_TAG_LEN +
+       uint32_t ether_hdr_len = RTE_ETHER_HDR_LEN + VLAN_TAG_LEN +
                                 hw->vtnet_hdr_size;
        uint32_t frame_size = mtu + ether_hdr_len;
        uint32_t max_frame_size = hw->max_mtu + ether_hdr_len;
 
        max_frame_size = RTE_MIN(max_frame_size, VIRTIO_MAX_RX_PKTLEN);
 
-       if (mtu < ETHER_MIN_MTU || frame_size > max_frame_size) {
+       if (mtu < RTE_ETHER_MIN_MTU || frame_size > max_frame_size) {
                PMD_INIT_LOG(ERR, "MTU should be between %d and %d",
-                       ETHER_MIN_MTU, max_frame_size - ether_hdr_len);
+                       RTE_ETHER_MIN_MTU, max_frame_size - ether_hdr_len);
                return -EINVAL;
        }
        return 0;
@@ -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)
 {
@@ -1082,7 +1097,7 @@ virtio_set_hwaddr(struct virtio_hw *hw)
 {
        vtpci_write_dev_config(hw,
                        offsetof(struct virtio_net_config, mac),
-                       &hw->mac_addr, ETHER_ADDR_LEN);
+                       &hw->mac_addr, RTE_ETHER_ADDR_LEN);
 }
 
 static void
@@ -1091,9 +1106,9 @@ virtio_get_hwaddr(struct virtio_hw *hw)
        if (vtpci_with_feature(hw, VIRTIO_NET_F_MAC)) {
                vtpci_read_dev_config(hw,
                        offsetof(struct virtio_net_config, mac),
-                       &hw->mac_addr, ETHER_ADDR_LEN);
+                       &hw->mac_addr, RTE_ETHER_ADDR_LEN);
        } else {
-               eth_random_addr(&hw->mac_addr[0]);
+               rte_eth_random_addr(&hw->mac_addr[0]);
                virtio_set_hwaddr(hw);
        }
 }
@@ -1114,10 +1129,10 @@ virtio_mac_table_set(struct virtio_hw *hw,
        ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
        ctrl.hdr.cmd = VIRTIO_NET_CTRL_MAC_TABLE_SET;
 
-       len[0] = uc->entries * ETHER_ADDR_LEN + sizeof(uc->entries);
+       len[0] = uc->entries * RTE_ETHER_ADDR_LEN + sizeof(uc->entries);
        memcpy(ctrl.data, uc, len[0]);
 
-       len[1] = mc->entries * ETHER_ADDR_LEN + sizeof(mc->entries);
+       len[1] = mc->entries * RTE_ETHER_ADDR_LEN + sizeof(mc->entries);
        memcpy(ctrl.data + len[0], mc, len[1]);
 
        err = virtio_send_command(hw->cvq, &ctrl, len, 2);
@@ -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;
 
@@ -1140,18 +1155,20 @@ virtio_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac_addr,
                return -EINVAL;
        }
 
-       uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
+       uc = alloca(VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN +
+               sizeof(uc->entries));
        uc->entries = 0;
-       mc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(mc->entries));
+       mc = alloca(VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN +
+               sizeof(mc->entries));
        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;
+                       = rte_is_multicast_ether_addr(addr) ? mc : uc;
 
-               memcpy(&tbl->macs[tbl->entries++], addr, ETHER_ADDR_LEN);
+               memcpy(&tbl->macs[tbl->entries++], addr, RTE_ETHER_ADDR_LEN);
        }
 
        return virtio_mac_table_set(hw, uc, mc);
@@ -1161,7 +1178,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;
 
@@ -1170,40 +1187,43 @@ virtio_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)
                return;
        }
 
-       uc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(uc->entries));
+       uc = alloca(VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN +
+               sizeof(uc->entries));
        uc->entries = 0;
-       mc = alloca(VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN + sizeof(mc->entries));
+       mc = alloca(VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN +
+               sizeof(mc->entries));
        mc->entries = 0;
 
        for (i = 0; i < VIRTIO_MAX_MAC_ADDRS; i++) {
                struct virtio_net_ctrl_mac *tbl;
 
-               if (i == index || is_zero_ether_addr(addrs + i))
+               if (i == index || rte_is_zero_ether_addr(addrs + i))
                        continue;
 
-               tbl = is_multicast_ether_addr(addrs + i) ? mc : uc;
-               memcpy(&tbl->macs[tbl->entries++], addrs + i, ETHER_ADDR_LEN);
+               tbl = rte_is_multicast_ether_addr(addrs + i) ? mc : uc;
+               memcpy(&tbl->macs[tbl->entries++], addrs + i,
+                       RTE_ETHER_ADDR_LEN);
        }
 
        virtio_mac_table_set(hw, uc, mc);
 }
 
 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;
 
-       memcpy(hw->mac_addr, mac_addr, ETHER_ADDR_LEN);
+       memcpy(hw->mac_addr, mac_addr, RTE_ETHER_ADDR_LEN);
 
        /* Use atomic update if available */
        if (vtpci_with_feature(hw, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
                struct virtio_pmd_ctrl ctrl;
-               int len = ETHER_ADDR_LEN;
+               int len = RTE_ETHER_ADDR_LEN;
 
                ctrl.hdr.class = VIRTIO_NET_CTRL_MAC;
                ctrl.hdr.cmd = VIRTIO_NET_CTRL_MAC_ADDR_SET;
 
-               memcpy(ctrl.data, mac_addr, ETHER_ADDR_LEN);
+               memcpy(ctrl.data, mac_addr, RTE_ETHER_ADDR_LEN);
                return virtio_send_command(hw->cvq, &ctrl, &len, 1);
        }
 
@@ -1282,7 +1302,7 @@ virtio_negotiate_features(struct virtio_hw *hw, uint64_t req_features)
                        offsetof(struct virtio_net_config, mtu),
                        &config.mtu, sizeof(config.mtu));
 
-               if (config.mtu < ETHER_MIN_MTU)
+               if (config.mtu < RTE_ETHER_MIN_MTU)
                        req_features &= ~(1ULL << VIRTIO_NET_F_MTU);
        }
 
@@ -1380,7 +1400,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 +1667,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,
+       rte_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",
@@ -1695,7 +1715,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
                         * time, but check again in case it has changed since
                         * then, which should not happen.
                         */
-                       if (config->mtu < ETHER_MIN_MTU) {
+                       if (config->mtu < RTE_ETHER_MIN_MTU) {
                                PMD_INIT_LOG(ERR, "invalid max MTU value (%u)",
                                                config->mtu);
                                return -1;
@@ -1706,7 +1726,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
                        eth_dev->data->mtu = config->mtu;
 
                } else {
-                       hw->max_mtu = VIRTIO_MAX_RX_PKTLEN - ETHER_HDR_LEN -
+                       hw->max_mtu = VIRTIO_MAX_RX_PKTLEN - RTE_ETHER_HDR_LEN -
                                VLAN_TAG_LEN - hw->vtnet_hdr_size;
                }
 
@@ -1721,7 +1741,7 @@ virtio_init_device(struct rte_eth_dev *eth_dev, uint64_t req_features)
        } else {
                PMD_INIT_LOG(DEBUG, "config->max_virtqueue_pairs=1");
                hw->max_queue_pairs = 1;
-               hw->max_mtu = VIRTIO_MAX_RX_PKTLEN - ETHER_HDR_LEN -
+               hw->max_mtu = VIRTIO_MAX_RX_PKTLEN - RTE_ETHER_HDR_LEN -
                        VLAN_TAG_LEN - hw->vtnet_hdr_size;
        }
 
@@ -1820,11 +1840,12 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
        }
 
        /* Allocate memory for storing MAC addresses */
-       eth_dev->data->mac_addrs = rte_zmalloc("virtio", VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN, 0);
+       eth_dev->data->mac_addrs = rte_zmalloc("virtio",
+                               VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN, 0);
        if (eth_dev->data->mac_addrs == NULL) {
                PMD_INIT_LOG(ERR,
                        "Failed to allocate %d bytes needed to store MAC addresses",
-                       VIRTIO_MAX_MAC_ADDRS * ETHER_ADDR_LEN);
+                       VIRTIO_MAX_MAC_ADDRS * RTE_ETHER_ADDR_LEN);
                return -ENOMEM;
        }
 
@@ -1847,6 +1868,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;
 }
 
@@ -1974,7 +1996,7 @@ virtio_dev_configure(struct rte_eth_dev *dev)
        const struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
        const struct rte_eth_txmode *txmode = &dev->data->dev_conf.txmode;
        struct virtio_hw *hw = dev->data->dev_private;
-       uint32_t ether_hdr_len = ETHER_HDR_LEN + VLAN_TAG_LEN +
+       uint32_t ether_hdr_len = RTE_ETHER_HDR_LEN + VLAN_TAG_LEN +
                hw->vtnet_hdr_size;
        uint64_t rx_offloads = rxmode->offloads;
        uint64_t tx_offloads = txmode->offloads;