Menangani permintaan I/O di driver pengontrol host USB

Praktik terbaik untuk driver pengontrol host untuk menangani permintaan I/O yang dikirim oleh UCX.

UCX melacak semua titik akhir yang telah dibuat oleh driver pengontrol host untuk perangkat di bus USB. Setiap permintaan transfer data yang dikirim oleh driver hub, atau oleh driver lain yang lebih tinggi di tumpukan perangkat USB, pertama-tama ditangani oleh UCX. UCX bertanggung jawab untuk meneruskan objek permintaan kerangka kerja ke antrean titik akhir yang benar. Blok Permintaan USB (URB) yang terkandung dalam permintaan dapat menentukan handel titik akhir. Jika handel titik akhir ditentukan, UCX memeriksa titik akhir yang sesuai di antara titik akhir yang ada untuk perangkat. Jika handel titik akhir yang ditentukan ada, permintaan diteruskan ke antrean titik akhir. Jika handel titik akhir yang ditentukan tidak ditemukan, permintaan gagal. Jika tidak ada handel yang ditentukan, maka permintaan adalah untuk titik akhir default, dan UCX meneruskan permintaan ke antrean titik akhir default driver pengontrol host untuk perangkat tersebut.

Untuk memastikan kompatibilitas dengan driver USB yang ada, pengontrol host harus mematuhi persyaratan berikut saat menyelesaikan permintaan URB:

  • WdfRequestComplete harus dipanggil di DISPATCH_LEVEL.
  • Jika URB dikirimkan ke antrean kerangka kerjanya dan driver mulai memprosesnya secara sinkron pada utas driver panggilan atau DPC, permintaan tidak boleh juga diselesaikan secara sinkron. Permintaan harus diselesaikan pada DPC terpisah, yang dapat dijadwalkan dengan panggilan ke WdfDpcEnqueue.
  • Mirip dengan persyaratan sebelumnya, setelah menerima EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE atau EVT_WDF_REQUEST_CANCEL, driver pengontrol host harus menyelesaikan permintaan URB pada DPC terpisah dari utas panggilan atau DPC. Secara default, WDF menyelesaikan permintaan yang dibatalkan pada antrean secara sinkron. Perilaku tersebut dapat menyebabkan masalah untuk permintaan URB. Untuk alasan ini, driver harus menyediakan panggilan balik EvtIoCanceledOnQueue untuk antrean URB-nya.

Objek permintaan kerangka kerja untuk IOCTL_INTERNAL_USB_SUBMIT_URB berisi URB yang terletak di Parameters.Others.Arg1 dari permintaan. Ketika permintaan selesai, status URB harus diatur ke USBD_STATUS_SUCCESS, atau ke status kegagalan yang menunjukkan sifat kegagalan. Nilai status kegagalan ditentukan dalam file header usb.h.