aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/netxen/netxen_nic_main.c133
1 files changed, 41 insertions, 92 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 7144c255ce54..6797ed069f1f 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -70,17 +70,15 @@ static void netxen_nic_poll_controller(struct net_device *netdev);
70static irqreturn_t netxen_intr(int irq, void *data); 70static irqreturn_t netxen_intr(int irq, void *data);
71static irqreturn_t netxen_msi_intr(int irq, void *data); 71static irqreturn_t netxen_msi_intr(int irq, void *data);
72 72
73int physical_port[] = {0, 1, 2, 3};
74
75/* PCI Device ID Table */ 73/* PCI Device ID Table */
76static struct pci_device_id netxen_pci_tbl[] __devinitdata = { 74static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
77 {PCI_DEVICE(0x4040, 0x0001)}, 75 {PCI_DEVICE(0x4040, 0x0001), PCI_DEVICE_CLASS(0x020000, ~0)},
78 {PCI_DEVICE(0x4040, 0x0002)}, 76 {PCI_DEVICE(0x4040, 0x0002), PCI_DEVICE_CLASS(0x020000, ~0)},
79 {PCI_DEVICE(0x4040, 0x0003)}, 77 {PCI_DEVICE(0x4040, 0x0003), PCI_DEVICE_CLASS(0x020000, ~0)},
80 {PCI_DEVICE(0x4040, 0x0004)}, 78 {PCI_DEVICE(0x4040, 0x0004), PCI_DEVICE_CLASS(0x020000, ~0)},
81 {PCI_DEVICE(0x4040, 0x0005)}, 79 {PCI_DEVICE(0x4040, 0x0005), PCI_DEVICE_CLASS(0x020000, ~0)},
82 {PCI_DEVICE(0x4040, 0x0024)}, 80 {PCI_DEVICE(0x4040, 0x0024), PCI_DEVICE_CLASS(0x020000, ~0)},
83 {PCI_DEVICE(0x4040, 0x0025)}, 81 {PCI_DEVICE(0x4040, 0x0025), PCI_DEVICE_CLASS(0x020000, ~0)},
84 {0,} 82 {0,}
85}; 83};
86 84
@@ -288,10 +286,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
288 int pci_func_id = PCI_FUNC(pdev->devfn); 286 int pci_func_id = PCI_FUNC(pdev->devfn);
289 DECLARE_MAC_BUF(mac); 287 DECLARE_MAC_BUF(mac);
290 288
291 printk(KERN_INFO "%s \n", netxen_nic_driver_string); 289 if (pci_func_id == 0)
290 printk(KERN_INFO "%s \n", netxen_nic_driver_string);
292 291
293 if (pdev->class != 0x020000) { 292 if (pdev->class != 0x020000) {
294 printk(KERN_ERR"NetXen function %d, class %x will not " 293 printk(KERN_DEBUG "NetXen function %d, class %x will not "
295 "be enabled.\n",pci_func_id, pdev->class); 294 "be enabled.\n",pci_func_id, pdev->class);
296 return -ENODEV; 295 return -ENODEV;
297 } 296 }
@@ -450,8 +449,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
450 */ 449 */
451 adapter->curr_window = 255; 450 adapter->curr_window = 255;
452 451
453 /* initialize the adapter */ 452 if (netxen_nic_get_board_info(adapter) != 0) {
454 netxen_initialize_adapter_hw(adapter); 453 printk("%s: Error getting board config info.\n",
454 netxen_nic_driver_name);
455 err = -EIO;
456 goto err_out_iounmap;
457 }
455 458
456 /* 459 /*
457 * Adapter in our case is quad port so initialize it before 460 * Adapter in our case is quad port so initialize it before
@@ -530,17 +533,15 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
530 netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ 533 netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */
531 534
532 /* Mezz cards have PCI function 0,2,3 enabled */ 535 /* Mezz cards have PCI function 0,2,3 enabled */
533 if ((adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) 536 switch (adapter->ahw.boardcfg.board_type) {
534 && (pci_func_id >= 2)) 537 case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ:
538 case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ:
539 if (pci_func_id >= 2)
535 adapter->portnum = pci_func_id - 2; 540 adapter->portnum = pci_func_id - 2;
536 541 break;
537#ifdef CONFIG_IA64 542 default:
538 if(adapter->portnum == 0) { 543 break;
539 netxen_pinit_from_rom(adapter, 0);
540 udelay(500);
541 netxen_load_firmware(adapter);
542 } 544 }
543#endif
544 545
545 init_timer(&adapter->watchdog_timer); 546 init_timer(&adapter->watchdog_timer);
546 adapter->ahw.xg_linkup = 0; 547 adapter->ahw.xg_linkup = 0;
@@ -613,11 +614,18 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
613 err = -ENODEV; 614 err = -ENODEV;
614 goto err_out_free_dev; 615 goto err_out_free_dev;
615 } 616 }
617 } else {
618 writel(0, NETXEN_CRB_NORMALIZE(adapter,
619 CRB_CMDPEG_STATE));
620 netxen_pinit_from_rom(adapter, 0);
621 msleep(1);
622 netxen_load_firmware(adapter);
623 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
616 } 624 }
617 625
618 /* clear the register for future unloads/loads */ 626 /* clear the register for future unloads/loads */
619 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); 627 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
620 printk(KERN_INFO "State: 0x%0x\n", 628 dev_info(&pdev->dev, "cmdpeg state: 0x%0x\n",
621 readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); 629 readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
622 630
623 /* 631 /*
@@ -639,9 +647,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
639 /* 647 /*
640 * See if the firmware gave us a virtual-physical port mapping. 648 * See if the firmware gave us a virtual-physical port mapping.
641 */ 649 */
650 adapter->physical_port = adapter->portnum;
642 i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); 651 i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum)));
643 if (i != 0x55555555) 652 if (i != 0x55555555)
644 physical_port[adapter->portnum] = i; 653 adapter->physical_port = i;
645 654
646 netif_carrier_off(netdev); 655 netif_carrier_off(netdev);
647 netif_stop_queue(netdev); 656 netif_stop_queue(netdev);
@@ -654,22 +663,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
654 goto err_out_free_dev; 663 goto err_out_free_dev;
655 } 664 }
656 665
666 netxen_nic_flash_print(adapter);
657 pci_set_drvdata(pdev, adapter); 667 pci_set_drvdata(pdev, adapter);
658 668
659 switch (adapter->ahw.board_type) {
660 case NETXEN_NIC_GBE:
661 printk(KERN_INFO "%s: QUAD GbE board initialized\n",
662 netxen_nic_driver_name);
663 break;
664
665 case NETXEN_NIC_XGBE:
666 printk(KERN_INFO "%s: XGbE board initialized\n",
667 netxen_nic_driver_name);
668 break;
669 }
670
671 adapter->driver_mismatch = 0;
672
673 return 0; 669 return 0;
674 670
675err_out_free_dev: 671err_out_free_dev:
@@ -760,55 +756,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
760 756
761 vfree(adapter->cmd_buf_arr); 757 vfree(adapter->cmd_buf_arr);
762 758
763 if (adapter->portnum == 0) { 759 if (adapter->portnum == 0)
764 if (init_firmware_done) { 760 netxen_free_adapter_offload(adapter);
765 i = 100;
766 do {
767 if (dma_watchdog_shutdown_request(adapter) == 1)
768 break;
769 msleep(100);
770 if (dma_watchdog_shutdown_poll_result(adapter) == 1)
771 break;
772 } while (--i);
773
774 if (i == 0)
775 printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n",
776 netdev->name);
777
778 /* clear the register for future unloads/loads */
779 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
780 printk(KERN_INFO "State: 0x%0x\n",
781 readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
782
783 /* leave the hw in the same state as reboot */
784 writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
785 netxen_pinit_from_rom(adapter, 0);
786 msleep(1);
787 netxen_load_firmware(adapter);
788 netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
789 }
790
791 /* clear the register for future unloads/loads */
792 writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc)));
793 printk(KERN_INFO "State: 0x%0x\n",
794 readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)));
795
796 i = 100;
797 do {
798 if (dma_watchdog_shutdown_request(adapter) == 1)
799 break;
800 msleep(100);
801 if (dma_watchdog_shutdown_poll_result(adapter) == 1)
802 break;
803 } while (--i);
804
805 if (i) {
806 netxen_free_adapter_offload(adapter);
807 } else {
808 printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n",
809 netdev->name);
810 }
811 }
812 761
813 if (adapter->irq) 762 if (adapter->irq)
814 free_irq(adapter->irq, adapter); 763 free_irq(adapter->irq, adapter);
@@ -840,13 +789,15 @@ static int netxen_nic_open(struct net_device *netdev)
840 irq_handler_t handler; 789 irq_handler_t handler;
841 unsigned long flags = IRQF_SAMPLE_RANDOM; 790 unsigned long flags = IRQF_SAMPLE_RANDOM;
842 791
792 if (adapter->driver_mismatch)
793 return -EIO;
794
843 if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { 795 if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) {
844 err = netxen_init_firmware(adapter); 796 err = netxen_init_firmware(adapter);
845 if (err != 0) { 797 if (err != 0) {
846 printk(KERN_ERR "Failed to init firmware\n"); 798 printk(KERN_ERR "Failed to init firmware\n");
847 return -EIO; 799 return -EIO;
848 } 800 }
849 netxen_nic_flash_print(adapter);
850 801
851 /* setup all the resources for the Phantom... */ 802 /* setup all the resources for the Phantom... */
852 /* this include the descriptors for rcv, tx, and status */ 803 /* this include the descriptors for rcv, tx, and status */
@@ -895,14 +846,12 @@ static int netxen_nic_open(struct net_device *netdev)
895 if (adapter->set_mtu) 846 if (adapter->set_mtu)
896 adapter->set_mtu(adapter, netdev->mtu); 847 adapter->set_mtu(adapter, netdev->mtu);
897 848
898 if (!adapter->driver_mismatch) 849 mod_timer(&adapter->watchdog_timer, jiffies);
899 mod_timer(&adapter->watchdog_timer, jiffies);
900 850
901 napi_enable(&adapter->napi); 851 napi_enable(&adapter->napi);
902 netxen_nic_enable_int(adapter); 852 netxen_nic_enable_int(adapter);
903 853
904 if (!adapter->driver_mismatch) 854 netif_start_queue(netdev);
905 netif_start_queue(netdev);
906 855
907 return 0; 856 return 0;
908} 857}