¿Cómo maneja Linux las URB?
Después de enviar la URB al kernel USB, no acceda a ningún miembro de la URB antes de llamar a la función de finalización.
usb_submit_urb () se puede llamar en un contexto atómico o en un contexto de proceso, por lo que la variable mem_flags correspondiente debe configurarse de acuerdo con el contexto de llamada, como se muestra a continuación.
-GFP_ATOMIC: cuando la persona que llama mantiene un bloqueo de giro o un bloqueo de lectura/escritura y el controlador modifica el estado actual-> a un estado distinto de TASK_RUNNING, el controlador de interrupciones, parte inferior, este indicador es utilizado en tasklets, controladores de temporizador y funciones de finalización de URB.
- GFP_NOIO: este indicador debe usarse en el bloque IO y en las rutas de manejo de errores del dispositivo de almacenamiento.
- GFP_KERNEL: si no hay motivo para usar GFP_ATOMIC y GFP_NOIO; GFP_KERNEL.
Si la llamada a usb_submit_urb() es exitosa, es decir, el control de la URB se ha transferido al kernel USB, la función devolverá 0; de lo contrario, se devolverá un número de error;
4) Envíe el controlador del controlador de host USB especificado por el kernel USB.
5) Manejado por el controlador host USB para una única transferencia al dispositivo USB.
Los pasos 4) a 5) los completan el kernel USB y el controlador de host y no están controlados por el controlador del dispositivo USB.
6) Cuando se completa la URB, el controlador del host USB notifica al controlador del dispositivo USB.