diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-08-11 19:32:26 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-08-11 19:32:26 -0400 |
| commit | e5d081f4686f9c6be8ab3d34dfcdb0afdbbdeefd (patch) | |
| tree | 282eb834bedf508f94732ecdbe3e32fe7942d84e | |
| parent | 77f63b4da4b69f65c17c45e797ddb3013b889df9 (diff) | |
| parent | 7562523e84ddc742fe1f9db8bd76b01acca89f6b (diff) | |
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
| -rw-r--r-- | drivers/scsi/fnic/fnic.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/fnic/fnic_main.c | 22 | ||||
| -rw-r--r-- | drivers/scsi/megaraid/megaraid_sas_base.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/scsi.c | 3 |
4 files changed, 28 insertions, 19 deletions
diff --git a/drivers/scsi/fnic/fnic.h b/drivers/scsi/fnic/fnic.h index b6d1f92ed33c..c18c68150e9f 100644 --- a/drivers/scsi/fnic/fnic.h +++ b/drivers/scsi/fnic/fnic.h | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | #define DRV_NAME "fnic" | 39 | #define DRV_NAME "fnic" |
| 40 | #define DRV_DESCRIPTION "Cisco FCoE HBA Driver" | 40 | #define DRV_DESCRIPTION "Cisco FCoE HBA Driver" |
| 41 | #define DRV_VERSION "1.5.0.22" | 41 | #define DRV_VERSION "1.5.0.23" |
| 42 | #define PFX DRV_NAME ": " | 42 | #define PFX DRV_NAME ": " |
| 43 | #define DFX DRV_NAME "%d: " | 43 | #define DFX DRV_NAME "%d: " |
| 44 | 44 | ||
diff --git a/drivers/scsi/fnic/fnic_main.c b/drivers/scsi/fnic/fnic_main.c index 5f09d1814d26..42e15ee6e1bb 100644 --- a/drivers/scsi/fnic/fnic_main.c +++ b/drivers/scsi/fnic/fnic_main.c | |||
| @@ -642,19 +642,6 @@ static int fnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 642 | INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame); | 642 | INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame); |
| 643 | INIT_WORK(&fnic->event_work, fnic_handle_event); | 643 | INIT_WORK(&fnic->event_work, fnic_handle_event); |
| 644 | skb_queue_head_init(&fnic->fip_frame_queue); | 644 | skb_queue_head_init(&fnic->fip_frame_queue); |
| 645 | spin_lock_irqsave(&fnic_list_lock, flags); | ||
| 646 | if (!fnic_fip_queue) { | ||
| 647 | fnic_fip_queue = | ||
| 648 | create_singlethread_workqueue("fnic_fip_q"); | ||
| 649 | if (!fnic_fip_queue) { | ||
| 650 | spin_unlock_irqrestore(&fnic_list_lock, flags); | ||
| 651 | printk(KERN_ERR PFX "fnic FIP work queue " | ||
| 652 | "create failed\n"); | ||
| 653 | err = -ENOMEM; | ||
| 654 | goto err_out_free_max_pool; | ||
| 655 | } | ||
| 656 | } | ||
| 657 | spin_unlock_irqrestore(&fnic_list_lock, flags); | ||
| 658 | INIT_LIST_HEAD(&fnic->evlist); | 645 | INIT_LIST_HEAD(&fnic->evlist); |
| 659 | INIT_LIST_HEAD(&fnic->vlans); | 646 | INIT_LIST_HEAD(&fnic->vlans); |
| 660 | } else { | 647 | } else { |
| @@ -960,6 +947,13 @@ static int __init fnic_init_module(void) | |||
| 960 | spin_lock_init(&fnic_list_lock); | 947 | spin_lock_init(&fnic_list_lock); |
| 961 | INIT_LIST_HEAD(&fnic_list); | 948 | INIT_LIST_HEAD(&fnic_list); |
| 962 | 949 | ||
| 950 | fnic_fip_queue = create_singlethread_workqueue("fnic_fip_q"); | ||
| 951 | if (!fnic_fip_queue) { | ||
| 952 | printk(KERN_ERR PFX "fnic FIP work queue create failed\n"); | ||
| 953 | err = -ENOMEM; | ||
| 954 | goto err_create_fip_workq; | ||
| 955 | } | ||
| 956 | |||
| 963 | fnic_fc_transport = fc_attach_transport(&fnic_fc_functions); | 957 | fnic_fc_transport = fc_attach_transport(&fnic_fc_functions); |
| 964 | if (!fnic_fc_transport) { | 958 | if (!fnic_fc_transport) { |
| 965 | printk(KERN_ERR PFX "fc_attach_transport error\n"); | 959 | printk(KERN_ERR PFX "fc_attach_transport error\n"); |
| @@ -978,6 +972,8 @@ static int __init fnic_init_module(void) | |||
| 978 | err_pci_register: | 972 | err_pci_register: |
| 979 | fc_release_transport(fnic_fc_transport); | 973 | fc_release_transport(fnic_fc_transport); |
| 980 | err_fc_transport: | 974 | err_fc_transport: |
| 975 | destroy_workqueue(fnic_fip_queue); | ||
| 976 | err_create_fip_workq: | ||
| 981 | destroy_workqueue(fnic_event_queue); | 977 | destroy_workqueue(fnic_event_queue); |
| 982 | err_create_fnic_workq: | 978 | err_create_fnic_workq: |
| 983 | kmem_cache_destroy(fnic_io_req_cache); | 979 | kmem_cache_destroy(fnic_io_req_cache); |
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 0177295599e0..1f0ca68409d4 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
| @@ -3547,11 +3547,21 @@ static int megasas_init_fw(struct megasas_instance *instance) | |||
| 3547 | break; | 3547 | break; |
| 3548 | } | 3548 | } |
| 3549 | 3549 | ||
| 3550 | /* | 3550 | if (megasas_transition_to_ready(instance, 0)) { |
| 3551 | * We expect the FW state to be READY | 3551 | atomic_set(&instance->fw_reset_no_pci_access, 1); |
| 3552 | */ | 3552 | instance->instancet->adp_reset |
| 3553 | if (megasas_transition_to_ready(instance, 0)) | 3553 | (instance, instance->reg_set); |
| 3554 | goto fail_ready_state; | 3554 | atomic_set(&instance->fw_reset_no_pci_access, 0); |
| 3555 | dev_info(&instance->pdev->dev, | ||
| 3556 | "megasas: FW restarted successfully from %s!\n", | ||
| 3557 | __func__); | ||
| 3558 | |||
| 3559 | /*waitting for about 30 second before retry*/ | ||
| 3560 | ssleep(30); | ||
| 3561 | |||
| 3562 | if (megasas_transition_to_ready(instance, 0)) | ||
| 3563 | goto fail_ready_state; | ||
| 3564 | } | ||
| 3555 | 3565 | ||
| 3556 | /* | 3566 | /* |
| 3557 | * MSI-X host index 0 is common for all adapter. | 3567 | * MSI-X host index 0 is common for all adapter. |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 3b1ea34e1f5a..eaa808e6ba91 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
| @@ -1031,6 +1031,9 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf, | |||
| 1031 | { | 1031 | { |
| 1032 | int i, result; | 1032 | int i, result; |
| 1033 | 1033 | ||
| 1034 | if (sdev->skip_vpd_pages) | ||
| 1035 | goto fail; | ||
| 1036 | |||
| 1034 | /* Ask for all the pages supported by this device */ | 1037 | /* Ask for all the pages supported by this device */ |
| 1035 | result = scsi_vpd_inquiry(sdev, buf, 0, buf_len); | 1038 | result = scsi_vpd_inquiry(sdev, buf, 0, buf_len); |
| 1036 | if (result) | 1039 | if (result) |
