examples/ipsec-secgw: fix session mempool initialisation
[dpdk.git] / drivers / net / enic / base / vnic_dev.c
index da33588..aaca07c 100644 (file)
@@ -29,9 +29,9 @@ struct vnic_res {
 };
 
 struct vnic_intr_coal_timer_info {
-       u32 mul;
-       u32 div;
-       u32 max_usec;
+       uint32_t mul;
+       uint32_t div;
+       uint32_t max_usec;
 };
 
 struct vnic_dev {
@@ -43,7 +43,7 @@ struct vnic_dev {
        struct vnic_devcmd_notify *notify;
        struct vnic_devcmd_notify notify_copy;
        dma_addr_t notify_pa;
-       u32 notify_sz;
+       uint32_t notify_sz;
        dma_addr_t linkstatus_pa;
        struct vnic_stats *stats;
        dma_addr_t stats_pa;
@@ -52,15 +52,25 @@ struct vnic_dev {
        struct fm_info *flowman_info;
        dma_addr_t flowman_info_pa;
        enum vnic_proxy_type proxy;
-       u32 proxy_index;
-       u64 args[VNIC_DEVCMD_NARGS];
+       uint32_t proxy_index;
+       uint64_t args[VNIC_DEVCMD_NARGS];
        int in_reset;
        struct vnic_intr_coal_timer_info intr_coal_timer_info;
        void *(*alloc_consistent)(void *priv, size_t size,
-               dma_addr_t *dma_handle, u8 *name);
+               dma_addr_t *dma_handle, uint8_t *name);
        void (*free_consistent)(void *priv,
                size_t size, void *vaddr,
                dma_addr_t dma_handle);
+       /*
+        * Used to serialize devcmd access, currently from PF and its
+        * VF representors. When there are no representors, lock is
+        * not used.
+        */
+       int locked;
+       void (*lock)(void *priv);
+       void (*unlock)(void *priv);
+       struct vnic_dev *pf_vdev;
+       int vf_id;
 };
 
 #define VNIC_MAX_RES_HDR_SIZE \
@@ -75,7 +85,7 @@ void *vnic_dev_priv(struct vnic_dev *vdev)
 
 void vnic_register_cbacks(struct vnic_dev *vdev,
        void *(*alloc_consistent)(void *priv, size_t size,
-           dma_addr_t *dma_handle, u8 *name),
+           dma_addr_t *dma_handle, uint8_t *name),
        void (*free_consistent)(void *priv,
            size_t size, void *vaddr,
            dma_addr_t dma_handle))
@@ -84,13 +94,21 @@ void vnic_register_cbacks(struct vnic_dev *vdev,
        vdev->free_consistent = free_consistent;
 }
 
+void vnic_register_lock(struct vnic_dev *vdev, void (*lock)(void *priv),
+       void (*unlock)(void *priv))
+{
+       vdev->lock = lock;
+       vdev->unlock = unlock;
+       vdev->locked = 0;
+}
+
 static int vnic_dev_discover_res(struct vnic_dev *vdev,
        struct vnic_dev_bar *bar, unsigned int num_bars)
 {
        struct vnic_resource_header __iomem *rh;
        struct mgmt_barmap_hdr __iomem *mrh;
        struct vnic_resource __iomem *r;
-       u8 type;
+       uint8_t type;
 
        if (num_bars == 0)
                return -EINVAL;
@@ -128,10 +146,10 @@ static int vnic_dev_discover_res(struct vnic_dev *vdev,
 
 
        while ((type = ioread8(&r->type)) != RES_TYPE_EOL) {
-               u8 bar_num = ioread8(&r->bar);
-               u32 bar_offset = ioread32(&r->bar_offset);
-               u32 count = ioread32(&r->count);
-               u32 len;
+               uint8_t bar_num = ioread8(&r->bar);
+               uint32_t bar_offset = ioread32(&r->bar_offset);
+               uint32_t count = ioread32(&r->count);
+               uint32_t len;
 
                r++;
 
@@ -234,7 +252,7 @@ void vnic_dev_clear_desc_ring(struct vnic_dev_ring *ring)
 int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev,
        struct vnic_dev_ring *ring,
        unsigned int desc_count, unsigned int desc_size,
-       __attribute__((unused)) unsigned int socket_id,
+       __rte_unused unsigned int socket_id,
        char *z_name)
 {
        void *alloc_addr;
@@ -243,7 +261,7 @@ int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev,
        vnic_dev_desc_ring_size(ring, desc_count, desc_size);
        alloc_addr = vdev->alloc_consistent(vdev->priv,
                                            ring->size_unaligned,
-                                           &alloc_pa, (u8 *)z_name);
+                                           &alloc_pa, (uint8_t *)z_name);
        if (!alloc_addr) {
                pr_err("Failed to allocate ring (size=%d), aborting\n",
                        (int)ring->size);
@@ -263,7 +281,7 @@ int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev,
 
        ring->base_addr = VNIC_ALIGN(ring->base_addr_unaligned,
                ring->base_align);
-       ring->descs = (u8 *)ring->descs_unaligned +
+       ring->descs = (uint8_t *)ring->descs_unaligned +
            (ring->base_addr - ring->base_addr_unaligned);
 
        vnic_dev_clear_desc_ring(ring);
@@ -273,7 +291,7 @@ int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev,
        return 0;
 }
 
-void vnic_dev_free_desc_ring(__attribute__((unused))  struct vnic_dev *vdev,
+void vnic_dev_free_desc_ring(__rte_unused  struct vnic_dev *vdev,
        struct vnic_dev_ring *ring)
 {
        if (ring->descs) {
@@ -291,7 +309,7 @@ static int _vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
        struct vnic_devcmd __iomem *devcmd = vdev->devcmd;
        unsigned int i;
        int delay;
-       u32 status;
+       uint32_t status;
        int err;
 
        status = ioread32(&devcmd->status);
@@ -308,7 +326,7 @@ static int _vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
        if (_CMD_DIR(cmd) & _CMD_DIR_WRITE) {
                for (i = 0; i < VNIC_DEVCMD_NARGS; i++)
                        writeq(vdev->args[i], &devcmd->args[i]);
-               wmb(); /* complete all writes initiated till now */
+               rte_wmb(); /* complete all writes initiated till now */
        }
 
        iowrite32(cmd, &devcmd->cmd);
@@ -318,7 +336,7 @@ static int _vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
 
        for (delay = 0; delay < wait; delay++) {
 
-               udelay(100);
+               usleep(100);
 
                status = ioread32(&devcmd->status);
                if (status == 0xFFFFFFFF) {
@@ -339,7 +357,7 @@ static int _vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
                        }
 
                        if (_CMD_DIR(cmd) & _CMD_DIR_READ) {
-                               rmb();/* finish all reads initiated till now */
+                               rte_rmb();/* finish all reads */
                                for (i = 0; i < VNIC_DEVCMD_NARGS; i++)
                                        vdev->args[i] = readq(&devcmd->args[i]);
                        }
@@ -354,9 +372,9 @@ static int _vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
 
 static int vnic_dev_cmd_proxy(struct vnic_dev *vdev,
        enum vnic_devcmd_cmd proxy_cmd, enum vnic_devcmd_cmd cmd,
-       u64 *args, int nargs, int wait)
+       uint64_t *args, int nargs, int wait)
 {
-       u32 status;
+       uint32_t status;
        int err;
 
        /*
@@ -377,7 +395,7 @@ static int vnic_dev_cmd_proxy(struct vnic_dev *vdev,
        if (err)
                return err;
 
-       status = (u32)vdev->args[0];
+       status = (uint32_t)vdev->args[0];
        if (status & STAT_ERROR) {
                err = (int)vdev->args[1];
                if (err != ERR_ECMDUNKNOWN ||
@@ -392,7 +410,7 @@ static int vnic_dev_cmd_proxy(struct vnic_dev *vdev,
 }
 
 static int vnic_dev_cmd_no_proxy(struct vnic_dev *vdev,
-       enum vnic_devcmd_cmd cmd, u64 *args, int nargs, int wait)
+       enum vnic_devcmd_cmd cmd, uint64_t *args, int nargs, int wait)
 {
        int err;
 
@@ -410,12 +428,39 @@ static int vnic_dev_cmd_no_proxy(struct vnic_dev *vdev,
        return err;
 }
 
+void vnic_dev_cmd_proxy_by_index_start(struct vnic_dev *vdev, uint16_t index)
+{
+       vdev->proxy = PROXY_BY_INDEX;
+       vdev->proxy_index = index;
+}
+
+void vnic_dev_cmd_proxy_end(struct vnic_dev *vdev)
+{
+       vdev->proxy = PROXY_NONE;
+       vdev->proxy_index = 0;
+}
+
 int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
-       u64 *a0, u64 *a1, int wait)
+       uint64_t *a0, uint64_t *a1, int wait)
 {
-       u64 args[2];
+       uint64_t args[2];
+       bool vf_rep;
+       int vf_idx;
        int err;
 
+       vf_rep = false;
+       if (vdev->pf_vdev) {
+               vf_rep = true;
+               vf_idx = vdev->vf_id;
+               /* Everything below assumes PF vdev */
+               vdev = vdev->pf_vdev;
+       }
+       if (vdev->lock)
+               vdev->lock(vdev->priv);
+       /* For VF representor, proxy devcmd to VF index */
+       if (vf_rep)
+               vnic_dev_cmd_proxy_by_index_start(vdev, vf_idx);
+
        args[0] = *a0;
        args[1] = *a1;
        memset(vdev->args, 0, sizeof(vdev->args));
@@ -435,6 +480,10 @@ int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
                break;
        }
 
+       if (vf_rep)
+               vnic_dev_cmd_proxy_end(vdev);
+       if (vdev->unlock)
+               vdev->unlock(vdev->priv);
        if (err == 0) {
                *a0 = args[0];
                *a1 = args[1];
@@ -444,36 +493,60 @@ int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
 }
 
 int vnic_dev_cmd_args(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
-                     u64 *args, int nargs, int wait)
+                     uint64_t *args, int nargs, int wait)
 {
+       bool vf_rep;
+       int vf_idx;
+       int err;
+
+       vf_rep = false;
+       if (vdev->pf_vdev) {
+               vf_rep = true;
+               vf_idx = vdev->vf_id;
+               vdev = vdev->pf_vdev;
+       }
+       if (vdev->lock)
+               vdev->lock(vdev->priv);
+       if (vf_rep)
+               vnic_dev_cmd_proxy_by_index_start(vdev, vf_idx);
+
        switch (vdev->proxy) {
        case PROXY_BY_INDEX:
-               return vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_INDEX, cmd,
+               err = vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_INDEX, cmd,
                                args, nargs, wait);
+               break;
        case PROXY_BY_BDF:
-               return vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_BDF, cmd,
+               err = vnic_dev_cmd_proxy(vdev, CMD_PROXY_BY_BDF, cmd,
                                args, nargs, wait);
+               break;
        case PROXY_NONE:
        default:
-               return vnic_dev_cmd_no_proxy(vdev, cmd, args, nargs, wait);
+               err = vnic_dev_cmd_no_proxy(vdev, cmd, args, nargs, wait);
+               break;
        }
+
+       if (vf_rep)
+               vnic_dev_cmd_proxy_end(vdev);
+       if (vdev->unlock)
+               vdev->unlock(vdev->priv);
+       return err;
 }
 
 int vnic_dev_fw_info(struct vnic_dev *vdev,
                     struct vnic_devcmd_fw_info **fw_info)
 {
        char name[RTE_MEMZONE_NAMESIZE];
-       u64 a0, a1 = 0;
+       uint64_t a0, a1 = 0;
        int wait = 1000;
        int err = 0;
-       static u32 instance;
+       static uint32_t instance;
 
        if (!vdev->fw_info) {
                snprintf((char *)name, sizeof(name), "vnic_fw_info-%u",
                         instance++);
                vdev->fw_info = vdev->alloc_consistent(vdev->priv,
                        sizeof(struct vnic_devcmd_fw_info),
-                       &vdev->fw_info_pa, (u8 *)name);
+                       &vdev->fw_info_pa, (uint8_t *)name);
                if (!vdev->fw_info)
                        return -ENOMEM;
                a0 = vdev->fw_info_pa;
@@ -485,7 +558,7 @@ int vnic_dev_fw_info(struct vnic_dev *vdev,
        return err;
 }
 
-static int vnic_dev_advanced_filters_cap(struct vnic_dev *vdev, u64 *args,
+static int vnic_dev_advanced_filters_cap(struct vnic_dev *vdev, uint64_t *args,
                int nargs)
 {
        memset(args, 0, nargs * sizeof(*args));
@@ -496,30 +569,30 @@ static int vnic_dev_advanced_filters_cap(struct vnic_dev *vdev, u64 *args,
 
 int vnic_dev_capable_adv_filters(struct vnic_dev *vdev)
 {
-       u64 a0 = CMD_ADD_ADV_FILTER, a1 = 0;
+       uint64_t a0 = CMD_ADD_ADV_FILTER, a1 = 0;
        int wait = 1000;
        int err;
 
        err = vnic_dev_cmd(vdev, CMD_CAPABILITY, &a0, &a1, wait);
        if (err)
                return 0;
-       return (a1 >= (u32)FILTER_DPDK_1);
+       return (a1 >= (uint32_t)FILTER_DPDK_1);
 }
 
-int vnic_dev_flowman_cmd(struct vnic_dev *vdev, u64 *args, int nargs)
+int vnic_dev_flowman_cmd(struct vnic_dev *vdev, uint64_t *args, int nargs)
 {
        int wait = 1000;
 
        return vnic_dev_cmd_args(vdev, CMD_FLOW_MANAGER_OP, args, nargs, wait);
 }
 
-static int vnic_dev_flowman_enable(struct vnic_dev *vdev, u32 *mode,
-                                  u8 *filter_actions)
+static int vnic_dev_flowman_enable(struct vnic_dev *vdev, uint32_t *mode,
+                                  uint8_t *filter_actions)
 {
        char name[RTE_MEMZONE_NAMESIZE];
-       u64 args[3];
-       u64 ops;
-       static u32 instance;
+       uint64_t args[3];
+       uint64_t ops;
+       static uint32_t instance;
 
        /* flowman devcmd available? */
        if (!vnic_dev_capable(vdev, CMD_FLOW_MANAGER_OP))
@@ -541,7 +614,7 @@ static int vnic_dev_flowman_enable(struct vnic_dev *vdev, u32 *mode,
                         instance++);
                vdev->flowman_info = vdev->alloc_consistent(vdev->priv,
                        sizeof(struct fm_info),
-                       &vdev->flowman_info_pa, (u8 *)name);
+                       &vdev->flowman_info_pa, (uint8_t *)name);
                if (!vdev->flowman_info)
                        return 0;
        }
@@ -582,12 +655,12 @@ static int vnic_dev_flowman_enable(struct vnic_dev *vdev, u32 *mode,
  *             all other filter types are not available.
  *   Retrun true in filter_tags if supported
  */
-int vnic_dev_capable_filter_mode(struct vnic_dev *vdev, u32 *mode,
-                                u8 *filter_actions)
+int vnic_dev_capable_filter_mode(struct vnic_dev *vdev, uint32_t *mode,
+                                uint8_t *filter_actions)
 {
-       u64 args[4];
+       uint64_t args[4];
        int err;
-       u32 max_level = 0;
+       uint32_t max_level = 0;
 
        /* If flowman is available, use it as it is the most capable API */
        if (vnic_dev_flowman_enable(vdev, mode, filter_actions))
@@ -623,7 +696,7 @@ int vnic_dev_capable_filter_mode(struct vnic_dev *vdev, u32 *mode,
        }
        max_level = args[1];
 parse_max_level:
-       if (max_level >= (u32)FILTER_USNIC_IP)
+       if (max_level >= (uint32_t)FILTER_USNIC_IP)
                *mode = FILTER_USNIC_IP;
        else
                *mode = FILTER_IPV4_5TUPLE;
@@ -633,7 +706,7 @@ parse_max_level:
 void vnic_dev_capable_udp_rss_weak(struct vnic_dev *vdev, bool *cfg_chk,
                                   bool *weak)
 {
-       u64 a0 = CMD_NIC_CFG, a1 = 0;
+       uint64_t a0 = CMD_NIC_CFG, a1 = 0;
        int wait = 1000;
        int err;
 
@@ -648,7 +721,7 @@ void vnic_dev_capable_udp_rss_weak(struct vnic_dev *vdev, bool *cfg_chk,
 
 int vnic_dev_capable(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd)
 {
-       u64 a0 = (u32)cmd, a1 = 0;
+       uint64_t a0 = (uint32_t)cmd, a1 = 0;
        int wait = 1000;
        int err;
 
@@ -660,7 +733,7 @@ int vnic_dev_capable(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd)
 int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, size_t size,
        void *value)
 {
-       u64 a0, a1;
+       uint64_t a0, a1;
        int wait = 1000;
        int err;
 
@@ -671,16 +744,16 @@ int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, size_t size,
 
        switch (size) {
        case 1:
-               *(u8 *)value = (u8)a0;
+               *(uint8_t *)value = (uint8_t)a0;
                break;
        case 2:
-               *(u16 *)value = (u16)a0;
+               *(uint16_t *)value = (uint16_t)a0;
                break;
        case 4:
-               *(u32 *)value = (u32)a0;
+               *(uint32_t *)value = (uint32_t)a0;
                break;
        case 8:
-               *(u64 *)value = a0;
+               *(uint64_t *)value = a0;
                break;
        default:
                BUG();
@@ -692,7 +765,7 @@ int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, size_t size,
 
 int vnic_dev_stats_clear(struct vnic_dev *vdev)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_STATS_CLEAR, &a0, &a1, wait);
@@ -700,7 +773,7 @@ int vnic_dev_stats_clear(struct vnic_dev *vdev)
 
 int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats)
 {
-       u64 a0, a1;
+       uint64_t a0, a1;
        int wait = 1000;
 
        if (!vdev->stats)
@@ -715,7 +788,7 @@ int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats)
 
 int vnic_dev_close(struct vnic_dev *vdev)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_CLOSE, &a0, &a1, wait);
@@ -723,7 +796,7 @@ int vnic_dev_close(struct vnic_dev *vdev)
 
 int vnic_dev_enable_wait(struct vnic_dev *vdev)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
 
        if (vnic_dev_capable(vdev, CMD_ENABLE_WAIT))
@@ -734,7 +807,7 @@ int vnic_dev_enable_wait(struct vnic_dev *vdev)
 
 int vnic_dev_disable(struct vnic_dev *vdev)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_DISABLE, &a0, &a1, wait);
@@ -742,7 +815,7 @@ int vnic_dev_disable(struct vnic_dev *vdev)
 
 int vnic_dev_open(struct vnic_dev *vdev, int arg)
 {
-       u64 a0 = (u32)arg, a1 = 0;
+       uint64_t a0 = (uint32_t)arg, a1 = 0;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_OPEN, &a0, &a1, wait);
@@ -750,7 +823,7 @@ int vnic_dev_open(struct vnic_dev *vdev, int arg)
 
 int vnic_dev_open_done(struct vnic_dev *vdev, int *done)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
        int err;
 
@@ -765,9 +838,9 @@ int vnic_dev_open_done(struct vnic_dev *vdev, int *done)
        return 0;
 }
 
-int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
+int vnic_dev_get_mac_addr(struct vnic_dev *vdev, uint8_t *mac_addr)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
        int err, i;
 
@@ -779,7 +852,7 @@ int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
                return err;
 
        for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
-               mac_addr[i] = ((u8 *)&a0)[i];
+               mac_addr[i] = ((uint8_t *)&a0)[i];
 
        return 0;
 }
@@ -787,7 +860,7 @@ int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr)
 int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
        int broadcast, int promisc, int allmulti)
 {
-       u64 a0, a1 = 0;
+       uint64_t a0, a1 = 0;
        int wait = 1000;
        int err;
 
@@ -804,15 +877,15 @@ int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
        return err;
 }
 
-int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr)
+int vnic_dev_add_addr(struct vnic_dev *vdev, uint8_t *addr)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
        int err;
        int i;
 
        for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
-               ((u8 *)&a0)[i] = addr[i];
+               ((uint8_t *)&a0)[i] = addr[i];
 
        err = vnic_dev_cmd(vdev, CMD_ADDR_ADD, &a0, &a1, wait);
        if (err)
@@ -823,15 +896,15 @@ int vnic_dev_add_addr(struct vnic_dev *vdev, u8 *addr)
        return err;
 }
 
-int vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr)
+int vnic_dev_del_addr(struct vnic_dev *vdev, uint8_t *addr)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
        int err;
        int i;
 
        for (i = 0; i < RTE_ETHER_ADDR_LEN; i++)
-               ((u8 *)&a0)[i] = addr[i];
+               ((uint8_t *)&a0)[i] = addr[i];
 
        err = vnic_dev_cmd(vdev, CMD_ADDR_DEL, &a0, &a1, wait);
        if (err)
@@ -843,9 +916,9 @@ int vnic_dev_del_addr(struct vnic_dev *vdev, u8 *addr)
 }
 
 int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev,
-       u8 ig_vlan_rewrite_mode)
+       uint8_t ig_vlan_rewrite_mode)
 {
-       u64 a0 = ig_vlan_rewrite_mode, a1 = 0;
+       uint64_t a0 = ig_vlan_rewrite_mode, a1 = 0;
        int wait = 1000;
 
        if (vnic_dev_capable(vdev, CMD_IG_VLAN_REWRITE_MODE))
@@ -866,9 +939,9 @@ static inline int vnic_dev_in_reset(struct vnic_dev *vdev)
 }
 
 int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
-       void *notify_addr, dma_addr_t notify_pa, u16 intr)
+       void *notify_addr, dma_addr_t notify_pa, uint16_t intr)
 {
-       u64 a0, a1;
+       uint64_t a0, a1;
        int wait = 1000;
        int r;
 
@@ -878,23 +951,23 @@ int vnic_dev_notify_setcmd(struct vnic_dev *vdev,
                vdev->notify_pa = notify_pa;
        }
 
-       a0 = (u64)notify_pa;
-       a1 = ((u64)intr << 32) & 0x0000ffff00000000ULL;
+       a0 = (uint64_t)notify_pa;
+       a1 = ((uint64_t)intr << 32) & 0x0000ffff00000000ULL;
        a1 += sizeof(struct vnic_devcmd_notify);
 
        r = vnic_dev_cmd(vdev, CMD_NOTIFY, &a0, &a1, wait);
        if (!vnic_dev_in_reset(vdev))
-               vdev->notify_sz = (r == 0) ? (u32)a1 : 0;
+               vdev->notify_sz = (r == 0) ? (uint32_t)a1 : 0;
 
        return r;
 }
 
-int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
+int vnic_dev_notify_set(struct vnic_dev *vdev, uint16_t intr)
 {
        void *notify_addr = NULL;
        dma_addr_t notify_pa = 0;
        char name[RTE_MEMZONE_NAMESIZE];
-       static u32 instance;
+       static uint32_t instance;
 
        if (vdev->notify || vdev->notify_pa) {
                return vnic_dev_notify_setcmd(vdev, vdev->notify,
@@ -905,7 +978,7 @@ int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
                        "vnic_notify-%u", instance++);
                notify_addr = vdev->alloc_consistent(vdev->priv,
                        sizeof(struct vnic_devcmd_notify),
-                       &notify_pa, (u8 *)name);
+                       &notify_pa, (uint8_t *)name);
                if (!notify_addr)
                        return -ENOMEM;
        }
@@ -915,7 +988,7 @@ int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr)
 
 int vnic_dev_notify_unsetcmd(struct vnic_dev *vdev)
 {
-       u64 a0, a1;
+       uint64_t a0, a1;
        int wait = 1000;
        int err;
 
@@ -947,10 +1020,10 @@ int vnic_dev_notify_unset(struct vnic_dev *vdev)
 
 static int vnic_dev_notify_ready(struct vnic_dev *vdev)
 {
-       u32 *words;
+       uint32_t *words;
        unsigned int nwords = vdev->notify_sz / 4;
        unsigned int i;
-       u32 csum;
+       uint32_t csum;
 
        if (!vdev->notify || !vdev->notify_sz)
                return 0;
@@ -958,7 +1031,7 @@ static int vnic_dev_notify_ready(struct vnic_dev *vdev)
        do {
                csum = 0;
                rte_memcpy(&vdev->notify_copy, vdev->notify, vdev->notify_sz);
-               words = (u32 *)&vdev->notify_copy;
+               words = (uint32_t *)&vdev->notify_copy;
                for (i = 1; i < nwords; i++)
                        csum += words[i];
        } while (csum != words[0]);
@@ -968,7 +1041,7 @@ static int vnic_dev_notify_ready(struct vnic_dev *vdev)
 
 int vnic_dev_init(struct vnic_dev *vdev, int arg)
 {
-       u64 a0 = (u32)arg, a1 = 0;
+       uint64_t a0 = (uint32_t)arg, a1 = 0;
        int wait = 1000;
        int r = 0;
 
@@ -1004,7 +1077,7 @@ int vnic_dev_link_status(struct vnic_dev *vdev)
        return vdev->notify_copy.link_state;
 }
 
-u32 vnic_dev_port_speed(struct vnic_dev *vdev)
+uint32_t vnic_dev_port_speed(struct vnic_dev *vdev)
 {
        if (!vnic_dev_notify_ready(vdev))
                return 0;
@@ -1012,19 +1085,37 @@ u32 vnic_dev_port_speed(struct vnic_dev *vdev)
        return vdev->notify_copy.port_speed;
 }
 
-u32 vnic_dev_intr_coal_timer_usec_to_hw(struct vnic_dev *vdev, u32 usec)
+uint32_t vnic_dev_mtu(struct vnic_dev *vdev)
+{
+       if (!vnic_dev_notify_ready(vdev))
+               return 0;
+
+       return vdev->notify_copy.mtu;
+}
+
+uint32_t vnic_dev_uif(struct vnic_dev *vdev)
+{
+       if (!vnic_dev_notify_ready(vdev))
+               return 0;
+
+       return vdev->notify_copy.uif;
+}
+
+uint32_t vnic_dev_intr_coal_timer_usec_to_hw(struct vnic_dev *vdev,
+                                            uint32_t usec)
 {
        return (usec * vdev->intr_coal_timer_info.mul) /
                vdev->intr_coal_timer_info.div;
 }
 
-u32 vnic_dev_intr_coal_timer_hw_to_usec(struct vnic_dev *vdev, u32 hw_cycles)
+uint32_t vnic_dev_intr_coal_timer_hw_to_usec(struct vnic_dev *vdev,
+                                            uint32_t hw_cycles)
 {
        return (hw_cycles * vdev->intr_coal_timer_info.div) /
                vdev->intr_coal_timer_info.mul;
 }
 
-u32 vnic_dev_get_intr_coal_timer_max(struct vnic_dev *vdev)
+uint32_t vnic_dev_get_intr_coal_timer_max(struct vnic_dev *vdev)
 {
        return vdev->intr_coal_timer_info.max_usec;
 }
@@ -1032,12 +1123,12 @@ u32 vnic_dev_get_intr_coal_timer_max(struct vnic_dev *vdev)
 int vnic_dev_alloc_stats_mem(struct vnic_dev *vdev)
 {
        char name[RTE_MEMZONE_NAMESIZE];
-       static u32 instance;
+       static uint32_t instance;
 
        snprintf((char *)name, sizeof(name), "vnic_stats-%u", instance++);
        vdev->stats = vdev->alloc_consistent(vdev->priv,
                                             sizeof(struct vnic_stats),
-                                            &vdev->stats_pa, (u8 *)name);
+                                            &vdev->stats_pa, (uint8_t *)name);
        return vdev->stats == NULL ? -ENOMEM : 0;
 }
 
@@ -1098,6 +1189,23 @@ err_out:
        return NULL;
 }
 
+struct vnic_dev *vnic_vf_rep_register(void *priv, struct vnic_dev *pf_vdev,
+       int vf_id)
+{
+       struct vnic_dev *vdev;
+
+       vdev = (struct vnic_dev *)rte_zmalloc("enic-vf-rep-vdev",
+                               sizeof(struct vnic_dev), RTE_CACHE_LINE_SIZE);
+       if (!vdev)
+               return NULL;
+       vdev->priv = priv;
+       vdev->pf_vdev = pf_vdev;
+       vdev->vf_id = vf_id;
+       vdev->alloc_consistent = pf_vdev->alloc_consistent;
+       vdev->free_consistent = pf_vdev->free_consistent;
+       return vdev;
+}
+
 /*
  *  vnic_dev_classifier: Add/Delete classifier entries
  *  @vdev: vdev of the device
@@ -1113,16 +1221,16 @@ err_out:
  * @data: filter data
  * @action: action data
  */
-int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry,
+int vnic_dev_classifier(struct vnic_dev *vdev, uint8_t cmd, uint16_t *entry,
        struct filter_v2 *data, struct filter_action_v2 *action_v2)
 {
-       u64 a0 = 0, a1 = 0;
+       uint64_t a0 = 0, a1 = 0;
        int wait = 1000;
        dma_addr_t tlv_pa;
        int ret = -EINVAL;
        struct filter_tlv *tlv, *tlv_va;
-       u64 tlv_size;
-       u32 filter_size, action_size;
+       uint64_t tlv_size;
+       uint32_t filter_size, action_size;
        static unsigned int unique_id;
        char z_name[RTE_MEMZONE_NAMESIZE];
        enum vnic_devcmd_cmd dev_cmd;
@@ -1139,7 +1247,7 @@ int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry,
                snprintf((char *)z_name, sizeof(z_name),
                        "vnic_clsf_%u", unique_id++);
                tlv_va = vdev->alloc_consistent(vdev->priv,
-                       tlv_size, &tlv_pa, (u8 *)z_name);
+                       tlv_size, &tlv_pa, (uint8_t *)z_name);
                if (!tlv_va)
                        return -ENOMEM;
                tlv = tlv_va;
@@ -1158,7 +1266,7 @@ int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry,
                tlv->length = action_size;
                memcpy(&tlv->val, (void *)action_v2, action_size);
                ret = vnic_dev_cmd(vdev, dev_cmd, &a0, &a1, wait);
-               *entry = (u16)a0;
+               *entry = (uint16_t)a0;
                vdev->free_consistent(vdev->priv, tlv_size, tlv_va, tlv_pa);
        } else if (cmd == CLSF_DEL) {
                a0 = *entry;
@@ -1168,20 +1276,21 @@ int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry,
        return ret;
 }
 
-int vnic_dev_overlay_offload_ctrl(struct vnic_dev *vdev, u8 overlay, u8 config)
+int vnic_dev_overlay_offload_ctrl(struct vnic_dev *vdev, uint8_t overlay,
+                                 uint8_t config)
 {
-       u64 a0 = overlay;
-       u64 a1 = config;
+       uint64_t a0 = overlay;
+       uint64_t a1 = config;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_OVERLAY_OFFLOAD_CTRL, &a0, &a1, wait);
 }
 
-int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, u8 overlay,
-                                u16 vxlan_udp_port_number)
+int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, uint8_t overlay,
+                                uint16_t vxlan_udp_port_number)
 {
-       u64 a1 = vxlan_udp_port_number;
-       u64 a0 = overlay;
+       uint64_t a1 = vxlan_udp_port_number;
+       uint64_t a0 = overlay;
        int wait = 1000;
 
        return vnic_dev_cmd(vdev, CMD_OVERLAY_OFFLOAD_CFG, &a0, &a1, wait);
@@ -1189,8 +1298,8 @@ int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, u8 overlay,
 
 int vnic_dev_capable_vxlan(struct vnic_dev *vdev)
 {
-       u64 a0 = VIC_FEATURE_VXLAN;
-       u64 a1 = 0;
+       uint64_t a0 = VIC_FEATURE_VXLAN;
+       uint64_t a1 = 0;
        int wait = 1000;
        int ret;
 
@@ -1203,8 +1312,8 @@ int vnic_dev_capable_vxlan(struct vnic_dev *vdev)
 
 int vnic_dev_capable_geneve(struct vnic_dev *vdev)
 {
-       u64 a0 = VIC_FEATURE_GENEVE;
-       u64 a1 = 0;
+       uint64_t a0 = VIC_FEATURE_GENEVE;
+       uint64_t a1 = 0;
        int wait = 1000;
        int ret;