gso: remove the interface count
[vpp.git] / src / plugins / vmxnet3 / vmxnet3.c
index 43f9cbe..43e5b58 100644 (file)
@@ -220,7 +220,7 @@ vmxnet3_provision_driver_shared (vlib_main_t * vm, vmxnet3_device_t * vd)
   shared->misc.guest_info |= VMXNET3_GOS_TYPE_LINUX;
   shared->misc.version_support = VMXNET3_VERSION_SELECT;
   shared->misc.upt_features = VMXNET3_F_RXCSUM;
-  if (vd->lro_enable)
+  if (vd->gso_enable)
     shared->misc.upt_features |= VMXNET3_F_LRO;
   if (vd->num_rx_queues > 1)
     {
@@ -405,8 +405,6 @@ static clib_error_t *
 vmxnet3_device_init (vlib_main_t * vm, vmxnet3_device_t * vd,
                     vmxnet3_create_if_args_t * args)
 {
-  vnet_main_t *vnm = vnet_get_main ();
-  vmxnet3_main_t *vmxm = &vmxnet3_main;
   clib_error_t *error = 0;
   u32 ret, i, size;
   vlib_thread_main_t *tm = vlib_get_thread_main ();
@@ -453,11 +451,10 @@ vmxnet3_device_init (vlib_main_t * vm, vmxnet3_device_t * vd,
       return error;
     }
 
-  /* LRO is only supported for version >= 3 */
-  if ((vmxm->lro_configured) && (vd->version >= 3))
+  /* GSO is only supported for version >= 3 */
+  if (args->enable_gso && (vd->version >= 3))
     {
-      vd->lro_enable = 1;
-      vnm->interface_main.gso_interface_count++;
+      vd->gso_enable = 1;
     }
 
   vmxnet3_reg_write (vd, 1, VMXNET3_REG_CMD, VMXNET3_CMD_GET_LINK);
@@ -658,9 +655,10 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args)
   pool_foreach (vd, vmxm->devices, ({
     if (vd->pci_addr.as_u32 == args->addr.as_u32)
       {
-       args->rv = VNET_API_ERROR_INVALID_VALUE;
+       args->rv = VNET_API_ERROR_ADDRESS_IN_USE;
        args->error =
-         clib_error_return (error, "PCI address in use");
+         clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+                            &args->addr, "pci address in use");
        vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
                  format_vlib_pci_addr, &args->addr, "pci address in use");
        return;
@@ -668,24 +666,31 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args)
   }));
   /* *INDENT-ON* */
 
-  pool_get (vmxm->devices, vd);
-  vd->num_tx_queues = args->txq_num;
-  vd->num_rx_queues = args->rxq_num;
-  vd->dev_instance = vd - vmxm->devices;
-  vd->per_interface_next_index = ~0;
-  vd->pci_addr = args->addr;
-
-  if (args->enable_elog)
-    vd->flags |= VMXNET3_DEVICE_F_ELOG;
+  if (args->bind)
+    {
+      error = vlib_pci_bind_to_uio (vm, &args->addr, (char *) "auto");
+      if (error)
+       {
+         args->rv = VNET_API_ERROR_INVALID_INTERFACE;
+         args->error =
+           clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+                              &args->addr,
+                              "error encountered on binding pci device");
+         vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
+                   format_vlib_pci_addr, &args->addr,
+                   "error encountered on binding pci devicee");
+         return;
+       }
+    }
 
   if ((error =
        vlib_pci_device_open (vm, &args->addr, vmxnet3_pci_device_ids, &h)))
     {
-      pool_put (vmxm->devices, vd);
       args->rv = VNET_API_ERROR_INVALID_INTERFACE;
       args->error =
-       clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
-                          &args->addr);
+       clib_error_return (error, "%U: %s", format_vlib_pci_addr,
+                          &args->addr,
+                          "error encountered on pci device open");
       vlib_log (VLIB_LOG_LEVEL_ERR, vmxm->log_default, "%U: %s",
                format_vlib_pci_addr, &args->addr,
                "error encountered on pci device open");
@@ -696,6 +701,16 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args)
    * Do not use vmxnet3_log_error prior to this line since the macro
    * references vd->pci_dev_handle
    */
+  pool_get (vmxm->devices, vd);
+  vd->num_tx_queues = args->txq_num;
+  vd->num_rx_queues = args->rxq_num;
+  vd->dev_instance = vd - vmxm->devices;
+  vd->per_interface_next_index = ~0;
+  vd->pci_addr = args->addr;
+
+  if (args->enable_elog)
+    vd->flags |= VMXNET3_DEVICE_F_ELOG;
+
   vd->pci_dev_handle = h;
   vd->numa_node = vlib_pci_get_numa_node (vm, h);
   vd->num_intrs = vd->num_rx_queues + 1;       // +1 for the event interrupt
@@ -780,7 +795,7 @@ vmxnet3_create_if (vlib_main_t * vm, vmxnet3_create_if_args_t * args)
 
   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vd->hw_if_index);
   hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE;
-  if (vd->lro_enable)
+  if (vd->gso_enable)
     hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO;
 
   vnet_hw_interface_set_input_node (vnm, vd->hw_if_index,
@@ -901,8 +916,6 @@ vmxnet3_delete_if (vlib_main_t * vm, vmxnet3_device_t * vd)
   clib_memset (vd, 0, sizeof (*vd));
   pool_put (vmxm->devices, vd);
 
-  if (vd->lro_enable)
-    vnm->interface_main.gso_interface_count--;
 }
 
 /*