Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5d081f4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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: "


+9 −13
Original line number Original line Diff line number Diff line
@@ -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)
	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)
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);
+15 −5
Original line number Original line Diff line number Diff line
@@ -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
			(instance, instance->reg_set);
		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))
		if (megasas_transition_to_ready(instance, 0))
			goto fail_ready_state;
			goto fail_ready_state;
	}


	/*
	/*
	 * MSI-X host index 0 is common for all adapter.
	 * MSI-X host index 0 is common for all adapter.
+3 −0
Original line number Original line Diff line number Diff line
@@ -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)