[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