On Mon, 16 Jul 2007, Alex Villací­s Lasso wrote:

> The problem is that I am getting a delayed -EPIPE (-32) on the 
> submission callback of the control urb on reception. This -EPIPE is 
> visible in the output of usbmon inside the tarball.
> 
> This urb is prepared as follows:
> 
>     /* Start first reception */
>     kingsun->rx_setuprequest->bRequestType = USB_DIR_OUT | 
> USB_TYPE_STANDARD | USB_RECIP_DEVICE;
>     kingsun->rx_setuprequest->bRequest = KINGSUN_REQ_RECV;
>     kingsun->rx_setuprequest->wValue = cpu_to_le16(0x0200);
>     kingsun->rx_setuprequest->wIndex = cpu_to_le16(0x0000);
>     kingsun->rx_setuprequest->wLength = cpu_to_le16(0);
>     usb_fill_control_urb(kingsun->rx_urb, kingsun->usbdev,
>             usb_rcvctrlpipe(kingsun->usbdev, 0),
>             (unsigned char *)kingsun->rx_setuprequest,
>             kingsun->rx_buf, KINGSUN_FIFO_SIZE,
>             ks959_rcv_irq, kingsun);   
>     kingsun->rx_urb->status = 0;
>     err = usb_submit_urb(kingsun->rx_urb, GFP_KERNEL);
>     if (err) {
>         err("ks-959: first urb-submit failed: %d", err);
>         goto close_irlap;
>     }
> 
> This tries to mimic as closely as possible what I am seeing in the 
> SnoopyPro logs. According to the logs, the driver sends a control urb 
> with 0x00 as bRequestType (USB_DIR_OUT | USB_TYPE_STANDARD | 
> USB_RECIP_DEVICE), 0x01 as bRequest, 0x0200 for wValue, 0x0000 for 
> wIndex, 0x0000 for wLength, and expects the device to answer with a data 
> payload that contains the received data. The actual sequence for the 
> setup packet in the logs is [00 01 00 02 00 00 00 00].
> 
> The constant KINGSUN_REQ_RECV is defined as 0x01 earlier in the code. I 
> can see from the USB headers (linux/usb/ch9.h), that this value is the 
> same as USB_REQ_CLEAR_FEATURE. So my first guess is that the setup 
> packet is invalid. In particular, I am suspicious of the use of 
> USB_DIR_OUT with a request that is supposed to return data. Also, 
> USB_REQ_CLEAR_FEATURE is supposed to have an answer without any data 
> payload. So I have a couple of questions:
> 
> Is this control URB valid?

No.  Of course, there's nothing to stop the device from accepting an 
invalid URB.

> Will the kernel actually send such a control URB over the wire, when 
> requested by the driver?

Yes.  This is not one of the things it checks for.

> Can the kernel handle a data payload for this particular kind of request 
> (USB_REQ_CLEAR_FEATURE)?

The kernel doesn't know or care anything about the type of the request.  
It just tries to do what the driver asks.

> If this control URB is not valid, who is responsible for answering 
> -EPIPE? The device (as a response), or the USB stack (because it rejects 
> the urb without sending it over the wire)?

The device.

> Is it possible that the SnoopyPro log is not showing correct data? How 
> can I be sure?

It seems pretty unlikely that SnoopyPro is making a mistake.  But maybe 
you have misinterpreted the data.

If you want to be sure, you have to use a USB bus analyzer.

> Any comments on this are welcome.

Can you post the portion of the SnoopyPro log containing both the UP
and DOWN reports for this questionable URB?

Alan Stern


-------------------------------------------------------------------------
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