On Wednesday 16 May 2007 18:25, Alan Stern wrote:
> On Wed, 16 May 2007, Hans Petter Selasky wrote:
> > It is very clear to me that non-blocking memory allocation at the point
> > of starting an USB transfer will require extra error handling in the USB
> > device driver code!
>
> It's not so clear to me.

In my new USB stack, I pass all endpoint and buffer size information 
to "usbd_transfer_setup()" at attach time:

For example:

static const struct usbd_config umodem_config_data[UMODEM_N_DATA_TRANSFER] = {

    [0] = {
      .type      = UE_BULK,
      .endpoint  = -1, /* any */
      .direction = UE_DIR_OUT,
      .bufsize   = UMODEM_BUF_SIZE,
      .flags     = 0,
      .callback  = &umodem_write_callback,
    },

    [1] = {
      .type      = UE_BULK,
      .endpoint  = -1, /* any */
      .direction = UE_DIR_IN,
      .bufsize   = UMODEM_BUF_SIZE,
      .flags     = USBD_SHORT_XFER_OK,
      .callback  = &umodem_read_callback,
    },

    [2] = {
      .type      = UE_CONTROL,
      .endpoint  = 0x00, /* Control pipe */
      .direction = -1,
      .bufsize   = sizeof(usb_device_request_t),
      .callback  = &umodem_write_clear_stall_callback,
      .timeout   = 1000, /* 1 second */
    },

    [3] = {
      .type      = UE_CONTROL,
      .endpoint  = 0x00, /* Control pipe */
      .direction = -1,
      .bufsize   = sizeof(usb_device_request_t),
      .callback  = &umodem_read_clear_stall_callback,
      .timeout   = 1000, /* 1 second */
    },
};

        error = usbd_transfer_setup(uaa->device, sc->sc_data_iface_index,
                                    sc->sc_xfer_data, umodem_config_data, 
                                    UMODEM_N_DATA_TRANSFER,
                                    sc, &Giant);
        if (error) {
            goto detach;
        }


>
> > My "usbd_transfer_start()" returns "void". Your "usb_submit_urb()"
> > returns "int".
>
> URB submission has other failure possibilities than lack of memory.
> Those other things have to be checked for regardless.

Yes, but that is because you allow too many parameters in the URB to be 
changed between USB transfers.

>
> > Pre-allocating everything you need simply saves code, hence you only
> > check once if you got the memory or not.
>
> It doesn't save code.  You need to check for the memory when you
> allocate it, no matter when that is done.

Yes, but it is a difference doing it once at attach or doing it every time you 
start a transfer.

> One allocation = one check. 
> The total code size is the same if you do the allocation early and only
> once or if you do it late and many times.
>
> It does save execution time.  But that's a different matter; it also
> wastes data space.

Yes, it wastes some memory, but that is just how it is. Get used to it :-)

I have some times been thinking that USB endpoint descriptors should have 
supplied some information on the maximum bandwidth supported, so that the USB 
devices can allocate appropriate buffers.

--HPS

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