Controlar las solicitudes de E/S en un controlador de controlador de host USB
Procedimientos recomendados para un controlador de host para controlar las solicitudes de E/S enviadas por UCX.
UCX realiza un seguimiento de todos los puntos de conexión creados por el controlador del controlador de host para dispositivos en el bus USB. Las solicitudes de transferencia de datos enviadas por el controlador del concentrador o por otro controlador que esté más arriba en la pila de dispositivos USB, se controlan primero mediante UCX. UCX es responsable de reenviar el objeto de solicitud del marco a la cola de punto de conexión correcta. El bloque de solicitud USB (URB) contenido en la solicitud puede especificar un identificador de punto de conexión. Si se especifica un identificador de punto de conexión, UCX comprueba el punto de conexión correspondiente entre los puntos de conexión presentes para el dispositivo. Si el identificador de punto de conexión especificado está presente, la solicitud se reenvía a la cola del punto de conexión. Si no se encuentra el identificador de punto de conexión especificado, se produce un error en la solicitud. Si no se especifica ningún identificador, la solicitud es para el punto de conexión predeterminado y UCX reenvía la solicitud a la cola de puntos de conexión predeterminados del controlador de host para ese dispositivo.
Para garantizar la compatibilidad con los controladores USB existentes, el controlador de host debe cumplir los siguientes requisitos al completar la solicitud URB:
- Se debe llamar a WdfRequestComplete en DISPATCH_LEVEL.
- Si el URB se entregó a su cola de marcos y el controlador comenzó a procesarlo de forma sincrónica en el subproceso o DPC del controlador que realiza la llamada, la solicitud no se debe completar de forma sincrónica. La solicitud debe completarse en un DPC independiente, que se puede programar con una llamada a WdfDpcEnqueue.
- Al igual que el requisito anterior, al recibir EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE o EVT_WDF_REQUEST_CANCEL, el controlador del host debe completar la solicitud URB en un DPC independiente del subproceso o DPC que realiza la llamada. De forma predeterminada, WDF completa las solicitudes canceladas en la cola de forma sincrónica. Ese comportamiento puede causar problemas para las solicitudes URB. Por este motivo, el controlador debe proporcionar una devolución de llamada EvtIoCanceledOnQueue para sus colas URB.
El objeto de solicitud de marco de un IOCTL_INTERNAL_USB_SUBMIT_URB contiene un URB ubicado en Parameters.Others.Arg1 de la solicitud. Una vez completada la solicitud, el estado urB debe establecerse en USBD_STATUS_SUCCESS o en un estado de error que indique la naturaleza del error. Los valores de estado de error se definen en el archivo de encabezado usb.h.