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 Original line Diff line number Diff line
@@ -299,7 +299,6 @@ struct snic {


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


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


	for (i = 0; i < ARRAY_SIZE(snic->msix); i++) {
	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,
				  snic->msix[i].isr,
				  0,
				  0,
				  snic->msix[i].devname,
				  snic->msix[i].devname,
@@ -158,47 +158,37 @@ snic_set_intr_mode(struct snic *snic)
{
{
	unsigned int n = ARRAY_SIZE(snic->wq);
	unsigned int n = ARRAY_SIZE(snic->wq);
	unsigned int m = SNIC_CQ_IO_CMPL_MAX;
	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
	 * We need n WQs, m CQs, and n+m+1 INTRs
	 * (last INTR is used for WQ/CQ errors and notification area
	 * (last INTR is used for WQ/CQ errors and notification area
	 */
	 */

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


	for (i = 0; i < (n + m + 1); i++)
	if (snic->wq_count < n || snic->cq_count < n + m)
		snic->msix_entry[i].entry = i;
		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->wq_count = n;
	snic->cq_count = n + m;
	snic->cq_count = n + m;
			snic->intr_count = n + m + 1;
	snic->intr_count = vecs;
	snic->err_intr_offset = SNIC_MSIX_ERR_NOTIFY;
	snic->err_intr_offset = SNIC_MSIX_ERR_NOTIFY;


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

	return 0;
	return 0;
		}
fail:
	}

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

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


void
void
snic_clear_intr_mode(struct snic *snic)
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);
	svnic_dev_set_intr_mode(snic->vdev, VNIC_DEV_INTR_MODE_INTX);
}
}