Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80fd8238 authored by Roland Dreier's avatar Roland Dreier Committed by Linus Torvalds
Browse files

[PATCH] IB/mthca: Encapsulate command interface init



Encapsulate mthca command interface initialization/cleanup.

Signed-off-by: default avatarRoland Dreier <roland@topspin.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 761f9eb8
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -431,6 +431,27 @@ static int mthca_cmd_imm(struct mthca_dev *dev,
				      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).
+2 −0
Original line number Diff line number Diff line
@@ -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,
+7 −16
Original line number Diff line number Diff line
@@ -1005,25 +1005,18 @@ static int __devinit mthca_init_one(struct pci_dev *pdev,
	    !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 @@ static int __devinit mthca_init_one(struct pci_dev *pdev,
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(struct pci_dev *pdev)
		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);