[PATCH] libertas: move reset_device() code main.c to if_usb.c
Marcelo Tosatti
marcelo at kvack.org
Mon Feb 26 10:34:50 EST 2007
On Sat, Feb 24, 2007 at 04:57:54PM +0100, Holger Schurig wrote:
> The reset_device() logic is only needed for USB devices, not for CF devices.
Holger,
This is not true: reset_device() sends the HostCmd_CMD_802_11_RESET
command to firmware, which is not an USB specific thing.
So we want to keep the
for_each_device(dev)
reset_device(dev)
loop in wlan_cleanup_module.
> Signed-off-by: Holger Schurig <hs4233 at mail.mn-solutions.de>
> ---
> drivers/net/wireless/libertas/decl.h | 1 -
> drivers/net/wireless/libertas/if_usb.c | 37 ++++++++++++++++++++++++++++++-
> drivers/net/wireless/libertas/main.c | 25 ---------------------
> 3 files changed, 35 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
> index 87c977f..cb4aba6 100644
> --- a/drivers/net/wireless/libertas/decl.h
> +++ b/drivers/net/wireless/libertas/decl.h
> @@ -73,7 +73,6 @@ extern void libertas_mac_event_disconnected(wlan_private * priv);
>
> void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str);
>
> -int reset_device(wlan_private *priv);
> /* main.c */
> extern struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band,
> int *cfp_no);
> diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
> index 87e6076..5bc7688 100644
> --- a/drivers/net/wireless/libertas/if_usb.c
> +++ b/drivers/net/wireless/libertas/if_usb.c
> @@ -17,6 +17,10 @@
>
> static const char usbdriver_name[] = "usb8xxx";
>
> +#define MAX_DEVS 5
> +static struct net_device *libertas_devs[MAX_DEVS];
> +static int libertas_found = 0;
> +
> static struct usb_device_id if_usb_table[] = {
> /* Enter the device signature inside */
> { USB_DEVICE(0x1286, 0x2001) },
> @@ -28,6 +32,7 @@ MODULE_DEVICE_TABLE(usb, if_usb_table);
>
> static void if_usb_receive(struct urb *urb);
> static void if_usb_receive_fwload(struct urb *urb);
> +static int reset_device(wlan_private *priv);
>
> /**
> * @brief call back function to handle the status of the URB
> @@ -189,6 +194,12 @@ static int if_usb_probe(struct usb_interface *intf,
> */
> if (!(priv = wlan_add_card(usb_cardp)))
> goto dealloc;
> +
> + if (libertas_found < MAX_DEVS) {
> + libertas_devs[libertas_found] = priv->wlan_dev.netdev;
> + libertas_found++;
> + }
> +
> if (wlan_add_mesh(priv))
> goto dealloc;
>
> @@ -220,6 +231,7 @@ static void if_usb_disconnect(struct usb_interface *intf)
> struct usb_card_rec *cardp = usb_get_intfdata(intf);
> wlan_private *priv = (wlan_private *) cardp->priv;
> wlan_adapter *adapter = NULL;
> + int i;
>
> adapter = priv->adapter;
>
> @@ -228,6 +240,14 @@ static void if_usb_disconnect(struct usb_interface *intf)
> */
> adapter->surpriseremoved = 1;
>
> + for (i = 0; i<libertas_found; i++) {
> + if (libertas_devs[i]==priv->wlan_dev.netdev) {
> + libertas_devs[i] = libertas_devs[--libertas_found];
> + libertas_devs[libertas_found] = NULL ;
> + break;
> + }
> + }
> +
> /* card is removed and we can call wlan_remove_card */
> lbs_deb_usbd(&cardp->udev->dev, "call remove card\n");
> wlan_remove_mesh(priv);
> @@ -330,12 +350,17 @@ static int libertas_do_reset(wlan_private *priv)
> int ret;
> struct usb_card_rec *cardp = priv->wlan_dev.card;
>
> + lbs_deb_enter(LBS_DEB_USB);
> +
> ret = usb_reset_device(cardp->udev);
> if (!ret) {
> msleep(10);
> reset_device(priv);
> msleep(10);
> }
> +
> + lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
> +
> return ret;
> }
>
> @@ -717,14 +742,16 @@ int libertas_sbi_read_event_cause(wlan_private * priv)
> return 0;
> }
>
> -int reset_device(wlan_private *priv)
> +static int reset_device(wlan_private *priv)
> {
> int ret;
>
> + lbs_deb_enter(LBS_DEB_USB);
> ret = libertas_prepare_and_send_command(priv, cmd_802_11_reset,
> cmd_act_halt, 0, 0, NULL);
> msleep_interruptible(10);
>
> + lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
> return ret;
> }
>
> @@ -934,7 +961,13 @@ int libertas_sbi_register(void)
> */
> void libertas_sbi_unregister(void)
> {
> + int i;
> +
> + for (i = 0; i<libertas_found; i++) {
> + wlan_private *priv = libertas_devs[i]->priv;
> + reset_device(priv);
> + }
> +
> /* API unregisters the driver from USB subsystem */
> usb_deregister(&if_usb_driver);
> - return;
> }
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 319c097..c674cb7 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -162,10 +162,6 @@ u8 libertas_adhoc_rates_g[G_SUPPORTED_RATES] =
> */
> u8 libertas_adhoc_rates_b[4] = { 0x82, 0x84, 0x8b, 0x96 };
>
> -#define MAX_DEVS 5
> -static struct net_device *libertas_devs[MAX_DEVS];
> -static int libertas_found = 0;
> -
> /**
> * the table to keep region code
> */
> @@ -852,11 +848,6 @@ wlan_private *wlan_add_card(void *card)
>
> libertas_debugfs_init_one(priv, dev);
>
> - if (libertas_found == MAX_DEVS)
> - goto err_init_fw;
> - libertas_devs[libertas_found] = dev;
> - libertas_found++;
> -
> lbs_deb_leave_args(LBS_DEB_NET, "priv %p", priv);
> return priv;
>
> @@ -961,7 +952,6 @@ int wlan_remove_card(wlan_private *priv)
> wlan_adapter *adapter;
> struct net_device *dev;
> union iwreq_data wrqu;
> - int i;
>
> lbs_deb_enter(LBS_DEB_NET);
>
> @@ -1004,14 +994,6 @@ int wlan_remove_card(wlan_private *priv)
> lbs_deb_net("free adapter\n");
> libertas_free_adapter(priv);
>
> - for (i = 0; i<libertas_found; i++) {
> - if (libertas_devs[i]==priv->wlan_dev.netdev) {
> - libertas_devs[i] = libertas_devs[--libertas_found];
> - libertas_devs[libertas_found] = NULL ;
> - break ;
> - }
> - }
> -
> lbs_deb_net("unregister finish\n");
>
> priv->wlan_dev.netdev = NULL;
> @@ -1162,15 +1144,8 @@ static int wlan_init_module(void)
>
> static void wlan_cleanup_module(void)
> {
> - int i;
> -
> lbs_deb_enter(LBS_DEB_MAIN);
>
> - for (i = 0; i<libertas_found; i++) {
> - wlan_private *priv = libertas_devs[i]->priv;
> - reset_device(priv);
> - }
> -
> libertas_sbi_unregister();
> libertas_debugfs_remove();
>
> --
> 1.4.4.4
>
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
More information about the libertas-dev
mailing list