X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Fvmxnet3%2Fvmxnet3.c;h=bddf8b49006d11c4cf21919d0df75361c73d7902;hb=2985e0af6b48c7a5b57e442ead21b3620686b052;hp=43f9cbed7930af85317ed98a796bfa825489fe7c;hpb=854559d154288945e03af6b6b7ce91c383667180;p=vpp.git diff --git a/src/plugins/vmxnet3/vmxnet3.c b/src/plugins/vmxnet3/vmxnet3.c index 43f9cbed793..bddf8b49006 100644 --- a/src/plugins/vmxnet3/vmxnet3.c +++ b/src/plugins/vmxnet3/vmxnet3.c @@ -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) { @@ -406,7 +406,6 @@ 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,10 +452,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; + vd->gso_enable = 1; vnm->interface_main.gso_interface_count++; } @@ -658,9 +657,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 +668,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 +703,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 +797,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,7 +918,7 @@ 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) + if (vd->gso_enable) vnm->interface_main.gso_interface_count--; }