From: Colin Leroy This patch enables power management (suspend, resume) support for zd1201. It fixes problems after wakeup for me, but these problems did not appear everytime without this patch. it's a bit empirical, based on what the usbnet does, so maybe not correct... Maybe someone can give it a look before it's applied. Signed-off-by: Colin Leroy Signed-off-by: Andrew Morton --- 25-akpm/drivers/usb/net/zd1201.c | 38 ++++++++++++++++++++++++++++++++++++++ 25-akpm/drivers/usb/net/zd1201.h | 1 + 2 files changed, 39 insertions(+) diff -puN drivers/usb/net/zd1201.c~pm-support-for-zd1201 drivers/usb/net/zd1201.c --- 25/drivers/usb/net/zd1201.c~pm-support-for-zd1201 Fri Apr 1 14:20:31 2005 +++ 25-akpm/drivers/usb/net/zd1201.c Fri Apr 1 14:20:31 2005 @@ -1883,12 +1883,50 @@ void zd1201_disconnect(struct usb_interf kfree(zd); } +#ifdef CONFIG_PM + +static int zd1201_suspend (struct usb_interface *interface, + pm_message_t message) +{ + struct zd1201 *zd = (struct zd1201 *)usb_get_intfdata(interface); + + netif_device_detach(zd->dev); + + zd->was_enabled = zd->mac_enabled; + + if (zd->was_enabled) + return zd1201_disable(zd); + else + return 0; +} + +static int zd1201_resume (struct usb_interface *interface) +{ + struct zd1201 *zd = (struct zd1201 *)usb_get_intfdata(interface); + + netif_device_attach(zd->dev); + + if (zd->was_enabled) + return zd1201_enable(zd); + else + return 0; +} + +#else + +#define zd1201_suspend NULL +#define zd1201_resume NULL + +#endif + static struct usb_driver zd1201_usb = { .owner = THIS_MODULE, .name = "zd1201", .probe = zd1201_probe, .disconnect = zd1201_disconnect, .id_table = zd1201_table, + .suspend = zd1201_suspend, + .resume = zd1201_resume, }; static int __init zd1201_init(void) diff -puN drivers/usb/net/zd1201.h~pm-support-for-zd1201 drivers/usb/net/zd1201.h --- 25/drivers/usb/net/zd1201.h~pm-support-for-zd1201 Fri Apr 1 14:20:31 2005 +++ 25-akpm/drivers/usb/net/zd1201.h Fri Apr 1 14:20:31 2005 @@ -46,6 +46,7 @@ struct zd1201 { char essid[IW_ESSID_MAX_SIZE+1]; int essidlen; int mac_enabled; + int was_enabled; int monitor; int encode_enabled; int encode_restricted; _