aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_main.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-04-28 11:29:11 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-29 01:44:31 -0400
commitf7185c71234434d48b96f9a0387737df1759a4af (patch)
tree1974fad5606305f11a750e66ec1e45f0f89a65ac /drivers/net/netxen/netxen_nic_main.c
parent4ea528a151549df795c984649d75860ea40390bd (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.c23
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
656static int 656static int
657netxen_start_firmware(struct netxen_adapter *adapter) 657netxen_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;