From zaitcev@redhat.com Mon May 22 21:59:07 2006 Date: Mon, 22 May 2006 21:58:49 -0700 From: Pete Zaitcev To: greg@kroah.com Cc: linux-usb-devel@lists.sourceforge.net Subject: USB serial: encapsulate schedule_work, remove double-calling Message-Id: <20060522215849.c2dafb6e.zaitcev@redhat.com> I'm going to throw schedule_work away, it's retarded. But for starters, let's have it encapsulated. Also, generic and whiteheat were both calling usb_serial_port_softint and scheduled work. Only one was necessary. Signed-off-by: Pete Zaitcev Signed-off-by: Greg Kroah-Hartman --- drivers/usb/serial/cyberjack.c | 2 +- drivers/usb/serial/cypress_m8.c | 2 +- drivers/usb/serial/empeg.c | 2 +- drivers/usb/serial/ftdi_sio.c | 2 +- drivers/usb/serial/garmin_gps.c | 2 +- drivers/usb/serial/generic.c | 4 +--- drivers/usb/serial/ipaq.c | 2 +- drivers/usb/serial/ipw.c | 2 +- drivers/usb/serial/ir-usb.c | 2 +- drivers/usb/serial/keyspan.c | 2 +- drivers/usb/serial/kl5kusb105.c | 3 +-- drivers/usb/serial/omninet.c | 2 +- drivers/usb/serial/option.c | 3 +-- drivers/usb/serial/pl2303.c | 2 +- drivers/usb/serial/usb-serial.c | 14 ++++++++++++-- drivers/usb/serial/usb-serial.h | 2 +- drivers/usb/serial/visor.c | 2 +- drivers/usb/serial/whiteheat.c | 4 +--- 18 files changed, 29 insertions(+), 25 deletions(-) --- gregkh-2.6.orig/drivers/usb/serial/cyberjack.c +++ gregkh-2.6/drivers/usb/serial/cyberjack.c @@ -469,7 +469,7 @@ static void cyberjack_write_bulk_callbac exit: spin_unlock(&priv->lock); - schedule_work(&port->work); + usb_serial_port_softint(port); } static int __init cyberjack_init (void) --- gregkh-2.6.orig/drivers/usb/serial/cypress_m8.c +++ gregkh-2.6/drivers/usb/serial/cypress_m8.c @@ -824,7 +824,7 @@ send: priv->bytes_out += count; /* do not count the line control and size bytes */ spin_unlock_irqrestore(&priv->lock, flags); - schedule_work(&port->work); + usb_serial_port_softint(port); } /* cypress_send */ --- gregkh-2.6.orig/drivers/usb/serial/empeg.c +++ gregkh-2.6/drivers/usb/serial/empeg.c @@ -335,7 +335,7 @@ static void empeg_write_bulk_callback (s return; } - schedule_work(&port->work); + usb_serial_port_softint(port); } --- gregkh-2.6.orig/drivers/usb/serial/ftdi_sio.c +++ gregkh-2.6/drivers/usb/serial/ftdi_sio.c @@ -1472,7 +1472,7 @@ static void ftdi_write_bulk_callback (st return; } - schedule_work(&port->work); + usb_serial_port_softint(port); } /* ftdi_write_bulk_callback */ --- gregkh-2.6.orig/drivers/usb/serial/garmin_gps.c +++ gregkh-2.6/drivers/usb/serial/garmin_gps.c @@ -1012,7 +1012,7 @@ static void garmin_write_bulk_callback ( garmin_data_p->flags |= CLEAR_HALT_REQUIRED; } - schedule_work(&port->work); + usb_serial_port_softint(port); } --- gregkh-2.6.orig/drivers/usb/serial/generic.c +++ gregkh-2.6/drivers/usb/serial/generic.c @@ -299,9 +299,7 @@ void usb_serial_generic_write_bulk_callb return; } - usb_serial_port_softint((void *)port); - - schedule_work(&port->work); + usb_serial_port_softint(port); } EXPORT_SYMBOL_GPL(usb_serial_generic_write_bulk_callback); --- gregkh-2.6.orig/drivers/usb/serial/ipaq.c +++ gregkh-2.6/drivers/usb/serial/ipaq.c @@ -870,7 +870,7 @@ static void ipaq_write_bulk_callback(str spin_unlock_irqrestore(&write_list_lock, flags); } - schedule_work(&port->work); + usb_serial_port_softint(port); } static int ipaq_write_room(struct usb_serial_port *port) --- gregkh-2.6.orig/drivers/usb/serial/ipw.c +++ gregkh-2.6/drivers/usb/serial/ipw.c @@ -376,7 +376,7 @@ static void ipw_write_bulk_callback(stru if (urb->status) dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status); - schedule_work(&port->work); + usb_serial_port_softint(port); } static int ipw_write(struct usb_serial_port *port, const unsigned char *buf, int count) --- gregkh-2.6.orig/drivers/usb/serial/ir-usb.c +++ gregkh-2.6/drivers/usb/serial/ir-usb.c @@ -408,7 +408,7 @@ static void ir_write_bulk_callback (stru urb->actual_length, urb->transfer_buffer); - schedule_work(&port->work); + usb_serial_port_softint(port); } static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs) --- gregkh-2.6.orig/drivers/usb/serial/keyspan.c +++ gregkh-2.6/drivers/usb/serial/keyspan.c @@ -481,7 +481,7 @@ static void usa2x_outdat_callback(struct dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]); if (port->open_count) - schedule_work(&port->work); + usb_serial_port_softint(port); } static void usa26_inack_callback(struct urb *urb, struct pt_regs *regs) --- gregkh-2.6.orig/drivers/usb/serial/kl5kusb105.c +++ gregkh-2.6/drivers/usb/serial/kl5kusb105.c @@ -569,8 +569,7 @@ static void klsi_105_write_bulk_callback return; } - /* from generic_write_bulk_callback */ - schedule_work(&port->work); + usb_serial_port_softint(port); } /* klsi_105_write_bulk_completion_callback */ --- gregkh-2.6.orig/drivers/usb/serial/omninet.c +++ gregkh-2.6/drivers/usb/serial/omninet.c @@ -320,7 +320,7 @@ static void omninet_write_bulk_callback return; } - schedule_work(&port->work); + usb_serial_port_softint(port); } --- gregkh-2.6.orig/drivers/usb/serial/option.c +++ gregkh-2.6/drivers/usb/serial/option.c @@ -365,8 +365,7 @@ static void option_outdat_callback(struc port = (struct usb_serial_port *) urb->context; - if (port->open_count) - schedule_work(&port->work); + usb_serial_port_softint(port); } static void option_instat_callback(struct urb *urb, struct pt_regs *regs) --- gregkh-2.6.orig/drivers/usb/serial/pl2303.c +++ gregkh-2.6/drivers/usb/serial/pl2303.c @@ -314,7 +314,7 @@ static void pl2303_send(struct usb_seria // TODO: reschedule pl2303_send } - schedule_work(&port->work); + usb_serial_port_softint(port); } static int pl2303_write_room(struct usb_serial_port *port) --- gregkh-2.6.orig/drivers/usb/serial/usb-serial.c +++ gregkh-2.6/drivers/usb/serial/usb-serial.c @@ -531,7 +531,17 @@ exit: return -EINVAL; } -void usb_serial_port_softint(void *private) +/* + * We would be calling tty_wakeup here, but unfortunately some line + * disciplines have an annoying habit of calling tty->write from + * the write wakeup callback (e.g. n_hdlc.c). + */ +void usb_serial_port_softint(struct usb_serial_port *port) +{ + schedule_work(&port->work); +} + +static void usb_serial_port_work(void *private) { struct usb_serial_port *port = private; struct tty_struct *tty; @@ -794,7 +804,7 @@ int usb_serial_probe(struct usb_interfac port->serial = serial; spin_lock_init(&port->lock); mutex_init(&port->mutex); - INIT_WORK(&port->work, usb_serial_port_softint, port); + INIT_WORK(&port->work, usb_serial_port_work, port); serial->port[i] = port; } --- gregkh-2.6.orig/drivers/usb/serial/usb-serial.h +++ gregkh-2.6/drivers/usb/serial/usb-serial.h @@ -236,7 +236,7 @@ struct usb_serial_driver { extern int usb_serial_register(struct usb_serial_driver *driver); extern void usb_serial_deregister(struct usb_serial_driver *driver); -extern void usb_serial_port_softint(void *private); +extern void usb_serial_port_softint(struct usb_serial_port *port); extern int usb_serial_probe(struct usb_interface *iface, const struct usb_device_id *id); extern void usb_serial_disconnect(struct usb_interface *iface); --- gregkh-2.6.orig/drivers/usb/serial/visor.c +++ gregkh-2.6/drivers/usb/serial/visor.c @@ -480,7 +480,7 @@ static void visor_write_bulk_callback (s --priv->outstanding_urbs; spin_unlock_irqrestore(&priv->lock, flags); - schedule_work(&port->work); + usb_serial_port_softint(port); } --- gregkh-2.6.orig/drivers/usb/serial/whiteheat.c +++ gregkh-2.6/drivers/usb/serial/whiteheat.c @@ -1089,9 +1089,7 @@ static void whiteheat_write_callback(str return; } - usb_serial_port_softint((void *)port); - - schedule_work(&port->work); + usb_serial_port_softint(port); }