diff options
author | NeilBrown <neilb@suse.de> | 2012-12-10 09:09:00 +1100 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@no-log.org> | 2013-03-09 14:43:38 +0100 |
commit | ad4651d9e62579384216cb34596cd1e891e39936 (patch) | |
tree | af0eff2b882383b75fa9ec5de15df05a5fcc1ab1 | |
parent | cad25f2aa1bb329b9d55b5774e307f8741f5ec63 (diff) | |
download | kernel_goldelico_gta04-ad4651d9e62579384216cb34596cd1e891e39936.zip kernel_goldelico_gta04-ad4651d9e62579384216cb34596cd1e891e39936.tar.gz kernel_goldelico_gta04-ad4651d9e62579384216cb34596cd1e891e39936.tar.bz2 |
Revert "libertas CS: convert to asynchronous firmware loading"
This reverts commit 488c3ee77ea0e63c9ae4736b1610aaf39c6527ee.
-rw-r--r-- | drivers/net/wireless/libertas/if_cs.c | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 16beaf3..cee5052 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c @@ -738,50 +738,6 @@ done: return ret; } -static void if_cs_prog_firmware(struct lbs_private *priv, int ret, - const struct firmware *helper, - const struct firmware *mainfw) -{ - struct if_cs_card *card = priv->card; - - if (ret) { - pr_err("failed to find firmware (%d)\n", ret); - return; - } - - /* Load the firmware */ - ret = if_cs_prog_helper(card, helper); - if (ret == 0 && (card->model != MODEL_8305)) - ret = if_cs_prog_real(card, mainfw); - if (ret) - goto out; - - /* Now actually get the IRQ */ - ret = request_irq(card->p_dev->irq, if_cs_interrupt, - IRQF_SHARED, DRV_NAME, card); - if (ret) { - pr_err("error in request_irq\n"); - goto out; - } - - /* - * Clear any interrupt cause that happened while sending - * firmware/initializing card - */ - if_cs_write16(card, IF_CS_CARD_INT_CAUSE, IF_CS_BIT_MASK); - if_cs_enable_ints(card); - - /* And finally bring the card up */ - priv->fw_ready = 1; - if (lbs_start_card(priv) != 0) { - pr_err("could not activate card\n"); - free_irq(card->p_dev->irq, card); - } - -out: - release_firmware(helper); - release_firmware(mainfw); -} /********************************************************************/ @@ -853,6 +809,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev) unsigned int prod_id; struct lbs_private *priv; struct if_cs_card *card; + const struct firmware *helper = NULL; + const struct firmware *mainfw = NULL; lbs_deb_enter(LBS_DEB_CS); @@ -932,6 +890,20 @@ static int if_cs_probe(struct pcmcia_device *p_dev) goto out2; } + ret = lbs_get_firmware(&p_dev->dev, card->model, &fw_table[0], + &helper, &mainfw); + if (ret) { + pr_err("failed to find firmware (%d)\n", ret); + goto out2; + } + + /* Load the firmware early, before calling into libertas.ko */ + ret = if_cs_prog_helper(card, helper); + if (ret == 0 && (card->model != MODEL_8305)) + ret = if_cs_prog_real(card, mainfw); + if (ret) + goto out2; + /* Make this card known to the libertas driver */ priv = lbs_add_card(card, &p_dev->dev); if (!priv) { @@ -939,22 +911,37 @@ static int if_cs_probe(struct pcmcia_device *p_dev) goto out2; } - /* Set up fields in lbs_private */ + /* Finish setting up fields in lbs_private */ card->priv = priv; priv->card = card; priv->hw_host_to_card = if_cs_host_to_card; priv->enter_deep_sleep = NULL; priv->exit_deep_sleep = NULL; priv->reset_deep_sleep_wakeup = NULL; + priv->fw_ready = 1; - /* Get firmware */ - ret = lbs_get_firmware_async(priv, &p_dev->dev, card->model, fw_table, - if_cs_prog_firmware); + /* Now actually get the IRQ */ + ret = request_irq(p_dev->irq, if_cs_interrupt, + IRQF_SHARED, DRV_NAME, card); if (ret) { - pr_err("failed to find firmware (%d)\n", ret); + pr_err("error in request_irq\n"); goto out3; } + /* + * Clear any interrupt cause that happened while sending + * firmware/initializing card + */ + if_cs_write16(card, IF_CS_CARD_INT_CAUSE, IF_CS_BIT_MASK); + if_cs_enable_ints(card); + + /* And finally bring the card up */ + if (lbs_start_card(priv) != 0) { + pr_err("could not activate card\n"); + goto out3; + } + + ret = 0; goto out; out3: @@ -964,6 +951,9 @@ out2: out1: pcmcia_disable_device(p_dev); out: + release_firmware(helper); + release_firmware(mainfw); + lbs_deb_leave_args(LBS_DEB_CS, "ret %d", ret); return ret; } |