aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c77
1 files changed, 46 insertions, 31 deletions
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
index 558df468f2e4..927ae9f801fb 100644
--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
@@ -593,47 +593,43 @@ static const struct net_device_ops netxen_netdev_ops = {
593}; 593};
594 594
595static void 595static void
596netxen_setup_intr(struct netxen_adapter *adapter) 596netxen_initialize_interrupt_registers(struct netxen_adapter *adapter)
597{ 597{
598 struct netxen_legacy_intr_set *legacy_intrp; 598 struct netxen_legacy_intr_set *legacy_intrp;
599 struct pci_dev *pdev = adapter->pdev; 599 u32 tgt_status_reg, int_state_reg;
600 int err, num_msix;
601
602 if (adapter->rss_supported) {
603 num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ?
604 MSIX_ENTRIES_PER_ADAPTER : 2;
605 } else
606 num_msix = 1;
607
608 adapter->max_sds_rings = 1;
609
610 adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
611 600
612 if (adapter->ahw.revision_id >= NX_P3_B0) 601 if (adapter->ahw.revision_id >= NX_P3_B0)
613 legacy_intrp = &legacy_intr[adapter->ahw.pci_func]; 602 legacy_intrp = &legacy_intr[adapter->ahw.pci_func];
614 else 603 else
615 legacy_intrp = &legacy_intr[0]; 604 legacy_intrp = &legacy_intr[0];
616 605
606 tgt_status_reg = legacy_intrp->tgt_status_reg;
607 int_state_reg = ISR_INT_STATE_REG;
608
617 adapter->int_vec_bit = legacy_intrp->int_vec_bit; 609 adapter->int_vec_bit = legacy_intrp->int_vec_bit;
618 adapter->tgt_status_reg = netxen_get_ioaddr(adapter, 610 adapter->tgt_status_reg = netxen_get_ioaddr(adapter, tgt_status_reg);
619 legacy_intrp->tgt_status_reg);
620 adapter->tgt_mask_reg = netxen_get_ioaddr(adapter, 611 adapter->tgt_mask_reg = netxen_get_ioaddr(adapter,
621 legacy_intrp->tgt_mask_reg); 612 legacy_intrp->tgt_mask_reg);
622 adapter->pci_int_reg = netxen_get_ioaddr(adapter, 613 adapter->pci_int_reg = netxen_get_ioaddr(adapter,
623 legacy_intrp->pci_int_reg); 614 legacy_intrp->pci_int_reg);
624 adapter->isr_int_vec = netxen_get_ioaddr(adapter, ISR_INT_VECTOR); 615 adapter->isr_int_vec = netxen_get_ioaddr(adapter, ISR_INT_VECTOR);
625 616
626 if (adapter->ahw.revision_id >= NX_P3_B1) 617 if (adapter->ahw.revision_id >= NX_P3_B1)
627 adapter->crb_int_state_reg = netxen_get_ioaddr(adapter, 618 adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
628 ISR_INT_STATE_REG); 619 int_state_reg);
629 else 620 else
630 adapter->crb_int_state_reg = netxen_get_ioaddr(adapter, 621 adapter->crb_int_state_reg = netxen_get_ioaddr(adapter,
631 CRB_INT_VECTOR); 622 CRB_INT_VECTOR);
623}
632 624
633 netxen_set_msix_bit(pdev, 0); 625static int netxen_setup_msi_interrupts(struct netxen_adapter *adapter,
626 int num_msix)
627{
628 struct pci_dev *pdev = adapter->pdev;
629 u32 value;
630 int err;
634 631
635 if (adapter->msix_supported) { 632 if (adapter->msix_supported) {
636
637 netxen_init_msix_entries(adapter, num_msix); 633 netxen_init_msix_entries(adapter, num_msix);
638 err = pci_enable_msix(pdev, adapter->msix_entries, num_msix); 634 err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
639 if (err == 0) { 635 if (err == 0) {
@@ -644,26 +640,45 @@ netxen_setup_intr(struct netxen_adapter *adapter)
644 adapter->max_sds_rings = num_msix; 640 adapter->max_sds_rings = num_msix;
645 641
646 dev_info(&pdev->dev, "using msi-x interrupts\n"); 642 dev_info(&pdev->dev, "using msi-x interrupts\n");
647 return; 643 return 0;
648 } 644 }
649
650 if (err > 0)
651 pci_disable_msix(pdev);
652
653 /* fall through for msi */ 645 /* fall through for msi */
654 } 646 }
655 647
656 if (use_msi && !pci_enable_msi(pdev)) { 648 if (use_msi && !pci_enable_msi(pdev)) {
649 value = msi_tgt_status[adapter->ahw.pci_func];
657 adapter->flags |= NETXEN_NIC_MSI_ENABLED; 650 adapter->flags |= NETXEN_NIC_MSI_ENABLED;
658 adapter->tgt_status_reg = netxen_get_ioaddr(adapter, 651 adapter->tgt_status_reg = netxen_get_ioaddr(adapter, value);
659 msi_tgt_status[adapter->ahw.pci_func]);
660 dev_info(&pdev->dev, "using msi interrupts\n");
661 adapter->msix_entries[0].vector = pdev->irq; 652 adapter->msix_entries[0].vector = pdev->irq;
662 return; 653 dev_info(&pdev->dev, "using msi interrupts\n");
654 return 0;
663 } 655 }
664 656
665 dev_info(&pdev->dev, "using legacy interrupts\n"); 657 return -EIO;
658}
659
660static void netxen_setup_intr(struct netxen_adapter *adapter)
661{
662 struct pci_dev *pdev = adapter->pdev;
663 int num_msix;
664
665 if (adapter->rss_supported)
666 num_msix = (num_online_cpus() >= MSIX_ENTRIES_PER_ADAPTER) ?
667 MSIX_ENTRIES_PER_ADAPTER : 2;
668 else
669 num_msix = 1;
670
671 adapter->max_sds_rings = 1;
672 adapter->flags &= ~(NETXEN_NIC_MSI_ENABLED | NETXEN_NIC_MSIX_ENABLED);
673
674 netxen_initialize_interrupt_registers(adapter);
675 netxen_set_msix_bit(pdev, 0);
676
677 if (!netxen_setup_msi_interrupts(adapter, num_msix))
678 return;
679
666 adapter->msix_entries[0].vector = pdev->irq; 680 adapter->msix_entries[0].vector = pdev->irq;
681 dev_info(&pdev->dev, "using legacy interrupts\n");
667} 682}
668 683
669static void 684static void