[PATCH] libertas: provide reset_card() callback on OLPC

Andres Salomon dilinger at queued.net
Tue May 20 12:19:25 EDT 2008


Awesome, I'll be happy to see this patch upstream.  Comments below.


On Tue, 20 May 2008 16:48:52 +0100
David Woodhouse <dwmw2 at infradead.org> wrote:

> Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
> 
> diff --git a/drivers/net/wireless/libertas/if_usb.c
> b/drivers/net/wireless/libertas/if_usb.c index 8032df7..8a7eb63 100644
> --- a/drivers/net/wireless/libertas/if_usb.c
> +++ b/drivers/net/wireless/libertas/if_usb.c
> @@ -7,6 +7,10 @@
>  #include <linux/netdevice.h>
>  #include <linux/usb.h>
>  
> +#ifdef CONFIG_OLPC
> +#include <asm/olpc.h>
> +#endif
> +
>  #define DRV_NAME "usb8xxx"
>  
>  #include "host.h"
> @@ -146,6 +150,14 @@ static void if_usb_fw_timeo(unsigned long priv)
>  	wake_up(&cardp->fw_wq);
>  }
>  
> +#ifdef CONFIG_OLPC
> +static int if_usb_reset_olpc_card(struct lbs_private *priv)
> +{
> +	printk(KERN_CRIT "Resetting OLPC wireless via EC...\n");
> +	olpc_ec_cmd(0x25, NULL, 0, NULL, 0);
> +}
> +#endif


Can you please add '#define EC_WIRELESS_RESET 0x25' (or whatever you want
to call it) to include/asm-x86/olpc.h, and use EC_WIRELESS_RESET here
rather than 0x25?  All EC commands should end up there.


> +
>  /**
>   *  @brief sets the configuration values
>   *  @param ifnum	interface number
> @@ -231,6 +243,11 @@ static int if_usb_probe(struct usb_interface
> *intf, cardp->priv->fw_ready = 1;
>  
>  	priv->hw_host_to_card = if_usb_host_to_card;
> +#ifdef CONFIG_OLPC
> +	if (machine_is_olpc())
> +		priv->reset_card = if_usb_reset_olpc_card;
> +#endif
> +

So, um, what happens if I plug a libertas dongle into an XO?  Is
machine_is_olpc() really enough to ensure that we want to reset this
specific libertas device?



>  	cardp->boot2_version = udev->descriptor.bcdDevice;
>  
>  	if_usb_submit_rx_urb(cardp);
> @@ -364,6 +381,11 @@ static int if_usb_reset_device(struct
> if_usb_card *cardp) ret = usb_reset_device(cardp->udev);
>  	msleep(100);
>  
> +#ifdef CONFIG_OLPC
> +	if (ret && machine_is_olpc())
> +		if_usb_reset_olpc_card(NULL);
> +#endif
> +

Any particular reason why we need the ifdef?  I'd prefer the following, if
it's a safe assumption to make:

if (ret && priv->reset_card)
	priv->reset_card(NULL);




>  	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
>  
>  	return ret;



More information about the libertas-dev mailing list