Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[sfrench/cifs-2.6.git] / drivers / scsi / mpi3mr / mpi3mr_fw.c
index 286a44506578b40665e1a45e0e0c88da9267b3b3..758f7ca9e0ee803bad899d35fef7bbd04b222f69 100644 (file)
@@ -1128,7 +1128,6 @@ static int mpi3mr_issue_and_process_mur(struct mpi3mr_ioc *mrioc,
 static int
 mpi3mr_revalidate_factsdata(struct mpi3mr_ioc *mrioc)
 {
-       u16 dev_handle_bitmap_sz;
        void *removepend_bitmap;
 
        if (mrioc->facts.reply_sz > mrioc->reply_sz) {
@@ -1160,25 +1159,23 @@ mpi3mr_revalidate_factsdata(struct mpi3mr_ioc *mrioc)
                    "\tcontroller while sas transport support is enabled at the\n"
                    "\tdriver, please reboot the system or reload the driver\n");
 
-       dev_handle_bitmap_sz = mrioc->facts.max_devhandle / 8;
-       if (mrioc->facts.max_devhandle % 8)
-               dev_handle_bitmap_sz++;
-       if (dev_handle_bitmap_sz > mrioc->dev_handle_bitmap_sz) {
-               removepend_bitmap = krealloc(mrioc->removepend_bitmap,
-                   dev_handle_bitmap_sz, GFP_KERNEL);
+       if (mrioc->facts.max_devhandle > mrioc->dev_handle_bitmap_bits) {
+               removepend_bitmap = bitmap_zalloc(mrioc->facts.max_devhandle,
+                                                 GFP_KERNEL);
                if (!removepend_bitmap) {
                        ioc_err(mrioc,
-                           "failed to increase removepend_bitmap sz from: %d to %d\n",
-                           mrioc->dev_handle_bitmap_sz, dev_handle_bitmap_sz);
+                               "failed to increase removepend_bitmap bits from %d to %d\n",
+                               mrioc->dev_handle_bitmap_bits,
+                               mrioc->facts.max_devhandle);
                        return -EPERM;
                }
-               memset(removepend_bitmap + mrioc->dev_handle_bitmap_sz, 0,
-                   dev_handle_bitmap_sz - mrioc->dev_handle_bitmap_sz);
+               bitmap_free(mrioc->removepend_bitmap);
                mrioc->removepend_bitmap = removepend_bitmap;
                ioc_info(mrioc,
-                   "increased dev_handle_bitmap_sz from %d to %d\n",
-                   mrioc->dev_handle_bitmap_sz, dev_handle_bitmap_sz);
-               mrioc->dev_handle_bitmap_sz = dev_handle_bitmap_sz;
+                        "increased bits of dev_handle_bitmap from %d to %d\n",
+                        mrioc->dev_handle_bitmap_bits,
+                        mrioc->facts.max_devhandle);
+               mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle;
        }
 
        return 0;
@@ -2957,27 +2954,18 @@ static int mpi3mr_alloc_reply_sense_bufs(struct mpi3mr_ioc *mrioc)
        if (!mrioc->pel_abort_cmd.reply)
                goto out_failed;
 
-       mrioc->dev_handle_bitmap_sz = mrioc->facts.max_devhandle / 8;
-       if (mrioc->facts.max_devhandle % 8)
-               mrioc->dev_handle_bitmap_sz++;
-       mrioc->removepend_bitmap = kzalloc(mrioc->dev_handle_bitmap_sz,
-           GFP_KERNEL);
+       mrioc->dev_handle_bitmap_bits = mrioc->facts.max_devhandle;
+       mrioc->removepend_bitmap = bitmap_zalloc(mrioc->dev_handle_bitmap_bits,
+                                                GFP_KERNEL);
        if (!mrioc->removepend_bitmap)
                goto out_failed;
 
-       mrioc->devrem_bitmap_sz = MPI3MR_NUM_DEVRMCMD / 8;
-       if (MPI3MR_NUM_DEVRMCMD % 8)
-               mrioc->devrem_bitmap_sz++;
-       mrioc->devrem_bitmap = kzalloc(mrioc->devrem_bitmap_sz,
-           GFP_KERNEL);
+       mrioc->devrem_bitmap = bitmap_zalloc(MPI3MR_NUM_DEVRMCMD, GFP_KERNEL);
        if (!mrioc->devrem_bitmap)
                goto out_failed;
 
-       mrioc->evtack_cmds_bitmap_sz = MPI3MR_NUM_EVTACKCMD / 8;
-       if (MPI3MR_NUM_EVTACKCMD % 8)
-               mrioc->evtack_cmds_bitmap_sz++;
-       mrioc->evtack_cmds_bitmap = kzalloc(mrioc->evtack_cmds_bitmap_sz,
-           GFP_KERNEL);
+       mrioc->evtack_cmds_bitmap = bitmap_zalloc(MPI3MR_NUM_EVTACKCMD,
+                                                 GFP_KERNEL);
        if (!mrioc->evtack_cmds_bitmap)
                goto out_failed;
 
@@ -3415,10 +3403,7 @@ static int mpi3mr_alloc_chain_bufs(struct mpi3mr_ioc *mrioc)
                if (!mrioc->chain_sgl_list[i].addr)
                        goto out_failed;
        }
-       mrioc->chain_bitmap_sz = num_chains / 8;
-       if (num_chains % 8)
-               mrioc->chain_bitmap_sz++;
-       mrioc->chain_bitmap = kzalloc(mrioc->chain_bitmap_sz, GFP_KERNEL);
+       mrioc->chain_bitmap = bitmap_zalloc(num_chains, GFP_KERNEL);
        if (!mrioc->chain_bitmap)
                goto out_failed;
        return retval;
@@ -4189,10 +4174,11 @@ void mpi3mr_memset_buffers(struct mpi3mr_ioc *mrioc)
                for (i = 0; i < MPI3MR_NUM_EVTACKCMD; i++)
                        memset(mrioc->evtack_cmds[i].reply, 0,
                            sizeof(*mrioc->evtack_cmds[i].reply));
-               memset(mrioc->removepend_bitmap, 0, mrioc->dev_handle_bitmap_sz);
-               memset(mrioc->devrem_bitmap, 0, mrioc->devrem_bitmap_sz);
-               memset(mrioc->evtack_cmds_bitmap, 0,
-                   mrioc->evtack_cmds_bitmap_sz);
+               bitmap_clear(mrioc->removepend_bitmap, 0,
+                            mrioc->dev_handle_bitmap_bits);
+               bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD);
+               bitmap_clear(mrioc->evtack_cmds_bitmap, 0,
+                            MPI3MR_NUM_EVTACKCMD);
        }
 
        for (i = 0; i < mrioc->num_queues; i++) {
@@ -4318,16 +4304,16 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc)
                mrioc->evtack_cmds[i].reply = NULL;
        }
 
-       kfree(mrioc->removepend_bitmap);
+       bitmap_free(mrioc->removepend_bitmap);
        mrioc->removepend_bitmap = NULL;
 
-       kfree(mrioc->devrem_bitmap);
+       bitmap_free(mrioc->devrem_bitmap);
        mrioc->devrem_bitmap = NULL;
 
-       kfree(mrioc->evtack_cmds_bitmap);
+       bitmap_free(mrioc->evtack_cmds_bitmap);
        mrioc->evtack_cmds_bitmap = NULL;
 
-       kfree(mrioc->chain_bitmap);
+       bitmap_free(mrioc->chain_bitmap);
        mrioc->chain_bitmap = NULL;
 
        kfree(mrioc->transport_cmds.reply);
@@ -4886,9 +4872,10 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
 
        mpi3mr_flush_delayed_cmd_lists(mrioc);
        mpi3mr_flush_drv_cmds(mrioc);
-       memset(mrioc->devrem_bitmap, 0, mrioc->devrem_bitmap_sz);
-       memset(mrioc->removepend_bitmap, 0, mrioc->dev_handle_bitmap_sz);
-       memset(mrioc->evtack_cmds_bitmap, 0, mrioc->evtack_cmds_bitmap_sz);
+       bitmap_clear(mrioc->devrem_bitmap, 0, MPI3MR_NUM_DEVRMCMD);
+       bitmap_clear(mrioc->removepend_bitmap, 0,
+                    mrioc->dev_handle_bitmap_bits);
+       bitmap_clear(mrioc->evtack_cmds_bitmap, 0, MPI3MR_NUM_EVTACKCMD);
        mpi3mr_flush_host_io(mrioc);
        mpi3mr_cleanup_fwevt_list(mrioc);
        mpi3mr_invalidate_devhandles(mrioc);