diff options
author | Dhananjay Phadke <dhananjay@netxen.com> | 2009-04-28 11:29:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-04-29 01:44:31 -0400 |
commit | f7185c71234434d48b96f9a0387737df1759a4af (patch) | |
tree | 1974fad5606305f11a750e66ec1e45f0f89a65ac /drivers/net/netxen/netxen_nic_main.c | |
parent | 4ea528a151549df795c984649d75860ea40390bd (diff) |
netxen: fix firmware download
o hold the firmware in memory across suspend, since filesystem
may not be up after resuming.
o reset the chip after requesting firmware, to minimize downtime
for NC-SI.
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 | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 07959fe06f2..5d79c19a6ec 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -654,19 +654,17 @@ err_out: | |||
654 | } | 654 | } |
655 | 655 | ||
656 | static int | 656 | static int |
657 | netxen_start_firmware(struct netxen_adapter *adapter) | 657 | netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) |
658 | { | 658 | { |
659 | int val, err, first_boot; | 659 | int val, err, first_boot; |
660 | struct pci_dev *pdev = adapter->pdev; | 660 | struct pci_dev *pdev = adapter->pdev; |
661 | 661 | ||
662 | int first_driver = 0; | 662 | int first_driver = 0; |
663 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | 663 | |
664 | if (adapter->ahw.pci_func == 0) | 664 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) |
665 | first_driver = 1; | 665 | first_driver = (adapter->portnum == 0); |
666 | } else { | 666 | else |
667 | if (adapter->portnum == 0) | 667 | first_driver = (adapter->ahw.pci_func == 0); |
668 | first_driver = 1; | ||
669 | } | ||
670 | 668 | ||
671 | if (!first_driver) | 669 | if (!first_driver) |
672 | return 0; | 670 | return 0; |
@@ -679,6 +677,9 @@ netxen_start_firmware(struct netxen_adapter *adapter) | |||
679 | return err; | 677 | return err; |
680 | } | 678 | } |
681 | 679 | ||
680 | if (request_fw) | ||
681 | netxen_request_firmware(adapter); | ||
682 | |||
682 | if (first_boot != 0x55555555) { | 683 | if (first_boot != 0x55555555) { |
683 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); | 684 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); |
684 | netxen_pinit_from_rom(adapter, 0); | 685 | netxen_pinit_from_rom(adapter, 0); |
@@ -1014,7 +1015,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1014 | break; | 1015 | break; |
1015 | } | 1016 | } |
1016 | 1017 | ||
1017 | err = netxen_start_firmware(adapter); | 1018 | err = netxen_start_firmware(adapter, 1); |
1018 | if (err) | 1019 | if (err) |
1019 | goto err_out_iounmap; | 1020 | goto err_out_iounmap; |
1020 | 1021 | ||
@@ -1125,6 +1126,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
1125 | 1126 | ||
1126 | netxen_cleanup_pci_map(adapter); | 1127 | netxen_cleanup_pci_map(adapter); |
1127 | 1128 | ||
1129 | netxen_release_firmware(adapter); | ||
1130 | |||
1128 | pci_release_regions(pdev); | 1131 | pci_release_regions(pdev); |
1129 | pci_disable_device(pdev); | 1132 | pci_disable_device(pdev); |
1130 | pci_set_drvdata(pdev, NULL); | 1133 | pci_set_drvdata(pdev, NULL); |
@@ -1176,7 +1179,7 @@ netxen_nic_resume(struct pci_dev *pdev) | |||
1176 | 1179 | ||
1177 | adapter->curr_window = 255; | 1180 | adapter->curr_window = 255; |
1178 | 1181 | ||
1179 | err = netxen_start_firmware(adapter); | 1182 | err = netxen_start_firmware(adapter, 0); |
1180 | if (err) { | 1183 | if (err) { |
1181 | dev_err(&pdev->dev, "failed to start firmware\n"); | 1184 | dev_err(&pdev->dev, "failed to start firmware\n"); |
1182 | return err; | 1185 | return err; |