diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 137 |
1 files changed, 45 insertions, 92 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7144c255ce54..63cd67b931e7 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -70,17 +70,19 @@ static void netxen_nic_poll_controller(struct net_device *netdev); | |||
70 | static irqreturn_t netxen_intr(int irq, void *data); | 70 | static irqreturn_t netxen_intr(int irq, void *data); |
71 | static irqreturn_t netxen_msi_intr(int irq, void *data); | 71 | static irqreturn_t netxen_msi_intr(int irq, void *data); |
72 | 72 | ||
73 | int physical_port[] = {0, 1, 2, 3}; | ||
74 | |||
75 | /* PCI Device ID Table */ | 73 | /* PCI Device ID Table */ |
74 | #define ENTRY(device) \ | ||
75 | {PCI_DEVICE(0x4040, (device)), \ | ||
76 | .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0} | ||
77 | |||
76 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { | 78 | static struct pci_device_id netxen_pci_tbl[] __devinitdata = { |
77 | {PCI_DEVICE(0x4040, 0x0001)}, | 79 | ENTRY(0x0001), |
78 | {PCI_DEVICE(0x4040, 0x0002)}, | 80 | ENTRY(0x0002), |
79 | {PCI_DEVICE(0x4040, 0x0003)}, | 81 | ENTRY(0x0003), |
80 | {PCI_DEVICE(0x4040, 0x0004)}, | 82 | ENTRY(0x0004), |
81 | {PCI_DEVICE(0x4040, 0x0005)}, | 83 | ENTRY(0x0005), |
82 | {PCI_DEVICE(0x4040, 0x0024)}, | 84 | ENTRY(0x0024), |
83 | {PCI_DEVICE(0x4040, 0x0025)}, | 85 | ENTRY(0x0025), |
84 | {0,} | 86 | {0,} |
85 | }; | 87 | }; |
86 | 88 | ||
@@ -288,10 +290,11 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
288 | int pci_func_id = PCI_FUNC(pdev->devfn); | 290 | int pci_func_id = PCI_FUNC(pdev->devfn); |
289 | DECLARE_MAC_BUF(mac); | 291 | DECLARE_MAC_BUF(mac); |
290 | 292 | ||
291 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | 293 | if (pci_func_id == 0) |
294 | printk(KERN_INFO "%s \n", netxen_nic_driver_string); | ||
292 | 295 | ||
293 | if (pdev->class != 0x020000) { | 296 | if (pdev->class != 0x020000) { |
294 | printk(KERN_ERR"NetXen function %d, class %x will not " | 297 | printk(KERN_DEBUG "NetXen function %d, class %x will not " |
295 | "be enabled.\n",pci_func_id, pdev->class); | 298 | "be enabled.\n",pci_func_id, pdev->class); |
296 | return -ENODEV; | 299 | return -ENODEV; |
297 | } | 300 | } |
@@ -450,8 +453,12 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
450 | */ | 453 | */ |
451 | adapter->curr_window = 255; | 454 | adapter->curr_window = 255; |
452 | 455 | ||
453 | /* initialize the adapter */ | 456 | if (netxen_nic_get_board_info(adapter) != 0) { |
454 | netxen_initialize_adapter_hw(adapter); | 457 | printk("%s: Error getting board config info.\n", |
458 | netxen_nic_driver_name); | ||
459 | err = -EIO; | ||
460 | goto err_out_iounmap; | ||
461 | } | ||
455 | 462 | ||
456 | /* | 463 | /* |
457 | * Adapter in our case is quad port so initialize it before | 464 | * Adapter in our case is quad port so initialize it before |
@@ -530,17 +537,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 */ | 537 | netxen_initialize_adapter_sw(adapter); /* initialize the buffers in adapter */ |
531 | 538 | ||
532 | /* Mezz cards have PCI function 0,2,3 enabled */ | 539 | /* Mezz cards have PCI function 0,2,3 enabled */ |
533 | if ((adapter->ahw.boardcfg.board_type == NETXEN_BRDTYPE_P2_SB31_10G_IMEZ) | 540 | switch (adapter->ahw.boardcfg.board_type) { |
534 | && (pci_func_id >= 2)) | 541 | case NETXEN_BRDTYPE_P2_SB31_10G_IMEZ: |
542 | case NETXEN_BRDTYPE_P2_SB31_10G_HMEZ: | ||
543 | if (pci_func_id >= 2) | ||
535 | adapter->portnum = pci_func_id - 2; | 544 | adapter->portnum = pci_func_id - 2; |
536 | 545 | break; | |
537 | #ifdef CONFIG_IA64 | 546 | default: |
538 | if(adapter->portnum == 0) { | 547 | break; |
539 | netxen_pinit_from_rom(adapter, 0); | ||
540 | udelay(500); | ||
541 | netxen_load_firmware(adapter); | ||
542 | } | 548 | } |
543 | #endif | ||
544 | 549 | ||
545 | init_timer(&adapter->watchdog_timer); | 550 | init_timer(&adapter->watchdog_timer); |
546 | adapter->ahw.xg_linkup = 0; | 551 | adapter->ahw.xg_linkup = 0; |
@@ -613,11 +618,18 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
613 | err = -ENODEV; | 618 | err = -ENODEV; |
614 | goto err_out_free_dev; | 619 | goto err_out_free_dev; |
615 | } | 620 | } |
621 | } else { | ||
622 | writel(0, NETXEN_CRB_NORMALIZE(adapter, | ||
623 | CRB_CMDPEG_STATE)); | ||
624 | netxen_pinit_from_rom(adapter, 0); | ||
625 | msleep(1); | ||
626 | netxen_load_firmware(adapter); | ||
627 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | ||
616 | } | 628 | } |
617 | 629 | ||
618 | /* clear the register for future unloads/loads */ | 630 | /* clear the register for future unloads/loads */ |
619 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); | 631 | writel(0, NETXEN_CRB_NORMALIZE(adapter, NETXEN_CAM_RAM(0x1fc))); |
620 | printk(KERN_INFO "State: 0x%0x\n", | 632 | dev_info(&pdev->dev, "cmdpeg state: 0x%0x\n", |
621 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); | 633 | readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE))); |
622 | 634 | ||
623 | /* | 635 | /* |
@@ -639,9 +651,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
639 | /* | 651 | /* |
640 | * See if the firmware gave us a virtual-physical port mapping. | 652 | * See if the firmware gave us a virtual-physical port mapping. |
641 | */ | 653 | */ |
654 | adapter->physical_port = adapter->portnum; | ||
642 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); | 655 | i = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_V2P(adapter->portnum))); |
643 | if (i != 0x55555555) | 656 | if (i != 0x55555555) |
644 | physical_port[adapter->portnum] = i; | 657 | adapter->physical_port = i; |
645 | 658 | ||
646 | netif_carrier_off(netdev); | 659 | netif_carrier_off(netdev); |
647 | netif_stop_queue(netdev); | 660 | netif_stop_queue(netdev); |
@@ -654,22 +667,9 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
654 | goto err_out_free_dev; | 667 | goto err_out_free_dev; |
655 | } | 668 | } |
656 | 669 | ||
670 | netxen_nic_flash_print(adapter); | ||
657 | pci_set_drvdata(pdev, adapter); | 671 | pci_set_drvdata(pdev, adapter); |
658 | 672 | ||
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; | 673 | return 0; |
674 | 674 | ||
675 | err_out_free_dev: | 675 | err_out_free_dev: |
@@ -760,55 +760,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
760 | 760 | ||
761 | vfree(adapter->cmd_buf_arr); | 761 | vfree(adapter->cmd_buf_arr); |
762 | 762 | ||
763 | if (adapter->portnum == 0) { | 763 | if (adapter->portnum == 0) |
764 | if (init_firmware_done) { | 764 | 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 | 765 | ||
813 | if (adapter->irq) | 766 | if (adapter->irq) |
814 | free_irq(adapter->irq, adapter); | 767 | free_irq(adapter->irq, adapter); |
@@ -840,13 +793,15 @@ static int netxen_nic_open(struct net_device *netdev) | |||
840 | irq_handler_t handler; | 793 | irq_handler_t handler; |
841 | unsigned long flags = IRQF_SAMPLE_RANDOM; | 794 | unsigned long flags = IRQF_SAMPLE_RANDOM; |
842 | 795 | ||
796 | if (adapter->driver_mismatch) | ||
797 | return -EIO; | ||
798 | |||
843 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { | 799 | if (adapter->is_up != NETXEN_ADAPTER_UP_MAGIC) { |
844 | err = netxen_init_firmware(adapter); | 800 | err = netxen_init_firmware(adapter); |
845 | if (err != 0) { | 801 | if (err != 0) { |
846 | printk(KERN_ERR "Failed to init firmware\n"); | 802 | printk(KERN_ERR "Failed to init firmware\n"); |
847 | return -EIO; | 803 | return -EIO; |
848 | } | 804 | } |
849 | netxen_nic_flash_print(adapter); | ||
850 | 805 | ||
851 | /* setup all the resources for the Phantom... */ | 806 | /* setup all the resources for the Phantom... */ |
852 | /* this include the descriptors for rcv, tx, and status */ | 807 | /* this include the descriptors for rcv, tx, and status */ |
@@ -895,14 +850,12 @@ static int netxen_nic_open(struct net_device *netdev) | |||
895 | if (adapter->set_mtu) | 850 | if (adapter->set_mtu) |
896 | adapter->set_mtu(adapter, netdev->mtu); | 851 | adapter->set_mtu(adapter, netdev->mtu); |
897 | 852 | ||
898 | if (!adapter->driver_mismatch) | 853 | mod_timer(&adapter->watchdog_timer, jiffies); |
899 | mod_timer(&adapter->watchdog_timer, jiffies); | ||
900 | 854 | ||
901 | napi_enable(&adapter->napi); | 855 | napi_enable(&adapter->napi); |
902 | netxen_nic_enable_int(adapter); | 856 | netxen_nic_enable_int(adapter); |
903 | 857 | ||
904 | if (!adapter->driver_mismatch) | 858 | netif_start_queue(netdev); |
905 | netif_start_queue(netdev); | ||
906 | 859 | ||
907 | return 0; | 860 | return 0; |
908 | } | 861 | } |