X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnx2x%2Fbnx2x_ethdev.c;h=b2ea5fafa77cbff2f514531854475a8577a6e83d;hb=9c99878aa1b16de26fcce82c112b401766dd910e;hp=b7359514e53591746153cebb0ba532e4f30d1db0;hpb=bdad90d12ec8eea8c9552880d715f10b0af93cc6;p=dpdk.git diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c index b7359514e5..b2ea5fafa7 100644 --- a/drivers/net/bnx2x/bnx2x_ethdev.c +++ b/drivers/net/bnx2x/bnx2x_ethdev.c @@ -13,9 +13,6 @@ #include #include -int bnx2x_logtype_init; -int bnx2x_logtype_driver; - /* * The set of PCI devices this driver supports */ @@ -240,6 +237,9 @@ bnx2x_dev_start(struct rte_eth_dev *dev) PMD_DRV_LOG(ERR, sc, "rte_intr_enable failed"); } + /* Configure the previously stored Multicast address list */ + if (IS_VF(sc)) + bnx2x_vfpf_set_mcast(sc, sc->mc_addrs, sc->mc_addrs_num); bnx2x_dev_rxtx_init(dev); bnx2x_print_device_info(sc); @@ -265,7 +265,12 @@ bnx2x_dev_stop(struct rte_eth_dev *dev) /* stop the periodic callout */ bnx2x_periodic_stop(dev); } - + /* Remove the configured Multicast list + * Sending NULL for the list of address and the + * Number is set to 0 denoting DEL_CMD + */ + if (IS_VF(sc)) + bnx2x_vfpf_set_mcast(sc, NULL, 0); ret = bnx2x_nic_unload(sc, UNLOAD_NORMAL, FALSE); if (ret) { PMD_DRV_LOG(DEBUG, sc, "bnx2x_nic_unload failed (%d)", ret); @@ -292,7 +297,7 @@ bnx2x_dev_close(struct rte_eth_dev *dev) bnx2x_free_ilt_mem(sc); } -static void +static int bnx2x_promisc_enable(struct rte_eth_dev *dev) { struct bnx2x_softc *sc = dev->data->dev_private; @@ -302,9 +307,11 @@ bnx2x_promisc_enable(struct rte_eth_dev *dev) if (rte_eth_allmulticast_get(dev->data->port_id) == 1) sc->rx_mode = BNX2X_RX_MODE_ALLMULTI_PROMISC; bnx2x_set_rx_mode(sc); + + return 0; } -static void +static int bnx2x_promisc_disable(struct rte_eth_dev *dev) { struct bnx2x_softc *sc = dev->data->dev_private; @@ -314,9 +321,11 @@ bnx2x_promisc_disable(struct rte_eth_dev *dev) if (rte_eth_allmulticast_get(dev->data->port_id) == 1) sc->rx_mode = BNX2X_RX_MODE_ALLMULTI; bnx2x_set_rx_mode(sc); + + return 0; } -static void +static int bnx2x_dev_allmulticast_enable(struct rte_eth_dev *dev) { struct bnx2x_softc *sc = dev->data->dev_private; @@ -326,9 +335,11 @@ bnx2x_dev_allmulticast_enable(struct rte_eth_dev *dev) if (rte_eth_promiscuous_get(dev->data->port_id) == 1) sc->rx_mode = BNX2X_RX_MODE_ALLMULTI_PROMISC; bnx2x_set_rx_mode(sc); + + return 0; } -static void +static int bnx2x_dev_allmulticast_disable(struct rte_eth_dev *dev) { struct bnx2x_softc *sc = dev->data->dev_private; @@ -338,6 +349,32 @@ bnx2x_dev_allmulticast_disable(struct rte_eth_dev *dev) if (rte_eth_promiscuous_get(dev->data->port_id) == 1) sc->rx_mode = BNX2X_RX_MODE_PROMISC; bnx2x_set_rx_mode(sc); + + return 0; +} + +static int +bnx2x_dev_set_mc_addr_list(struct rte_eth_dev *dev, + struct rte_ether_addr *mc_addrs, uint32_t mc_addrs_num) +{ + struct bnx2x_softc *sc = dev->data->dev_private; + int err; + PMD_INIT_FUNC_TRACE(sc); + /* flush previous addresses */ + err = bnx2x_vfpf_set_mcast(sc, NULL, 0); + if (err) + return err; + sc->mc_addrs_num = 0; + + /* Add new ones */ + err = bnx2x_vfpf_set_mcast(sc, mc_addrs, mc_addrs_num); + if (err) + return err; + + sc->mc_addrs_num = mc_addrs_num; + memcpy(sc->mc_addrs, mc_addrs, mc_addrs_num * sizeof(*mc_addrs)); + + return 0; } static int @@ -493,6 +530,7 @@ bnx2x_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) dev_info->rx_desc_lim.nb_max = MAX_RX_AVAIL; dev_info->rx_desc_lim.nb_min = MIN_RX_SIZE_NONTPA; + dev_info->rx_desc_lim.nb_mtu_seg_max = 1; dev_info->tx_desc_lim.nb_max = MAX_TX_AVAIL; return 0; @@ -554,6 +592,7 @@ static const struct eth_dev_ops bnx2xvf_eth_dev_ops = { .promiscuous_disable = bnx2x_promisc_disable, .allmulticast_enable = bnx2x_dev_allmulticast_enable, .allmulticast_disable = bnx2x_dev_allmulticast_disable, + .set_mc_addr_list = bnx2x_dev_set_mc_addr_list, .link_update = bnx2xvf_dev_link_update, .stats_get = bnx2x_dev_stats_get, .xstats_get = bnx2x_dev_xstats_get, @@ -590,6 +629,11 @@ bnx2x_common_dev_init(struct rte_eth_dev *eth_dev, int is_vf) eth_dev->dev_ops = is_vf ? &bnx2xvf_eth_dev_ops : &bnx2x_eth_dev_ops; + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + PMD_DRV_LOG(ERR, sc, "Skipping device init from secondary process"); + return 0; + } + rte_eth_copy_pci_info(eth_dev, pci_dev); sc->pcie_bus = pci_dev->addr.bus; @@ -758,13 +802,5 @@ RTE_PMD_REGISTER_KMOD_DEP(net_bnx2x, "* igb_uio | uio_pci_generic | vfio-pci"); RTE_PMD_REGISTER_PCI(net_bnx2xvf, rte_bnx2xvf_pmd); RTE_PMD_REGISTER_PCI_TABLE(net_bnx2xvf, pci_id_bnx2xvf_map); RTE_PMD_REGISTER_KMOD_DEP(net_bnx2xvf, "* igb_uio | vfio-pci"); - -RTE_INIT(bnx2x_init_log) -{ - bnx2x_logtype_init = rte_log_register("pmd.net.bnx2x.init"); - if (bnx2x_logtype_init >= 0) - rte_log_set_level(bnx2x_logtype_init, RTE_LOG_NOTICE); - bnx2x_logtype_driver = rte_log_register("pmd.net.bnx2x.driver"); - if (bnx2x_logtype_driver >= 0) - rte_log_set_level(bnx2x_logtype_driver, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(bnx2x_logtype_init, pmd.net.bnx2x.init, NOTICE); +RTE_LOG_REGISTER(bnx2x_logtype_driver, pmd.net.bnx2x.driver, NOTICE);