X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fliquidio%2Flio_ethdev.c;h=e1eaf9eb8ad56ed5db62736d94ad36bc021b5fe7;hb=9039c8125730;hp=6c24962312ee2a0ad567ff9f5b58d2e6ba8b6e92;hpb=37a725d66da55d51382b8c44b97e715ff20ea4b9;p=dpdk.git diff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c index 6c24962312..e1eaf9eb8a 100644 --- a/drivers/net/liquidio/lio_ethdev.c +++ b/drivers/net/liquidio/lio_ethdev.c @@ -2,7 +2,8 @@ * Copyright(c) 2017 Cavium, Inc */ -#include +#include +#include #include #include #include @@ -14,6 +15,9 @@ #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, @@ -363,15 +367,13 @@ lio_dev_stats_reset(struct rte_eth_dev *eth_dev) } } -static void +static int lio_dev_info_get(struct rte_eth_dev *eth_dev, struct rte_eth_dev_info *devinfo) { struct lio_device *lio_dev = LIO_DEV(eth_dev); struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); - devinfo->pci_dev = pci_dev; - switch (pci_dev->id.subsystem_device_id) { /* CN23xx 10G cards */ case PCI_SUBSYS_DEV_ID_CN2350_210: @@ -391,6 +393,7 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev, devinfo->speed_capa = ETH_LINK_SPEED_10G; lio_dev_err(lio_dev, "Unknown CN23XX subsystem device id. Setting 10G as default link speed.\n"); + return -EINVAL; } devinfo->max_rx_queues = lio_dev->max_rx_queues; @@ -421,6 +424,7 @@ lio_dev_info_get(struct rte_eth_dev *eth_dev, ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_IPV6_EX | ETH_RSS_IPV6_TCP_EX); + return 0; } static int @@ -428,7 +432,7 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) { struct lio_device *lio_dev = LIO_DEV(eth_dev); uint16_t pf_mtu = lio_dev->linfo.link.s.mtu; - uint32_t frame_len = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; + uint32_t frame_len = mtu + RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN; struct lio_dev_ctrl_cmd ctrl_cmd; struct lio_ctrl_pkt ctrl_pkt; @@ -443,9 +447,9 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) /* check if VF MTU is within allowed range. * New value should not exceed PF MTU. */ - if ((mtu < ETHER_MIN_MTU) || (mtu > pf_mtu)) { + if (mtu < RTE_ETHER_MIN_MTU || mtu > pf_mtu) { lio_dev_err(lio_dev, "VF MTU should be >= %d and <= %d\n", - ETHER_MIN_MTU, pf_mtu); + RTE_ETHER_MIN_MTU, pf_mtu); return -EINVAL; } @@ -474,10 +478,12 @@ lio_dev_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu) return -1; } - if (frame_len > ETHER_MAX_LEN) - eth_dev->data->dev_conf.rxmode.jumbo_frame = 1; + if (frame_len > RTE_ETHER_MAX_LEN) + eth_dev->data->dev_conf.rxmode.offloads |= + DEV_RX_OFFLOAD_JUMBO_FRAME; else - eth_dev->data->dev_conf.rxmode.jumbo_frame = 0; + eth_dev->data->dev_conf.rxmode.offloads &= + ~DEV_RX_OFFLOAD_JUMBO_FRAME; eth_dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_len; eth_dev->data->mtu = mtu; @@ -901,32 +907,6 @@ lio_dev_vlan_filter_set(struct rte_eth_dev *eth_dev, uint16_t vlan_id, int on) return 0; } -/** - * Atomically writes the link status information into global - * structure rte_eth_dev. - * - * @param eth_dev - * - Pointer to the structure rte_eth_dev to read from. - * - Pointer to the buffer to be saved with the link status. - * - * @return - * - On success, zero. - * - On failure, negative value. - */ -static inline int -lio_dev_atomic_write_link_status(struct rte_eth_dev *eth_dev, - struct rte_eth_link *link) -{ - struct rte_eth_link *dst = ð_dev->data->dev_link; - struct rte_eth_link *src = link; - - if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst, - *(uint64_t *)src) == 0) - return -1; - - return 0; -} - static uint64_t lio_hweight64(uint64_t w) { @@ -946,23 +926,19 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete __rte_unused) { struct lio_device *lio_dev = LIO_DEV(eth_dev); - struct rte_eth_link link, old; + struct rte_eth_link link; /* Initialize */ + memset(&link, 0, sizeof(link)); link.link_status = ETH_LINK_DOWN; link.link_speed = ETH_SPEED_NUM_NONE; link.link_duplex = ETH_LINK_HALF_DUPLEX; link.link_autoneg = ETH_LINK_AUTONEG; - memset(&old, 0, sizeof(old)); /* Return what we found */ if (lio_dev->linfo.link.s.link_up == 0) { /* Interface is down */ - if (lio_dev_atomic_write_link_status(eth_dev, &link)) - return -1; - if (link.link_status == old.link_status) - return -1; - return 0; + return rte_eth_linkstatus_set(eth_dev, &link); } link.link_status = ETH_LINK_UP; /* Interface is up */ @@ -979,20 +955,18 @@ lio_dev_link_update(struct rte_eth_dev *eth_dev, link.link_duplex = ETH_LINK_HALF_DUPLEX; } - if (lio_dev_atomic_write_link_status(eth_dev, &link)) - return -1; - - if (link.link_status == old.link_status) - return -1; - - return 0; + return rte_eth_linkstatus_set(eth_dev, &link); } /** * \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); @@ -1017,14 +991,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); @@ -1032,20 +1010,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); @@ -1053,17 +1031,17 @@ 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 @@ -1438,6 +1416,11 @@ lio_dev_start(struct rte_eth_dev *eth_dev) /* Configure RSS if device configured with multiple RX queues. */ lio_dev_mq_rx_configure(eth_dev); + /* Before update the link info, + * must set linfo.link.link_status64 to 0. + */ + lio_dev->linfo.link.link_status64 = 0; + /* start polling for lsc */ ret = rte_eal_alarm_set(LIO_LSC_TIMEOUT, lio_sync_link_state_check, @@ -1456,9 +1439,9 @@ lio_dev_start(struct rte_eth_dev *eth_dev) goto dev_mtu_set_error; } - mtu = (uint16_t)(frame_len - ETHER_HDR_LEN - ETHER_CRC_LEN); - if (mtu < ETHER_MIN_MTU) - mtu = ETHER_MIN_MTU; + mtu = (uint16_t)(frame_len - RTE_ETHER_HDR_LEN - RTE_ETHER_CRC_LEN); + if (mtu < RTE_ETHER_MIN_MTU) + mtu = RTE_ETHER_MIN_MTU; if (eth_dev->data->mtu != mtu) { ret = lio_dev_mtu_set(eth_dev, mtu); @@ -1739,7 +1722,7 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) struct lio_device *lio_dev = LIO_DEV(eth_dev); uint16_t timeout = LIO_MAX_CMD_TIMEOUT; int retval, num_iqueues, num_oqueues; - uint8_t mac[ETHER_ADDR_LEN], i; + uint8_t mac[RTE_ETHER_ADDR_LEN], i; struct lio_if_cfg_resp *resp; struct lio_soft_command *sc; union lio_if_cfg if_cfg; @@ -1809,8 +1792,8 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) goto nic_config_fail; } - snprintf(lio_dev->firmware_version, LIO_FW_VERSION_LENGTH, "%s", - resp->cfg_info.lio_firmware_version); + strlcpy(lio_dev->firmware_version, + resp->cfg_info.lio_firmware_version, LIO_FW_VERSION_LENGTH); lio_swap_8B_data((uint64_t *)(&resp->cfg_info), sizeof(struct octeon_if_cfg_info) >> 3); @@ -1857,12 +1840,13 @@ lio_dev_configure(struct rte_eth_dev *eth_dev) /* 64-bit swap required on LE machines */ lio_swap_8B_data(&lio_dev->linfo.hw_addr, 1); - for (i = 0; i < ETHER_ADDR_LEN; i++) + for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) mac[i] = *((uint8_t *)(((uint8_t *)&lio_dev->linfo.hw_addr) + 2 + i)); /* Copy the permanent MAC address */ - ether_addr_copy((struct ether_addr *)mac, ð_dev->data->mac_addrs[0]); + rte_ether_addr_copy((struct rte_ether_addr *)mac, + ð_dev->data->mac_addrs[0]); /* enable firmware checksum support for tunnel packets */ lio_enable_hw_tunnel_rx_checksum(eth_dev); @@ -2066,14 +2050,11 @@ lio_eth_dev_uninit(struct rte_eth_dev *eth_dev) PMD_INIT_FUNC_TRACE(); if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return -EPERM; + return 0; /* lio_free_sc_buffer_pool */ lio_free_sc_buffer_pool(lio_dev); - rte_free(eth_dev->data->mac_addrs); - eth_dev->data->mac_addrs = NULL; - eth_dev->dev_ops = NULL; eth_dev->rx_pkt_burst = NULL; eth_dev->tx_pkt_burst = NULL; @@ -2119,7 +2100,7 @@ lio_eth_dev_init(struct rte_eth_dev *eth_dev) } eth_dev->dev_ops = &liovf_eth_dev_ops; - eth_dev->data->mac_addrs = rte_zmalloc("lio", ETHER_ADDR_LEN, 0); + eth_dev->data->mac_addrs = rte_zmalloc("lio", RTE_ETHER_ADDR_LEN, 0); if (eth_dev->data->mac_addrs == NULL) { lio_dev_err(lio_dev, "MAC addresses memory allocation failed\n"); @@ -2143,19 +2124,8 @@ static int lio_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct rte_pci_device *pci_dev) { - struct rte_eth_dev *eth_dev; - int ret; - - eth_dev = rte_eth_dev_pci_allocate(pci_dev, - sizeof(struct lio_device)); - if (eth_dev == NULL) - return -ENOMEM; - - ret = lio_eth_dev_init(eth_dev); - if (ret) - rte_eth_dev_pci_release(eth_dev); - - return ret; + return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct lio_device), + lio_eth_dev_init); } static int @@ -2181,3 +2151,13 @@ 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); +}