X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmvpp2%2Fmrvl_ethdev.c;h=476227b9a1479b774b1d03f0d549c4a13ed00c21;hb=31536a6892ef9dfe98be26b65d9235d82ea9f9f1;hp=8647c9b0dec3c2b3029f17c0dc7e7e907ca60b27;hpb=6d13ea8e8e49ab957deae2bba5ecf4a4bfe747d1;p=dpdk.git diff --git a/drivers/net/mvpp2/mrvl_ethdev.c b/drivers/net/mvpp2/mrvl_ethdev.c index 8647c9b0de..476227b9a1 100644 --- a/drivers/net/mvpp2/mrvl_ethdev.c +++ b/drivers/net/mvpp2/mrvl_ethdev.c @@ -5,7 +5,7 @@ */ #include -#include +#include #include #include #include @@ -84,8 +84,6 @@ static struct pp2_bpool *mrvl_port_to_bpool_lookup[RTE_MAX_ETHPORTS]; static int mrvl_port_bpool_size[PP2_NUM_PKT_PROC][PP2_BPOOL_NUM_POOLS][RTE_MAX_LCORE]; static uint64_t cookie_addr_high = MRVL_COOKIE_ADDR_INVALID; -int mrvl_logtype; - struct mrvl_ifnames { const char *names[PP2_NUM_ETH_PPIO * PP2_NUM_PKT_PROC]; int idx; @@ -144,6 +142,9 @@ static uint16_t mrvl_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); static uint16_t mrvl_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts); +static int rte_pmd_mrvl_remove(struct rte_vdev_device *vdev); +static void mrvl_deinit_pp2(void); +static void mrvl_deinit_hifs(void); #define MRVL_XSTATS_TBL_ENTRY(name) { \ @@ -440,15 +441,15 @@ mrvl_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) * when this feature has not been enabled/supported so far * (TODO check scattered_rx flag here once scattered RX is supported). */ - if (mru + MRVL_PKT_OFFS > mbuf_data_size) { - mru = mbuf_data_size - MRVL_PKT_OFFS; + if (mru - RTE_ETHER_CRC_LEN + MRVL_PKT_OFFS > mbuf_data_size) { + mru = mbuf_data_size + RTE_ETHER_CRC_LEN - MRVL_PKT_OFFS; mtu = MRVL_PP2_MRU_TO_MTU(mru); MRVL_LOG(WARNING, "MTU too big, max MTU possible limitted " "by current mbuf size: %u. Set MTU to %u, MRU to %u", mbuf_data_size, mtu, mru); } - if (mtu < ETHER_MIN_MTU || mru > MRVL_PKT_SIZE_MAX) { + if (mtu < RTE_ETHER_MIN_MTU || mru > MRVL_PKT_SIZE_MAX) { MRVL_LOG(ERR, "Invalid MTU [%u] or MRU [%u]", mtu, mru); return -EINVAL; } @@ -670,18 +671,6 @@ mrvl_dev_start(struct rte_eth_dev *dev) priv->uc_mc_flushed = 1; } - if (!priv->vlan_flushed) { - ret = pp2_ppio_flush_vlan(priv->ppio); - if (ret) { - MRVL_LOG(ERR, "Failed to flush vlan list"); - /* - * TODO - * once pp2_ppio_flush_vlan() is supported jump to out - * goto out; - */ - } - priv->vlan_flushed = 1; - } ret = mrvl_mtu_set(dev, dev->data->mtu); if (ret) MRVL_LOG(ERR, "Failed to set MTU to %d", dev->data->mtu); @@ -813,7 +802,7 @@ mrvl_flush_bpool(struct rte_eth_dev *dev) unsigned int core_id = rte_lcore_id(); if (core_id == LCORE_ID_ANY) - core_id = 0; + core_id = rte_get_main_lcore(); hif = mrvl_get_hif(priv, core_id); @@ -842,10 +831,10 @@ mrvl_flush_bpool(struct rte_eth_dev *dev) * @param dev * Pointer to Ethernet device structure. */ -static void +static int mrvl_dev_stop(struct rte_eth_dev *dev) { - mrvl_dev_set_link_down(dev); + return mrvl_dev_set_link_down(dev); } /** @@ -854,12 +843,15 @@ mrvl_dev_stop(struct rte_eth_dev *dev) * @param dev * Pointer to Ethernet device structure. */ -static void +static int mrvl_dev_close(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; size_t i; + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + return 0; + mrvl_flush_rx_queues(dev); mrvl_flush_tx_shadow_queues(dev); mrvl_flow_deinit(dev); @@ -898,6 +890,24 @@ mrvl_dev_close(struct rte_eth_dev *dev) pp2_cls_plcr_deinit(priv->default_policer); priv->default_policer = NULL; } + + + if (priv->bpool) { + pp2_bpool_deinit(priv->bpool); + used_bpools[priv->pp_id] &= ~(1 << priv->bpool_bit); + priv->bpool = NULL; + } + + mrvl_dev_num--; + + if (mrvl_dev_num == 0) { + MRVL_LOG(INFO, "Perform MUSDK deinit"); + mrvl_deinit_hifs(); + mrvl_deinit_pp2(); + rte_mvep_deinit(MVEP_MOD_T_PP2); + } + + return 0; } /** @@ -975,22 +985,29 @@ mrvl_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_promiscuous_enable(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int ret; if (!priv->ppio) - return; + return 0; if (priv->isolated) - return; + return 0; ret = pp2_ppio_set_promisc(priv->ppio, 1); - if (ret) + if (ret) { MRVL_LOG(ERR, "Failed to enable promiscuous mode"); + return -EAGAIN; + } + + return 0; } /** @@ -998,22 +1015,29 @@ mrvl_promiscuous_enable(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_allmulticast_enable(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int ret; if (!priv->ppio) - return; + return 0; if (priv->isolated) - return; + return 0; ret = pp2_ppio_set_mc_promisc(priv->ppio, 1); - if (ret) + if (ret) { MRVL_LOG(ERR, "Failed enable all-multicast mode"); + return -EAGAIN; + } + + return 0; } /** @@ -1021,19 +1045,26 @@ mrvl_allmulticast_enable(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_promiscuous_disable(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int ret; if (!priv->ppio) - return; + return 0; ret = pp2_ppio_set_promisc(priv->ppio, 0); - if (ret) + if (ret) { MRVL_LOG(ERR, "Failed to disable promiscuous mode"); + return -EAGAIN; + } + + return 0; } /** @@ -1041,19 +1072,26 @@ mrvl_promiscuous_disable(struct rte_eth_dev *dev) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_allmulticast_disable(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int ret; if (!priv->ppio) - return; + return 0; ret = pp2_ppio_set_mc_promisc(priv->ppio, 0); - if (ret) + if (ret) { MRVL_LOG(ERR, "Failed to disable all-multicast mode"); + return -EAGAIN; + } + + return 0; } /** @@ -1068,7 +1106,7 @@ static void mrvl_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) { struct mrvl_priv *priv = dev->data->dev_private; - char buf[ETHER_ADDR_FMT_SIZE]; + char buf[RTE_ETHER_ADDR_FMT_SIZE]; int ret; if (!priv->ppio) @@ -1080,7 +1118,7 @@ mrvl_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) ret = pp2_ppio_remove_mac_addr(priv->ppio, dev->data->mac_addrs[index].addr_bytes); if (ret) { - ether_format_addr(buf, sizeof(buf), + rte_ether_format_addr(buf, sizeof(buf), &dev->data->mac_addrs[index]); MRVL_LOG(ERR, "Failed to remove mac %s", buf); } @@ -1106,7 +1144,7 @@ mrvl_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, uint32_t index, uint32_t vmdq __rte_unused) { struct mrvl_priv *priv = dev->data->dev_private; - char buf[ETHER_ADDR_FMT_SIZE]; + char buf[RTE_ETHER_ADDR_FMT_SIZE]; int ret; if (priv->isolated) @@ -1134,7 +1172,7 @@ mrvl_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, */ ret = pp2_ppio_add_mac_addr(priv->ppio, mac_addr->addr_bytes); if (ret) { - ether_format_addr(buf, sizeof(buf), mac_addr); + rte_ether_format_addr(buf, sizeof(buf), mac_addr); MRVL_LOG(ERR, "Failed to add mac %s", buf); return -1; } @@ -1167,8 +1205,8 @@ mrvl_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) ret = pp2_ppio_set_mac_addr(priv->ppio, mac_addr->addr_bytes); if (ret) { - char buf[ETHER_ADDR_FMT_SIZE]; - ether_format_addr(buf, sizeof(buf), mac_addr); + char buf[RTE_ETHER_ADDR_FMT_SIZE]; + rte_ether_format_addr(buf, sizeof(buf), mac_addr); MRVL_LOG(ERR, "Failed to set mac to %s", buf); } @@ -1282,15 +1320,18 @@ mrvl_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats) * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_stats_reset(struct rte_eth_dev *dev) { struct mrvl_priv *priv = dev->data->dev_private; int i; if (!priv->ppio) - return; + return 0; for (i = 0; i < dev->data->nb_rx_queues; i++) { struct mrvl_rxq *rxq = dev->data->rx_queues[i]; @@ -1308,7 +1349,7 @@ mrvl_stats_reset(struct rte_eth_dev *dev) txq->bytes_sent = 0; } - pp2_ppio_get_statistics(priv->ppio, NULL, 1); + return pp2_ppio_get_statistics(priv->ppio, NULL, 1); } /** @@ -1359,11 +1400,14 @@ mrvl_xstats_get(struct rte_eth_dev *dev, * * @param dev * Pointer to Ethernet device structure. + * + * @return + * 0 on success, negative error value otherwise. */ -static void +static int mrvl_xstats_reset(struct rte_eth_dev *dev) { - mrvl_stats_reset(dev); + return mrvl_stats_reset(dev); } /** @@ -1403,7 +1447,7 @@ mrvl_xstats_get_names(struct rte_eth_dev *dev __rte_unused, * @param info * Info structure output buffer. */ -static void +static int mrvl_dev_infos_get(struct rte_eth_dev *dev __rte_unused, struct rte_eth_dev_info *info) { @@ -1438,6 +1482,8 @@ mrvl_dev_infos_get(struct rte_eth_dev *dev __rte_unused, info->default_rxconf.rx_drop_en = 1; info->max_rx_pktlen = MRVL_PKT_SIZE_MAX; + + return 0; } /** @@ -1556,8 +1602,8 @@ mrvl_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) static int mrvl_fill_bpool(struct mrvl_rxq *rxq, int num) { - struct buff_release_entry entries[MRVL_PP2_RXD_MAX]; - struct rte_mbuf *mbufs[MRVL_PP2_RXD_MAX]; + struct buff_release_entry entries[num]; + struct rte_mbuf *mbufs[num]; int i, ret; unsigned int core_id; struct pp2_hif *hif; @@ -1565,7 +1611,7 @@ mrvl_fill_bpool(struct mrvl_rxq *rxq, int num) core_id = rte_lcore_id(); if (core_id == LCORE_ID_ANY) - core_id = 0; + core_id = rte_get_main_lcore(); hif = mrvl_get_hif(rxq->priv, core_id); if (!hif) @@ -1715,7 +1761,7 @@ mrvl_rx_queue_release(void *rxq) unsigned int core_id = rte_lcore_id(); if (core_id == LCORE_ID_ANY) - core_id = 0; + core_id = rte_get_main_lcore(); if (!q) return; @@ -2113,7 +2159,6 @@ mrvl_desc_to_packet_type_and_offset(struct pp2_ppio_desc *desc, *l4_offset = *l3_offset + MRVL_ARP_LENGTH; break; default: - MRVL_LOG(DEBUG, "Failed to recognise l3 packet type"); break; } @@ -2125,7 +2170,6 @@ mrvl_desc_to_packet_type_and_offset(struct pp2_ppio_desc *desc, packet_type |= RTE_PTYPE_L4_UDP; break; default: - MRVL_LOG(DEBUG, "Failed to recognise l4 packet type"); break; } @@ -2195,10 +2239,9 @@ mrvl_rx_pkt_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) ret = pp2_ppio_recv(q->priv->ppio, q->priv->rxq_map[q->queue_id].tc, q->priv->rxq_map[q->queue_id].inq, descs, &nb_pkts); - if (unlikely(ret < 0)) { - MRVL_LOG(ERR, "Failed to receive packets"); + if (unlikely(ret < 0)) return 0; - } + mrvl_port_bpool_size[bpool->pp2_id][bpool->id][core_id] -= nb_pkts; for (i = 0; i < nb_pkts; i++) { @@ -2261,21 +2304,13 @@ mrvl_rx_pkt_burst(void *rxq, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) if (unlikely(num <= q->priv->bpool_min_size || (!rx_done && num < q->priv->bpool_init_size))) { - ret = mrvl_fill_bpool(q, MRVL_BURST_SIZE); - if (ret) - MRVL_LOG(ERR, "Failed to fill bpool"); + mrvl_fill_bpool(q, MRVL_BURST_SIZE); } else if (unlikely(num > q->priv->bpool_max_size)) { int i; int pkt_to_remove = num - q->priv->bpool_init_size; struct rte_mbuf *mbuf; struct pp2_buff_inf buff; - MRVL_LOG(DEBUG, - "port-%d:%d: bpool %d oversize - remove %d buffers (pool size: %d -> %d)", - bpool->pp2_id, q->priv->ppio->port_id, - bpool->id, pkt_to_remove, num, - q->priv->bpool_init_size); - for (i = 0; i < pkt_to_remove; i++) { ret = pp2_bpool_get_buff(hif, bpool, &buff); if (ret) @@ -2468,12 +2503,8 @@ mrvl_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) sq, q->queue_id, 0); sq_free_size = MRVL_PP2_TX_SHADOWQ_SIZE - sq->size - 1; - if (unlikely(nb_pkts > sq_free_size)) { - MRVL_LOG(DEBUG, - "No room in shadow queue for %d packets! %d packets will be sent.", - nb_pkts, sq_free_size); + if (unlikely(nb_pkts > sq_free_size)) nb_pkts = sq_free_size; - } for (i = 0; i < nb_pkts; i++) { struct rte_mbuf *mbuf = tx_pkts[i]; @@ -2590,10 +2621,6 @@ mrvl_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, */ if (unlikely(total_descs > sq_free_size)) { total_descs -= nb_segs; - RTE_LOG(DEBUG, PMD, - "No room in shadow queue for %d packets! " - "%d packets will be sent.\n", - nb_pkts, i); break; } @@ -2787,7 +2814,7 @@ mrvl_eth_dev_create(struct rte_vdev_device *vdev, const char *name) eth_dev->data->mac_addrs = rte_zmalloc("mac_addrs", - ETHER_ADDR_LEN * MRVL_MAC_ADDRS_MAX, 0); + RTE_ETHER_ADDR_LEN * MRVL_MAC_ADDRS_MAX, 0); if (!eth_dev->data->mac_addrs) { MRVL_LOG(ERR, "Failed to allocate space for eth addrs"); ret = -ENOMEM; @@ -2801,13 +2828,13 @@ mrvl_eth_dev_create(struct rte_vdev_device *vdev, const char *name) goto out_free; memcpy(eth_dev->data->mac_addrs[0].addr_bytes, - req.ifr_addr.sa_data, ETHER_ADDR_LEN); + req.ifr_addr.sa_data, RTE_ETHER_ADDR_LEN); - eth_dev->data->kdrv = RTE_KDRV_NONE; eth_dev->device = &vdev->device; eth_dev->rx_pkt_burst = mrvl_rx_pkt_burst; mrvl_set_tx_function(eth_dev); eth_dev->dev_ops = &mrvl_ops; + eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; rte_eth_dev_probing_finish(eth_dev); return 0; @@ -2817,28 +2844,6 @@ out_free: return ret; } -/** - * Cleanup previously created device representing Ethernet port. - * - * @param name - * Pointer to the port name. - */ -static void -mrvl_eth_dev_destroy(const char *name) -{ - struct rte_eth_dev *eth_dev; - struct mrvl_priv *priv; - - eth_dev = rte_eth_dev_allocated(name); - if (!eth_dev) - return; - - priv = eth_dev->data->dev_private; - pp2_bpool_deinit(priv->bpool); - used_bpools[priv->pp_id] &= ~(1 << priv->bpool_bit); - rte_eth_dev_release_port(eth_dev); -} - /** * Callback used by rte_kvargs_process() during argument parsing. * @@ -2959,20 +2964,15 @@ init_devices: ret = mrvl_eth_dev_create(vdev, ifnames.names[i]); if (ret) goto out_cleanup; + mrvl_dev_num++; } - mrvl_dev_num += ifnum; rte_kvargs_free(kvlist); return 0; out_cleanup: - for (; i > 0; i--) - mrvl_eth_dev_destroy(ifnames.names[i]); + rte_pmd_mrvl_remove(vdev); - if (mrvl_dev_num == 0) { - mrvl_deinit_pp2(); - rte_mvep_deinit(MVEP_MOD_T_PP2); - } out_free_kvlist: rte_kvargs_free(kvlist); @@ -2991,31 +2991,16 @@ out_free_kvlist: static int rte_pmd_mrvl_remove(struct rte_vdev_device *vdev) { - int i; - const char *name; + uint16_t port_id; + int ret = 0; - name = rte_vdev_device_name(vdev); - if (!name) - return -EINVAL; - - MRVL_LOG(INFO, "Removing %s", name); - - RTE_ETH_FOREACH_DEV(i) { /* FIXME: removing all devices! */ - char ifname[RTE_ETH_NAME_MAX_LEN]; - - rte_eth_dev_get_name_by_port(i, ifname); - mrvl_eth_dev_destroy(ifname); - mrvl_dev_num--; - } - - if (mrvl_dev_num == 0) { - MRVL_LOG(INFO, "Perform MUSDK deinit"); - mrvl_deinit_hifs(); - mrvl_deinit_pp2(); - rte_mvep_deinit(MVEP_MOD_T_PP2); + RTE_ETH_FOREACH_DEV(port_id) { + if (rte_eth_devices[port_id].device != &vdev->device) + continue; + ret |= rte_eth_dev_close(port_id); } - return 0; + return ret == 0 ? 0 : -EIO; } static struct rte_vdev_driver pmd_mrvl_drv = { @@ -3025,10 +3010,4 @@ static struct rte_vdev_driver pmd_mrvl_drv = { RTE_PMD_REGISTER_VDEV(net_mvpp2, pmd_mrvl_drv); RTE_PMD_REGISTER_ALIAS(net_mvpp2, eth_mvpp2); - -RTE_INIT(mrvl_init_log) -{ - mrvl_logtype = rte_log_register("pmd.net.mvpp2"); - if (mrvl_logtype >= 0) - rte_log_set_level(mrvl_logtype, RTE_LOG_NOTICE); -} +RTE_LOG_REGISTER(mrvl_logtype, pmd.net.mvpp2, NOTICE);