Commit 8f6d98d2 authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.1.7 : Short bug fixes

Short bug fixes:
 - Fix iocbq list corruption due to missing list_del's in ct handling
 - Missing unlock in lpfc_sli_next_iotag()
 - Fix initialization of can_queue value
 - Differentiate sysfs mailbox errors with different codes.
Signed-off-by: default avatarJames Smart <James.Smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 1c067a42
...@@ -884,7 +884,7 @@ sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count) ...@@ -884,7 +884,7 @@ sysfs_mbox_write(struct kobject *kobj, char *buf, loff_t off, size_t count)
phba->sysfs_mbox.mbox == NULL ) { phba->sysfs_mbox.mbox == NULL ) {
sysfs_mbox_idle(phba); sysfs_mbox_idle(phba);
spin_unlock_irq(host->host_lock); spin_unlock_irq(host->host_lock);
return -EINVAL; return -EAGAIN;
} }
} }
...@@ -1008,7 +1008,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) ...@@ -1008,7 +1008,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
if (rc != MBX_SUCCESS) { if (rc != MBX_SUCCESS) {
sysfs_mbox_idle(phba); sysfs_mbox_idle(phba);
spin_unlock_irq(host->host_lock); spin_unlock_irq(host->host_lock);
return -ENODEV; return (rc == MBX_TIMEOUT) ? -ETIME : -ENODEV;
} }
phba->sysfs_mbox.state = SMBOX_READING; phba->sysfs_mbox.state = SMBOX_READING;
} }
...@@ -1017,7 +1017,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count) ...@@ -1017,7 +1017,7 @@ sysfs_mbox_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
printk(KERN_WARNING "mbox_read: Bad State\n"); printk(KERN_WARNING "mbox_read: Bad State\n");
sysfs_mbox_idle(phba); sysfs_mbox_idle(phba);
spin_unlock_irq(host->host_lock); spin_unlock_irq(host->host_lock);
return -EINVAL; return -EAGAIN;
} }
memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count); memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count);
......
...@@ -131,6 +131,7 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba, ...@@ -131,6 +131,7 @@ lpfc_ct_unsol_event(struct lpfc_hba * phba,
} }
ct_unsol_event_exit_piocbq: ct_unsol_event_exit_piocbq:
list_del(&head);
if (pmbuf) { if (pmbuf) {
list_for_each_entry_safe(matp, next_matp, &pmbuf->list, list) { list_for_each_entry_safe(matp, next_matp, &pmbuf->list, list) {
lpfc_mbuf_free(phba, matp->virt, matp->phys); lpfc_mbuf_free(phba, matp->virt, matp->phys);
......
...@@ -1616,7 +1616,11 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) ...@@ -1616,7 +1616,11 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
goto out_free_iocbq; goto out_free_iocbq;
} }
/* We can rely on a queue depth attribute only after SLI HBA setup */ /*
* Set initial can_queue value since 0 is no longer supported and
* scsi_add_host will fail. This will be adjusted later based on the
* max xri value determined in hba setup.
*/
host->can_queue = phba->cfg_hba_queue_depth - 10; host->can_queue = phba->cfg_hba_queue_depth - 10;
/* Tell the midlayer we support 16 byte commands */ /* Tell the midlayer we support 16 byte commands */
...@@ -1656,6 +1660,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) ...@@ -1656,6 +1660,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
goto out_free_irq; goto out_free_irq;
} }
/*
* hba setup may have changed the hba_queue_depth so we need to adjust
* the value of can_queue.
*/
host->can_queue = phba->cfg_hba_queue_depth - 10;
lpfc_discovery_wait(phba); lpfc_discovery_wait(phba);
if (phba->cfg_poll & DISABLE_FCP_RING_INT) { if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
......
...@@ -320,7 +320,8 @@ lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq) ...@@ -320,7 +320,8 @@ lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocbq)
kfree(old_arr); kfree(old_arr);
return iotag; return iotag;
} }
} } else
spin_unlock_irq(phba->host->host_lock);
lpfc_printf_log(phba, KERN_ERR,LOG_SLI, lpfc_printf_log(phba, KERN_ERR,LOG_SLI,
"%d:0318 Failed to allocate IOTAG.last IOTAG is %d\n", "%d:0318 Failed to allocate IOTAG.last IOTAG is %d\n",
...@@ -1399,11 +1400,11 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba, ...@@ -1399,11 +1400,11 @@ lpfc_sli_handle_slow_ring_event(struct lpfc_hba * phba,
next_iocb, next_iocb,
&saveq->list, &saveq->list,
list) { list) {
list_del(&rspiocbp->list);
lpfc_sli_release_iocbq(phba, lpfc_sli_release_iocbq(phba,
rspiocbp); rspiocbp);
} }
} }
lpfc_sli_release_iocbq(phba, saveq); lpfc_sli_release_iocbq(phba, saveq);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment