/** * Setup MSIX based interrupt. */ int bfad_setup_intr(struct bfad_s *bfad) { int error = 0; u32 mask = 0, i, num_bit = 0, max_bit = 0; struct msix_entry msix_entries[MAX_MSIX_ENTRY]; /* Call BFA to get the msix map for this PCI function. */ bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); /* Set up the msix entry table */ bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); if (!msix_disable) { error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); if (error) { /* * Only error number of vector is available. * We don't have a mechanism to map multiple * interrupts into one vector, so even if we * can try to request less vectors, we don't * know how to associate interrupt events to * vectors. Linux doesn't dupicate vectors * in the MSIX table for this case. */ printk(KERN_WARNING "bfad%d: " "pci_enable_msix failed (%d)," " use line based.\n", bfad->inst_no, error); goto line_based; } /* Save the vectors */ for (i = 0; i < bfad->nvec; i++) { bfa_trc(bfad, msix_entries[i].vector); bfad->msix_tab[i].msix.vector = msix_entries[i].vector; } bfa_msix_init(&bfad->bfa, bfad->nvec); bfad->bfad_flags |= BFAD_MSIX_ON; return error; } line_based: error = 0; if (request_irq (bfad->pcidev->irq, (irq_handler_t) bfad_intx, BFAD_IRQ_FLAGS, BFAD_DRIVER_NAME, bfad) != 0) { /* Enable interrupt handler failed */ return 1; } return error; }
int bfad_setup_intr(struct bfad_s *bfad) { int error = 0; u32 mask = 0, i, num_bit = 0, max_bit = 0; struct msix_entry msix_entries[MAX_MSIX_ENTRY]; bfa_msix_getvecs(&bfad->bfa, &mask, &num_bit, &max_bit); bfad_init_msix_entry(bfad, msix_entries, mask, max_bit); if (!msix_disable) { error = pci_enable_msix(bfad->pcidev, msix_entries, bfad->nvec); if (error) { printk(KERN_WARNING "bfad%d: " "pci_enable_msix failed (%d)," " use line based.\n", bfad->inst_no, error); goto line_based; } for (i = 0; i < bfad->nvec; i++) { bfa_trc(bfad, msix_entries[i].vector); bfad->msix_tab[i].msix.vector = msix_entries[i].vector; } bfa_msix_init(&bfad->bfa, bfad->nvec); bfad->bfad_flags |= BFAD_MSIX_ON; return error; } line_based: error = 0; if (request_irq (bfad->pcidev->irq, (irq_handler_t) bfad_intx, BFAD_IRQ_FLAGS, BFAD_DRIVER_NAME, bfad) != 0) { return 1; } return error; }