aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bnx2.c
diff options
context:
space:
mode:
authorfrançois romieu <romieu@fr.zoreil.com>2011-09-29 20:36:52 -0400
committerDavid S. Miller <davem@davemloft.net>2011-10-03 14:09:10 -0400
commit7880b72e94fd3cf3283de6752175191583bce9f0 (patch)
treec758b01cf118d38b60abc8b2db0ff13873c30e8e /drivers/net/ethernet/broadcom/bnx2.c
parent96c131842aab45b5d139d0bcb417796819f5ee92 (diff)
bnx2: don't request firmware when there's no userspace.
The firmware is cached during the first successful call to open() and released once the network device is unregistered. The driver uses the cached firmware between open() and unregister_netdev(). It's similar to 953a12cc2889d1be92e80a2d0bab5ffef4942300 but the firmware is mandatory. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Reviewed-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2.c')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2.c67
1 files changed, 41 insertions, 26 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index 9afb6534cabe..21bdda3766b1 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -3623,7 +3623,7 @@ bnx2_set_rx_mode(struct net_device *dev)
3623 spin_unlock_bh(&bp->phy_lock); 3623 spin_unlock_bh(&bp->phy_lock);
3624} 3624}
3625 3625
3626static int __devinit 3626static int
3627check_fw_section(const struct firmware *fw, 3627check_fw_section(const struct firmware *fw,
3628 const struct bnx2_fw_file_section *section, 3628 const struct bnx2_fw_file_section *section,
3629 u32 alignment, bool non_empty) 3629 u32 alignment, bool non_empty)
@@ -3639,7 +3639,7 @@ check_fw_section(const struct firmware *fw,
3639 return 0; 3639 return 0;
3640} 3640}
3641 3641
3642static int __devinit 3642static int
3643check_mips_fw_entry(const struct firmware *fw, 3643check_mips_fw_entry(const struct firmware *fw,
3644 const struct bnx2_mips_fw_file_entry *entry) 3644 const struct bnx2_mips_fw_file_entry *entry)
3645{ 3645{
@@ -3650,8 +3650,16 @@ check_mips_fw_entry(const struct firmware *fw,
3650 return 0; 3650 return 0;
3651} 3651}
3652 3652
3653static int __devinit 3653static void bnx2_release_firmware(struct bnx2 *bp)
3654bnx2_request_firmware(struct bnx2 *bp) 3654{
3655 if (bp->rv2p_firmware) {
3656 release_firmware(bp->mips_firmware);
3657 release_firmware(bp->rv2p_firmware);
3658 bp->rv2p_firmware = NULL;
3659 }
3660}
3661
3662static int bnx2_request_uncached_firmware(struct bnx2 *bp)
3655{ 3663{
3656 const char *mips_fw_file, *rv2p_fw_file; 3664 const char *mips_fw_file, *rv2p_fw_file;
3657 const struct bnx2_mips_fw_file *mips_fw; 3665 const struct bnx2_mips_fw_file *mips_fw;
@@ -3673,13 +3681,13 @@ bnx2_request_firmware(struct bnx2 *bp)
3673 rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev); 3681 rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
3674 if (rc) { 3682 if (rc) {
3675 pr_err("Can't load firmware file \"%s\"\n", mips_fw_file); 3683 pr_err("Can't load firmware file \"%s\"\n", mips_fw_file);
3676 return rc; 3684 goto out;
3677 } 3685 }
3678 3686
3679 rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev); 3687 rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
3680 if (rc) { 3688 if (rc) {
3681 pr_err("Can't load firmware file \"%s\"\n", rv2p_fw_file); 3689 pr_err("Can't load firmware file \"%s\"\n", rv2p_fw_file);
3682 return rc; 3690 goto err_release_mips_firmware;
3683 } 3691 }
3684 mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data; 3692 mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
3685 rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data; 3693 rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
@@ -3690,16 +3698,30 @@ bnx2_request_firmware(struct bnx2 *bp)
3690 check_mips_fw_entry(bp->mips_firmware, &mips_fw->tpat) || 3698 check_mips_fw_entry(bp->mips_firmware, &mips_fw->tpat) ||
3691 check_mips_fw_entry(bp->mips_firmware, &mips_fw->txp)) { 3699 check_mips_fw_entry(bp->mips_firmware, &mips_fw->txp)) {
3692 pr_err("Firmware file \"%s\" is invalid\n", mips_fw_file); 3700 pr_err("Firmware file \"%s\" is invalid\n", mips_fw_file);
3693 return -EINVAL; 3701 rc = -EINVAL;
3702 goto err_release_firmware;
3694 } 3703 }
3695 if (bp->rv2p_firmware->size < sizeof(*rv2p_fw) || 3704 if (bp->rv2p_firmware->size < sizeof(*rv2p_fw) ||
3696 check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc1.rv2p, 8, true) || 3705 check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc1.rv2p, 8, true) ||
3697 check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc2.rv2p, 8, true)) { 3706 check_fw_section(bp->rv2p_firmware, &rv2p_fw->proc2.rv2p, 8, true)) {
3698 pr_err("Firmware file \"%s\" is invalid\n", rv2p_fw_file); 3707 pr_err("Firmware file \"%s\" is invalid\n", rv2p_fw_file);
3699 return -EINVAL; 3708 rc = -EINVAL;
3709 goto err_release_firmware;
3700 } 3710 }
3711out:
3712 return rc;
3701 3713
3702 return 0; 3714err_release_firmware:
3715 release_firmware(bp->rv2p_firmware);
3716 bp->rv2p_firmware = NULL;
3717err_release_mips_firmware:
3718 release_firmware(bp->mips_firmware);
3719 goto out;
3720}
3721
3722static int bnx2_request_firmware(struct bnx2 *bp)
3723{
3724 return bp->rv2p_firmware ? 0 : bnx2_request_uncached_firmware(bp);
3703} 3725}
3704 3726
3705static u32 3727static u32
@@ -6267,6 +6289,10 @@ bnx2_open(struct net_device *dev)
6267 struct bnx2 *bp = netdev_priv(dev); 6289 struct bnx2 *bp = netdev_priv(dev);
6268 int rc; 6290 int rc;
6269 6291
6292 rc = bnx2_request_firmware(bp);
6293 if (rc < 0)
6294 goto out;
6295
6270 netif_carrier_off(dev); 6296 netif_carrier_off(dev);
6271 6297
6272 bnx2_set_power_state(bp, PCI_D0); 6298 bnx2_set_power_state(bp, PCI_D0);
@@ -6327,8 +6353,8 @@ bnx2_open(struct net_device *dev)
6327 netdev_info(dev, "using MSIX\n"); 6353 netdev_info(dev, "using MSIX\n");
6328 6354
6329 netif_tx_start_all_queues(dev); 6355 netif_tx_start_all_queues(dev);
6330 6356out:
6331 return 0; 6357 return rc;
6332 6358
6333open_err: 6359open_err:
6334 bnx2_napi_disable(bp); 6360 bnx2_napi_disable(bp);
@@ -6336,7 +6362,8 @@ open_err:
6336 bnx2_free_irq(bp); 6362 bnx2_free_irq(bp);
6337 bnx2_free_mem(bp); 6363 bnx2_free_mem(bp);
6338 bnx2_del_napi(bp); 6364 bnx2_del_napi(bp);
6339 return rc; 6365 bnx2_release_firmware(bp);
6366 goto out;
6340} 6367}
6341 6368
6342static void 6369static void
@@ -8354,10 +8381,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8354 8381
8355 pci_set_drvdata(pdev, dev); 8382 pci_set_drvdata(pdev, dev);
8356 8383
8357 rc = bnx2_request_firmware(bp);
8358 if (rc)
8359 goto error;
8360
8361 memcpy(dev->dev_addr, bp->mac_addr, 6); 8384 memcpy(dev->dev_addr, bp->mac_addr, 6);
8362 memcpy(dev->perm_addr, bp->mac_addr, 6); 8385 memcpy(dev->perm_addr, bp->mac_addr, 6);
8363 8386
@@ -8389,11 +8412,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8389 return 0; 8412 return 0;
8390 8413
8391error: 8414error:
8392 if (bp->mips_firmware)
8393 release_firmware(bp->mips_firmware);
8394 if (bp->rv2p_firmware)
8395 release_firmware(bp->rv2p_firmware);
8396
8397 if (bp->regview) 8415 if (bp->regview)
8398 iounmap(bp->regview); 8416 iounmap(bp->regview);
8399 pci_release_regions(pdev); 8417 pci_release_regions(pdev);
@@ -8414,11 +8432,6 @@ bnx2_remove_one(struct pci_dev *pdev)
8414 del_timer_sync(&bp->timer); 8432 del_timer_sync(&bp->timer);
8415 cancel_work_sync(&bp->reset_task); 8433 cancel_work_sync(&bp->reset_task);
8416 8434
8417 if (bp->mips_firmware)
8418 release_firmware(bp->mips_firmware);
8419 if (bp->rv2p_firmware)
8420 release_firmware(bp->rv2p_firmware);
8421
8422 if (bp->regview) 8435 if (bp->regview)
8423 iounmap(bp->regview); 8436 iounmap(bp->regview);
8424 8437
@@ -8429,6 +8442,8 @@ bnx2_remove_one(struct pci_dev *pdev)
8429 bp->flags &= ~BNX2_FLAG_AER_ENABLED; 8442 bp->flags &= ~BNX2_FLAG_AER_ENABLED;
8430 } 8443 }
8431 8444
8445 bnx2_release_firmware(bp);
8446
8432 free_netdev(dev); 8447 free_netdev(dev);
8433 8448
8434 pci_release_regions(pdev); 8449 pci_release_regions(pdev);