lkml.org 
[lkml]   [2006]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: usb-serial ipaq kernel problem
    On Tue, May 30, 2006 at 11:53:29AM -0300, Luiz Fernando N. Capitulino wrote:
    > On Tue, 30 May 2006 11:38:01 -0300
    > "Luiz Fernando N. Capitulino" <lcapitulino@mandriva.com.br> wrote:
    >
    > If it ran _before_ the timeout expires with no timeout error it does not
    > depend. Then we can do the simpler solution: just kill the read urb in the
    > ipaq_open's error path.

    That seems to work.
    I also found that both the return in ipaq_write_bulk_callback and the
    flush_scheduled_work() in destroy_serial() are needed to get rid of the
    usb_serial_disconnect() bug.

    It's now running with the following patch:

    Signed-off-by: Frank Gevaerts <frank.gevaerts@fks.be>

    diff -pur linux-2.6.17-rc4/drivers/usb/serial/ipaq.c linux-2.6.17-rc4.test/drivers/usb/serial/ipaq.c
    --- linux-2.6.17-rc4/drivers/usb/serial/ipaq.c 2006-03-20 06:53:29.000000000 +0100
    +++ linux-2.6.17-rc4.test/drivers/usb/serial/ipaq.c 2006-05-30 19:41:19.000000000 +0200
    @@ -71,6 +71,7 @@

    static __u16 product, vendor;
    static int debug;
    +static int connect_retries;

    /* Function prototypes for an ipaq */
    static int ipaq_open (struct usb_serial_port *port, struct file *filp);
    @@ -583,7 +584,7 @@ static int ipaq_open(struct usb_serial_p
    struct ipaq_private *priv;
    struct ipaq_packet *pkt;
    int i, result = 0;
    - int retries = KP_RETRIES;
    + int retries = connect_retries;

    dbg("%s - port %d", __FUNCTION__, port->number);

    @@ -681,6 +682,7 @@ enomem:
    result = -ENOMEM;
    err("%s - Out of memory", __FUNCTION__);
    error:
    + usb_kill_urb(port->read_urb);
    ipaq_destroy_lists(port);
    kfree(priv);
    return result;
    @@ -692,6 +694,7 @@ static void ipaq_close(struct usb_serial
    struct ipaq_private *priv = usb_get_serial_port_data(port);

    dbg("%s - port %d", __FUNCTION__, port->number);
    +

    /*
    * shut down bulk read and write
    @@ -855,6 +858,7 @@ static void ipaq_write_bulk_callback(str

    if (urb->status) {
    dbg("%s - nonzero write bulk status received: %d", __FUNCTION__, urb->status);
    + return;
    }

    spin_lock_irqsave(&write_list_lock, flags);
    @@ -967,3 +971,6 @@ MODULE_PARM_DESC(vendor, "User specified

    module_param(product, ushort, 0);
    MODULE_PARM_DESC(product, "User specified USB idProduct");
    +
    +module_param(connect_retries, int, KP_RETRIES);
    +MODULE_PARM_DESC(product, "Maximum number of connect retries (100ms each)");
    diff -pur linux-2.6.17-rc4/drivers/usb/serial/usb-serial.c linux-2.6.17-rc4.test/drivers/usb/serial/usb-serial.c
    --- linux-2.6.17-rc4/drivers/usb/serial/usb-serial.c 2006-05-30 19:01:16.000000000 +0200
    +++ linux-2.6.17-rc4.test/drivers/usb/serial/usb-serial.c 2006-05-30 19:01:24.000000000 +0200
    @@ -162,6 +162,8 @@ static void destroy_serial(struct kref *
    }
    }

    + flush_scheduled_work(); /* port->work */
    +
    usb_put_dev(serial->dev);

    /* free up any memory that we allocated */
    Frank

    --
    Frank Gevaerts frank.gevaerts@fks.be
    fks bvba - Formal and Knowledge Systems http://www.fks.be/
    Stationsstraat 108 Tel: ++32-(0)11-21 49 11
    B-3570 ALKEN Fax: ++32-(0)11-22 04 19
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-05-30 19:51    [W:0.024 / U:29.424 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site