qed: IOV configure and FLR
[deliverable/linux.git] / drivers / net / ethernet / qlogic / qed / qed_l2.c
index 3f35c6ca92528d3cc1951df3d09f8ef19c3dd8ba..5978bb57f8835e0ec12e7b549b86377e7d2d4314 100644 (file)
 #include "qed_mcp.h"
 #include "qed_reg_addr.h"
 #include "qed_sp.h"
-
-enum qed_rss_caps {
-       QED_RSS_IPV4            = 0x1,
-       QED_RSS_IPV6            = 0x2,
-       QED_RSS_IPV4_TCP        = 0x4,
-       QED_RSS_IPV6_TCP        = 0x8,
-       QED_RSS_IPV4_UDP        = 0x10,
-       QED_RSS_IPV6_UDP        = 0x20,
-};
-
-/* Should be the same as ETH_RSS_IND_TABLE_ENTRIES_NUM */
-#define QED_RSS_IND_TABLE_SIZE 128
-#define QED_RSS_KEY_SIZE 10 /* size in 32b chunks */
+#include "qed_sriov.h"
 
 struct qed_rss_params {
        u8      update_rss_config;
@@ -1428,16 +1416,16 @@ static void __qed_get_vport_port_stats(struct qed_hwfn *p_hwfn,
                        sizeof(port_stats));
 
        p_stats->rx_64_byte_packets             += port_stats.pmm.r64;
-       p_stats->rx_127_byte_packets            += port_stats.pmm.r127;
-       p_stats->rx_255_byte_packets            += port_stats.pmm.r255;
-       p_stats->rx_511_byte_packets            += port_stats.pmm.r511;
-       p_stats->rx_1023_byte_packets           += port_stats.pmm.r1023;
-       p_stats->rx_1518_byte_packets           += port_stats.pmm.r1518;
-       p_stats->rx_1522_byte_packets           += port_stats.pmm.r1522;
-       p_stats->rx_2047_byte_packets           += port_stats.pmm.r2047;
-       p_stats->rx_4095_byte_packets           += port_stats.pmm.r4095;
-       p_stats->rx_9216_byte_packets           += port_stats.pmm.r9216;
-       p_stats->rx_16383_byte_packets          += port_stats.pmm.r16383;
+       p_stats->rx_65_to_127_byte_packets      += port_stats.pmm.r127;
+       p_stats->rx_128_to_255_byte_packets     += port_stats.pmm.r255;
+       p_stats->rx_256_to_511_byte_packets     += port_stats.pmm.r511;
+       p_stats->rx_512_to_1023_byte_packets    += port_stats.pmm.r1023;
+       p_stats->rx_1024_to_1518_byte_packets   += port_stats.pmm.r1518;
+       p_stats->rx_1519_to_1522_byte_packets   += port_stats.pmm.r1522;
+       p_stats->rx_1519_to_2047_byte_packets   += port_stats.pmm.r2047;
+       p_stats->rx_2048_to_4095_byte_packets   += port_stats.pmm.r4095;
+       p_stats->rx_4096_to_9216_byte_packets   += port_stats.pmm.r9216;
+       p_stats->rx_9217_to_16383_byte_packets  += port_stats.pmm.r16383;
        p_stats->rx_crc_errors                  += port_stats.pmm.rfcs;
        p_stats->rx_mac_crtl_frames             += port_stats.pmm.rxcf;
        p_stats->rx_pause_frames                += port_stats.pmm.rxpf;
@@ -1593,32 +1581,53 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
 
        info->num_tc = 1;
 
-       if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
-               for_each_hwfn(cdev, i)
-                       info->num_queues += FEAT_NUM(&cdev->hwfns[i],
-                                                    QED_PF_L2_QUE);
-               if (cdev->int_params.fp_msix_cnt)
-                       info->num_queues = min_t(u8, info->num_queues,
-                                                cdev->int_params.fp_msix_cnt);
+       if (IS_PF(cdev)) {
+               if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
+                       for_each_hwfn(cdev, i)
+                           info->num_queues +=
+                           FEAT_NUM(&cdev->hwfns[i], QED_PF_L2_QUE);
+                       if (cdev->int_params.fp_msix_cnt)
+                               info->num_queues =
+                                   min_t(u8, info->num_queues,
+                                         cdev->int_params.fp_msix_cnt);
+               } else {
+                       info->num_queues = cdev->num_hwfns;
+               }
+
+               info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN);
+               ether_addr_copy(info->port_mac,
+                               cdev->hwfns[0].hw_info.hw_mac_addr);
        } else {
-               info->num_queues = cdev->num_hwfns;
-       }
+               qed_vf_get_num_rxqs(QED_LEADING_HWFN(cdev), &info->num_queues);
+               if (cdev->num_hwfns > 1) {
+                       u8 queues = 0;
 
-       info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN);
-       ether_addr_copy(info->port_mac,
-                       cdev->hwfns[0].hw_info.hw_mac_addr);
+                       qed_vf_get_num_rxqs(&cdev->hwfns[1], &queues);
+                       info->num_queues += queues;
+               }
+
+               qed_vf_get_num_vlan_filters(&cdev->hwfns[0],
+                                           &info->num_vlan_filters);
+               qed_vf_get_port_mac(&cdev->hwfns[0], info->port_mac);
+       }
 
        qed_fill_dev_info(cdev, &info->common);
 
+       if (IS_VF(cdev))
+               memset(info->common.hw_mac, 0, ETH_ALEN);
+
        return 0;
 }
 
 static void qed_register_eth_ops(struct qed_dev *cdev,
-                                struct qed_eth_cb_ops *ops,
-                                void *cookie)
+                                struct qed_eth_cb_ops *ops, void *cookie)
 {
-       cdev->protocol_ops.eth  = ops;
-       cdev->ops_cookie        = cookie;
+       cdev->protocol_ops.eth = ops;
+       cdev->ops_cookie = cookie;
+
+       /* For VF, we start bulletin reading */
+       if (IS_VF(cdev))
+               qed_vf_start_iov_wq(cdev);
 }
 
 static int qed_start_vport(struct qed_dev *cdev,
@@ -1744,9 +1753,7 @@ static int qed_update_vport(struct qed_dev *cdev,
                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 = QED_RSS_IPV4 |
-                                        QED_RSS_IPV6 |
-                                        QED_RSS_IPV4_TCP | QED_RSS_IPV6_TCP;
+               sp_rss_params.rss_caps = params->rss_params.rss_caps;
                sp_rss_params.rss_table_size_log = 7; /* 2^7 = 128 */
                memcpy(sp_rss_params.rss_ind_table,
                       params->rss_params.rss_ind_table,
@@ -1899,6 +1906,39 @@ static int qed_stop_txq(struct qed_dev *cdev,
        return 0;
 }
 
+static int qed_tunn_configure(struct qed_dev *cdev,
+                             struct qed_tunn_params *tunn_params)
+{
+       struct qed_tunn_update_params tunn_info;
+       int i, rc;
+
+       if (IS_VF(cdev))
+               return 0;
+
+       memset(&tunn_info, 0, sizeof(tunn_info));
+       if (tunn_params->update_vxlan_port == 1) {
+               tunn_info.update_vxlan_udp_port = 1;
+               tunn_info.vxlan_udp_port = tunn_params->vxlan_port;
+       }
+
+       if (tunn_params->update_geneve_port == 1) {
+               tunn_info.update_geneve_udp_port = 1;
+               tunn_info.geneve_udp_port = tunn_params->geneve_port;
+       }
+
+       for_each_hwfn(cdev, i) {
+               struct qed_hwfn *hwfn = &cdev->hwfns[i];
+
+               rc = qed_sp_pf_update_tunn_cfg(hwfn, &tunn_info,
+                                              QED_SPQ_MODE_EBLOCK, NULL);
+
+               if (rc)
+                       return rc;
+       }
+
+       return 0;
+}
+
 static int qed_configure_filter_rx_mode(struct qed_dev *cdev,
                                        enum qed_filter_rx_mode_type type)
 {
@@ -2026,8 +2066,15 @@ static int qed_fp_cqe_completion(struct qed_dev *dev,
                                      cqe);
 }
 
+#ifdef CONFIG_QED_SRIOV
+extern const struct qed_iov_hv_ops qed_iov_ops_pass;
+#endif
+
 static const struct qed_eth_ops qed_eth_ops_pass = {
        .common = &qed_common_ops_pass,
+#ifdef CONFIG_QED_SRIOV
+       .iov = &qed_iov_ops_pass,
+#endif
        .fill_dev_info = &qed_fill_eth_dev_info,
        .register_ops = &qed_register_eth_ops,
        .vport_start = &qed_start_vport,
@@ -2041,16 +2088,11 @@ static const struct qed_eth_ops qed_eth_ops_pass = {
        .fastpath_stop = &qed_fastpath_stop,
        .eth_cqe_completion = &qed_fp_cqe_completion,
        .get_vport_stats = &qed_get_vport_stats,
+       .tunn_config = &qed_tunn_configure,
 };
 
-const struct qed_eth_ops *qed_get_eth_ops(u32 version)
+const struct qed_eth_ops *qed_get_eth_ops(void)
 {
-       if (version != QED_ETH_INTERFACE_VERSION) {
-               pr_notice("Cannot supply ethtool operations [%08x != %08x]\n",
-                         version, QED_ETH_INTERFACE_VERSION);
-               return NULL;
-       }
-
        return &qed_eth_ops_pass;
 }
 EXPORT_SYMBOL(qed_get_eth_ops);
This page took 0.02717 seconds and 5 git commands to generate.