]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi/lpfc: Fixed new requirement compatibility with Resource and Capacity Descriptors
authorVaios Papadimitriou <vaios.papadimitriou@emulex.com>
Tue, 28 Aug 2012 22:58:52 +0000 (15:58 -0700)
committerJerry Snitselaar <jerry.snitselaar@oracle.com>
Wed, 5 Sep 2012 19:25:48 +0000 (12:25 -0700)
commit id: http://marc.info/?l=linux-scsi&m=134496904429993

Signed-off-by: Jerry Snitselaar <jerry.snitselaar@oracle.com>
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_init.c

index 89a47d6d095f131d3b9c86bcfd53eb52c511c4aa..0f717c1e0919bef4bae62a3ca5bfa369488f8dfb 100644 (file)
@@ -2567,7 +2567,7 @@ struct lpfc_mbx_get_sli4_parameters {
 };
 
 struct lpfc_rscr_desc_generic {
-#define LPFC_RSRC_DESC_WSIZE                   18
+#define LPFC_RSRC_DESC_WSIZE                   22
        uint32_t desc[LPFC_RSRC_DESC_WSIZE];
 };
 
@@ -2577,6 +2577,9 @@ struct lpfc_rsrc_desc_pcie {
 #define lpfc_rsrc_desc_pcie_type_MASK          0x000000ff
 #define lpfc_rsrc_desc_pcie_type_WORD          word0
 #define LPFC_RSRC_DESC_TYPE_PCIE               0x40
+#define lpfc_rsrc_desc_pcie_length_SHIFT       8
+#define lpfc_rsrc_desc_pcie_length_MASK                0x000000ff
+#define lpfc_rsrc_desc_pcie_length_WORD                word0
        uint32_t word1;
 #define lpfc_rsrc_desc_pcie_pfnum_SHIFT                0
 #define lpfc_rsrc_desc_pcie_pfnum_MASK         0x000000ff
@@ -2604,6 +2607,12 @@ struct lpfc_rsrc_desc_fcfcoe {
 #define lpfc_rsrc_desc_fcfcoe_type_MASK                0x000000ff
 #define lpfc_rsrc_desc_fcfcoe_type_WORD                word0
 #define LPFC_RSRC_DESC_TYPE_FCFCOE             0x43
+#define lpfc_rsrc_desc_fcfcoe_length_SHIFT     8
+#define lpfc_rsrc_desc_fcfcoe_length_MASK      0x000000ff
+#define lpfc_rsrc_desc_fcfcoe_length_WORD      word0
+#define LPFC_RSRC_DESC_TYPE_FCFCOE_V0_RSVD     0
+#define LPFC_RSRC_DESC_TYPE_FCFCOE_V0_LENGTH   72
+#define LPFC_RSRC_DESC_TYPE_FCFCOE_V1_LENGTH   88
        uint32_t word1;
 #define lpfc_rsrc_desc_fcfcoe_vfnum_SHIFT      0
 #define lpfc_rsrc_desc_fcfcoe_vfnum_MASK       0x000000ff
@@ -2662,6 +2671,12 @@ struct lpfc_rsrc_desc_fcfcoe {
 #define lpfc_rsrc_desc_fcfcoe_eq_cnt_SHIFT     16
 #define lpfc_rsrc_desc_fcfcoe_eq_cnt_MASK      0x0000ffff
 #define lpfc_rsrc_desc_fcfcoe_eq_cnt_WORD      word13
+/* extended FC/FCoE Resource Descriptor when length = 88 bytes */
+       uint32_t bw_min;
+       uint32_t bw_max;
+       uint32_t iops_min;
+       uint32_t iops_max;
+       uint32_t reserved[4];
 };
 
 struct lpfc_func_cfg {
index a9f75e7d816f8d016c2afed36e227e6f1caf589a..bc32ff64b5e79f3784d2d892cada27553b187a77 100644 (file)
@@ -6268,8 +6268,9 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
        uint32_t shdr_status, shdr_add_status;
        struct lpfc_mbx_get_func_cfg *get_func_cfg;
        struct lpfc_rsrc_desc_fcfcoe *desc;
+       char *pdesc_0;
        uint32_t desc_count;
-       int length, i, rc = 0;
+       int length, i, rc = 0, rc2;
 
        pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
        if (!pmb) {
@@ -6381,18 +6382,17 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
                         LPFC_MBOX_OPCODE_GET_FUNCTION_CONFIG,
                         length, LPFC_SLI4_MBX_EMBED);
 
-       rc = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
+       rc2 = lpfc_sli_issue_mbox(phba, pmb, MBX_POLL);
        shdr = (union lpfc_sli4_cfg_shdr *)
                                &pmb->u.mqe.un.sli4_config.header.cfg_shdr;
        shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);
        shdr_add_status = bf_get(lpfc_mbox_hdr_add_status, &shdr->response);
-       if (rc || shdr_status || shdr_add_status) {
+       if (rc2 || shdr_status || shdr_add_status) {
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
                                "3026 Mailbox failed , mbxCmd x%x "
                                "GET_FUNCTION_CONFIG, mbxStatus x%x\n",
                                bf_get(lpfc_mqe_command, &pmb->u.mqe),
                                bf_get(lpfc_mqe_status, &pmb->u.mqe));
-               rc = -EIO;
                goto read_cfg_out;
        }
 
@@ -6400,11 +6400,18 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
        get_func_cfg = &pmb->u.mqe.un.get_func_cfg;
        desc_count = get_func_cfg->func_cfg.rsrc_desc_count;
 
+       pdesc_0 = (char *)&get_func_cfg->func_cfg.desc[0];
+       desc = (struct lpfc_rsrc_desc_fcfcoe *)pdesc_0;
+       length = bf_get(lpfc_rsrc_desc_fcfcoe_length, desc);
+       if (length == LPFC_RSRC_DESC_TYPE_FCFCOE_V0_RSVD)
+               length = LPFC_RSRC_DESC_TYPE_FCFCOE_V0_LENGTH;
+       else if (length != LPFC_RSRC_DESC_TYPE_FCFCOE_V1_LENGTH)
+               goto read_cfg_out;
+
        for (i = 0; i < LPFC_RSRC_DESC_MAX_NUM; i++) {
-               desc = (struct lpfc_rsrc_desc_fcfcoe *)
-                       &get_func_cfg->func_cfg.desc[i];
+               desc = (struct lpfc_rsrc_desc_fcfcoe *)(pdesc_0 + length * i);
                if (LPFC_RSRC_DESC_TYPE_FCFCOE ==
-                   bf_get(lpfc_rsrc_desc_pcie_type, desc)) {
+                   bf_get(lpfc_rsrc_desc_fcfcoe_type, desc)) {
                        phba->sli4_hba.iov.pf_number =
                                bf_get(lpfc_rsrc_desc_fcfcoe_pfnum, desc);
                        phba->sli4_hba.iov.vf_number =
@@ -6418,13 +6425,11 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
                                "3027 GET_FUNCTION_CONFIG: pf_number:%d, "
                                "vf_number:%d\n", phba->sli4_hba.iov.pf_number,
                                phba->sli4_hba.iov.vf_number);
-       else {
+       else
                lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
                                "3028 GET_FUNCTION_CONFIG: failed to find "
                                "Resrouce Descriptor:x%x\n",
                                LPFC_RSRC_DESC_TYPE_FCFCOE);
-               rc = -EIO;
-       }
 
 read_cfg_out:
        mempool_free(pmb, phba->mbox_mem_pool);