net/dpaa2: change VLAN filter rule to be called on config
[dpdk.git] / drivers / net / dpaa2 / dpaa2_ethdev.c
index 92e680f..9daba70 100644 (file)
@@ -147,6 +147,12 @@ dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
        PMD_INIT_FUNC_TRACE();
 
        if (mask & ETH_VLAN_FILTER_MASK) {
+               /* VLAN Filter not avaialble */
+               if (!priv->max_vlan_filters) {
+                       RTE_LOG(INFO, PMD, "VLAN filter not available\n");
+                       goto next_mask;
+               }
+
                if (dev->data->dev_conf.rxmode.hw_vlan_filter)
                        ret = dpni_enable_vlan_filter(dpni, CMD_PRI_LOW,
                                                      priv->token, true);
@@ -157,7 +163,7 @@ dpaa2_vlan_offload_set(struct rte_eth_dev *dev, int mask)
                        RTE_LOG(ERR, PMD, "Unable to set vlan filter = %d\n",
                                ret);
        }
-
+next_mask:
        if (mask & ETH_VLAN_EXTEND_MASK) {
                if (dev->data->dev_conf.rxmode.hw_vlan_extend)
                        RTE_LOG(INFO, PMD,
@@ -321,8 +327,8 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
 
        if (eth_conf->rxmode.jumbo_frame == 1) {
                if (eth_conf->rxmode.max_rx_pkt_len <= DPAA2_MAX_RX_PKT_LEN) {
-                       ret = dpaa2_dev_mtu_set(dev,
-                                       eth_conf->rxmode.max_rx_pkt_len);
+                       ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW,
+                               priv->token, eth_conf->rxmode.max_rx_pkt_len);
                        if (ret) {
                                PMD_INIT_LOG(ERR,
                                             "unable to set mtu. check config\n");
@@ -374,6 +380,9 @@ dpaa2_eth_dev_configure(struct rte_eth_dev *dev)
                return ret;
        }
 
+       if (eth_conf->rxmode.hw_vlan_filter)
+               dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
+
        /* update the current status */
        dpaa2_dev_link_update(dev, 0);
 
@@ -662,7 +671,7 @@ dpaa2_interrupt_handler(void *param)
                dpaa2_dev_link_update(dev, 0);
                /* calling all the apps registered for link status event */
                _rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC,
-                                             NULL, NULL);
+                                             NULL);
        }
 out:
        ret = dpni_clear_irq_status(dpni, CMD_PRI_LOW, priv->token,
@@ -764,16 +773,6 @@ dpaa2_dev_start(struct rte_eth_dev *dev)
                             "code = %d\n", ret);
                return ret;
        }
-       /* VLAN Offload Settings */
-       if (priv->max_vlan_filters) {
-               ret = dpaa2_vlan_offload_set(dev, ETH_VLAN_FILTER_MASK);
-               if (ret) {
-                       PMD_INIT_LOG(ERR, "Error to dpaa2_vlan_offload_set:"
-                                    "code = %d\n", ret);
-                       return ret;
-               }
-       }
-
 
        /* if the interrupts were configured on this devices*/
        if (intr_handle && (intr_handle->fd) &&
@@ -974,7 +973,8 @@ dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        int ret;
        struct dpaa2_dev_priv *priv = dev->data->dev_private;
        struct fsl_mc_io *dpni = (struct fsl_mc_io *)priv->hw;
-       uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
+       uint32_t frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN
+                               + VLAN_TAG_SIZE;
 
        PMD_INIT_FUNC_TRACE();
 
@@ -992,11 +992,13 @@ dpaa2_dev_mtu_set(struct rte_eth_dev *dev, uint16_t mtu)
        else
                dev->data->dev_conf.rxmode.jumbo_frame = 0;
 
+       dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size;
+
        /* Set the Max Rx frame length as 'mtu' +
         * Maximum Ethernet header length
         */
        ret = dpni_set_max_frame_length(dpni, CMD_PRI_LOW, priv->token,
-                                       mtu + ETH_VLAN_HLEN);
+                                       frame_size);
        if (ret) {
                PMD_DRV_LOG(ERR, "setting the max frame length failed");
                return -1;
@@ -1667,6 +1669,8 @@ int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev,
 
        if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_PARALLEL)
                dpaa2_ethq->cb = dpaa2_dev_process_parallel_event;
+       else if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC)
+               dpaa2_ethq->cb = dpaa2_dev_process_atomic_event;
        else
                return -EINVAL;
 
@@ -1676,6 +1680,11 @@ int dpaa2_eth_eventq_attach(const struct rte_eth_dev *dev,
        cfg.destination.id = dpcon_id;
        cfg.destination.priority = queue_conf->ev.priority;
 
+       if (queue_conf->ev.sched_type == RTE_SCHED_TYPE_ATOMIC) {
+               options |= DPNI_QUEUE_OPT_HOLD_ACTIVE;
+               cfg.destination.hold_active = 1;
+       }
+
        options |= DPNI_QUEUE_OPT_USER_CTX;
        cfg.user_context = (uint64_t)(dpaa2_ethq);