From: Rob Evers <revers@redhat.com> Date: Tue, 7 Apr 2009 15:24:27 -0400 Subject: [scsi] lpfc: update to version 8.2.0.39 Message-id: 20090407192155.14572.33131.sendpatchset@localhost.localdomain O-Subject: [RHEL5.4 PATCH V3 2/4] Update lpfc to version 8.2.0.39 Bugzilla: 476738 https://bugzilla.redhat.com/show_bug.cgi?id=476738 Update lpfc from 8.2.0.38 to 8.2.0.39 -- diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 9818398..e70c034 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c @@ -1806,18 +1806,40 @@ LPFC_VPORT_ATTR_R(scan_down, 1, 0, 1, # Set loop mode if you want to run as an NL_Port. Value range is [0,0x6]. # Default value is 0. */ -static int -lpfc_topology_set(struct lpfc_hba *phba, int val) +static ssize_t +lpfc_topology_store(struct class_device *cdev, const char *buf, size_t count) { + struct Scsi_Host *shost = class_to_shost(cdev); + struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; + struct lpfc_hba *phba = vport->phba; + int val = 0; + int nolip = 0; + const char *val_buf = buf; int err; uint32_t prev_val; + + if (!strncmp(buf, "nolip ", strlen("nolip "))) { + nolip = 1; + val_buf = &buf[strlen("nolip ")]; + } + + if (!isdigit(val_buf[0])) + return -EINVAL; + if (sscanf(val_buf, "%i", &val) != 1) + return -EINVAL; + if (val >= 0 && val <= 6) { prev_val = phba->cfg_topology; phba->cfg_topology = val; + if (nolip) + return strlen(buf); + err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport)); - if (err) + if (err) { phba->cfg_topology = prev_val; - return err; + return -EINVAL; + } else + return strlen(buf); } lpfc_printf_log(phba, KERN_ERR, LOG_INIT, "%d:0467 lpfc_topology attribute cannot be set to %d, " @@ -1830,7 +1852,6 @@ module_param(lpfc_topology, int, 0); MODULE_PARM_DESC(lpfc_topology, "Select Fibre Channel topology"); lpfc_param_show(topology) lpfc_param_init(topology, 0, 0, 6) -lpfc_param_store(topology) static CLASS_DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR, lpfc_topology_show, lpfc_topology_store); @@ -2170,12 +2191,28 @@ static struct bin_attribute sysfs_drvr_stat_data_attr = { # 8 = 8 Gigabaud # Value range is [0,8]. Default value is 0. */ -static int -lpfc_link_speed_set(struct lpfc_hba *phba, int val) +static ssize_t +lpfc_link_speed_store(struct class_device *cdev, const char *buf, size_t count) { + struct Scsi_Host *shost = class_to_shost(cdev); + struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; + struct lpfc_hba *phba = vport->phba; + int val = 0; + int nolip = 0; + const char *val_buf = buf; int err; uint32_t prev_val; + if (!strncmp(buf, "nolip ", strlen("nolip "))) { + nolip = 1; + val_buf = &buf[strlen("nolip ")]; + } + + if (!isdigit(val_buf[0])) + return -EINVAL; + if (sscanf(val_buf, "%i", &val) != 1) + return -EINVAL; + if (((val == LINK_SPEED_1G) && !(phba->lmt & LMT_1Gb)) || ((val == LINK_SPEED_2G) && !(phba->lmt & LMT_2Gb)) || ((val == LINK_SPEED_4G) && !(phba->lmt & LMT_4Gb)) || @@ -2187,10 +2224,15 @@ lpfc_link_speed_set(struct lpfc_hba *phba, int val) && (LPFC_LINK_SPEED_BITMAP & (1 << val))) { prev_val = phba->cfg_link_speed; phba->cfg_link_speed = val; + if (nolip) + return strlen(buf); + err = lpfc_issue_lip(lpfc_shost_from_vport(phba->pport)); - if (err) + if (err) { phba->cfg_link_speed = prev_val; - return err; + return -EINVAL; + } else + return strlen(buf); } lpfc_printf_log(phba, KERN_ERR, LOG_INIT, @@ -2220,7 +2262,6 @@ lpfc_link_speed_init(struct lpfc_hba *phba, int val) return -EINVAL; } -lpfc_param_store(link_speed) static CLASS_DEVICE_ATTR(lpfc_link_speed, S_IRUGO | S_IWUSR, lpfc_link_speed_show, lpfc_link_speed_store); @@ -2636,6 +2677,8 @@ struct class_device_attribute *lpfc_hba_attrs_no_npiv[] = { &class_device_attr_lpfc_max_scsicmpl_time, &class_device_attr_lpfc_stat_data_ctrl, &class_device_attr_lpfc_hostmem_hgp, + &class_device_attr_lpfc_enable_hba_heartbeat, + &class_device_attr_lpfc_enable_hba_reset, NULL, }; @@ -3337,7 +3380,11 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) == 1)) { wait_4_menlo_maint = 1; phba->wait_4_mlo_maint_flg = 1; - } + } else if (sysfs_mbox->mbox->mb.un.varWords[0] == + SETVAR_MLORST) { + phba->link_flag &= ~LS_LOOPBACK_MODE; + phba->fc_topology = TOPOLOGY_PT_PT; + } case MBX_WRITE_WWN: case MBX_UPDATE_CFG: break; diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 43845a3..d11019d 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -1978,8 +1978,10 @@ lpfc_els_retry(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb, switch ((irsp->un.ulpWord[4] & 0xff)) { case IOERR_LOOP_OPEN_FAILURE: if (cmd == ELS_CMD_FLOGI) { - if (PCI_DEVICE_ID_HORNET == - phba->pcidev->device) { + if ((PCI_DEVICE_ID_HORNET == + phba->pcidev->device) + && phba->link_flag == + LS_LOOPBACK_MODE) { phba->fc_topology = TOPOLOGY_LOOP; phba->pport->fc_myDID = 0; phba->alpa_map[0] = 0; diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 380e154..a4521d2 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -2647,6 +2647,10 @@ lpfc_disc_list_loopmap(struct lpfc_vport *vport) if (phba->fc_topology != TOPOLOGY_LOOP) return; + if ((PCI_DEVICE_ID_HORNET == phba->pcidev->device) + && (phba->link_flag & LS_LOOPBACK_MODE)) + return; + /* Check for loop map present or not */ if (phba->alpa_map[0]) { for (j = 1; j <= phba->alpa_map[0]; j++) { diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index f7b9f07..f8b9a23 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h @@ -18,7 +18,7 @@ * included with this package. * *******************************************************************/ -#define LPFC_DRIVER_VERSION "8.2.0.38" +#define LPFC_DRIVER_VERSION "8.2.0.39" #define LPFC_DRIVER_NAME "lpfc"