aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-02-24 19:38:22 -0500
committerDavid S. Miller <davem@davemloft.net>2009-02-24 19:38:22 -0500
commitba599d4f0d2071abc049cb6345eab510a8a3643e (patch)
treee42bac74b45238e373d8d4b4de779ce83c1fd833 /drivers/net/netxen/netxen_nic_main.c
parent32344a394029baeca5bcc9fa839694b23a82cc64 (diff)
netxen: firmware download support
Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_main.c')
-rw-r--r--drivers/net/netxen/netxen_nic_main.c125
1 files changed, 62 insertions, 63 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 2648e9026726..9d6e68fe0c94 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -457,18 +457,65 @@ static const struct net_device_ops netxen_netdev_ops = {
457#endif 457#endif
458}; 458};
459 459
460/* 460static int
461 * netxen_nic_probe() 461netxen_start_firmware(struct netxen_adapter *adapter)
462 * 462{
463 * The Linux system will invoke this after identifying the vendor ID and 463 int val, err, first_boot;
464 * device Id in the pci_tbl supported by this module. 464 struct pci_dev *pdev = adapter->pdev;
465 * 465
466 * A quad port card has one operational PCI config space, (function 0), 466 first_boot = adapter->pci_read_normalize(adapter,
467 * which is used to access all four ports. 467 NETXEN_CAM_RAM(0x1fc));
468 * 468
469 * This routine will initialize the adapter, and setup the global parameters 469 err = netxen_check_hw_init(adapter, first_boot);
470 * along with the port's specific structure. 470 if (err) {
471 */ 471 dev_err(&pdev->dev, "error in init HW init sequence\n");
472 return err;
473 }
474
475 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
476 netxen_set_port_mode(adapter);
477
478 if (first_boot != 0x55555555) {
479 adapter->pci_write_normalize(adapter,
480 CRB_CMDPEG_STATE, 0);
481 netxen_pinit_from_rom(adapter, 0);
482 msleep(1);
483 }
484 netxen_load_firmware(adapter);
485
486 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
487
488 /* Initialize multicast addr pool owners */
489 val = 0x7654;
490 if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
491 val |= 0x0f000000;
492 netxen_crb_writelit_adapter(adapter,
493 NETXEN_MAC_ADDR_CNTL_REG, val);
494
495 }
496
497 err = netxen_initialize_adapter_offload(adapter);
498 if (err)
499 return err;
500
501 /*
502 * Tell the hardware our version number.
503 */
504 val = (_NETXEN_NIC_LINUX_MAJOR << 16)
505 | ((_NETXEN_NIC_LINUX_MINOR << 8))
506 | (_NETXEN_NIC_LINUX_SUBVERSION);
507 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, val);
508
509 /* Handshake with the card before we register the devices. */
510 err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
511 if (err) {
512 netxen_free_adapter_offload(adapter);
513 return err;
514 }
515
516 return 0;
517}
518
472static int __devinit 519static int __devinit
473netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 520netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
474{ 521{
@@ -484,7 +531,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
484 u8 __iomem *db_ptr = NULL; 531 u8 __iomem *db_ptr = NULL;
485 unsigned long mem_base, mem_len, db_base, db_len = 0, pci_len0 = 0; 532 unsigned long mem_base, mem_len, db_base, db_len = 0, pci_len0 = 0;
486 int i = 0, err; 533 int i = 0, err;
487 int first_driver, first_boot; 534 int first_driver;
488 u32 val; 535 u32 val;
489 int pci_func_id = PCI_FUNC(pdev->devfn); 536 int pci_func_id = PCI_FUNC(pdev->devfn);
490 struct netxen_legacy_intr_set *legacy_intrp; 537 struct netxen_legacy_intr_set *legacy_intrp;
@@ -736,56 +783,10 @@ skip_doorbell:
736 } 783 }
737 784
738 if (first_driver) { 785 if (first_driver) {
739 first_boot = adapter->pci_read_normalize(adapter, 786 err = netxen_start_firmware(adapter);
740 NETXEN_CAM_RAM(0x1fc));
741
742 err = netxen_check_hw_init(adapter, first_boot);
743 if (err) {
744 printk(KERN_ERR "%s: error in init HW init sequence\n",
745 netxen_nic_driver_name);
746 goto err_out_iounmap;
747 }
748
749 if (NX_IS_REVISION_P3(revision_id))
750 netxen_set_port_mode(adapter);
751
752 if (first_boot != 0x55555555) {
753 adapter->pci_write_normalize(adapter,
754 CRB_CMDPEG_STATE, 0);
755 netxen_pinit_from_rom(adapter, 0);
756 msleep(1);
757 }
758 netxen_load_firmware(adapter);
759
760 if (NX_IS_REVISION_P2(revision_id)) {
761
762 /* Initialize multicast addr pool owners */
763 val = 0x7654;
764 if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
765 val |= 0x0f000000;
766 netxen_crb_writelit_adapter(adapter,
767 NETXEN_MAC_ADDR_CNTL_REG, val);
768
769 }
770
771 err = netxen_initialize_adapter_offload(adapter);
772 if (err) 787 if (err)
773 goto err_out_iounmap; 788 goto err_out_iounmap;
774 789 }
775 /*
776 * Tell the hardware our version number.
777 */
778 i = (_NETXEN_NIC_LINUX_MAJOR << 16)
779 | ((_NETXEN_NIC_LINUX_MINOR << 8))
780 | (_NETXEN_NIC_LINUX_SUBVERSION);
781 adapter->pci_write_normalize(adapter, CRB_DRIVER_VERSION, i);
782
783 /* Handshake with the card before we register the devices. */
784 err = netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
785 if (err)
786 goto err_out_free_offload;
787
788 } /* first_driver */
789 790
790 netxen_nic_flash_print(adapter); 791 netxen_nic_flash_print(adapter);
791 792
@@ -890,14 +891,12 @@ err_out_disable_msi:
890 if (adapter->flags & NETXEN_NIC_MSI_ENABLED) 891 if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
891 pci_disable_msi(pdev); 892 pci_disable_msi(pdev);
892 893
893err_out_free_offload:
894 if (first_driver) 894 if (first_driver)
895 netxen_free_adapter_offload(adapter); 895 netxen_free_adapter_offload(adapter);
896 896
897err_out_iounmap: 897err_out_iounmap:
898 if (db_ptr) 898 if (db_ptr)
899 iounmap(db_ptr); 899 iounmap(db_ptr);
900
901 if (mem_ptr0) 900 if (mem_ptr0)
902 iounmap(mem_ptr0); 901 iounmap(mem_ptr0);
903 if (mem_ptr1) 902 if (mem_ptr1)