Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 Mar 2021 21:37:18 +0000 (13:37 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 Mar 2021 21:37:18 +0000 (13:37 -0800)
Pull SCSI fixes from James Bottomley:
 "Ten updates: one non code maintainer update for vmw_pvscsi, five code
  updates for ibmvfc and four for UFS.

  All are either trivial patches or bug fixes"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
  scsi: vmw_pvscsi: MAINTAINERS: Update maintainer
  scsi: ufs: Convert sysfs sprintf/snprintf family to sysfs_emit
  scsi: ufs: Remove redundant checks of !hba in suspend/resume callbacks
  scsi: ufs: ufs-qcom: Disable interrupt in reset path
  scsi: ufs: Minor adjustments to error handling
  scsi: ibmvfc: Reinitialize sub-CRQs and perform channel enquiry after LPM
  scsi: ibmvfc: Store return code of H_FREE_SUB_CRQ during cleanup
  scsi: ibmvfc: Treat H_CLOSED as success during sub-CRQ registration
  scsi: ibmvfc: Fix invalid sub-CRQ handles after hard reset
  scsi: ibmvfc: Simplify handling of sub-CRQ initialization

1  2 
MAINTAINERS
drivers/scsi/ibmvscsi/ibmvfc.c

diff --combined MAINTAINERS
@@@ -5835,7 -5835,7 +5835,7 @@@ M:      David Airlie <airlied@linux.ie
  M:    Daniel Vetter <daniel@ffwll.ch>
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
 -B:    https://bugs.freedesktop.org/
 +B:    https://gitlab.freedesktop.org/drm
  C:    irc://chat.freenode.net/dri-devel
  T:    git git://anongit.freedesktop.org/drm/drm
  F:    Documentation/devicetree/bindings/display/
@@@ -10716,8 -10716,7 +10716,8 @@@ F:   drivers/net/ethernet/marvell/mvpp2
  
  MARVELL MWIFIEX WIRELESS DRIVER
  M:    Amitkumar Karwar <amitkarwar@gmail.com>
 -M:    Ganapathi Bhat <ganapathi.bhat@nxp.com>
 +M:    Ganapathi Bhat <ganapathi017@gmail.com>
 +M:    Sharvari Harisangam <sharvari.harisangam@nxp.com>
  M:    Xinming Hu <huxinming820@gmail.com>
  L:    linux-wireless@vger.kernel.org
  S:    Maintained
@@@ -19166,7 -19165,7 +19166,7 @@@ S:   Maintaine
  F:    drivers/infiniband/hw/vmw_pvrdma/
  
  VMware PVSCSI driver
- M:    Jim Gill <jgill@vmware.com>
+ M:    Vishal Bhakta <vbhakta@vmware.com>
  M:    VMware PV-Drivers <pv-drivers@vmware.com>
  L:    linux-scsi@vger.kernel.org
  S:    Maintained
@@@ -21,6 -21,7 +21,7 @@@
  #include <linux/bsg-lib.h>
  #include <asm/firmware.h>
  #include <asm/irq.h>
+ #include <asm/rtas.h>
  #include <asm/vio.h>
  #include <scsi/scsi.h>
  #include <scsi/scsi_cmnd.h>
@@@ -158,6 -159,9 +159,9 @@@ static void ibmvfc_npiv_logout(struct i
  static void ibmvfc_tgt_implicit_logout_and_del(struct ibmvfc_target *);
  static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
  
+ static void ibmvfc_release_sub_crqs(struct ibmvfc_host *);
+ static void ibmvfc_init_sub_crqs(struct ibmvfc_host *);
  static const char *unknown_error = "unknown error";
  
  static long h_reg_sub_crq(unsigned long unit_address, unsigned long ioba,
@@@ -899,6 -903,9 +903,9 @@@ static int ibmvfc_reenable_crq_queue(st
  {
        int rc = 0;
        struct vio_dev *vdev = to_vio_dev(vhost->dev);
+       unsigned long flags;
+       ibmvfc_release_sub_crqs(vhost);
  
        /* Re-enable the CRQ */
        do {
        if (rc)
                dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
  
+       spin_lock_irqsave(vhost->host->host_lock, flags);
+       spin_lock(vhost->crq.q_lock);
+       vhost->do_enquiry = 1;
+       vhost->using_channels = 0;
+       spin_unlock(vhost->crq.q_lock);
+       spin_unlock_irqrestore(vhost->host->host_lock, flags);
+       ibmvfc_init_sub_crqs(vhost);
        return rc;
  }
  
@@@ -926,8 -942,8 +942,8 @@@ static int ibmvfc_reset_crq(struct ibmv
        unsigned long flags;
        struct vio_dev *vdev = to_vio_dev(vhost->dev);
        struct ibmvfc_queue *crq = &vhost->crq;
-       struct ibmvfc_queue *scrq;
-       int i;
+       ibmvfc_release_sub_crqs(vhost);
  
        /* Close the CRQ */
        do {
        memset(crq->msgs.crq, 0, PAGE_SIZE);
        crq->cur = 0;
  
-       if (vhost->scsi_scrqs.scrqs) {
-               for (i = 0; i < nr_scsi_hw_queues; i++) {
-                       scrq = &vhost->scsi_scrqs.scrqs[i];
-                       spin_lock(scrq->q_lock);
-                       memset(scrq->msgs.scrq, 0, PAGE_SIZE);
-                       scrq->cur = 0;
-                       spin_unlock(scrq->q_lock);
-               }
-       }
        /* And re-open it again */
        rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
                                crq->msg_token, PAGE_SIZE);
                dev_warn(vhost->dev, "Partner adapter not ready\n");
        else if (rc != 0)
                dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc);
        spin_unlock(vhost->crq.q_lock);
        spin_unlock_irqrestore(vhost->host->host_lock, flags);
  
+       ibmvfc_init_sub_crqs(vhost);
        return rc;
  }
  
@@@ -5642,7 -5651,8 +5651,8 @@@ static int ibmvfc_register_scsi_channel
        rc = h_reg_sub_crq(vdev->unit_address, scrq->msg_token, PAGE_SIZE,
                           &scrq->cookie, &scrq->hw_irq);
  
-       if (rc) {
+       /* H_CLOSED indicates successful register, but no CRQ partner */
+       if (rc && rc != H_CLOSED) {
                dev_warn(dev, "Error registering sub-crq: %d\n", rc);
                if (rc == H_PARAMETER)
                        dev_warn_once(dev, "Firmware may not support MQ\n");
  
  irq_failed:
        do {
-               plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie);
-       } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
+               rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address, scrq->cookie);
+       } while (rtas_busy_delay(rc));
  reg_failed:
        ibmvfc_free_queue(vhost, scrq);
        LEAVE;
@@@ -5694,6 -5704,7 +5704,7 @@@ static void ibmvfc_deregister_scsi_chan
  
        free_irq(scrq->irq, scrq);
        irq_dispose_mapping(scrq->irq);
+       scrq->irq = 0;
  
        do {
                rc = plpar_hcall_norets(H_FREE_SUB_CRQ, vdev->unit_address,
        LEAVE;
  }
  
- static int ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
+ static void ibmvfc_init_sub_crqs(struct ibmvfc_host *vhost)
  {
        int i, j;
  
        ENTER;
+       if (!vhost->mq_enabled)
+               return;
  
        vhost->scsi_scrqs.scrqs = kcalloc(nr_scsi_hw_queues,
                                          sizeof(*vhost->scsi_scrqs.scrqs),
                                          GFP_KERNEL);
-       if (!vhost->scsi_scrqs.scrqs)
-               return -1;
+       if (!vhost->scsi_scrqs.scrqs) {
+               vhost->do_enquiry = 0;
+               return;
+       }
  
        for (i = 0; i < nr_scsi_hw_queues; i++) {
                if (ibmvfc_register_scsi_channel(vhost, i)) {
                        kfree(vhost->scsi_scrqs.scrqs);
                        vhost->scsi_scrqs.scrqs = NULL;
                        vhost->scsi_scrqs.active_queues = 0;
-                       LEAVE;
-                       return -1;
+                       vhost->do_enquiry = 0;
+                       break;
                }
        }
  
        LEAVE;
-       return 0;
  }
  
  static void ibmvfc_release_sub_crqs(struct ibmvfc_host *vhost)
@@@ -5999,11 -6013,7 +6013,7 @@@ static int ibmvfc_probe(struct vio_dev 
                goto remove_shost;
        }
  
-       if (vhost->mq_enabled) {
-               rc = ibmvfc_init_sub_crqs(vhost);
-               if (rc)
-                       dev_warn(dev, "Failed to allocate Sub-CRQs. rc=%d\n", rc);
-       }
+       ibmvfc_init_sub_crqs(vhost);
  
        if (shost_to_fc_host(shost)->rqst_q)
                blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1);
@@@ -6038,7 -6048,7 +6048,7 @@@ out
   * Return value:
   *    0
   **/
 -static int ibmvfc_remove(struct vio_dev *vdev)
 +static void ibmvfc_remove(struct vio_dev *vdev)
  {
        struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev);
        LIST_HEAD(purge);
        spin_unlock(&ibmvfc_driver_lock);
        scsi_host_put(vhost->host);
        LEAVE;
 -      return 0;
  }
  
  /**