Hello ,
I am developing a driver for a usb-serial adapter ( 1 port device with
BULK IN and BULK OUT endpoint). The development is on Redhat kernel
2.6.9.

I find that write call backs are not happening when I unload my driver
module and reload it afterwards , without disconnecting the usb-serial
adapter . 

In this case I have analyzed the bus traffic using analyzer . I find
NACK's being returned by the device for the urb submitted on the BULK
OUT endpoint . I have verified that DTR,RTS on the usb-serial end is
asserted when submitting urb on the BULK OUT endpoint of the usb-serial
device.

i am also able to receive data on the BULK IN endpoint . Read callbacks
are happening . 
i.e data sent by the device on the serial end is received by the
usb-serial adapter.

If i plug out the device and reconnect it with the driver module loaded
, and try sending data I get the write call backs .
The issue occurs only when the device is plugged in when unloading and
reloading the driver .

My Test setup  is as below - 
Linux 2.6.9 m/c with ------>- usb  port on the host ----> usb-serial
adapter -----> NULL Modem Cable -----> serial port ----> Windows host
with
my usb-serial driver
machine running hyperterminal


I am also unlinking the urbs synchronously using usb_kill_urb in
usb-serial drivers shutdown routine ( routine that gets called when
driver is unloaded with device conencted )

What could be the issue ?  Would this be due to incorrect initialization
of the device or the usb-stack on Linux 2.6.9. Has anybody observed
something similar for any other usb / usb-serial device . I would be
glad if anyone could provide pointers to debug this issue .

Regards,
Monali.


Shutdown routine of my usb-serial driver . 

static void oxsemi_shutdown (struct usb_serial *serial)
{
     struct oxsemi_port *port_info;
     struct oxsemi_serial *device_info;
     int i =0;

     oxsemi_dbg("[ENTRY]", CRITICAL);
  
     /* Any local memory allocated for this device
      * should be freed
      */

     /* stop reads and writes on all ports */
     for (i=0; i < serial->num_ports; ++i) {
          port_info = usb_get_serial_port_data(serial->port[i]);
          device_info = usb_get_serial_data(serial);

          /* Unlink all the URB's. */
        if (serial->dev) {
                        /* shutdown our urbs */
                   usb_kill_urb(serial->port[i]->write_urb);
             usb_kill_urb(serial->port[i]->read_urb);
        }
     }  

        oxsemi_tx_buffer_free(port_info->tx_buffer);
        kfree(port_info);
        usb_set_serial_port_data(serial->port[i], NULL);
 }

 kfree (usb_get_serial_data(serial));
 usb_set_serial_data(serial, NULL);

 oxsemi_dbg("[EXIT]", TRACE);
}


-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
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