New upstream version 17.11.1
[deb_dpdk.git] / drivers / net / i40e / i40e_fdir.c
index 3d7170d..6802995 100644 (file)
@@ -168,7 +168,6 @@ i40e_fdir_rx_queue_init(struct i40e_rx_queue *rxq)
 
        rte_wmb();
        /* Init the RX tail regieter. */
-       I40E_PCI_REG_WRITE(rxq->qrx_tail, 0);
        I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1);
 
        return err;
@@ -670,22 +669,31 @@ i40e_fdir_configure(struct rte_eth_dev *dev)
                PMD_DRV_LOG(ERR, " invalid configuration arguments.");
                return -EINVAL;
        }
-       /* configure flex payload */
-       for (i = 0; i < conf->nb_payloads; i++)
-               i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
-       /* configure flex mask*/
-       for (i = 0; i < conf->nb_flexmasks; i++) {
-               if (hw->mac.type == I40E_MAC_X722) {
-                       /* get translated pctype value in fd pctype register */
-                       pctype = (enum i40e_filter_pctype)i40e_read_rx_ctl(
-                               hw, I40E_GLQF_FD_PCTYPES(
-                               (int)i40e_flowtype_to_pctype(pf->adapter,
-                               conf->flex_mask[i].flow_type)));
-               } else
-                       pctype = i40e_flowtype_to_pctype(pf->adapter,
-                                               conf->flex_mask[i].flow_type);
 
-               i40e_set_flex_mask_on_pctype(pf, pctype, &conf->flex_mask[i]);
+       if (!pf->support_multi_driver) {
+               /* configure flex payload */
+               for (i = 0; i < conf->nb_payloads; i++)
+                       i40e_set_flx_pld_cfg(pf, &conf->flex_set[i]);
+               /* configure flex mask*/
+               for (i = 0; i < conf->nb_flexmasks; i++) {
+                       if (hw->mac.type == I40E_MAC_X722) {
+                               /* get pctype value in fd pctype register */
+                               pctype = (enum i40e_filter_pctype)
+                                         i40e_read_rx_ctl(hw,
+                                               I40E_GLQF_FD_PCTYPES(
+                                               (int)i40e_flowtype_to_pctype(
+                                               pf->adapter,
+                                               conf->flex_mask[i].flow_type)));
+                       } else {
+                               pctype = i40e_flowtype_to_pctype(pf->adapter,
+                                                 conf->flex_mask[i].flow_type);
+                       }
+
+                       i40e_set_flex_mask_on_pctype(pf, pctype,
+                                                    &conf->flex_mask[i]);
+               }
+       } else {
+               PMD_DRV_LOG(ERR, "Not support flexible payload.");
        }
 
        return ret;
@@ -1363,13 +1371,18 @@ i40e_check_fdir_programming_status(struct i40e_rx_queue *rxq)
                                PMD_DRV_LOG(ERR, "invalid programming status"
                                            " reported, error = %u.", error);
                } else
-                       PMD_DRV_LOG(ERR, "unknown programming status"
+                       PMD_DRV_LOG(INFO, "unknown programming status"
                                    " reported, len = %d, id = %u.", len, id);
                rxdp->wb.qword1.status_error_len = 0;
                rxq->rx_tail++;
                if (unlikely(rxq->rx_tail == rxq->nb_rx_desc))
                        rxq->rx_tail = 0;
+               if (rxq->rx_tail == 0)
+                       I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->nb_rx_desc - 1);
+               else
+                       I40E_PCI_REG_WRITE(rxq->qrx_tail, rxq->rx_tail - 1);
        }
+
        return ret;
 }
 
@@ -1612,8 +1625,15 @@ i40e_flow_add_del_fdir_filter(struct rte_eth_dev *dev,
        if (add) {
                fdir_filter = rte_zmalloc("fdir_filter",
                                          sizeof(*fdir_filter), 0);
+               if (fdir_filter == NULL) {
+                       PMD_DRV_LOG(ERR, "Failed to alloc memory.");
+                       return -ENOMEM;
+               }
+
                rte_memcpy(fdir_filter, &check_filter, sizeof(check_filter));
                ret = i40e_sw_fdir_filter_insert(pf, fdir_filter);
+               if (ret < 0)
+                       rte_free(fdir_filter);
        } else {
                ret = i40e_sw_fdir_filter_del(pf, &node->fdir.input);
        }