X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Ffm10k%2Ffm10k_ethdev.c;h=f537ab286289c375601043b4cc451c01e0d49867;hb=64767daf3c9eaa4d2b2b00017137ac0566df1c55;hp=f0f62900896cf7b8dee5495e17dbaaf877f293ec;hpb=9039c8125730adfd46b8c891e7f205eb4ac43c67;p=dpdk.git diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index f0f6290089..f537ab2862 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -43,11 +43,21 @@ int fm10k_logtype_init; int fm10k_logtype_driver; +#ifdef RTE_LIBRTE_FM10K_DEBUG_RX +int fm10k_logtype_rx; +#endif +#ifdef RTE_LIBRTE_FM10K_DEBUG_TX +int fm10k_logtype_tx; +#endif +#ifdef RTE_LIBRTE_FM10K_DEBUG_TX_FREE +int fm10k_logtype_tx_free; +#endif + static void fm10k_close_mbx_service(struct fm10k_hw *hw); static int fm10k_dev_promiscuous_enable(struct rte_eth_dev *dev); static int fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev); -static void fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev); -static void fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev); +static int fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev); +static int fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev); static inline int fm10k_glort_valid(struct fm10k_hw *hw); static int fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on); @@ -451,6 +461,9 @@ fm10k_dev_configure(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); + if (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) + dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_RSS_HASH; + /* multipe queue mode checking */ ret = fm10k_check_mq_mode(dev); if (ret != 0) { @@ -964,7 +977,7 @@ fm10k_dev_promiscuous_disable(struct rte_eth_dev *dev) return 0; } -static void +static int fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -974,7 +987,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev) /* Return if it didn't acquire valid glort range */ if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw)) - return; + return 0; /* If promiscuous mode is enabled, it doesn't make sense to enable * allmulticast and disable promiscuous since fm10k only can select @@ -983,7 +996,7 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev) if (dev->data->promiscuous) { PMD_INIT_LOG(INFO, "Promiscuous mode is enabled, "\ "needn't enable allmulticast"); - return; + return 0; } fm10k_mbx_lock(hw); @@ -991,11 +1004,15 @@ fm10k_dev_allmulticast_enable(struct rte_eth_dev *dev) FM10K_XCAST_MODE_ALLMULTI); fm10k_mbx_unlock(hw); - if (status != FM10K_SUCCESS) + if (status != FM10K_SUCCESS) { PMD_INIT_LOG(ERR, "Failed to enable allmulticast mode"); + return -EAGAIN; + } + + return 0; } -static void +static int fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -1005,12 +1022,12 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev) /* Return if it didn't acquire valid glort range */ if ((hw->mac.type == fm10k_mac_pf) && !fm10k_glort_valid(hw)) - return; + return 0; if (dev->data->promiscuous) { PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode "\ "since promisc mode is enabled"); - return; + return -EINVAL; } fm10k_mbx_lock(hw); @@ -1019,8 +1036,12 @@ fm10k_dev_allmulticast_disable(struct rte_eth_dev *dev) FM10K_XCAST_MODE_NONE); fm10k_mbx_unlock(hw); - if (status != FM10K_SUCCESS) + if (status != FM10K_SUCCESS) { PMD_INIT_LOG(ERR, "Failed to disable allmulticast mode"); + return -EAGAIN; + } + + return 0; } static void @@ -1202,28 +1223,6 @@ fm10k_dev_queue_release(struct rte_eth_dev *dev) } } -static void -fm10k_dev_close(struct rte_eth_dev *dev) -{ - struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); - - PMD_INIT_FUNC_TRACE(); - - fm10k_mbx_lock(hw); - hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map, - MAX_LPORT_NUM, false); - fm10k_mbx_unlock(hw); - - /* allow 100ms for device to quiesce */ - rte_delay_us(FM10K_SWITCH_QUIESCE_US); - - /* Stop mailbox service first */ - fm10k_close_mbx_service(hw); - fm10k_dev_stop(dev); - fm10k_dev_queue_release(dev); - fm10k_stop_hw(hw); -} - static int fm10k_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete) @@ -1355,7 +1354,7 @@ fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) return 0; } -static void +static int fm10k_stats_reset(struct rte_eth_dev *dev) { struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); @@ -1366,6 +1365,8 @@ fm10k_stats_reset(struct rte_eth_dev *dev) memset(hw_stats, 0, sizeof(*hw_stats)); fm10k_rebind_hw_stats(hw, hw_stats); + + return 0; } static int @@ -1807,7 +1808,8 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev) DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | DEV_RX_OFFLOAD_JUMBO_FRAME | - DEV_RX_OFFLOAD_HEADER_SPLIT); + DEV_RX_OFFLOAD_HEADER_SPLIT | + DEV_RX_OFFLOAD_RSS_HASH); } static int @@ -2809,6 +2811,53 @@ fm10k_close_mbx_service(struct fm10k_hw *hw) hw->mbx.ops.disconnect(hw, &hw->mbx); } +static void +fm10k_dev_close(struct rte_eth_dev *dev) +{ + struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); + struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev); + struct rte_intr_handle *intr_handle = &pdev->intr_handle; + + PMD_INIT_FUNC_TRACE(); + + fm10k_mbx_lock(hw); + hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map, + MAX_LPORT_NUM, false); + fm10k_mbx_unlock(hw); + + /* allow 100ms for device to quiesce */ + rte_delay_us(FM10K_SWITCH_QUIESCE_US); + + /* Stop mailbox service first */ + fm10k_close_mbx_service(hw); + fm10k_dev_stop(dev); + fm10k_dev_queue_release(dev); + fm10k_stop_hw(hw); + + dev->dev_ops = NULL; + dev->rx_pkt_burst = NULL; + dev->tx_pkt_burst = NULL; + + /* disable uio/vfio intr */ + rte_intr_disable(intr_handle); + + /*PF/VF has different interrupt handling mechanism */ + if (hw->mac.type == fm10k_mac_pf) { + /* disable interrupt */ + fm10k_dev_disable_intr_pf(dev); + + /* unregister callback func to eal lib */ + rte_intr_callback_unregister(intr_handle, + fm10k_dev_interrupt_handler_pf, (void *)dev); + } else { + /* disable interrupt */ + fm10k_dev_disable_intr_vf(dev); + + rte_intr_callback_unregister(intr_handle, + fm10k_dev_interrupt_handler_vf, (void *)dev); + } +} + static const struct eth_dev_ops fm10k_eth_dev_ops = { .dev_configure = fm10k_dev_configure, .dev_start = fm10k_dev_start, @@ -2909,7 +2958,7 @@ fm10k_xmit_pkts_vec(void *tx_queue, struct rte_mbuf **tx_pkts, return nb_tx; } -static void __attribute__((cold)) +static void __rte_cold fm10k_set_tx_function(struct rte_eth_dev *dev) { struct fm10k_tx_queue *txq; @@ -2958,7 +3007,7 @@ fm10k_set_tx_function(struct rte_eth_dev *dev) } } -static void __attribute__((cold)) +static void __rte_cold fm10k_set_rx_function(struct rte_eth_dev *dev) { struct fm10k_dev_info *dev_info = @@ -3113,8 +3162,17 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev) &dev->data->mac_addrs[0]); } + /* Pass the information to the rte_eth_dev_close() that it should also + * release the private port resources. + */ + dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE; + /* Reset the hw statistics */ - fm10k_stats_reset(dev); + diag = fm10k_stats_reset(dev); + if (diag != 0) { + PMD_INIT_LOG(ERR, "Stats reset failed: %d", diag); + return diag; + } /* Reset the hw */ diag = fm10k_reset_hw(hw); @@ -3152,19 +3210,19 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev) /* Make sure Switch Manager is ready before going forward. */ if (hw->mac.type == fm10k_mac_pf) { - int switch_ready = 0; + bool switch_ready = false; for (i = 0; i < MAX_QUERY_SWITCH_STATE_TIMES; i++) { fm10k_mbx_lock(hw); hw->mac.ops.get_host_state(hw, &switch_ready); fm10k_mbx_unlock(hw); - if (switch_ready) + if (switch_ready == true) break; /* Delay some time to acquire async LPORT_MAP info. */ rte_delay_us(WAIT_SWITCH_MSG_US); } - if (switch_ready == 0) { + if (switch_ready == false) { PMD_INIT_LOG(ERR, "switch is not ready"); return -1; } @@ -3215,9 +3273,6 @@ eth_fm10k_dev_init(struct rte_eth_dev *dev) static int eth_fm10k_dev_uninit(struct rte_eth_dev *dev) { - struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private); - struct rte_pci_device *pdev = RTE_ETH_DEV_TO_PCI(dev); - struct rte_intr_handle *intr_handle = &pdev->intr_handle; PMD_INIT_FUNC_TRACE(); /* only uninitialize in the primary process */ @@ -3227,29 +3282,6 @@ eth_fm10k_dev_uninit(struct rte_eth_dev *dev) /* safe to close dev here */ fm10k_dev_close(dev); - dev->dev_ops = NULL; - dev->rx_pkt_burst = NULL; - dev->tx_pkt_burst = NULL; - - /* disable uio/vfio intr */ - rte_intr_disable(intr_handle); - - /*PF/VF has different interrupt handling mechanism */ - if (hw->mac.type == fm10k_mac_pf) { - /* disable interrupt */ - fm10k_dev_disable_intr_pf(dev); - - /* unregister callback func to eal lib */ - rte_intr_callback_unregister(intr_handle, - fm10k_dev_interrupt_handler_pf, (void *)dev); - } else { - /* disable interrupt */ - fm10k_dev_disable_intr_vf(dev); - - rte_intr_callback_unregister(intr_handle, - fm10k_dev_interrupt_handler_vf, (void *)dev); - } - return 0; } @@ -3295,4 +3327,22 @@ RTE_INIT(fm10k_init_log) fm10k_logtype_driver = rte_log_register("pmd.net.fm10k.driver"); if (fm10k_logtype_driver >= 0) rte_log_set_level(fm10k_logtype_driver, RTE_LOG_NOTICE); + +#ifdef RTE_LIBRTE_FM10K_DEBUG_RX + fm10k_logtype_rx = rte_log_register("pmd.net.fm10k.rx"); + if (fm10k_logtype_rx >= 0) + rte_log_set_level(fm10k_logtype_rx, RTE_LOG_DEBUG); +#endif + +#ifdef RTE_LIBRTE_FM10K_DEBUG_TX + fm10k_logtype_tx = rte_log_register("pmd.net.fm10k.tx"); + if (fm10k_logtype_tx >= 0) + rte_log_set_level(fm10k_logtype_tx, RTE_LOG_DEBUG); +#endif + +#ifdef RTE_LIBRTE_FM10K_DEBUG_TX_FREE + fm10k_logtype_tx_free = rte_log_register("pmd.net.fm10k.tx_free"); + if (fm10k_logtype_tx_free >= 0) + rte_log_set_level(fm10k_logtype_tx_free, RTE_LOG_DEBUG); +#endif }