A Tuesday 05 June 2007 16:54:14, Alan Stern escreveu:
> On Mon, 4 Jun 2007, Paulo Pereira wrote:
> > The patch that you send is not resolving the problem... :(
> > I stil have Kernel panic after 45/60 min of work with Ktorrent/Amule...
> >
> > The Drump is:
> >
> > Call Trace:
> > [<c055fb36>] usb_hcd_submit+0xb1/0x763
> > [<f9276488>] ipt_do_table+0x2c7/0x2ef [ip_tables]
> > [<f929a6d7>] nf_ct_deliver_cached_events+0x41/0x96 [nf_conntrak]
> > [<f9288254>] ipv4_confirm+0x36/0c3b [nf_conntrack_ipv4]
> > [<c05ce7c2>] tcp_v4_rcv+0x827/0x899
> > [<c05afcc0>] nf_hook_slow+0x4d/0xb5
> > [<c042826f>] irq_enter+0x19/0x23
> > [<c042826f>] irq_enter+0x19/0x23
> > [<c040794c>] do_IRQ+0xbd/0xd1
> > [<f90893c9>] option_write+0xa7/0xef [option]
>
> Okay, from this it looks like there's a problem in the option.c serial
> driver.  Glancing at the code, it's obvious why: The thing totally
> abuses the USB API.
>
> Try applying this patch; it should help.
>
> Alan Stern
>
>
> Index: usb-2.6/drivers/usb/serial/option.c
> ===================================================================
> --- usb-2.6.orig/drivers/usb/serial/option.c
> +++ usb-2.6/drivers/usb/serial/option.c
> @@ -38,6 +38,7 @@
>  #include <linux/tty.h>
>  #include <linux/tty_flip.h>
>  #include <linux/module.h>
> +#include <linux/bitops.h>
>  #include <linux/usb.h>
>  #include <linux/usb/serial.h>
>
> @@ -238,6 +239,7 @@ struct option_port_private {
>       /* Output endpoints and buffer for this port */
>       struct urb *out_urbs[N_OUT_URB];
>       char out_buffer[N_OUT_URB][OUT_BUFLEN];
> +     unsigned long out_busy;         /* Bit vector of URBs in use */
>
>       /* Settings for the port */
>       int rts_state;  /* Handshaking pins (outputs) */
> @@ -368,7 +370,7 @@ static int option_write(struct usb_seria
>                       todo = OUT_BUFLEN;
>
>               this_urb = portdata->out_urbs[i];
> -             if (this_urb->status == -EINPROGRESS) {
> +             if (test_and_set_bit(i, &portdata->out_busy)) {
>                       if (time_before(jiffies,
>                                       portdata->tx_start_time[i] + 10 * HZ))
>                               continue;
> @@ -392,6 +394,7 @@ static int option_write(struct usb_seria
>                       dbg("usb_submit_urb %p (write bulk) failed "
>                               "(%d, has %d)", this_urb,
>                               err, this_urb->status);
> +                     clear_bit(i, &portdata->out_busy);
>                       continue;
>               }
>               portdata->tx_start_time[i] = jiffies;
> @@ -444,12 +447,23 @@ static void option_indat_callback(struct
>  static void option_outdat_callback(struct urb *urb)
>  {
>       struct usb_serial_port *port;
> +     struct option_port_private *portdata;
> +     int i;
>
>       dbg("%s", __FUNCTION__);
>
>       port = (struct usb_serial_port *) urb->context;
>
>       usb_serial_port_softint(port);
> +
> +     portdata = usb_get_serial_port_data(port);
> +     for (i = 0; i < N_OUT_URB; ++i) {
> +             if (portdata->out_urbs[i] == urb) {
> +                     smp_mb__before_clear_bit();
> +                     clear_bit(i, &portdata->out_busy);
> +                     break;
> +             }
> +     }
>  }
>
>  static void option_instat_callback(struct urb *urb)
> @@ -516,7 +530,7 @@ static int option_write_room(struct usb_
>
>       for (i=0; i < N_OUT_URB; i++) {
>               this_urb = portdata->out_urbs[i];
> -             if (this_urb && this_urb->status != -EINPROGRESS)
> +             if (this_urb && !test_bit(i, &portdata->out_busy))
>                       data_len += OUT_BUFLEN;
>       }
>
> @@ -535,7 +549,7 @@ static int option_chars_in_buffer(struct
>
>       for (i=0; i < N_OUT_URB; i++) {
>               this_urb = portdata->out_urbs[i];
> -             if (this_urb && this_urb->status == -EINPROGRESS)
> +             if (this_urb && test_bit(i, &portdata->out_busy))
>                       data_len += this_urb->transfer_buffer_length;
>       }
>       dbg("%s: %d", __FUNCTION__, data_len);

Hi I have a problem instaling the patch, I hope that anyone can help me...
When a trie to install the patch:
        patching file drivers/usb/serial/option.c
        patch: **** malformed patch at line 4:  #include <linux/tty.h>

Thanks, Paulo


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to