/*Handling link events */
snic_handle_link_event(snic);
return IRQ_HANDLED;
} /* end of snic_isr_msix_err_notify */
void
snic_free_intr(struct snic *snic)
{ int i;
/* ONLY interrupt mode MSIX is supported */ for (i = 0; i < ARRAY_SIZE(snic->msix); i++) { if (snic->msix[i].requested) {
free_irq(pci_irq_vector(snic->pdev, i),
snic->msix[i].devid);
}
}
} /* end of snic_free_intr */
int
snic_request_intr(struct snic *snic)
{ int ret = 0, i; enum vnic_dev_intr_mode intr_mode;
/* * Currently HW supports single WQ and CQ. So passing devid as snic. * When hardware supports multiple WQs and CQs, one idea is * to pass devid as corresponding WQ or CQ ptr and retrieve snic * from queue ptr. * Except for err_notify, which is always one.
*/
sprintf(snic->msix[SNIC_MSIX_WQ].devname, "%.11s-scsi-wq",
snic->name);
snic->msix[SNIC_MSIX_WQ].isr = snic_isr_msix_wq;
snic->msix[SNIC_MSIX_WQ].devid = snic;
for (i = 0; i < ARRAY_SIZE(snic->msix); i++) {
ret = request_irq(pci_irq_vector(snic->pdev, i),
snic->msix[i].isr,
0,
snic->msix[i].devname,
snic->msix[i].devid); if (ret) {
SNIC_HOST_ERR(snic->shost, "MSI-X: request_irq(%d) failed %d\n",
i,
ret);
snic_free_intr(snic); break;
}
snic->msix[i].requested = 1;
}
return ret;
} /* end of snic_request_intr */
int
snic_set_intr_mode(struct snic *snic)
{ unsignedint n = ARRAY_SIZE(snic->wq); unsignedint m = SNIC_CQ_IO_CMPL_MAX; unsignedint 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));
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;
snic->wq_count = n;
snic->cq_count = n + m;
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); return 0;
fail:
svnic_dev_set_intr_mode(snic->vdev, VNIC_DEV_INTR_MODE_UNKNOWN); return -EINVAL;
} /* end of snic_set_intr_mode */
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.