On Tue, Sep 28, 2010 at 2:43 AM, Brett Rudley <brudley@xxxxxxxxxxxx> wrote: > > Handle case when firmware files are missing more gracefully. > > Signed-off-by: Brett Rudley <brudley@xxxxxxxxxxxx> > --- > drivers/staging/brcm80211/sys/wl_mac80211.c | 71 ++++++++++++++------------ > 1 files changed, 38 insertions(+), 33 deletions(-) > > diff --git a/drivers/staging/brcm80211/sys/wl_mac80211.c b/drivers/staging/brcm80211/sys/wl_mac80211.c > index 5400360..d718e9e 100644 > --- a/drivers/staging/brcm80211/sys/wl_mac80211.c > +++ b/drivers/staging/brcm80211/sys/wl_mac80211.c > @@ -187,6 +187,7 @@ static struct pci_device_id wl_id_table[] = { > }; > > MODULE_DEVICE_TABLE(pci, wl_id_table); > +static void __devexit wl_remove(struct pci_dev *pdev); > #endif /* !BCMSDIO */ > > #ifdef BCMSDIO > @@ -284,7 +285,7 @@ static int wl_ops_tx_nl(struct ieee80211_hw *hw, struct sk_buff *skb) > goto done; > } > status = wl_start(skb, wl); > - done: > +done: Unrelated changes creeping into this patch? > return status; > } > #else > @@ -299,7 +300,7 @@ static int wl_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb) > goto done; > } > status = wl_start(skb, wl); > - done: > +done: > WL_UNLOCK(wl); > return status; > } > @@ -450,7 +451,7 @@ static int wl_ops_config(struct ieee80211_hw *hw, u32 changed) > } > } > > - config_out: > +config_out: > return err; > } > > @@ -902,9 +903,11 @@ static wl_info_t *wl_attach(uint16 vendor, uint16 device, ulong regs, > #ifndef WLC_HIGH_ONLY > /* prepare ucode */ > if (wl_request_fw(wl, (struct pci_dev *)btparam)) { > - printf("%s: %s driver failed\n", KBUILD_MODNAME, > - EPI_VERSION_STR); > - goto fail; > + printf("%s: Failed to find firmware usually in %s\n", > + KBUILD_MODNAME, "/lib/firmware/brcm"); > + wl_release_fw(wl); > + wl_remove((struct pci_dev *)btparam); > + goto fail1; > } > #endif > > @@ -915,8 +918,8 @@ static wl_info_t *wl_attach(uint16 vendor, uint16 device, ulong regs, > wl_release_fw(wl); > #endif > if (!wl->wlc) { > - printf("%s: %s driver failed with code %d\n", KBUILD_MODNAME, > - EPI_VERSION_STR, err); > + printf("%s: %s wlc_attach() failed with code %d\n", > + KBUILD_MODNAME, EPI_VERSION_STR, err); > goto fail; > } > wl->pub = wlc_pub(wl->wlc); > @@ -1016,8 +1019,9 @@ static wl_info_t *wl_attach(uint16 vendor, uint16 device, ulong regs, > wl_found++; > return wl; > > - fail: > +fail: > wl_free(wl); > +fail1: > return NULL; > } > > @@ -1189,9 +1193,6 @@ static void wl_dbus_disconnect_cb(void *arg) > } > #endif /* WLC_HIGH_ONLY */ > > -#ifndef BCMSDIO > -static void __devexit wl_remove(struct pci_dev *pdev); > -#endif > > #define CHAN2GHZ(channel, freqency, chflags) { \ > .band = IEEE80211_BAND_2GHZ, \ > @@ -1510,8 +1511,13 @@ wl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) > wl = wl_attach(pdev->vendor, pdev->device, pci_resource_start(pdev, 0), > PCI_BUS, pdev, pdev->irq); > > + if (!wl) { > + WL_ERROR(("%s: %s: wl_attach failed!\n", > + KBUILD_MODNAME, __func__)); > + return -ENODEV; > + } > return 0; > - err_1: > +err_1: > WL_ERROR(("%s: err_1: Major hoarkage\n", __func__)); > return 0; > } > @@ -1594,31 +1600,28 @@ static void __devexit wl_remove(struct pci_dev *pdev) > WL_ERROR(("wl: wl_remove: wlc_chipmatch failed\n")); > return; > } > - > - ieee80211_unregister_hw(hw); > - > - WL_LOCK(wl); > - wl_down(wl); > - WL_UNLOCK(wl); > - WL_NONE(("%s: Down\n", __func__)); > - > + if (wl->wlc) { > + ieee80211_unregister_hw(hw); > + WL_LOCK(wl); > + wl_down(wl); > + WL_UNLOCK(wl); > + WL_NONE(("%s: Down\n", __func__)); > + } > pci_disable_device(pdev); > - > wl_free(wl); > - > pci_set_drvdata(pdev, NULL); > ieee80211_free_hw(hw); > } > > static struct pci_driver wl_pci_driver = { > - .name = "brcm80211", > - .probe = wl_pci_probe, > + .name = "brcm80211", > + .probe = wl_pci_probe, > #ifdef LINUXSTA_PS > - .suspend = wl_suspend, > - .resume = wl_resume, > + .suspend = wl_suspend, > + .resume = wl_resume, > #endif /* LINUXSTA_PS */ > - .remove = __devexit_p(wl_remove), > - .id_table = wl_id_table, > + .remove = __devexit_p(wl_remove), > + .id_table = wl_id_table, > }; > #endif /* !BCMSDIO */ > > @@ -2016,7 +2019,7 @@ static void BCMFASTPATH wl_dpc(ulong data) > wl_intrson(wl); > } > > - done: > +done: > WL_UNLOCK(wl); > #endif /* WLC_LOW */ > } > @@ -2511,7 +2514,8 @@ static int wl_request_fw(wl_info_t *wl, struct pci_dev *pdev) > WL_NONE(("request fw %s\n", fw_name)); > status = request_firmware(&wl->fw.fw_bin[i], fw_name, device); > if (status) { > - printf("fail to request firmware %s\n", fw_name); > + printf("%s: fail to load firmware %s\n", > + KBUILD_MODNAME, fw_name); > wl_release_fw(wl); > return status; > } > @@ -2520,7 +2524,8 @@ static int wl_request_fw(wl_info_t *wl, struct pci_dev *pdev) > UCODE_LOADER_API_VER); > status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device); > if (status) { > - printf("fail to request firmware %s\n", fw_name); > + printf("%s: fail to load firmware %s\n", > + KBUILD_MODNAME, fw_name); > wl_release_fw(wl); > return status; > } > -- > 1.6.3.3 > > > _______________________________________________ > devel mailing list > devel@xxxxxxxxxxxxxxxxxxxxxx > http://driverdev.linuxdriverproject.org/mailman/listinfo/devel > -- Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-) _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel