if_spi: howto implement suspend/resume?

Mike Rapoport mike at compulab.co.il
Sun Apr 19 02:59:00 EDT 2009



Dan Williams wrote:
> On Fri, 2009-04-17 at 18:24 +0200, Uli Luckas wrote:
>> Hi all,
>> I am trying to implement suspend/resume support for libertas_spi as suspending 
>> a device with the libertas_spi driver loaded now crashes the kernel.
>> As I have no firmware documentation, I naively followed the if_usb driver.
>> As expected this did not work. With the patch below the kernel does not crash 
>> any more but the libertas chip is non-functional after resume:
>> Apr 17 18:14:51 [kernel] [    0.000931] libertas: I/O error

[ snip ]

>> Apr 17 18:14:51 [kernel] [    0.495033] libertas: DNLD_CMD: hw_host_to_card 
>> failed: -22
>>
>> Can anybody sched some ligt on how to approach suspend functionality in 
>> if_spi?
> 
> Does SPI suspend cut power to the libertas chip?  Does it do
> bus-specific low-power stuff?  The current suspend code assumes that the
> libertas chip does not require complete reinitialization (ie, new
> firmware load, etc), which of course implies that the libertas chip is
> still powered across suspend so that when the host wakes up, a command
> can simply be sent to the card that will wake it up.

I think that suspend behavior is machine dependent. In the hardware I have the
power to the libertas chip is cut during suspend, but in other platforms the
chip may be powered on.

> That is an artifact of the OLPC use-case, which isn't necessarily
> applicable elsewhere.
> 
> Dan
> 
>> Thanks
>> Uli
>>
>>
>> Index: drivers/net/wireless/libertas/if_spi.c
>> ===================================================================
>> --- drivers/net/wireless/libertas/if_spi.c	(revision 11391)
>> +++ drivers/net/wireless/libertas/if_spi.c	(working copy)
>> @@ -31,6 +31,7 @@
>>  #include "decl.h"
>>  #include "defs.h"
>>  #include "dev.h"
>> +#include "cmd.h"
>>  #include "if_spi.h"
>>  
>>  struct if_spi_packet {
>> @@ -1139,6 +1140,10 @@
>>  	if (err)
>>  		goto release_irq;
>>  
>> +	priv->wol_gpio = 2; /* Wake via GPIO2... */
>> +	priv->wol_gap = 20; /* ... after 20ms    */
>> +	lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);
>> +
>>  	lbs_deb_spi("Finished initializing WLAN module.\n");
>>  
>>  	/* successful exit */
>> @@ -1183,9 +1188,49 @@
>>  	return 0;
>>  }
>>  
>> +#ifdef CONFIG_PM
>> +static int if_spi_suspend(struct spi_device *spi, pm_message_t mesg)
>> +{
>> +	struct if_spi_card *card = spi_get_drvdata(spi);
>> +	struct lbs_private *priv = card->priv;
>> +	int ret;
>> +
>> +	lbs_deb_enter(LBS_DEB_USB);
>> +
>> +	ret = lbs_suspend(priv);
>> +	if (ret)
>> +		goto out;
>> +
>> + out:
>> +	lbs_deb_leave(LBS_DEB_USB);
>> +	return ret;
>> +}
>> +
>> +static int if_spi_resume(struct spi_device *spi)
>> +{
>> +	struct if_spi_card *card = spi_get_drvdata(spi);
>> +	struct lbs_private *priv = card->priv;
>> +
>> +	lbs_deb_enter(LBS_DEB_USB);
>> +
>> +	up(&card->spi_ready);
>> +
>> +	lbs_resume(priv);
>> +
>> +	lbs_deb_leave(LBS_DEB_USB);
>> +	return 0;
>> +}
>> +#else
>> +#define if_spi_suspend NULL
>> +#define if_spi_resume NULL
>> +#endif
>> +
>> +
>>  static struct spi_driver libertas_spi_driver = {
>>  	.probe	= if_spi_probe,
>>  	.remove = __devexit_p(libertas_spi_remove),
>> +	.suspend = if_spi_suspend,
>> +	.resume = if_spi_resume,
>>  	.driver = {
>>  		.name	= "libertas_spi",
>>  		.bus	= &spi_bus_type,
>>
>> -- 
>>
>> ------- ROAD ...the handyPC Company - - -  ) ) )
>>
>> Uli Luckas
>> Head of Software Development
>>
>> ROAD GmbH
>> Bennigsenstr. 14 | 12159 Berlin | Germany
>> fon: +49 (30) 230069 - 62 | fax: +49 (30) 230069 - 69
>> url: www.road.de
>>
>> Amtsgericht Charlottenburg: HRB 96688 B
>> Managing director: Hans-Peter Constien
>>
>>
>> _______________________________________________
>> libertas-dev mailing list
>> libertas-dev at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/libertas-dev
> 
> 
> _______________________________________________
> libertas-dev mailing list
> libertas-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/libertas-dev
> 

-- 
Sincerely yours,
Mike.




More information about the libertas-dev mailing list