Commit 8e305cb2 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Martin K. Petersen
Browse files

scsi: snic: switch to pci_irq_alloc_vectors

parent 156f8759
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -299,7 +299,6 @@ struct snic {

	/* pci related */
	struct pci_dev *pdev;
	struct msix_entry msix_entry[SNIC_MSIX_INTR_MAX];
	struct snic_msix_entry msix[SNIC_MSIX_INTR_MAX];

	/* io related info */
+19 −29
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ snic_free_intr(struct snic *snic)
	/* ONLY interrupt mode MSIX is supported */
	for (i = 0; i < ARRAY_SIZE(snic->msix); i++) {
		if (snic->msix[i].requested) {
			free_irq(snic->msix_entry[i].vector,
			free_irq(pci_irq_vector(snic->pdev, i),
				 snic->msix[i].devid);
		}
	}
@@ -134,7 +134,7 @@ snic_request_intr(struct snic *snic)
	snic->msix[SNIC_MSIX_ERR_NOTIFY].devid = snic;

	for (i = 0; i < ARRAY_SIZE(snic->msix); i++) {
		ret = request_irq(snic->msix_entry[i].vector,
		ret = request_irq(pci_irq_vector(snic->pdev, i),
				  snic->msix[i].isr,
				  0,
				  snic->msix[i].devname,
@@ -158,47 +158,37 @@ snic_set_intr_mode(struct snic *snic)
{
	unsigned int n = ARRAY_SIZE(snic->wq);
	unsigned int m = SNIC_CQ_IO_CMPL_MAX;
	unsigned int i;
	unsigned int vecs = n + m + 1;

	/*
	 * We need n WQs, m CQs, and n+m+1 INTRs
	 * (last INTR is used for WQ/CQ errors and notification area
	 */

	BUILD_BUG_ON((ARRAY_SIZE(snic->wq) + SNIC_CQ_IO_CMPL_MAX) >
			ARRAY_SIZE(snic->intr));
	SNIC_BUG_ON(ARRAY_SIZE(snic->msix_entry) < (n + m + 1));

	for (i = 0; i < (n + m + 1); i++)
		snic->msix_entry[i].entry = i;
	if (snic->wq_count < n || snic->cq_count < n + m)
		goto fail;

	if (pci_alloc_irq_vectors(snic->pdev, vecs, vecs, PCI_IRQ_MSIX) < 0)
		goto fail;

	if (snic->wq_count >= n && snic->cq_count >= (n + m)) {
		if (!pci_enable_msix(snic->pdev,
				     snic->msix_entry,
				     (n + m + 1))) {
	snic->wq_count = n;
	snic->cq_count = n + m;
			snic->intr_count = n + m + 1;
	snic->intr_count = vecs;
	snic->err_intr_offset = SNIC_MSIX_ERR_NOTIFY;

			SNIC_ISR_DBG(snic->shost,
				     "Using MSI-X Interrupts\n");
			svnic_dev_set_intr_mode(snic->vdev,
						VNIC_DEV_INTR_MODE_MSIX);

	SNIC_ISR_DBG(snic->shost, "Using MSI-X Interrupts\n");
	svnic_dev_set_intr_mode(snic->vdev, VNIC_DEV_INTR_MODE_MSIX);
	return 0;
		}
	}

fail:
	svnic_dev_set_intr_mode(snic->vdev, VNIC_DEV_INTR_MODE_UNKNOWN);

	return -EINVAL;
} /* end of snic_set_intr_mode */

void
snic_clear_intr_mode(struct snic *snic)
{
	pci_disable_msix(snic->pdev);

	pci_free_irq_vectors(snic->pdev);
	svnic_dev_set_intr_mode(snic->vdev, VNIC_DEV_INTR_MODE_INTX);
}