net/qede/base: fix updating VF queue zone id
[dpdk.git] / drivers / net / qede / qede_eth_if.c
index fd07d8b..d0f6e87 100644 (file)
@@ -40,8 +40,6 @@ qed_start_vport(struct ecore_dev *edev, struct qed_start_vport_params *p_params)
                        return rc;
                }
 
-               ecore_hw_start_fastpath(p_hwfn);
-
                DP_VERBOSE(edev, ECORE_MSG_SPQ,
                           "Started V-PORT %d with MTU %d\n",
                           p_params->vport_id, p_params->mtu);
@@ -70,6 +68,33 @@ static int qed_stop_vport(struct ecore_dev *edev, uint8_t vport_id)
        return 0;
 }
 
+bool qed_update_rss_parm_cmt(struct ecore_dev *edev, uint16_t *p_tbl)
+{
+       uint16_t max = 0, k;
+       bool rss_mode = 0; /* disable */
+       int divisor;
+
+       /* Find largest entry, since it's possible RSS needs to
+        * be disabled [in case only 1 queue per-hwfn]
+        */
+       for (k = 0; k < ECORE_RSS_IND_TABLE_SIZE; k++)
+               max = (max > p_tbl[k]) ?  max : p_tbl[k];
+
+       /* Either fix RSS values or disable RSS */
+       if (edev->num_hwfns < max + 1) {
+               divisor = (max + edev->num_hwfns - 1) / edev->num_hwfns;
+               DP_VERBOSE(edev, ECORE_MSG_SPQ,
+                          "CMT - fixing RSS values (modulo %02x)\n",
+                          divisor);
+               for (k = 0; k < ECORE_RSS_IND_TABLE_SIZE; k++)
+                       p_tbl[k] = p_tbl[k] % divisor;
+
+               rss_mode = 1;
+       }
+
+       return rss_mode;
+}
+
 static int
 qed_update_vport(struct ecore_dev *edev, struct qed_update_vport_params *params)
 {
@@ -94,58 +119,7 @@ qed_update_vport(struct ecore_dev *edev, struct qed_update_vport_params *params)
        sp_params.accept_any_vlan = params->accept_any_vlan;
        sp_params.update_accept_any_vlan_flg =
            params->update_accept_any_vlan_flg;
-
-       /* RSS - is a bit tricky, since upper-layer isn't familiar with hwfns.
-        * We need to re-fix the rss values per engine for CMT.
-        */
-
-       if (edev->num_hwfns > 1 && params->update_rss_flg) {
-               struct qed_update_vport_rss_params *rss = &params->rss_params;
-               int k, max = 0;
-
-               /* Find largest entry, since it's possible RSS needs to
-                * be disabled [in case only 1 queue per-hwfn]
-                */
-               for (k = 0; k < ECORE_RSS_IND_TABLE_SIZE; k++)
-                       max = (max > rss->rss_ind_table[k]) ?
-                           max : rss->rss_ind_table[k];
-
-               /* Either fix RSS values or disable RSS */
-               if (edev->num_hwfns < max + 1) {
-                       int divisor = (max + edev->num_hwfns - 1) /
-                           edev->num_hwfns;
-
-                       DP_VERBOSE(edev, ECORE_MSG_SPQ,
-                                  "CMT - fixing RSS values (modulo %02x)\n",
-                                  divisor);
-
-                       for (k = 0; k < ECORE_RSS_IND_TABLE_SIZE; k++)
-                               rss->rss_ind_table[k] =
-                                   rss->rss_ind_table[k] % divisor;
-               } else {
-                       DP_VERBOSE(edev, ECORE_MSG_SPQ,
-                                  "CMT - 1 queue per-hwfn; Disabling RSS\n");
-                       params->update_rss_flg = 0;
-               }
-       }
-
-       /* Now, update the RSS configuration for actual configuration */
-       if (params->update_rss_flg) {
-               sp_rss_params.update_rss_config = 1;
-               sp_rss_params.rss_enable = 1;
-               sp_rss_params.update_rss_capabilities = 1;
-               sp_rss_params.update_rss_ind_table = 1;
-               sp_rss_params.update_rss_key = 1;
-               sp_rss_params.rss_caps = ECORE_RSS_IPV4 | ECORE_RSS_IPV6 |
-                   ECORE_RSS_IPV4_TCP | ECORE_RSS_IPV6_TCP;
-               sp_rss_params.rss_table_size_log = 7;   /* 2^7 = 128 */
-               rte_memcpy(sp_rss_params.rss_ind_table,
-                      params->rss_params.rss_ind_table,
-                      ECORE_RSS_IND_TABLE_SIZE * sizeof(uint16_t));
-               rte_memcpy(sp_rss_params.rss_key, params->rss_params.rss_key,
-                      ECORE_RSS_KEY_SIZE * sizeof(uint32_t));
-       }
-       sp_params.rss_params = &sp_rss_params;
+       sp_params.mtu = params->mtu;
 
        for_each_hwfn(edev, i) {
                struct ecore_hwfn *p_hwfn = &edev->hwfns[i];
@@ -169,9 +143,9 @@ qed_update_vport(struct ecore_dev *edev, struct qed_update_vport_params *params)
 
 static int
 qed_start_rxq(struct ecore_dev *edev,
-             uint8_t rss_id, uint8_t rx_queue_id,
-             uint8_t vport_id, uint16_t sb,
-             uint8_t sb_index, uint16_t bd_max_bytes,
+             uint8_t rss_num,
+             struct ecore_queue_start_common_params *p_params,
+             uint16_t bd_max_bytes,
              dma_addr_t bd_chain_phys_addr,
              dma_addr_t cqe_pbl_addr,
              uint16_t cqe_pbl_size, void OSAL_IOMEM * *pp_prod)
@@ -179,28 +153,28 @@ qed_start_rxq(struct ecore_dev *edev,
        struct ecore_hwfn *p_hwfn;
        int rc, hwfn_index;
 
-       hwfn_index = rss_id % edev->num_hwfns;
+       hwfn_index = rss_num % edev->num_hwfns;
        p_hwfn = &edev->hwfns[hwfn_index];
 
+       p_params->queue_id = p_params->queue_id / edev->num_hwfns;
+       p_params->stats_id = p_params->vport_id;
+
        rc = ecore_sp_eth_rx_queue_start(p_hwfn,
                                         p_hwfn->hw_info.opaque_fid,
-                                        rx_queue_id / edev->num_hwfns,
-                                        vport_id,
-                                        vport_id,
-                                        sb,
-                                        sb_index,
+                                        p_params,
                                         bd_max_bytes,
                                         bd_chain_phys_addr,
                                         cqe_pbl_addr, cqe_pbl_size, pp_prod);
 
        if (rc) {
-               DP_ERR(edev, "Failed to start RXQ#%d\n", rx_queue_id);
+               DP_ERR(edev, "Failed to start RXQ#%d\n", p_params->queue_id);
                return rc;
        }
 
        DP_VERBOSE(edev, ECORE_MSG_SPQ,
-                  "Started RX-Q %d [rss %d] on V-PORT %d and SB %d\n",
-                  rx_queue_id, rss_id, vport_id, sb);
+                  "Started RX-Q %d [rss_num %d] on V-PORT %d and SB %d\n",
+                  p_params->queue_id, rss_num, p_params->vport_id,
+                  p_params->sb);
 
        return 0;
 }
@@ -227,35 +201,36 @@ qed_stop_rxq(struct ecore_dev *edev, struct qed_stop_rxq_params *params)
 
 static int
 qed_start_txq(struct ecore_dev *edev,
-             uint8_t rss_id, uint16_t tx_queue_id,
-             uint8_t vport_id, uint16_t sb,
-             uint8_t sb_index,
+             uint8_t rss_num,
+             struct ecore_queue_start_common_params *p_params,
              dma_addr_t pbl_addr,
              uint16_t pbl_size, void OSAL_IOMEM * *pp_doorbell)
 {
        struct ecore_hwfn *p_hwfn;
        int rc, hwfn_index;
 
-       hwfn_index = rss_id % edev->num_hwfns;
+       hwfn_index = rss_num % edev->num_hwfns;
        p_hwfn = &edev->hwfns[hwfn_index];
 
+       p_params->queue_id = p_params->queue_id / edev->num_hwfns;
+       p_params->qzone_id = p_params->queue_id;
+       p_params->stats_id = p_params->vport_id;
+
        rc = ecore_sp_eth_tx_queue_start(p_hwfn,
                                         p_hwfn->hw_info.opaque_fid,
-                                        tx_queue_id / edev->num_hwfns,
-                                        vport_id,
-                                        vport_id,
-                                        sb,
-                                        sb_index,
+                                        p_params,
+                                        0 /* tc */,
                                         pbl_addr, pbl_size, pp_doorbell);
 
        if (rc) {
-               DP_ERR(edev, "Failed to start TXQ#%d\n", tx_queue_id);
+               DP_ERR(edev, "Failed to start TXQ#%d\n", p_params->queue_id);
                return rc;
        }
 
        DP_VERBOSE(edev, ECORE_MSG_SPQ,
-                  "Started TX-Q %d [rss %d] on V-PORT %d and SB %d\n",
-                  tx_queue_id, rss_id, vport_id, sb);
+                  "Started TX-Q %d [rss_num %d] on V-PORT %d and SB %d\n",
+                  p_params->queue_id, rss_num, p_params->vport_id,
+                  p_params->sb);
 
        return 0;
 }
@@ -294,136 +269,58 @@ static int qed_fastpath_stop(struct ecore_dev *edev)
        return 0;
 }
 
-static void
-qed_get_vport_stats(struct ecore_dev *edev, struct ecore_eth_stats *stats)
-{
-       ecore_get_vport_stats(edev, stats);
-}
-
-static int
-qed_configure_filter_ucast(struct ecore_dev *edev,
-                          struct qed_filter_ucast_params *params)
+static void qed_fastpath_start(struct ecore_dev *edev)
 {
-       struct ecore_filter_ucast ucast;
-
-       if (!params->vlan_valid && !params->mac_valid) {
-               DP_NOTICE(edev, true,
-                         "Tried configuring a unicast filter,"
-                         "but both MAC and VLAN are not set\n");
-               return -EINVAL;
-       }
-
-       memset(&ucast, 0, sizeof(ucast));
-       switch (params->type) {
-       case QED_FILTER_XCAST_TYPE_ADD:
-               ucast.opcode = ECORE_FILTER_ADD;
-               break;
-       case QED_FILTER_XCAST_TYPE_DEL:
-               ucast.opcode = ECORE_FILTER_REMOVE;
-               break;
-       case QED_FILTER_XCAST_TYPE_REPLACE:
-               ucast.opcode = ECORE_FILTER_REPLACE;
-               break;
-       default:
-               DP_NOTICE(edev, true, "Unknown unicast filter type %d\n",
-                         params->type);
-       }
+       struct ecore_hwfn *p_hwfn;
+       int i;
 
-       if (params->vlan_valid && params->mac_valid) {
-               ucast.type = ECORE_FILTER_MAC_VLAN;
-               ether_addr_copy((struct ether_addr *)&params->mac,
-                               (struct ether_addr *)&ucast.mac);
-               ucast.vlan = params->vlan;
-       } else if (params->mac_valid) {
-               ucast.type = ECORE_FILTER_MAC;
-               ether_addr_copy((struct ether_addr *)&params->mac,
-                               (struct ether_addr *)&ucast.mac);
-       } else {
-               ucast.type = ECORE_FILTER_VLAN;
-               ucast.vlan = params->vlan;
+       for_each_hwfn(edev, i) {
+               p_hwfn = &edev->hwfns[i];
+               ecore_hw_start_fastpath(p_hwfn);
        }
-
-       ucast.is_rx_filter = true;
-       ucast.is_tx_filter = true;
-
-       return ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL);
 }
 
-static int
-qed_configure_filter_mcast(struct ecore_dev *edev,
-                          struct qed_filter_mcast_params *params)
+static void
+qed_get_vport_stats(struct ecore_dev *edev, struct ecore_eth_stats *stats)
 {
-       struct ecore_filter_mcast mcast;
-       int i;
-
-       memset(&mcast, 0, sizeof(mcast));
-       switch (params->type) {
-       case QED_FILTER_XCAST_TYPE_ADD:
-               mcast.opcode = ECORE_FILTER_ADD;
-               break;
-       case QED_FILTER_XCAST_TYPE_DEL:
-               mcast.opcode = ECORE_FILTER_REMOVE;
-               break;
-       default:
-               DP_NOTICE(edev, true, "Unknown multicast filter type %d\n",
-                         params->type);
-       }
-
-       mcast.num_mc_addrs = params->num;
-       for (i = 0; i < mcast.num_mc_addrs; i++)
-               ether_addr_copy((struct ether_addr *)&params->mac[i],
-                               (struct ether_addr *)&mcast.mac[i]);
-
-       return ecore_filter_mcast_cmd(edev, &mcast, ECORE_SPQ_MODE_CB, NULL);
+       ecore_get_vport_stats(edev, stats);
 }
 
-int
-qed_configure_filter_rx_mode(struct ecore_dev *edev,
-                            enum qed_filter_rx_mode_type type)
+int qed_configure_filter_rx_mode(struct rte_eth_dev *eth_dev,
+                                enum qed_filter_rx_mode_type type)
 {
-       struct ecore_filter_accept_flags accept_flags;
+       struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
+       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
+       struct ecore_filter_accept_flags flags;
 
-       memset(&accept_flags, 0, sizeof(accept_flags));
+       memset(&flags, 0, sizeof(flags));
 
-       accept_flags.update_rx_mode_config = 1;
-       accept_flags.update_tx_mode_config = 1;
-       accept_flags.rx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED |
-                                       ECORE_ACCEPT_MCAST_MATCHED |
-                                       ECORE_ACCEPT_BCAST;
-       accept_flags.tx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED |
+       flags.update_rx_mode_config = 1;
+       flags.update_tx_mode_config = 1;
+       flags.rx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED |
                                        ECORE_ACCEPT_MCAST_MATCHED |
                                        ECORE_ACCEPT_BCAST;
 
-       if (type == QED_FILTER_RX_MODE_TYPE_PROMISC)
-               accept_flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED;
-       else if (type == QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC)
-               accept_flags.rx_accept_filter |= ECORE_ACCEPT_MCAST_UNMATCHED;
-       else if (type == (QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC |
-                         QED_FILTER_RX_MODE_TYPE_PROMISC))
-               accept_flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED |
-                   ECORE_ACCEPT_MCAST_UNMATCHED;
+       flags.tx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED |
+                                ECORE_ACCEPT_MCAST_MATCHED |
+                                ECORE_ACCEPT_BCAST;
 
-       return ecore_filter_accept_cmd(edev, 0, accept_flags, false, false,
-                                      ECORE_SPQ_MODE_CB, NULL);
-}
-
-static int
-qed_configure_filter(struct ecore_dev *edev, struct qed_filter_params *params)
-{
-       switch (params->type) {
-       case QED_FILTER_TYPE_UCAST:
-               return qed_configure_filter_ucast(edev, &params->filter.ucast);
-       case QED_FILTER_TYPE_MCAST:
-               return qed_configure_filter_mcast(edev, &params->filter.mcast);
-       case QED_FILTER_TYPE_RX_MODE:
-               return qed_configure_filter_rx_mode(edev,
-                                                   params->filter.
-                                                   accept_flags);
-       default:
-               DP_NOTICE(edev, true, "Unknown filter type %d\n",
-                         (int)params->type);
-               return -EINVAL;
+       if (type == QED_FILTER_RX_MODE_TYPE_PROMISC) {
+               flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED;
+               if (IS_VF(edev)) {
+                       flags.tx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED;
+                       DP_INFO(edev, "Enabling Tx unmatched flag for VF\n");
+               }
+       } else if (type == QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC) {
+               flags.rx_accept_filter |= ECORE_ACCEPT_MCAST_UNMATCHED;
+       } else if (type == (QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC |
+                           QED_FILTER_RX_MODE_TYPE_PROMISC)) {
+               flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED |
+                                         ECORE_ACCEPT_MCAST_UNMATCHED;
        }
+
+       return ecore_filter_accept_cmd(edev, 0, flags, false, false,
+                                      ECORE_SPQ_MODE_CB, NULL);
 }
 
 static const struct qed_eth_ops qed_eth_ops_pass = {
@@ -438,20 +335,10 @@ static const struct qed_eth_ops qed_eth_ops_pass = {
        INIT_STRUCT_FIELD(q_tx_stop, &qed_stop_txq),
        INIT_STRUCT_FIELD(eth_cqe_completion, &qed_fp_cqe_completion),
        INIT_STRUCT_FIELD(fastpath_stop, &qed_fastpath_stop),
+       INIT_STRUCT_FIELD(fastpath_start, &qed_fastpath_start),
        INIT_STRUCT_FIELD(get_vport_stats, &qed_get_vport_stats),
-       INIT_STRUCT_FIELD(filter_config, &qed_configure_filter),
 };
 
-uint32_t qed_get_protocol_version(enum qed_protocol protocol)
-{
-       switch (protocol) {
-       case QED_PROTOCOL_ETH:
-               return QED_ETH_INTERFACE_VERSION;
-       default:
-               return 0;
-       }
-}
-
 const struct qed_eth_ops *qed_get_eth_ops(void)
 {
        return &qed_eth_ops_pass;