diff options
author | Dhananjay Phadke <dhananjay@netxen.com> | 2009-02-24 19:38:22 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-02-24 19:38:22 -0500 |
commit | ba599d4f0d2071abc049cb6345eab510a8a3643e (patch) | |
tree | e42bac74b45238e373d8d4b4de779ce83c1fd833 /drivers/net/netxen/netxen_nic_main.c | |
parent | 32344a394029baeca5bcc9fa839694b23a82cc64 (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.c | 125 |
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 2648e902672..9d6e68fe0c9 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 | /* | 460 | static int |
461 | * netxen_nic_probe() | 461 | netxen_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 | |||
472 | static int __devinit | 519 | static int __devinit |
473 | netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 520 | netxen_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 | ||
893 | err_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 | ||
897 | err_out_iounmap: | 897 | err_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) |