[PATCH] brcm80211: handle missing firmware

Gábor Stefanik netrolller.3d at gmail.com
Tue Sep 28 08:27:28 UTC 2010


On Tue, Sep 28, 2010 at 2:43 AM, Brett Rudley <brudley at broadcom.com> wrote:
>
> Handle case when firmware files are missing more gracefully.
>
> Signed-off-by: Brett Rudley <brudley at broadcom.com>
> ---
>  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 at linuxdriverproject.org
> http://driverdev.linuxdriverproject.org/mailman/listinfo/devel
>



-- 
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)



More information about the devel mailing list