Am Montag 29 Oktober 2007 schrieb Tilman Schmidt:
> From: Tilman Schmidt <[EMAIL PROTECTED]>
> 
> Add basic suspend/resume support to the usb_gigaset driver.
> 
> Signed-off-by: Tilman Schmidt <[EMAIL PROTECTED]>
> ---
> 
>  drivers/isdn/gigaset/usb-gigaset.c |   69 
> ++++++++++++++++++++++++++++++++++++-
>  1 file changed, 68 insertions(+), 1 deletion(-)
> 
> --- a/drivers/isdn/gigaset/usb-gigaset.c      2007-10-23 01:48:12.000000000 
> +0200
> +++ b/drivers/isdn/gigaset/usb-gigaset.c      2007-10-24 00:47:32.000000000 
> +0200
> @@ -104,10 +104,15 @@ MODULE_DEVICE_TABLE(usb, gigaset_table);
>   * flags per packet.
>   */
>  
> +/* functions called if a device of this driver is connected/disconnected */
>  static int gigaset_probe(struct usb_interface *interface,
>                        const struct usb_device_id *id);
>  static void gigaset_disconnect(struct usb_interface *interface);
>  
> +/* functions called before/after suspend */
> +static int gigaset_suspend(struct usb_interface *intf, pm_message_t message);
> +static int gigaset_resume(struct usb_interface *intf);
> +
>  static struct gigaset_driver *driver = NULL;
>  static struct cardstate *cardstate = NULL;
>  
> @@ -117,6 +122,11 @@ static struct usb_driver gigaset_usb_dri
>       .probe =        gigaset_probe,
>       .disconnect =   gigaset_disconnect,
>       .id_table =     gigaset_table,
> +     .suspend =      gigaset_suspend,
> +     .resume =       gigaset_resume,
> +     .reset_resume = gigaset_resume,
> +     .pre_reset =    gigaset_suspend,
> +     .post_reset =   gigaset_resume,
>  };
>  
>  struct usb_cardstate {
> @@ -831,7 +843,7 @@ static void gigaset_disconnect(struct us
>       usb_set_intfdata(interface, NULL);
>       tasklet_kill(&cs->write_tasklet);
>  
> -     usb_kill_urb(ucs->bulk_out_urb);        /* FIXME: only if active? */
> +     usb_kill_urb(ucs->bulk_out_urb);
>  
>       kfree(ucs->bulk_out_buffer);
>       usb_free_urb(ucs->bulk_out_urb);
> @@ -847,6 +859,63 @@ static void gigaset_disconnect(struct us
>       gigaset_unassign(cs);
>  }
>  
> +/* gigaset_suspend
> + * This function is called before the USB connection is suspended or reset.
> + */
> +static int gigaset_suspend(struct usb_interface *intf, pm_message_t message)
> +{
> +     struct cardstate *cs;
> +     struct usb_cardstate *ucs;
> +     int rc;
> +
> +     if ((cs = usb_get_intfdata(intf)) == NULL ||
> +         (ucs = cs->hw.usb) == NULL) {
> +             err("%s: no cardstate", __func__);
> +             return -EFAULT;
> +     }
> +
> +     //FIXME stop common module activities? ISDN_STAT_STOP? block open()?
> +
> +     /* stop submitting bulk URBs */
> +     tasklet_disable(&cs->write_tasklet);
> +
> +     /* kill pending read URB */
> +     usb_kill_urb(ucs->read_urb);

no pending write URB?

        Regards
                Oliver
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to