net/mvpp2: remove CRC length from MRU validation
[dpdk.git] / drivers / net / mvpp2 / mrvl_ethdev.c
index 0af5635..476227b 100644 (file)
@@ -5,7 +5,7 @@
  */
 
 #include <rte_string_fns.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
 #include <rte_kvargs.h>
 #include <rte_log.h>
 #include <rte_malloc.h>
@@ -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;
@@ -443,8 +441,8 @@ 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",
@@ -673,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);
@@ -816,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);
 
@@ -845,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);
 }
 
 /**
@@ -857,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);
@@ -917,6 +906,8 @@ mrvl_dev_close(struct rte_eth_dev *dev)
                mrvl_deinit_pp2();
                rte_mvep_deinit(MVEP_MOD_T_PP2);
        }
+
+       return 0;
 }
 
 /**
@@ -1024,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;
 }
 
 /**
@@ -1074,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;
 }
 
 /**
@@ -1597,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;
@@ -1606,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)
@@ -1756,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;
@@ -2154,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;
        }
 
@@ -2166,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;
        }
 
@@ -2236,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++) {
@@ -2302,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)
@@ -2509,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];
@@ -2631,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;
                }
 
@@ -2844,14 +2830,11 @@ mrvl_eth_dev_create(struct rte_vdev_device *vdev, const char *name)
        memcpy(eth_dev->data->mac_addrs[0].addr_bytes,
               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;
-
-       /* Flag to call rte_eth_dev_release_port() in rte_eth_dev_close(). */
-       eth_dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
+       eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        rte_eth_dev_probing_finish(eth_dev);
        return 0;
@@ -3009,14 +2992,15 @@ static int
 rte_pmd_mrvl_remove(struct rte_vdev_device *vdev)
 {
        uint16_t port_id;
+       int ret = 0;
 
        RTE_ETH_FOREACH_DEV(port_id) {
                if (rte_eth_devices[port_id].device != &vdev->device)
                        continue;
-               rte_eth_dev_close(port_id);
+               ret |= rte_eth_dev_close(port_id);
        }
 
-       return 0;
+       return ret == 0 ? 0 : -EIO;
 }
 
 static struct rte_vdev_driver pmd_mrvl_drv = {
@@ -3026,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);