]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/scsi/lpfc/lpfc_attr.c
scsi: lpfc: Correct topology type reporting on G7 adapters
[mirror_ubuntu-bionic-kernel.git] / drivers / scsi / lpfc / lpfc_attr.c
index fadbd401d4aedcc3e886b2392387fc7028fe1e72..d2f088492b42b02bbbcc1d920850f6eb2f289205 100644 (file)
@@ -1222,7 +1222,7 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode)
                return -EACCES;
 
        if ((phba->sli_rev < LPFC_SLI_REV4) ||
-           (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
+           (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) <
             LPFC_SLI_INTF_IF_TYPE_2))
                return -EPERM;
 
@@ -1522,6 +1522,9 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
                max_vpi = (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) > 0) ?
                        (bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - 1) : 0;
 
+               /* Limit the max we support */
+               if (max_vpi > LPFC_MAX_VPI)
+                       max_vpi = LPFC_MAX_VPI;
                if (mvpi)
                        *mvpi = max_vpi;
                if (avpi)
@@ -1537,8 +1540,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba,
                        *axri = pmb->un.varRdConfig.avail_xri;
                if (mvpi)
                        *mvpi = pmb->un.varRdConfig.max_vpi;
-               if (avpi)
-                       *avpi = pmb->un.varRdConfig.avail_vpi;
+               if (avpi) {
+                       /* avail_vpi is only valid if link is up and ready */
+                       if (phba->link_state == LPFC_HBA_READY)
+                               *avpi = pmb->un.varRdConfig.avail_vpi;
+                       else
+                               *avpi = pmb->un.varRdConfig.max_vpi;
+               }
        }
 
        mempool_free(pmboxq, phba->mbox_mem_pool);
@@ -3672,8 +3680,9 @@ lpfc_topology_store(struct device *dev, struct device_attribute *attr,
                                val);
                        return -EINVAL;
                }
-               if (phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC &&
-                       val == 4) {
+               if ((phba->pcidev->device == PCI_DEVICE_ID_LANCER_G6_FC ||
+                    phba->pcidev->device == PCI_DEVICE_ID_LANCER_G7_FC) &&
+                   val == 4) {
                        lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
                                "3114 Loop mode not supported\n");
                        return -EINVAL;
@@ -4095,7 +4104,7 @@ lpfc_link_speed_store(struct device *dev, struct device_attribute *attr,
        uint32_t prev_val, if_type;
 
        if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf);
-       if (if_type == LPFC_SLI_INTF_IF_TYPE_2 &&
+       if (if_type >= LPFC_SLI_INTF_IF_TYPE_2 &&
            phba->hba_flag & HBA_FORCED_LINK_SPEED)
                return -EPERM;