>       whiteheat.c

whiteheat_attach:

        usb_clear_halt(serial->dev, pipe);
        ret = usb_bulk_msg (serial->dev, pipe, command, sizeof(command), &alen, 
COMMAND_TIMEOUT);
DMA on stack

whiteheat_write:

                result = usb_submit_urb(urb, GFP_ATOMIC);
no need for ATOMIC here

static void command_port_read_callback:
        spin_lock_irqsave(&command_info->lock, flags);
no need to save flags, you are in irq context

static int firm_send_command:
        retval = usb_submit_urb (command_port->write_urb, GFP_KERNEL);
illegal while holding a spinlock, logic looks fishy

static int start_command_port:
        spin_lock_irqsave(&command_info->lock, flags);
        if (!command_info->port_running) {
                /* Work around HCD bugs */
                usb_clear_halt(serial->dev, command_port->read_urb->pipe);

                command_port->read_urb->dev = serial->dev;
                retval = usb_submit_urb(command_port->read_urb, GFP_KERNEL);
major brokenness -
A - using usb_clear_halt with a spinlock held is absolutely illegal
B - if you have to submit an URB with a spinlock held, you _must_ use GFP_ATOMIC

static int start_port_read:
                retval = usb_submit_urb(urb, GFP_KERNEL);
use GFP_ATOMIC

static void stop_command_port (and other places):
        spin_lock_irqsave(&command_info->lock, flags);
        command_info->port_running--;
        if (!command_info->port_running)
                usb_unlink_urb(command_port->read_urb);
you must use asynchrnous unlink here.

        HTH
                Oliver




-------------------------------------------------------
This SF.net email is sponsored by: Tablet PC.  
Does your code think in ink? You could win a Tablet PC. 
Get a free Tablet PC hat just for playing. What are you waiting for? 
http://ads.sourceforge.net/cgi-bin/redirect.pl?micr5043en
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to