X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fthunderx%2Fnicvf_ethdev.c;h=f0bd20a22b6a6f4aa32b35c6f8290fdd5622999a;hb=f593944fc988dfccebed62205fd0b88c60ed7d77;hp=edc956bb3dfbd4062bf2e3b4f3472a38d65e6394;hpb=9039c8125730adfd46b8c891e7f205eb4ac43c67;p=dpdk.git diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c index edc956bb3d..f0bd20a22b 100644 --- a/drivers/net/thunderx/nicvf_ethdev.c +++ b/drivers/net/thunderx/nicvf_ethdev.c @@ -44,31 +44,16 @@ #include "nicvf_svf.h" #include "nicvf_logs.h" -int nicvf_logtype_mbox; -int nicvf_logtype_init; -int nicvf_logtype_driver; - -static void nicvf_dev_stop(struct rte_eth_dev *dev); +static int nicvf_dev_stop(struct rte_eth_dev *dev); static void nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup); static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic, bool cleanup); static int nicvf_vlan_offload_config(struct rte_eth_dev *dev, int mask); static int nicvf_vlan_offload_set(struct rte_eth_dev *dev, int mask); -RTE_INIT(nicvf_init_log) -{ - nicvf_logtype_mbox = rte_log_register("pmd.net.thunderx.mbox"); - if (nicvf_logtype_mbox >= 0) - rte_log_set_level(nicvf_logtype_mbox, RTE_LOG_NOTICE); - - nicvf_logtype_init = rte_log_register("pmd.net.thunderx.init"); - if (nicvf_logtype_init >= 0) - rte_log_set_level(nicvf_logtype_init, RTE_LOG_NOTICE); - - nicvf_logtype_driver = rte_log_register("pmd.net.thunderx.driver"); - if (nicvf_logtype_driver >= 0) - rte_log_set_level(nicvf_logtype_driver, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(nicvf_logtype_mbox, pmd.net.thunderx.mbox, NOTICE); +RTE_LOG_REGISTER(nicvf_logtype_init, pmd.net.thunderx.init, NOTICE); +RTE_LOG_REGISTER(nicvf_logtype_driver, pmd.net.thunderx.driver, NOTICE); static void nicvf_link_status_update(struct nicvf *nic, @@ -98,9 +83,9 @@ nicvf_interrupt(void *arg) nicvf_link_status_update(nic, &link); rte_eth_linkstatus_set(dev, &link); - _rte_eth_dev_callback_process(dev, - RTE_ETH_EVENT_INTR_LSC, - NULL); + rte_eth_dev_callback_process(dev, + RTE_ETH_EVENT_INTR_LSC, + NULL); } } @@ -362,7 +347,7 @@ nicvf_dev_supported_ptypes_get(struct rte_eth_dev *dev) return ptypes; } -static void +static int nicvf_dev_stats_reset(struct rte_eth_dev *dev) { int i; @@ -370,6 +355,7 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) struct nicvf *nic = nicvf_pmd_priv(dev); uint16_t rx_start, rx_end; uint16_t tx_start, tx_end; + int ret; /* Reset all primary nic counters */ nicvf_rx_range(dev, nic, &rx_start, &rx_end); @@ -380,7 +366,9 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) for (i = tx_start; i <= tx_end; i++) txqs |= (0x3 << (i * 2)); - nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs); + ret = nicvf_mbox_reset_stat_counters(nic, 0x3FFF, 0x1F, rxqs, txqs); + if (ret != 0) + return ret; /* Reset secondary nic queue counters */ for (i = 0; i < nic->sqs_count; i++) { @@ -396,8 +384,12 @@ nicvf_dev_stats_reset(struct rte_eth_dev *dev) for (i = tx_start; i <= tx_end; i++) txqs |= (0x3 << ((i % MAX_SND_QUEUES_PER_QS) * 2)); - nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs); + ret = nicvf_mbox_reset_stat_counters(snic, 0, 0, rxqs, txqs); + if (ret != 0) + return ret; } + + return 0; } /* Promiscuous mode enabled by default in LMAC to VF 1:1 map configuration */ @@ -489,9 +481,10 @@ nicvf_dev_reta_query(struct rte_eth_dev *dev, int ret, i, j; if (reta_size != NIC_MAX_RSS_IDR_TBL_SIZE) { - RTE_LOG(ERR, PMD, "The size of hash lookup table configured " - "(%d) doesn't match the number hardware can supported " - "(%d)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE); + PMD_DRV_LOG(ERR, + "The size of hash lookup table configured " + "(%u) doesn't match the number hardware can supported " + "(%u)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE); return -EINVAL; } @@ -519,9 +512,9 @@ nicvf_dev_reta_update(struct rte_eth_dev *dev, int ret, i, j; if (reta_size != NIC_MAX_RSS_IDR_TBL_SIZE) { - RTE_LOG(ERR, PMD, "The size of hash lookup table configured " - "(%d) doesn't match the number hardware can supported " - "(%d)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE); + PMD_DRV_LOG(ERR, "The size of hash lookup table configured " + "(%u) doesn't match the number hardware can supported " + "(%u)", reta_size, NIC_MAX_RSS_IDR_TBL_SIZE); return -EINVAL; } @@ -562,8 +555,8 @@ nicvf_dev_rss_hash_update(struct rte_eth_dev *dev, if (rss_conf->rss_key && rss_conf->rss_key_len != RSS_HASH_KEY_BYTE_SIZE) { - RTE_LOG(ERR, PMD, "Hash key size mismatch %d", - rss_conf->rss_key_len); + PMD_DRV_LOG(ERR, "Hash key size mismatch %u", + rss_conf->rss_key_len); return -EINVAL; } @@ -1773,6 +1766,7 @@ nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup) struct nicvf *nic = nicvf_pmd_priv(dev); PMD_INIT_FUNC_TRACE(); + dev->data->dev_started = 0; /* Teardown secondary vf first */ for (i = 0; i < nic->sqs_count; i++) { @@ -1796,12 +1790,14 @@ nicvf_dev_stop_cleanup(struct rte_eth_dev *dev, bool cleanup) PMD_INIT_LOG(ERR, "Failed to reclaim CPI config %d", ret); } -static void +static int nicvf_dev_stop(struct rte_eth_dev *dev) { PMD_INIT_FUNC_TRACE(); nicvf_dev_stop_cleanup(dev, false); + + return 0; } static void @@ -1859,13 +1855,15 @@ nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic, bool cleanup) } } -static void +static int nicvf_dev_close(struct rte_eth_dev *dev) { size_t i; struct nicvf *nic = nicvf_pmd_priv(dev); PMD_INIT_FUNC_TRACE(); + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; nicvf_dev_stop_cleanup(dev, true); nicvf_periodic_alarm_stop(nicvf_interrupt, dev); @@ -1876,6 +1874,8 @@ nicvf_dev_close(struct rte_eth_dev *dev) nicvf_periodic_alarm_stop(nicvf_vf_interrupt, nic->snicvf[i]); } + + return 0; } static int @@ -1913,6 +1913,9 @@ nicvf_dev_configure(struct rte_eth_dev *dev) PMD_INIT_FUNC_TRACE(); + if (rxmode->mq_mode & ETH_MQ_RX_RSS_FLAG) + rxmode->offloads |= DEV_RX_OFFLOAD_RSS_HASH; + if (!rte_eal_has_hugepages()) { PMD_INIT_LOG(INFO, "Huge page is not configured"); return -EINVAL; @@ -1978,6 +1981,37 @@ nicvf_dev_configure(struct rte_eth_dev *dev) return 0; } +static int +nicvf_dev_set_link_up(struct rte_eth_dev *dev) +{ + struct nicvf *nic = nicvf_pmd_priv(dev); + int rc, i; + + rc = nicvf_mbox_set_link_up_down(nic, true); + if (rc) + goto done; + + /* Start tx queues */ + for (i = 0; i < dev->data->nb_tx_queues; i++) + nicvf_dev_tx_queue_start(dev, i); + +done: + return rc; +} + +static int +nicvf_dev_set_link_down(struct rte_eth_dev *dev) +{ + struct nicvf *nic = nicvf_pmd_priv(dev); + int i; + + /* Stop tx queues */ + for (i = 0; i < dev->data->nb_tx_queues; i++) + nicvf_dev_tx_queue_stop(dev, i); + + return nicvf_mbox_set_link_up_down(nic, false); +} + /* Initialize and register driver with DPDK Application */ static const struct eth_dev_ops nicvf_eth_dev_ops = { .dev_configure = nicvf_dev_configure, @@ -2002,9 +2036,10 @@ static const struct eth_dev_ops nicvf_eth_dev_ops = { .tx_queue_stop = nicvf_dev_tx_queue_stop, .rx_queue_setup = nicvf_dev_rx_queue_setup, .rx_queue_release = nicvf_dev_rx_queue_release, - .rx_queue_count = nicvf_dev_rx_queue_count, .tx_queue_setup = nicvf_dev_tx_queue_setup, .tx_queue_release = nicvf_dev_tx_queue_release, + .dev_set_link_up = nicvf_dev_set_link_up, + .dev_set_link_down = nicvf_dev_set_link_down, .get_reg = nicvf_dev_get_regs, }; @@ -2089,10 +2124,7 @@ static int nicvf_eth_dev_uninit(struct rte_eth_dev *dev) { PMD_INIT_FUNC_TRACE(); - - if (rte_eal_process_type() == RTE_PROC_PRIMARY) - nicvf_dev_close(dev); - + nicvf_dev_close(dev); return 0; } static int @@ -2105,6 +2137,7 @@ nicvf_eth_dev_init(struct rte_eth_dev *eth_dev) PMD_INIT_FUNC_TRACE(); eth_dev->dev_ops = &nicvf_eth_dev_ops; + eth_dev->rx_queue_count = nicvf_dev_rx_queue_count; /* For secondary processes, the primary has done all the work */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) { @@ -2122,6 +2155,7 @@ nicvf_eth_dev_init(struct rte_eth_dev *eth_dev) pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); rte_eth_copy_pci_info(eth_dev, pci_dev); + eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; nic->device_id = pci_dev->id.device_id; nic->vendor_id = pci_dev->id.vendor_id;