net/qede: fix default extended VLAN offload config
[dpdk.git] / drivers / net / qede / qede_ethdev.c
index 7a63d05..68c8c89 100644 (file)
@@ -338,6 +338,24 @@ static void qede_interrupt_action(struct ecore_hwfn *p_hwfn)
        ecore_int_sp_dpc((osal_int_ptr_t)(p_hwfn));
 }
 
+static void
+qede_interrupt_handler_intx(void *param)
+{
+       struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param;
+       struct qede_dev *qdev = eth_dev->data->dev_private;
+       struct ecore_dev *edev = &qdev->edev;
+       u64 status;
+
+       /* Check if our device actually raised an interrupt */
+       status = ecore_int_igu_read_sisr_reg(ECORE_LEADING_HWFN(edev));
+       if (status & 0x1) {
+               qede_interrupt_action(ECORE_LEADING_HWFN(edev));
+
+               if (rte_intr_enable(eth_dev->intr_handle))
+                       DP_ERR(edev, "rte_intr_enable failed\n");
+       }
+}
+
 static void
 qede_interrupt_handler(void *param)
 {
@@ -957,7 +975,11 @@ qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr,
        struct ecore_filter_ucast ucast;
        int re;
 
+       if (!is_valid_assigned_ether_addr(mac_addr))
+               return -EINVAL;
+
        qede_set_ucast_cmn_params(&ucast);
+       ucast.opcode = ECORE_FILTER_ADD;
        ucast.type = ECORE_FILTER_MAC;
        ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac);
        re = (int)qede_mac_int_ops(eth_dev, &ucast, 1);
@@ -979,6 +1001,9 @@ qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index)
                return;
        }
 
+       if (!is_valid_assigned_ether_addr(&eth_dev->data->mac_addrs[index]))
+               return;
+
        qede_set_ucast_cmn_params(&ucast);
        ucast.opcode = ECORE_FILTER_REMOVE;
        ucast.type = ECORE_FILTER_MAC;
@@ -1002,8 +1027,9 @@ qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr)
                return -EPERM;
        }
 
-       qede_mac_addr_add(eth_dev, mac_addr, 0, 0);
-       return 0;
+       qede_mac_addr_remove(eth_dev, 0);
+
+       return qede_mac_addr_add(eth_dev, mac_addr, 0, 0);
 }
 
 static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool flg)
@@ -1329,9 +1355,6 @@ static void qede_dev_stop(struct rte_eth_dev *eth_dev)
        /* Disable traffic */
        ecore_hw_stop_fastpath(edev); /* TBD - loop */
 
-       if (IS_PF(edev))
-               qede_mac_addr_remove(eth_dev, 0);
-
        DP_INFO(edev, "Device is stopped\n");
 }
 
@@ -1471,8 +1494,7 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
 
        /* Enable VLAN offloads by default */
        ret = qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK  |
-                                            ETH_VLAN_FILTER_MASK |
-                                            ETH_VLAN_EXTEND_MASK);
+                                            ETH_VLAN_FILTER_MASK);
        if (ret)
                return ret;
 
@@ -2070,8 +2092,6 @@ int qede_update_mtu(struct rte_eth_dev *eth_dev, uint16_t mtu)
                                        goto err;
 
                                /* Restore config lost due to vport stop */
-                               qede_mac_addr_set(eth_dev, &qdev->primary_mac);
-
                                if (eth_dev->data->promiscuous)
                                        qede_promiscuous_enable(eth_dev);
                                else
@@ -2500,9 +2520,6 @@ static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
                dev->data->dev_started = 0;
                qede_dev_stop(dev);
                restart = true;
-       } else {
-               if (IS_PF(edev))
-                       qede_mac_addr_remove(dev, 0);
        }
        rte_delay_ms(1000);
        qdev->mtu = mtu;
@@ -3024,6 +3041,9 @@ static const struct eth_dev_ops qede_eth_vf_dev_ops = {
        .mtu_set = qede_set_mtu,
        .udp_tunnel_port_add = qede_udp_dst_port_add,
        .udp_tunnel_port_del = qede_udp_dst_port_del,
+       .mac_addr_add = qede_mac_addr_add,
+       .mac_addr_remove = qede_mac_addr_remove,
+       .mac_addr_set = qede_mac_addr_set,
 };
 
 static void qede_update_pf_params(struct ecore_dev *edev)
@@ -3052,6 +3072,7 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
        /* Fix up ecore debug level */
        uint32_t dp_module = ~0 & ~ECORE_MSG_HW;
        uint8_t dp_level = ECORE_LEVEL_VERBOSE;
+       uint32_t int_mode;
        int rc;
 
        /* Extract key data structures */
@@ -3096,8 +3117,22 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
                return -ENODEV;
        }
        qede_update_pf_params(edev);
-       rte_intr_callback_register(&pci_dev->intr_handle,
-                                  qede_interrupt_handler, (void *)eth_dev);
+
+       switch (pci_dev->intr_handle.type) {
+       case RTE_INTR_HANDLE_UIO_INTX:
+       case RTE_INTR_HANDLE_VFIO_LEGACY:
+               int_mode = ECORE_INT_MODE_INTA;
+               rte_intr_callback_register(&pci_dev->intr_handle,
+                                          qede_interrupt_handler_intx,
+                                          (void *)eth_dev);
+               break;
+       default:
+               int_mode = ECORE_INT_MODE_MSIX;
+               rte_intr_callback_register(&pci_dev->intr_handle,
+                                          qede_interrupt_handler,
+                                          (void *)eth_dev);
+       }
+
        if (rte_intr_enable(&pci_dev->intr_handle)) {
                DP_ERR(edev, "rte_intr_enable() failed\n");
                return -ENODEV;
@@ -3105,7 +3140,8 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
 
        /* Start the Slowpath-process */
        memset(&params, 0, sizeof(struct qed_slowpath_params));
-       params.int_mode = ECORE_INT_MODE_MSIX;
+
+       params.int_mode = int_mode;
        params.drv_major = QEDE_PMD_VERSION_MAJOR;
        params.drv_minor = QEDE_PMD_VERSION_MINOR;
        params.drv_rev = QEDE_PMD_VERSION_REVISION;
@@ -3188,7 +3224,7 @@ static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf)
                                                ECORE_LEADING_HWFN(edev),
                                                vf_mac,
                                                &is_mac_forced);
-                       if (is_mac_exist && is_mac_forced) {
+                       if (is_mac_exist) {
                                DP_INFO(edev, "VF macaddr received from PF\n");
                                ether_addr_copy((struct ether_addr *)&vf_mac,
                                                &eth_dev->data->mac_addrs[0]);