timeout, status);
 }
 
+int mthca_cmd_init(struct mthca_dev *dev)
+{
+       sema_init(&dev->cmd.hcr_sem, 1);
+       sema_init(&dev->cmd.poll_sem, 1);
+       dev->cmd.use_events = 0;
+
+       dev->hcr = ioremap(pci_resource_start(dev->pdev, 0) + MTHCA_HCR_BASE,
+                          MTHCA_HCR_SIZE);
+       if (!dev->hcr) {
+               mthca_err(dev, "Couldn't map command register.");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+void mthca_cmd_cleanup(struct mthca_dev *dev)
+{
+       iounmap(dev->hcr);
+}
+
 /*
  * Switch to using events to issue FW commands (should be called after
  * event queue to command events has been initialized).
 
        u32 cap_mask;
 };
 
+int mthca_cmd_init(struct mthca_dev *dev);
+void mthca_cmd_cleanup(struct mthca_dev *dev);
 int mthca_cmd_use_events(struct mthca_dev *dev);
 void mthca_cmd_use_polling(struct mthca_dev *dev);
 void mthca_cmd_event(struct mthca_dev *dev, u16 token,
 
            !pci_enable_msi(pdev))
                mdev->mthca_flags |= MTHCA_FLAG_MSI;
 
-       sema_init(&mdev->cmd.hcr_sem, 1);
-       sema_init(&mdev->cmd.poll_sem, 1);
-       mdev->cmd.use_events = 0;
-
-       mdev->hcr = ioremap(pci_resource_start(pdev, 0) + MTHCA_HCR_BASE, MTHCA_HCR_SIZE);
-       if (!mdev->hcr) {
-               mthca_err(mdev, "Couldn't map command register, "
-                         "aborting.\n");
-               err = -ENOMEM;
+       if (mthca_cmd_init(mdev)) {
+               mthca_err(mdev, "Failed to init command interface, aborting.\n");
                goto err_free_dev;
        }
 
        err = mthca_tune_pci(mdev);
        if (err)
-               goto err_iounmap;
+               goto err_cmd;
 
        err = mthca_init_hca(mdev);
        if (err)
-               goto err_iounmap;
+               goto err_cmd;
 
        if (mdev->fw_ver < mthca_hca_table[id->driver_data].latest_fw) {
                mthca_warn(mdev, "HCA FW version %x.%x.%x is old (%x.%x.%x is current).\n",
 err_close:
        mthca_close_hca(mdev);
 
-err_iounmap:
-       iounmap(mdev->hcr);
+err_cmd:
+       mthca_cmd_cleanup(mdev);
 
 err_free_dev:
        if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
                iounmap(mdev->kar);
                mthca_uar_free(mdev, &mdev->driver_uar);
                mthca_cleanup_uar_table(mdev);
-
                mthca_close_hca(mdev);
-
-               iounmap(mdev->hcr);
+               mthca_cmd_cleanup(mdev);
 
                if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
                        pci_disable_msix(pdev);