X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhinic%2Fhinic_pmd_ethdev.c;h=cd4dad8588f3b348a61ef792371846429f25ce79;hb=39e4a2577fd05199f53182b7c8509aeed40dc07f;hp=daf8f33cf37d7404537cb5e18513e0347c879c70;hpb=b8f5d2ae75c97698190d46f4810d01f407016aad;p=dpdk.git diff --git a/drivers/net/hinic/hinic_pmd_ethdev.c b/drivers/net/hinic/hinic_pmd_ethdev.c index daf8f33cf3..cd4dad8588 100644 --- a/drivers/net/hinic/hinic_pmd_ethdev.c +++ b/drivers/net/hinic/hinic_pmd_ethdev.c @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include #include @@ -69,12 +69,6 @@ #define HINIC_VLAN_FILTER_EN (1U << 0) -#define HINIC_MTU_TO_PKTLEN(mtu) \ - ((mtu) + ETH_HLEN + ETH_CRC_LEN) - -#define HINIC_PKTLEN_TO_MTU(pktlen) \ - ((pktlen) - (ETH_HLEN + ETH_CRC_LEN)) - /* lro numer limit for one packet */ #define HINIC_LRO_WQE_NUM_DEFAULT 8 @@ -939,13 +933,6 @@ static int hinic_dev_set_link_up(struct rte_eth_dev *dev) struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); int ret; - ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, true); - if (ret) { - PMD_DRV_LOG(ERR, "Enable port tx xsfp failed, dev_name: %s, port_id: %d", - nic_dev->proc_dev_name, dev->data->port_id); - return ret; - } - /* link status follow phy port status, up will open pma */ ret = hinic_set_port_enable(nic_dev->hwdev, true); if (ret) @@ -969,13 +956,6 @@ static int hinic_dev_set_link_down(struct rte_eth_dev *dev) struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); int ret; - ret = hinic_set_xsfp_tx_status(nic_dev->hwdev, false); - if (ret) { - PMD_DRV_LOG(ERR, "Disable port tx xsfp failed, dev_name: %s, port_id: %d", - nic_dev->proc_dev_name, dev->data->port_id); - return ret; - } - /* link status follow phy port status, up will close pma */ ret = hinic_set_port_enable(nic_dev->hwdev, false); if (ret) @@ -1095,12 +1075,14 @@ init_qp_fail: /** * DPDK callback to release the receive queue. * - * @param queue - * Generic receive queue pointer. + * @param dev + * Pointer to Ethernet device structure. + * @param qid + * Receive queue index. */ -static void hinic_rx_queue_release(void *queue) +static void hinic_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) { - struct hinic_rxq *rxq = queue; + struct hinic_rxq *rxq = dev->data->rx_queues[qid]; struct hinic_nic_dev *nic_dev; if (!rxq) { @@ -1127,12 +1109,14 @@ static void hinic_rx_queue_release(void *queue) /** * DPDK callback to release the transmit queue. * - * @param queue - * Generic transmit queue pointer. + * @param dev + * Pointer to Ethernet device structure. + * @param qid + * Transmit queue index. */ -static void hinic_tx_queue_release(void *queue) +static void hinic_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) { - struct hinic_txq *txq = queue; + struct hinic_txq *txq = dev->data->tx_queues[qid]; struct hinic_nic_dev *nic_dev; if (!txq) { @@ -1177,7 +1161,7 @@ static void hinic_free_all_sq(struct hinic_nic_dev *nic_dev) * @param dev * Pointer to Ethernet device structure. */ -static void hinic_dev_stop(struct rte_eth_dev *dev) +static int hinic_dev_stop(struct rte_eth_dev *dev) { int rc; char *name; @@ -1194,7 +1178,7 @@ static void hinic_dev_stop(struct rte_eth_dev *dev) if (!rte_bit_relaxed_test_and_clear32(HINIC_DEV_START, &nic_dev->dev_status)) { PMD_DRV_LOG(INFO, "Device %s already stopped", name); - return; + return 0; } /* just stop phy port and vport */ @@ -1229,6 +1213,8 @@ static void hinic_dev_stop(struct rte_eth_dev *dev) /* free mbuf */ hinic_free_all_rx_mbuf(dev); hinic_free_all_tx_mbuf(dev); + + return 0; } static void hinic_disable_interrupt(struct rte_eth_dev *dev) @@ -1266,6 +1252,8 @@ static void hinic_disable_interrupt(struct rte_eth_dev *dev) if (retries == HINIC_INTR_CB_UNREG_MAX_RETRIES) PMD_DRV_LOG(ERR, "Unregister intr callback failed after %d retries", retries); + + rte_bit_relaxed_clear32(HINIC_DEV_INIT, &nic_dev->dev_status); } static int hinic_set_dev_promiscuous(struct hinic_nic_dev *nic_dev, bool enable) @@ -1538,6 +1526,9 @@ static void hinic_deinit_mac_addr(struct rte_eth_dev *eth_dev) /* delete multicast mac addrs */ hinic_delete_mc_addr_list(nic_dev); + + rte_free(nic_dev->mc_list); + } static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) @@ -1563,7 +1554,7 @@ static int hinic_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) /* update max frame size */ frame_size = HINIC_MTU_TO_PKTLEN(mtu); - if (frame_size > RTE_ETHER_MAX_LEN) + if (frame_size > HINIC_ETH_MAX_LEN) dev->data->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME; else @@ -1621,6 +1612,9 @@ static int hinic_vlan_filter_set(struct rte_eth_dev *dev, if (vlan_id > RTE_ETHER_MAX_VLAN_ID) return -EINVAL; + if (vlan_id == 0) + return 0; + func_id = hinic_global_func_id(nic_dev->hwdev); if (enable) { @@ -2369,10 +2363,8 @@ static int hinic_set_mac_addr(struct rte_eth_dev *dev, rte_ether_addr_copy(addr, &nic_dev->default_addr); - PMD_DRV_LOG(INFO, "Set new mac address %02x:%02x:%02x:%02x:%02x:%02x", - addr->addr_bytes[0], addr->addr_bytes[1], - addr->addr_bytes[2], addr->addr_bytes[3], - addr->addr_bytes[4], addr->addr_bytes[5]); + PMD_DRV_LOG(INFO, "Set new mac address " RTE_ETHER_ADDR_PRT_FMT, + RTE_ETHER_ADDR_BYTES(addr)); return 0; } @@ -2508,42 +2500,20 @@ allmulti: } /** - * DPDK callback to manage filter control operations + * DPDK callback to get flow operations * * @param dev * Pointer to Ethernet device structure. - * @param filter_type - * Filter type, which just supports generic type. - * @param filter_op - * Filter operation to perform. - * @param arg + * @param ops * Pointer to operation-specific structure. * * @return * 0 on success, negative error value otherwise. */ -static int hinic_dev_filter_ctrl(struct rte_eth_dev *dev, - enum rte_filter_type filter_type, - enum rte_filter_op filter_op, - void *arg) +static int hinic_dev_flow_ops_get(struct rte_eth_dev *dev __rte_unused, + const struct rte_flow_ops **ops) { - struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); - int func_id = hinic_global_func_id(nic_dev->hwdev); - - switch (filter_type) { - case RTE_ETH_FILTER_GENERIC: - if (filter_op != RTE_ETH_FILTER_GET) - return -EINVAL; - *(const void **)arg = &hinic_flow_ops; - break; - default: - PMD_DRV_LOG(INFO, "Filter type (%d) not supported", - filter_type); - return -EINVAL; - } - - PMD_DRV_LOG(INFO, "Set filter_ctrl succeed, func_id: 0x%x, filter_type: 0x%x," - "filter_op: 0x%x.", func_id, filter_type, filter_op); + *ops = &hinic_flow_ops; return 0; } @@ -2970,6 +2940,7 @@ static void hinic_nic_dev_destroy(struct rte_eth_dev *eth_dev) static int hinic_dev_close(struct rte_eth_dev *dev) { struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); + int ret; if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; @@ -2982,7 +2953,7 @@ static int hinic_dev_close(struct rte_eth_dev *dev) } /* stop device first */ - hinic_dev_stop(dev); + ret = hinic_dev_stop(dev); /* rx_cqe, rx_info */ hinic_free_all_rx_resources(dev); @@ -3003,10 +2974,13 @@ static int hinic_dev_close(struct rte_eth_dev *dev) /* disable hardware and uio interrupt */ hinic_disable_interrupt(dev); + /* destroy rx mode mutex */ + hinic_mutex_destroy(&nic_dev->rx_mode_mutex); + /* deinit nic hardware device */ hinic_nic_dev_destroy(dev); - return 0; + return ret; } static const struct eth_dev_ops hinic_pmd_ops = { @@ -3047,7 +3021,7 @@ static const struct eth_dev_ops hinic_pmd_ops = { .mac_addr_remove = hinic_mac_addr_remove, .mac_addr_add = hinic_mac_addr_add, .set_mc_addr_list = hinic_set_mc_addr_list, - .filter_ctrl = hinic_dev_filter_ctrl, + .flow_ops_get = hinic_dev_flow_ops_get, }; static const struct eth_dev_ops hinic_pmd_vf_ops = { @@ -3082,7 +3056,11 @@ static const struct eth_dev_ops hinic_pmd_vf_ops = { .mac_addr_remove = hinic_mac_addr_remove, .mac_addr_add = hinic_mac_addr_add, .set_mc_addr_list = hinic_set_mc_addr_list, - .filter_ctrl = hinic_dev_filter_ctrl, + .flow_ops_get = hinic_dev_flow_ops_get, +}; + +static const struct eth_dev_ops hinic_dev_sec_ops = { + .dev_infos_get = hinic_dev_infos_get, }; static int hinic_func_init(struct rte_eth_dev *eth_dev) @@ -3099,12 +3077,15 @@ static int hinic_func_init(struct rte_eth_dev *eth_dev) /* EAL is SECONDARY and eth_dev is already created */ if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + eth_dev->dev_ops = &hinic_dev_sec_ops; PMD_DRV_LOG(INFO, "Initialize %s in secondary process", eth_dev->data->name); return 0; } + eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; + nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(eth_dev); memset(nic_dev, 0, sizeof(*nic_dev)); @@ -3241,24 +3222,11 @@ static int hinic_dev_init(struct rte_eth_dev *eth_dev) static int hinic_dev_uninit(struct rte_eth_dev *dev) { - struct hinic_nic_dev *nic_dev; - - nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev); - rte_bit_relaxed_clear32(HINIC_DEV_INIT, &nic_dev->dev_status); - if (rte_eal_process_type() != RTE_PROC_PRIMARY) return 0; - hinic_mutex_destroy(&nic_dev->rx_mode_mutex); - hinic_dev_close(dev); - dev->dev_ops = NULL; - dev->rx_pkt_burst = NULL; - dev->tx_pkt_burst = NULL; - - rte_free(nic_dev->mc_list); - return HINIC_OK; } @@ -3294,4 +3262,4 @@ static struct rte_pci_driver rte_hinic_pmd = { RTE_PMD_REGISTER_PCI(net_hinic, rte_hinic_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_hinic, pci_id_hinic_map); -RTE_LOG_REGISTER(hinic_logtype, pmd.net.hinic, INFO); +RTE_LOG_REGISTER_DEFAULT(hinic_logtype, INFO);