X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Favf%2Fdevice.c;h=1618800c432364713e5c2dc120fa76d190e588f3;hb=c3148b1be8f519c80c4417c21b978dfef72b351b;hp=de470da9fbf66ab863262d3a522a8a87b7e3e45e;hpb=6ab29d4193abeb03e2c988564fb6d22585565524;p=vpp.git diff --git a/src/plugins/avf/device.c b/src/plugins/avf/device.c index de470da9fbf..1618800c432 100644 --- a/src/plugins/avf/device.c +++ b/src/plugins/avf/device.c @@ -156,7 +156,6 @@ avf_aq_desc_enq (vlib_main_t * vm, avf_device_t * ad, avf_aq_desc_t * dt, if (ad->flags & AVF_DEVICE_F_ELOG) clib_memcpy_fast (&dc, d, sizeof (avf_aq_desc_t)); - CLIB_MEMORY_BARRIER (); ad->atq_next_slot = (ad->atq_next_slot + 1) % AVF_MBOX_LEN; avf_reg_write (ad, AVF_ATQT, ad->atq_next_slot); avf_reg_flush (ad); @@ -610,18 +609,25 @@ avf_op_config_rss_lut (vlib_main_t * vm, avf_device_t * ad) clib_error_t * avf_op_config_rss_key (vlib_main_t * vm, avf_device_t * ad) { + /* from DPDK i40e... */ + static uint32_t rss_key_default[] = { 0x6b793944, 0x23504cb5, 0x5bea75b6, + 0x309f4f12, 0x3dc0a2b8, 0x024ddcdf, + 0x339b8ca0, 0x4c4af64a, 0x34fac605, + 0x55d85839, 0x3a58997d, 0x2ec938e1, + 0x66031581 }; int msg_len = sizeof (virtchnl_rss_key_t) + ad->rss_key_size - 1; - int i; u8 msg[msg_len]; virtchnl_rss_key_t *rk; + if (sizeof (rss_key_default) != ad->rss_key_size) + return clib_error_create ("unsupported RSS key size (expected %d, got %d)", + sizeof (rss_key_default), ad->rss_key_size); + clib_memset (msg, 0, msg_len); rk = (virtchnl_rss_key_t *) msg; rk->vsi_id = ad->vsi_id; rk->key_len = ad->rss_key_size; - u32 seed = random_default_seed (); - for (i = 0; i < ad->rss_key_size; i++) - rk->key[i] = (u8) random_u32 (&seed); + memcpy_s (rk->key, rk->key_len, rss_key_default, sizeof (rss_key_default)); avf_log_debug (ad, "config_rss_key: vsi_id %u rss_key_size %u key 0x%U", rk->vsi_id, rk->key_len, format_hex_bytes_no_wrap, rk->key, @@ -1031,6 +1037,12 @@ avf_device_init (vlib_main_t * vm, avf_main_t * am, avf_device_t * ad, outer = vc.offloads.stripping_support.outer & mask; inner = vc.offloads.stripping_support.inner & mask; + /* Check for ability to modify the VLAN setting */ + outer = + vc.offloads.stripping_support.outer & VIRTCHNL_VLAN_TOGGLE ? outer : 0; + inner = + vc.offloads.stripping_support.inner & VIRTCHNL_VLAN_TOGGLE ? inner : 0; + if ((outer || inner) && (error = avf_op_disable_vlan_stripping_v2 (vm, ad, outer, inner))) return error; @@ -1119,7 +1131,6 @@ avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq) if (is_irq == 0) avf_op_get_stats (vm, ad, &ad->eth_stats); - /* *INDENT-OFF* */ vec_foreach (e, ad->events) { avf_log_debug (ad, "event: %s (%u) sev %d", @@ -1162,8 +1173,9 @@ avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq) flags |= (VNET_HW_INTERFACE_FLAG_FULL_DUPLEX | VNET_HW_INTERFACE_FLAG_LINK_UP); vnet_hw_interface_set_flags (vnm, ad->hw_if_index, flags); - vnet_hw_interface_set_link_speed (vnm, ad->hw_if_index, - mbps * 1000); + vnet_hw_interface_set_link_speed ( + vnm, ad->hw_if_index, + (mbps == UINT32_MAX) ? UINT32_MAX : mbps * 1000); ad->link_speed = mbps; } else if (!link_up && (ad->flags & AVF_DEVICE_F_LINK_UP) != 0) @@ -1214,7 +1226,6 @@ avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq) } } } - /* *INDENT-ON* */ vec_reset_length (ad->events); return; @@ -1227,16 +1238,32 @@ error: clib_error_t * avf_op_program_flow (vlib_main_t *vm, avf_device_t *ad, int is_create, - u8 *rule, u32 rule_len, u8 *program_status, - u32 status_len) + enum virthnl_adv_ops vc_op, u8 *rule, u32 rule_len, + u8 *program_status, u32 status_len) { + virtchnl_ops_t op; + avf_log_debug (ad, "avf_op_program_flow: vsi_id %u is_create %u", ad->vsi_id, is_create); - return avf_send_to_pf (vm, ad, - is_create ? VIRTCHNL_OP_ADD_FDIR_FILTER : - VIRTCHNL_OP_DEL_FDIR_FILTER, - rule, rule_len, program_status, status_len); + switch (vc_op) + { + case VIRTCHNL_ADV_OP_ADD_FDIR_FILTER: + case VIRTCHNL_ADV_OP_DEL_FDIR_FILTER: + op = + is_create ? VIRTCHNL_OP_ADD_FDIR_FILTER : VIRTCHNL_OP_DEL_FDIR_FILTER; + break; + case VIRTCHNL_ADV_OP_ADD_RSS_CFG: + case VIRTCHNL_ADV_OP_DEL_RSS_CFG: + op = is_create ? VIRTCHNL_OP_ADD_RSS_CFG : VIRTCHNL_OP_DEL_RSS_CFG; + break; + default: + return clib_error_return (0, "invalid virtchnl opcode"); + ; + } + + return avf_send_to_pf (vm, ad, op, rule, rule_len, program_status, + status_len); } static void @@ -1250,9 +1277,9 @@ avf_process_handle_request (vlib_main_t * vm, avf_process_req_t * req) else if (req->type == AVF_PROCESS_REQ_CONFIG_PROMISC_MDDE) req->error = avf_op_config_promisc_mode (vm, ad, req->is_enable); else if (req->type == AVF_PROCESS_REQ_PROGRAM_FLOW) - req->error = - avf_op_program_flow (vm, ad, req->is_add, req->rule, req->rule_len, - req->program_status, req->status_len); + req->error = avf_op_program_flow (vm, ad, req->is_add, req->vc_op, + req->rule, req->rule_len, + req->program_status, req->status_len); else clib_panic ("BUG: unknown avf proceess request type"); @@ -1374,7 +1401,6 @@ avf_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) /* create local list of device pointers as device pool may grow * during suspend */ vec_reset_length (dev_pointers); - /* *INDENT-OFF* */ pool_foreach_index (i, am->devices) { vec_add1 (dev_pointers, avf_get_device (i)); @@ -1384,19 +1410,16 @@ avf_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f) { avf_process_one_device (vm, dev_pointers[i], irq); }; - /* *INDENT-ON* */ last_run_duration = vlib_time_now (vm) - last_periodic_time; } return 0; } -/* *INDENT-OFF* */ VLIB_REGISTER_NODE (avf_process_node) = { .function = avf_process, .type = VLIB_NODE_TYPE_PROCESS, .name = "avf-process", }; -/* *INDENT-ON* */ static void avf_irq_0_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line) @@ -1409,13 +1432,11 @@ avf_irq_0_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line) if (ad->flags & AVF_DEVICE_F_ELOG) { - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (el) = { .format = "avf[%d] irq 0: icr0 0x%x", .format_args = "i4i4", }; - /* *INDENT-ON* */ struct { u32 dev_instance; @@ -1445,13 +1466,11 @@ avf_irq_n_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line) if (ad->flags & AVF_DEVICE_F_ELOG) { - /* *INDENT-OFF* */ ELOG_TYPE_DECLARE (el) = { .format = "avf[%d] irq %d: received", .format_args = "i4i2", }; - /* *INDENT-ON* */ struct { u32 dev_instance; @@ -1497,7 +1516,6 @@ avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier) vlib_physmem_free (vm, ad->atq_bufs); vlib_physmem_free (vm, ad->arq_bufs); - /* *INDENT-OFF* */ vec_foreach_index (i, ad->rxqs) { avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, i); @@ -1507,10 +1525,8 @@ avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier) rxq->n_enqueued); vec_free (rxq->bufs); } - /* *INDENT-ON* */ vec_free (ad->rxqs); - /* *INDENT-OFF* */ vec_foreach_index (i, ad->txqs) { avf_txq_t *txq = vec_elt_at_index (ad->txqs, i); @@ -1530,7 +1546,6 @@ avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier) vec_free (txq->tmp_descs); clib_spinlock_free (&txq->lock); } - /* *INDENT-ON* */ vec_free (ad->txqs); vec_free (ad->name); @@ -1582,6 +1597,7 @@ void avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) { vnet_main_t *vnm = vnet_get_main (); + vnet_eth_interface_registration_t eir = {}; avf_main_t *am = &avf_main; avf_device_t *ad, **adp; vlib_pci_dev_handle_t h; @@ -1592,7 +1608,6 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) if (avf_validate_queue_size (args) != 0) return; - /* *INDENT-OFF* */ pool_foreach (adp, am->devices) { if ((*adp)->pci_addr.as_u32 == args->addr.as_u32) { @@ -1603,7 +1618,6 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) return; } } - /* *INDENT-ON* */ pool_get (am->devices, adp); adp[0] = ad = clib_mem_alloc_aligned (sizeof (avf_device_t), @@ -1614,7 +1628,10 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) ad->name = vec_dup (args->name); if (args->enable_elog) - ad->flags |= AVF_DEVICE_F_ELOG; + { + ad->flags |= AVF_DEVICE_F_ELOG; + avf_elog_init (); + } if ((error = vlib_pci_device_open (vm, &args->addr, avf_pci_device_ids, &h))) @@ -1712,29 +1729,25 @@ avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) goto error; /* create interface */ - error = ethernet_register_interface (vnm, avf_device_class.index, - ad->dev_instance, ad->hwaddr, - &ad->hw_if_index, avf_flag_change); - - if (error) - goto error; + eir.dev_class_index = avf_device_class.index; + eir.dev_instance = ad->dev_instance; + eir.address = ad->hwaddr; + eir.cb.flag_change = avf_flag_change; + ad->hw_if_index = vnet_eth_register_interface (vnm, &eir); - /* Indicate ability to support L3 DMAC filtering and - * initialize interface to L3 non-promisc mode */ - vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, ad->hw_if_index); - hi->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_MAC_FILTER | - VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM | - VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO; ethernet_set_flags (vnm, ad->hw_if_index, ETHERNET_INTERFACE_FLAG_DEFAULT_L3); vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index); args->sw_if_index = ad->sw_if_index = sw->sw_if_index; - vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, ad->hw_if_index); - hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE; vnet_hw_if_set_input_node (vnm, ad->hw_if_index, avf_input_node.index); + /* set hw interface caps */ + vnet_hw_if_set_caps (vnm, ad->hw_if_index, + VNET_HW_IF_CAP_INT_MODE | VNET_HW_IF_CAP_MAC_FILTER | + VNET_HW_IF_CAP_TX_CKSUM | VNET_HW_IF_CAP_TCP_GSO); + for (i = 0; i < ad->n_rx_queues; i++) { u32 qi, fi; @@ -1880,8 +1893,8 @@ avf_clear_hw_interface_counters (u32 instance) } clib_error_t * -avf_program_flow (u32 dev_instance, int is_add, u8 *rule, u32 rule_len, - u8 *program_status, u32 status_len) +avf_program_flow (u32 dev_instance, int is_add, enum virthnl_adv_ops vc_op, + u8 *rule, u32 rule_len, u8 *program_status, u32 status_len) { vlib_main_t *vm = vlib_get_main (); avf_process_req_t req; @@ -1889,6 +1902,7 @@ avf_program_flow (u32 dev_instance, int is_add, u8 *rule, u32 rule_len, req.dev_instance = dev_instance; req.type = AVF_PROCESS_REQ_PROGRAM_FLOW; req.is_add = is_add; + req.vc_op = vc_op; req.rule = rule; req.rule_len = rule_len; req.program_status = program_status; @@ -1897,7 +1911,6 @@ avf_program_flow (u32 dev_instance, int is_add, u8 *rule, u32 rule_len, return avf_process_request (vm, &req); } -/* *INDENT-OFF* */ VNET_DEVICE_CLASS (avf_device_class, ) = { .name = "Adaptive Virtual Function (AVF) interface", .clear_counters = avf_clear_hw_interface_counters, @@ -1911,7 +1924,6 @@ VNET_DEVICE_CLASS (avf_device_class, ) = { .tx_function_error_strings = avf_tx_func_error_strings, .flow_ops_function = avf_flow_ops_fn, }; -/* *INDENT-ON* */ clib_error_t * avf_init (vlib_main_t * vm) @@ -1925,17 +1937,4 @@ avf_init (vlib_main_t * vm) return 0; } -/* *INDENT-OFF* */ -VLIB_INIT_FUNCTION (avf_init) = -{ - .runs_after = VLIB_INITS ("pci_bus_init"), -}; -/* *INDENT-OFF* */ - -/* - * fd.io coding-style-patch-verification: ON - * - * Local Variables: - * eval: (c-set-style "gnu") - * End: - */ +VLIB_INIT_FUNCTION (avf_init);