net/qede/base: read card personality via MFW commands
authorRasesh Mody <rasesh.mody@cavium.com>
Wed, 29 Mar 2017 20:36:16 +0000 (13:36 -0700)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 4 Apr 2017 17:02:50 +0000 (19:02 +0200)
Add support to read NIC personality via management FW for non-L2
protocols.

Signed-off-by: Rasesh Mody <rasesh.mody@cavium.com>
drivers/net/qede/base/ecore.h
drivers/net/qede/base/ecore_dev.c
drivers/net/qede/base/ecore_mcp.c
drivers/net/qede/base/ecore_sriov.c

index 25c96f8..842a3b5 100644 (file)
@@ -243,7 +243,8 @@ enum ecore_pci_personality {
        ECORE_PCI_FCOE,
        ECORE_PCI_ISCSI,
        ECORE_PCI_ETH_ROCE,
-       ECORE_PCI_IWARP,
+       ECORE_PCI_ETH_IWARP,
+       ECORE_PCI_ETH_RDMA,
        ECORE_PCI_DEFAULT /* default in shmem */
 };
 
@@ -328,6 +329,19 @@ enum ecore_hw_err_type {
 struct ecore_hw_info {
        /* PCI personality */
        enum ecore_pci_personality personality;
+#define ECORE_IS_RDMA_PERSONALITY(dev)                     \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE ||  \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_ROCE_PERSONALITY(dev)                    \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_IWARP_PERSONALITY(dev)                            \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_L2_PERSONALITY(dev)                 \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH || \
+        ECORE_IS_RDMA_PERSONALITY(dev))
 
        /* Resource Allocation scheme results */
        u32 resc_start[ECORE_MAX_RESC];
index 7494f93..1b033b7 100644 (file)
@@ -219,9 +219,7 @@ static enum _ecore_status_t ecore_init_qm_info(struct ecore_hwfn *p_hwfn,
         * don't have a good recycle flow. Non ethernet PFs require only a
         * single physical queue.
         */
-       if (p_hwfn->hw_info.personality == ECORE_PCI_ETH_ROCE ||
-           p_hwfn->hw_info.personality == ECORE_PCI_IWARP ||
-           p_hwfn->hw_info.personality == ECORE_PCI_ETH)
+       if (ECORE_IS_L2_PERSONALITY(p_hwfn))
                protocol_pqs = p_hwfn->hw_info.num_hw_tc;
        else
                protocol_pqs = 1;
@@ -229,7 +227,7 @@ static enum _ecore_status_t ecore_init_qm_info(struct ecore_hwfn *p_hwfn,
        num_pqs = protocol_pqs + num_vfs + 1;   /* The '1' is for pure-LB */
        num_vports = (u8)RESC_NUM(p_hwfn, ECORE_VPORT);
 
-       if (p_hwfn->hw_info.personality == ECORE_PCI_ETH_ROCE) {
+       if (ECORE_IS_ROCE_PERSONALITY(p_hwfn)) {
                num_pqs++;      /* for RoCE queue */
                init_rdma_offload_pq = true;
                if (p_hwfn->pf_params.rdma_pf_params.enable_dcqcn) {
@@ -259,7 +257,7 @@ static enum _ecore_status_t ecore_init_qm_info(struct ecore_hwfn *p_hwfn,
                qm_info->num_pf_rls = (u8)num_pf_rls;
        }
 
-       if (p_hwfn->hw_info.personality == ECORE_PCI_IWARP) {
+       if (ECORE_IS_IWARP_PERSONALITY(p_hwfn)) {
                num_pqs += 3;   /* for iwarp queue / pure-ack / ooo */
                init_rdma_offload_pq = true;
                init_pure_ack_pq = true;
@@ -335,9 +333,7 @@ static enum _ecore_status_t ecore_init_qm_info(struct ecore_hwfn *p_hwfn,
                struct init_qm_pq_params *params =
                    &qm_info->qm_pq_params[curr_queue++];
 
-               if (p_hwfn->hw_info.personality == ECORE_PCI_ETH_ROCE ||
-                   p_hwfn->hw_info.personality == ECORE_PCI_IWARP ||
-                   p_hwfn->hw_info.personality == ECORE_PCI_ETH) {
+               if (ECORE_IS_L2_PERSONALITY(p_hwfn)) {
                        params->vport_id = vport_id;
                        params->tc_id = i;
                        /* Note: this assumes that if we had a configuration
@@ -612,8 +608,7 @@ enum _ecore_status_t ecore_resc_alloc(struct ecore_dev *p_dev)
 
                /* EQ */
                n_eqes = ecore_chain_get_capacity(&p_hwfn->p_spq->chain);
-               if ((p_hwfn->hw_info.personality == ECORE_PCI_ETH_ROCE) ||
-                   (p_hwfn->hw_info.personality == ECORE_PCI_IWARP)) {
+               if (ECORE_IS_RDMA_PERSONALITY(p_hwfn)) {
                        /* Calculate the EQ size
                         * ---------------------
                         * Each ICID may generate up to one event at a time i.e.
@@ -636,7 +631,7 @@ enum _ecore_status_t ecore_resc_alloc(struct ecore_dev *p_dev)
                         *          smaller than RoCE's so we avoid exact
                         *          calculation.
                         */
-                       if (p_hwfn->hw_info.personality == ECORE_PCI_ETH_ROCE) {
+                       if (ECORE_IS_ROCE_PERSONALITY(p_hwfn)) {
                                num_cons =
                                    ecore_cxt_get_proto_cid_count(
                                                p_hwfn,
index 0338576..9f897b5 100644 (file)
@@ -1373,16 +1373,47 @@ enum _ecore_status_t ecore_mcp_get_media_type(struct ecore_dev *p_dev,
        return ECORE_SUCCESS;
 }
 
+/* @DPDK */
+/* Old MFW has a global configuration for all PFs regarding RDMA support */
+static void
+ecore_mcp_get_shmem_proto_legacy(struct ecore_hwfn *p_hwfn,
+                                enum ecore_pci_personality *p_proto)
+{
+       *p_proto = ECORE_PCI_ETH;
+
+       DP_VERBOSE(p_hwfn, ECORE_MSG_IFUP,
+                  "According to Legacy capabilities, L2 personality is %08x\n",
+                  (u32)*p_proto);
+}
+
+/* @DPDK */
+static enum _ecore_status_t
+ecore_mcp_get_shmem_proto_mfw(struct ecore_hwfn *p_hwfn,
+                             struct ecore_ptt *p_ptt,
+                             enum ecore_pci_personality *p_proto)
+{
+       u32 resp = 0, param = 0;
+       enum _ecore_status_t rc;
+
+       DP_VERBOSE(p_hwfn, ECORE_MSG_IFUP,
+                  "According to capabilities, L2 personality is %08x [resp %08x param %08x]\n",
+                  (u32)*p_proto, resp, param);
+       return ECORE_SUCCESS;
+}
+
 static enum _ecore_status_t
 ecore_mcp_get_shmem_proto(struct ecore_hwfn *p_hwfn,
                          struct public_func *p_info,
+                         struct ecore_ptt *p_ptt,
                          enum ecore_pci_personality *p_proto)
 {
        enum _ecore_status_t rc = ECORE_SUCCESS;
 
        switch (p_info->config & FUNC_MF_CFG_PROTOCOL_MASK) {
        case FUNC_MF_CFG_PROTOCOL_ETHERNET:
-               *p_proto = ECORE_PCI_ETH;
+               if (ecore_mcp_get_shmem_proto_mfw(p_hwfn, p_ptt, p_proto) !=
+                   ECORE_SUCCESS)
+                       ecore_mcp_get_shmem_proto_legacy(p_hwfn, p_proto);
                break;
        default:
                rc = ECORE_INVAL;
@@ -1403,7 +1434,8 @@ enum _ecore_status_t ecore_mcp_fill_shmem_func_info(struct ecore_hwfn *p_hwfn,
        info->pause_on_host = (shmem_info.config &
                               FUNC_MF_CFG_PAUSE_ON_HOST_RING) ? 1 : 0;
 
-       if (ecore_mcp_get_shmem_proto(p_hwfn, &shmem_info, &info->protocol)) {
+       if (ecore_mcp_get_shmem_proto(p_hwfn, &shmem_info, p_ptt,
+                                     &info->protocol)) {
                DP_ERR(p_hwfn, "Unknown personality %08x\n",
                       (u32)(shmem_info.config & FUNC_MF_CFG_PROTOCOL_MASK));
                return ECORE_INVAL;
@@ -1559,8 +1591,9 @@ int ecore_mcp_get_personality_cnt(struct ecore_hwfn *p_hwfn,
                if (shmem_info.config & FUNC_MF_CFG_FUNC_HIDE)
                        continue;
 
-               if (ecore_mcp_get_shmem_proto(p_hwfn, &shmem_info,
-                                             &protocol) != ECORE_SUCCESS)
+               if (ecore_mcp_get_shmem_proto(p_hwfn, &shmem_info, p_ptt,
+                                             &protocol) !=
+                   ECORE_SUCCESS)
                        continue;
 
                if ((1 << ((u32)protocol)) & personalities)
index 6e86966..578899c 100644 (file)
@@ -86,6 +86,7 @@ static enum _ecore_status_t ecore_sp_vf_start(struct ecore_hwfn *p_hwfn,
                p_ramrod->personality = PERSONALITY_ETH;
                break;
        case ECORE_PCI_ETH_ROCE:
+       case ECORE_PCI_ETH_IWARP:
                p_ramrod->personality = PERSONALITY_RDMA_AND_ETH;
                break;
        default: