From: Roland Dreier Encapsulate mthca command interface initialization/cleanup. Signed-off-by: Roland Dreier Signed-off-by: Andrew Morton --- drivers/infiniband/hw/mthca/mthca_cmd.c | 21 +++++++++++++++++++++ drivers/infiniband/hw/mthca/mthca_cmd.h | 2 ++ drivers/infiniband/hw/mthca/mthca_main.c | 23 +++++++---------------- 3 files changed, 30 insertions(+), 16 deletions(-) diff -puN drivers/infiniband/hw/mthca/mthca_cmd.c~ib-mthca-encapsulate-command-interface-init drivers/infiniband/hw/mthca/mthca_cmd.c --- 25/drivers/infiniband/hw/mthca/mthca_cmd.c~ib-mthca-encapsulate-command-interface-init 2005-06-24 23:06:18.000000000 -0700 +++ 25-akpm/drivers/infiniband/hw/mthca/mthca_cmd.c 2005-06-24 23:06:18.000000000 -0700 @@ -431,6 +431,27 @@ static int mthca_cmd_imm(struct mthca_de 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). diff -puN drivers/infiniband/hw/mthca/mthca_cmd.h~ib-mthca-encapsulate-command-interface-init drivers/infiniband/hw/mthca/mthca_cmd.h --- 25/drivers/infiniband/hw/mthca/mthca_cmd.h~ib-mthca-encapsulate-command-interface-init 2005-06-24 23:06:18.000000000 -0700 +++ 25-akpm/drivers/infiniband/hw/mthca/mthca_cmd.h 2005-06-24 23:06:18.000000000 -0700 @@ -235,6 +235,8 @@ struct mthca_set_ib_param { 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, diff -puN drivers/infiniband/hw/mthca/mthca_main.c~ib-mthca-encapsulate-command-interface-init drivers/infiniband/hw/mthca/mthca_main.c --- 25/drivers/infiniband/hw/mthca/mthca_main.c~ib-mthca-encapsulate-command-interface-init 2005-06-24 23:06:18.000000000 -0700 +++ 25-akpm/drivers/infiniband/hw/mthca/mthca_main.c 2005-06-24 23:06:18.000000000 -0700 @@ -1005,25 +1005,18 @@ static int __devinit mthca_init_one(stru !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", @@ -1071,8 +1064,8 @@ err_cleanup: 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) @@ -1119,10 +1112,8 @@ static void __devexit mthca_remove_one(s 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); _