Merge patch series "scsi: documentation: clean up docs and fix kernel-doc"
[linux-block.git] / drivers / scsi / mpi3mr / mpi3mr_os.c
index 1bffd629c1244f22a43e1ba6a8eab0b676e5370d..5f975e0db38831328e48798c265318def3d0b6bc 100644 (file)
@@ -8,11 +8,12 @@
  */
 
 #include "mpi3mr.h"
+#include <linux/idr.h>
 
 /* global driver scop variables */
 LIST_HEAD(mrioc_list);
 DEFINE_SPINLOCK(mrioc_list_lock);
-static int mrioc_ids;
+static DEFINE_IDA(mrioc_ida);
 static int warn_non_secure_ctlr;
 atomic64_t event_counter;
 
@@ -1028,7 +1029,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
 }
 
 /**
- * mpi3mr_rfresh_tgtdevs - Refresh target device exposure
+ * mpi3mr_refresh_tgtdevs - Refresh target device exposure
  * @mrioc: Adapter instance reference
  *
  * This is executed post controller reset to identify any
@@ -1038,7 +1039,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
  * Return: Nothing.
  */
 
-void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
+void mpi3mr_refresh_tgtdevs(struct mpi3mr_ioc *mrioc)
 {
        struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next;
        struct mpi3mr_stgt_priv_data *tgt_priv;
@@ -1046,8 +1047,8 @@ void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
        dprint_reset(mrioc, "refresh target devices: check for removals\n");
        list_for_each_entry_safe(tgtdev, tgtdev_next, &mrioc->tgtdev_list,
            list) {
-               if ((tgtdev->dev_handle == MPI3MR_INVALID_DEV_HANDLE) &&
-                    tgtdev->is_hidden &&
+               if (((tgtdev->dev_handle == MPI3MR_INVALID_DEV_HANDLE) ||
+                    tgtdev->is_hidden) &&
                     tgtdev->host_exposed && tgtdev->starget &&
                     tgtdev->starget->hostdata) {
                        tgt_priv = tgtdev->starget->hostdata;
@@ -2009,7 +2010,7 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
                        mpi3mr_refresh_sas_ports(mrioc);
                        mpi3mr_refresh_expanders(mrioc);
                }
-               mpi3mr_rfresh_tgtdevs(mrioc);
+               mpi3mr_refresh_tgtdevs(mrioc);
                ioc_info(mrioc,
                    "scan for non responding and newly added devices after soft reset completed\n");
                break;
@@ -4894,7 +4895,7 @@ static int mpi3mr_qcmd(struct Scsi_Host *shost,
                    MPI3_SCSIIO_MSGFLAGS_DIVERT_TO_FIRMWARE;
                scsiio_flags |= MPI3_SCSIIO_FLAGS_DIVERT_REASON_IO_THROTTLING;
        }
-       scsiio_req->flags = cpu_to_le32(scsiio_flags);
+       scsiio_req->flags |= cpu_to_le32(scsiio_flags);
 
        if (mpi3mr_op_request_post(mrioc, op_req_q,
            scmd_priv_data->mpi3mr_scsiio_req)) {
@@ -5072,7 +5073,10 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
        mrioc = shost_priv(shost);
-       mrioc->id = mrioc_ids++;
+       retval = ida_alloc_range(&mrioc_ida, 1, U8_MAX, GFP_KERNEL);
+       if (retval < 0)
+               goto id_alloc_failed;
+       mrioc->id = (u8)retval;
        sprintf(mrioc->driver_name, "%s", MPI3MR_DRIVER_NAME);
        sprintf(mrioc->name, "%s%d", mrioc->driver_name, mrioc->id);
        INIT_LIST_HEAD(&mrioc->list);
@@ -5222,9 +5226,11 @@ init_ioc_failed:
 resource_alloc_failed:
        destroy_workqueue(mrioc->fwevt_worker_thread);
 fwevtthread_failed:
+       ida_free(&mrioc_ida, mrioc->id);
        spin_lock(&mrioc_list_lock);
        list_del(&mrioc->list);
        spin_unlock(&mrioc_list_lock);
+id_alloc_failed:
        scsi_host_put(shost);
 shost_failed:
        return retval;
@@ -5310,6 +5316,7 @@ static void mpi3mr_remove(struct pci_dev *pdev)
                mrioc->sas_hba.num_phys = 0;
        }
 
+       ida_free(&mrioc_ida, mrioc->id);
        spin_lock(&mrioc_list_lock);
        list_del(&mrioc->list);
        spin_unlock(&mrioc_list_lock);
@@ -5525,6 +5532,7 @@ static void __exit mpi3mr_exit(void)
                           &driver_attr_event_counter);
        pci_unregister_driver(&mpi3mr_pci_driver);
        sas_release_transport(mpi3mr_transport_template);
+       ida_destroy(&mrioc_ida);
 }
 
 module_init(mpi3mr_init);