X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fliquidio%2Flio_ethdev.c;h=d4dd3768cdb68ea9d2b90f23ff67f197258c6b07;hb=be797cbf4582f3c474f208aeb3d1baa4001a6156;hp=d97e357e3c3d36acfbe418012d4ff159fecbf511;hpb=bdad90d12ec8eea8c9552880d715f10b0af93cc6;p=dpdk.git diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index d97e357e3c..d4dd3768cd 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -15,9 +15,6 @@ #include "lio_ethdev.h" #include "lio_rxtx.h" -int lio_logtype_init; -int lio_logtype_driver; - /* Default RSS key in use */ static uint8_t lio_rss_key[40] = { 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, @@ -243,17 +240,18 @@ lio_dev_xstats_get_names(struct rte_eth_dev *eth_dev, } /* Reset hw stats for the port */ -static void +static int lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; + int ret; if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down\n", lio_dev->port_id); - return; + return -EINVAL; } /* flush added to prevent cmd failure @@ -270,19 +268,21 @@ lio_dev_xstats_reset(struct rte_eth_dev *eth_dev) ctrl_pkt.ncmd.s.cmd = LIO_CMD_CLEAR_STATS; ctrl_pkt.ctrl_cmd = &ctrl_cmd; - if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) { + ret = lio_send_ctrl_pkt(lio_dev, &ctrl_pkt); + if (ret != 0) { lio_dev_err(lio_dev, "Failed to send clear stats command\n"); - return; + return ret; } - if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) { + ret = lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd); + if (ret != 0) { lio_dev_err(lio_dev, "Clear stats command timed out\n"); - return; + return ret; } /* clear stored per queue stats */ - RTE_FUNC_PTR_OR_RET(*eth_dev->dev_ops->stats_reset); - (*eth_dev->dev_ops->stats_reset)(eth_dev); + RTE_FUNC_PTR_OR_ERR_RET(*eth_dev->dev_ops->stats_reset, 0); + return (*eth_dev->dev_ops->stats_reset)(eth_dev); } /* Retrieve the device statistics (# packets in/out, # bytes in/out, etc */ @@ -338,7 +338,7 @@ lio_dev_stats_get(struct rte_eth_dev *eth_dev, return 0; } -static void +static int lio_dev_stats_reset(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -365,6 +365,8 @@ lio_dev_stats_reset(struct rte_eth_dev *eth_dev) memset(oq_stats, 0, sizeof(struct lio_droq_stats)); } } + + return 0; } static int @@ -407,7 +409,8 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev, devinfo->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM | DEV_RX_OFFLOAD_UDP_CKSUM | DEV_RX_OFFLOAD_TCP_CKSUM | - DEV_RX_OFFLOAD_VLAN_STRIP); + DEV_RX_OFFLOAD_VLAN_STRIP | + DEV_RX_OFFLOAD_RSS_HASH); devinfo->tx_offload_capa = (DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM | @@ -961,8 +964,12 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, /** * \brief Net device enable, disable allmulticast * @param eth_dev Pointer to the structure rte_eth_dev + * + * @return + * On success return 0 + * On failure return negative errno */ -static void +static int lio_change_dev_flag(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -987,14 +994,18 @@ lio_change_dev_flag(struct rte_eth_dev *eth_dev) if (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) { lio_dev_err(lio_dev, "Failed to send change flag message\n"); - return; + return -EAGAIN; } - if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) + if (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) { lio_dev_err(lio_dev, "Change dev flag command timed out\n"); + return -ETIMEDOUT; + } + + return 0; } -static void +static int lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1002,20 +1013,20 @@ lio_dev_promiscuous_enable(struct rte_eth_dev *eth_dev) if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) { lio_dev_err(lio_dev, "Require firmware version >= %s\n", LIO_VF_TRUST_MIN_VERSION); - return; + return -EAGAIN; } if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't enable promiscuous\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags |= LIO_IFFLAG_PROMISC; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1023,20 +1034,20 @@ lio_dev_promiscuous_disable(struct rte_eth_dev *eth_dev) if (strcmp(lio_dev->firmware_version, LIO_VF_TRUST_MIN_VERSION) < 0) { lio_dev_err(lio_dev, "Require firmware version >= %s\n", LIO_VF_TRUST_MIN_VERSION); - return; + return -EAGAIN; } if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't disable promiscuous\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags &= ~LIO_IFFLAG_PROMISC; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1044,14 +1055,14 @@ lio_dev_allmulticast_enable(struct rte_eth_dev *eth_dev) if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't enable multicast\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags |= LIO_IFFLAG_ALLMULTI; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } -static void +static int lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); @@ -1059,11 +1070,11 @@ lio_dev_allmulticast_disable(struct rte_eth_dev *eth_dev) if (!lio_dev->intf_open) { lio_dev_err(lio_dev, "Port %d down, can't disable multicast\n", lio_dev->port_id); - return; + return -EAGAIN; } lio_dev->ifflags &= ~LIO_IFFLAG_ALLMULTI; - lio_change_dev_flag(eth_dev); + return lio_change_dev_flag(eth_dev); } static void @@ -1454,12 +1465,13 @@ dev_lsc_handle_error: } /* Stop device and disable input/output functions */ -static void +static int lio_dev_stop(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); lio_dev_info(lio_dev, "Stopping port %d\n", eth_dev->data->port_id); + eth_dev->data->dev_started = 0; lio_dev->intf_open = 0; rte_mb(); @@ -1472,6 +1484,8 @@ lio_dev_stop(struct rte_eth_dev *eth_dev) /* Clear recorded link status */ lio_dev->linfo.link.link_status64 = 0; + + return 0; } static int @@ -1539,20 +1553,24 @@ lio_dev_set_link_down(struct rte_eth_dev *eth_dev) * @return * - nothing */ -static void +static int lio_dev_close(struct rte_eth_dev *eth_dev) { struct lio_device *lio_dev = LIO_DEV(eth_dev); + int ret = 0; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; lio_dev_info(lio_dev, "closing port %d\n", eth_dev->data->port_id); if (lio_dev->intf_open) - lio_dev_stop(eth_dev); + ret = lio_dev_stop(eth_dev); /* Reset ioq regs */ lio_dev->fn_list.setup_device_regs(lio_dev); - if (lio_dev->pci_dev->kdrv == RTE_KDRV_IGB_UIO) { + if (lio_dev->pci_dev->kdrv == RTE_PCI_KDRV_IGB_UIO) { cn23xx_vf_ask_pf_to_do_flr(lio_dev); rte_delay_ms(LIO_PCI_FLR_WAIT); } @@ -1570,6 +1588,8 @@ lio_dev_close(struct rte_eth_dev *eth_dev) /* Delete all queues */ lio_dev_clear_queues(eth_dev); + + return ret; } /** @@ -1687,6 +1707,7 @@ static int lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq) { struct lio_device *lio_dev = LIO_DEV(eth_dev); + int ret; if (lio_dev->nb_rx_queues != num_rxq || lio_dev->nb_tx_queues != num_txq) { @@ -1696,8 +1717,11 @@ lio_reconf_queues(struct rte_eth_dev *eth_dev, int num_txq, int num_rxq) lio_dev->nb_tx_queues = num_txq; } - if (lio_dev->intf_open) - lio_dev_stop(eth_dev); + if (lio_dev->intf_open) { + ret = lio_dev_stop(eth_dev); + if (ret != 0) + return ret; + } /* Reset ioq registers */ if (lio_dev->fn_list.setup_device_regs(lio_dev)) { @@ -1722,6 +1746,10 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) PMD_INIT_FUNC_TRACE(); + if (eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS_FLAG) + eth_dev->data->dev_conf.rxmode.offloads |= + DEV_RX_OFFLOAD_RSS_HASH; + /* Inform firmware about change in number of queues to use. * Disable IO queues and reset registers for re-configuration. */ @@ -1997,7 +2025,7 @@ lio_first_time_init(struct lio_device *lio_dev, goto error; /* Request and wait for device reset. */ - if (pdev->kdrv == RTE_KDRV_IGB_UIO) { + if (pdev->kdrv == RTE_PCI_KDRV_IGB_UIO) { cn23xx_vf_ask_pf_to_do_flr(lio_dev); /* FLR wait time doubled as a precaution. */ rte_delay_ms(LIO_PCI_FLR_WAIT * 2); @@ -2047,10 +2075,6 @@ lio_eth_dev_uninit(struct rte_eth_dev *eth_dev) /* lio_free_sc_buffer_pool */ lio_free_sc_buffer_pool(lio_dev); - eth_dev->dev_ops = NULL; - eth_dev->rx_pkt_burst = NULL; - eth_dev->tx_pkt_burst = NULL; - return 0; } @@ -2070,6 +2094,7 @@ lio_eth_dev_init(struct rte_eth_dev *eth_dev) return 0; rte_eth_copy_pci_info(eth_dev, pdev); + eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; if (pdev->mem_resource[0].addr) { lio_dev->hw_addr = pdev->mem_resource[0].addr; @@ -2143,13 +2168,5 @@ static struct rte_pci_driver rte_liovf_pmd = { RTE_PMD_REGISTER_PCI(net_liovf, rte_liovf_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_liovf, pci_id_liovf_map); RTE_PMD_REGISTER_KMOD_DEP(net_liovf, "* igb_uio | vfio-pci"); - -RTE_INIT(lio_init_log) -{ - lio_logtype_init = rte_log_register("pmd.net.liquidio.init"); - if (lio_logtype_init >= 0) - rte_log_set_level(lio_logtype_init, RTE_LOG_NOTICE); - lio_logtype_driver = rte_log_register("pmd.net.liquidio.driver"); - if (lio_logtype_driver >= 0) - rte_log_set_level(lio_logtype_driver, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(lio_logtype_init, pmd.net.liquidio.init, NOTICE); +RTE_LOG_REGISTER(lio_logtype_driver, pmd.net.liquidio.driver, NOTICE);