Commit e5d081f4 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
 "This is three bug fixes: An fnic warning caused by sleeping under a
  lock, a major regression with our updated WRITE SAME/UNMAP logic which
  caused tons of USB devices (and one RAID card) to cease to function
  and a megaraid_sas firmware initialisation problem which causes kdump
  failures"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  [SCSI] Don't attempt to send extended INQUIRY command if skip_vpd_pages is set
  [SCSI] fnic: BUG: sleeping function called from invalid context during probe
  [SCSI] megaraid_sas: megaraid_sas driver init fails in kdump kernel
parents 77f63b4d 7562523e
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#define DRV_NAME "fnic" #define DRV_NAME "fnic"
#define DRV_DESCRIPTION "Cisco FCoE HBA Driver" #define DRV_DESCRIPTION "Cisco FCoE HBA Driver"
#define DRV_VERSION "1.5.0.22" #define DRV_VERSION "1.5.0.23"
#define PFX DRV_NAME ": " #define PFX DRV_NAME ": "
#define DFX DRV_NAME "%d: " #define DFX DRV_NAME "%d: "
......
...@@ -642,19 +642,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -642,19 +642,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame); INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame);
INIT_WORK(&fnic->event_work, fnic_handle_event); INIT_WORK(&fnic->event_work, fnic_handle_event);
skb_queue_head_init(&fnic->fip_frame_queue); skb_queue_head_init(&fnic->fip_frame_queue);
spin_lock_irqsave(&fnic_list_lock, flags);
if (!fnic_fip_queue) {
fnic_fip_queue =
create_singlethread_workqueue("fnic_fip_q");
if (!fnic_fip_queue) {
spin_unlock_irqrestore(&fnic_list_lock, flags);
printk(KERN_ERR PFX "fnic FIP work queue "
"create failed\n");
err = -ENOMEM;
goto err_out_free_max_pool;
}
}
spin_unlock_irqrestore(&fnic_list_lock, flags);
INIT_LIST_HEAD(&fnic->evlist); INIT_LIST_HEAD(&fnic->evlist);
INIT_LIST_HEAD(&fnic->vlans); INIT_LIST_HEAD(&fnic->vlans);
} else { } else {
...@@ -960,6 +947,13 @@ static int __init fnic_init_module(void) ...@@ -960,6 +947,13 @@ static int __init fnic_init_module(void)
spin_lock_init(&fnic_list_lock); spin_lock_init(&fnic_list_lock);
INIT_LIST_HEAD(&fnic_list); INIT_LIST_HEAD(&fnic_list);
fnic_fip_queue = create_singlethread_workqueue("fnic_fip_q");
if (!fnic_fip_queue) {
printk(KERN_ERR PFX "fnic FIP work queue create failed\n");
err = -ENOMEM;
goto err_create_fip_workq;
}
fnic_fc_transport = fc_attach_transport(&fnic_fc_functions); fnic_fc_transport = fc_attach_transport(&fnic_fc_functions);
if (!fnic_fc_transport) { if (!fnic_fc_transport) {
printk(KERN_ERR PFX "fc_attach_transport error\n"); printk(KERN_ERR PFX "fc_attach_transport error\n");
...@@ -978,6 +972,8 @@ static int __init fnic_init_module(void) ...@@ -978,6 +972,8 @@ static int __init fnic_init_module(void)
err_pci_register: err_pci_register:
fc_release_transport(fnic_fc_transport); fc_release_transport(fnic_fc_transport);
err_fc_transport: err_fc_transport:
destroy_workqueue(fnic_fip_queue);
err_create_fip_workq:
destroy_workqueue(fnic_event_queue); destroy_workqueue(fnic_event_queue);
err_create_fnic_workq: err_create_fnic_workq:
kmem_cache_destroy(fnic_io_req_cache); kmem_cache_destroy(fnic_io_req_cache);
......
...@@ -3547,11 +3547,21 @@ static int megasas_init_fw(struct megasas_instance *instance) ...@@ -3547,11 +3547,21 @@ static int megasas_init_fw(struct megasas_instance *instance)
break; break;
} }
/* if (megasas_transition_to_ready(instance, 0)) {
* We expect the FW state to be READY atomic_set(&instance->fw_reset_no_pci_access, 1);
*/ instance->instancet->adp_reset
if (megasas_transition_to_ready(instance, 0)) (instance, instance->reg_set);
goto fail_ready_state; atomic_set(&instance->fw_reset_no_pci_access, 0);
dev_info(&instance->pdev->dev,
"megasas: FW restarted successfully from %s!\n",
__func__);
/*waitting for about 30 second before retry*/
ssleep(30);
if (megasas_transition_to_ready(instance, 0))
goto fail_ready_state;
}
/* /*
* MSI-X host index 0 is common for all adapter. * MSI-X host index 0 is common for all adapter.
......
...@@ -1031,6 +1031,9 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf, ...@@ -1031,6 +1031,9 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf,
{ {
int i, result; int i, result;
if (sdev->skip_vpd_pages)
goto fail;
/* Ask for all the pages supported by this device */ /* Ask for all the pages supported by this device */
result = scsi_vpd_inquiry(sdev, buf, 0, buf_len); result = scsi_vpd_inquiry(sdev, buf, 0, buf_len);
if (result) if (result)
......
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