#include #include #include #include #include #include #include #include #include #include #include #include #include static atomic_int usb_ms_counter = 0; static struct device* usb_ms_init(struct xhci* xhci, struct xhci_usb_device* usb_device, struct proc* proc, struct reschedule_ctx* rctx) { static device_op_func_t ops[] = { [XDRV_GET_SIZE] = &usbdrv_get_size, [XDRV_GET_SECTOR_SIZE] = &usbdrv_get_sector_size, [XDRV_GET_DEVICE_TYPE] = &usbdrv_get_device_type, [XDRV_READ] = &usbdrv_read, [XDRV_WRITE] = &usbdrv_write, [XDRV_PARTITION_RESCAN] = &usbdrv_partition_rescan, }; struct usbdrv_init init = { .xhci = xhci, .usb_device = usb_device, }; char key[30]; snprintf(key, sizeof(key), "usbdrv%d", atomic_fetch_add(&usb_ms_counter, 1)); struct device* device = device_create(DEVICE_TYPE_DRIVE, key, ops, lengthof(ops), &usbdrv_init, &usbdrv_fini, &init, proc, rctx); if (device != NULL) device_probe_partitions(proc, rctx, device); return device; } struct usb_driver_info usb_driver_infos[USB_DRIVER_MAX_MATCHES] = { {.if_class = 0x08, .if_subclass = 0x06, .if_proto = 0x50, .init = &usb_ms_init}, };