static grub_usb_controller_dev_t grub_usb_list;
static struct grub_usb_attach_desc *attach_hooks;
-void
-grub_usb_controller_dev_register (grub_usb_controller_dev_t usb)
+/* Iterate over all controllers found by the driver. */
+static int
+grub_usb_controller_dev_register_iter (grub_usb_controller_t dev, void *data)
{
- auto int iterate_hook (grub_usb_controller_t dev);
+ grub_usb_controller_dev_t usb = data;
- /* Iterate over all controllers found by the driver. */
- int iterate_hook (grub_usb_controller_t dev)
- {
- dev->dev = usb;
+ dev->dev = usb;
- /* Enable the ports of the USB Root Hub. */
- grub_usb_root_hub (dev);
+ /* Enable the ports of the USB Root Hub. */
+ grub_usb_root_hub (dev);
- return 0;
- }
+ return 0;
+}
+void
+grub_usb_controller_dev_register (grub_usb_controller_dev_t usb)
+{
usb->next = grub_usb_list;
grub_usb_list = usb;
if (usb->iterate)
- usb->iterate (iterate_hook);
+ usb->iterate (grub_usb_controller_dev_register_iter, usb);
}
void
}
#if 0
-int
-grub_usb_controller_iterate (int (*hook) (grub_usb_controller_t dev))
+/* Context for grub_usb_controller_iterate. */
+struct grub_usb_controller_iterate_ctx
{
+ grub_usb_controller_iterate_hook_t hook;
+ void *hook_data;
grub_usb_controller_dev_t p;
+};
- auto int iterate_hook (grub_usb_controller_t dev);
+/* Helper for grub_usb_controller_iterate. */
+static int
+grub_usb_controller_iterate_iter (grub_usb_controller_t dev, void *data)
+{
+ struct grub_usb_controller_iterate_ctx *ctx = data;
- int iterate_hook (grub_usb_controller_t dev)
- {
- dev->dev = p;
- if (hook (dev))
- return 1;
- return 0;
- }
+ dev->dev = ctx->p;
+ if (ctx->hook (dev, ctx->hook_data))
+ return 1;
+ return 0;
+}
+
+int
+grub_usb_controller_iterate (grub_usb_controller_iterate_hook_t hook,
+ void *hook_data)
+{
+ struct grub_usb_controller_iterate_ctx ctx = {
+ .hook = hook,
+ .hook_data = hook_data
+ };
/* Iterate over all controller drivers. */
- for (p = grub_usb_list; p; p = p->next)
+ for (ctx.p = grub_usb_list; ctx.p; ctx.p = ctx.p->next)
{
/* Iterate over the busses of the controllers. XXX: Actually, a
hub driver should do this. */
- if (p->iterate (iterate_hook))
+ if (ctx.p->iterate (grub_usb_controller_iterate_iter, &ctx))
return 1;
}
}
}
-void
-grub_usb_register_attach_hook_class (struct grub_usb_attach_desc *desc)
+/* Helper for grub_usb_register_attach_hook_class. */
+static int
+grub_usb_register_attach_hook_class_iter (grub_usb_device_t usbdev, void *data)
{
- auto int usb_iterate (grub_usb_device_t dev);
-
- int usb_iterate (grub_usb_device_t usbdev)
- {
- struct grub_usb_desc_device *descdev = &usbdev->descdev;
- int i;
-
- if (descdev->class != 0 || descdev->subclass || descdev->protocol != 0
- || descdev->configcnt == 0)
- return 0;
+ struct grub_usb_attach_desc *desc = data;
+ struct grub_usb_desc_device *descdev = &usbdev->descdev;
+ int i;
- /* XXX: Just check configuration 0 for now. */
- for (i = 0; i < usbdev->config[0].descconf->numif; i++)
- {
- struct grub_usb_desc_if *interf;
+ if (descdev->class != 0 || descdev->subclass || descdev->protocol != 0
+ || descdev->configcnt == 0)
+ return 0;
- interf = usbdev->config[0].interf[i].descif;
+ /* XXX: Just check configuration 0 for now. */
+ for (i = 0; i < usbdev->config[0].descconf->numif; i++)
+ {
+ struct grub_usb_desc_if *interf;
- grub_dprintf ("usb", "iterate: interf=%d, class=%d, subclass=%d, protocol=%d\n",
- i, interf->class, interf->subclass, interf->protocol);
+ interf = usbdev->config[0].interf[i].descif;
- if (usbdev->config[0].interf[i].attached)
- continue;
+ grub_dprintf ("usb", "iterate: interf=%d, class=%d, subclass=%d, protocol=%d\n",
+ i, interf->class, interf->subclass, interf->protocol);
- if (interf->class != desc->class)
- continue;
- if (desc->hook (usbdev, 0, i))
- usbdev->config[0].interf[i].attached = 1;
- }
+ if (usbdev->config[0].interf[i].attached)
+ continue;
- return 0;
+ if (interf->class != desc->class)
+ continue;
+ if (desc->hook (usbdev, 0, i))
+ usbdev->config[0].interf[i].attached = 1;
}
+ return 0;
+}
+
+void
+grub_usb_register_attach_hook_class (struct grub_usb_attach_desc *desc)
+{
desc->next = attach_hooks;
attach_hooks = desc;
- grub_usb_iterate (usb_iterate);
+ grub_usb_iterate (grub_usb_register_attach_hook_class_iter, desc);
}
void
GRUB_USB_SPEED_HIGH
} grub_usb_speed_t;
+typedef int (*grub_usb_iterate_hook_t) (grub_usb_device_t dev, void *data);
+typedef int (*grub_usb_controller_iterate_hook_t) (grub_usb_controller_t dev,
+ void *data);
+
/* Call HOOK with each device, until HOOK returns non-zero. */
-int grub_usb_iterate (int (*hook) (grub_usb_device_t dev));
+int grub_usb_iterate (grub_usb_iterate_hook_t hook, void *hook_data);
grub_usb_err_t grub_usb_device_initialize (grub_usb_device_t dev);
void grub_usb_controller_dev_unregister (grub_usb_controller_dev_t usb);
-int grub_usb_controller_iterate (int (*hook) (grub_usb_controller_t dev));
+int grub_usb_controller_iterate (grub_usb_controller_iterate_hook_t hook,
+ void *hook_data);
grub_usb_err_t grub_usb_control_msg (grub_usb_device_t dev, grub_uint8_t reqtype,
/* The device name. */
const char *name;
- int (*iterate) (int (*hook) (grub_usb_controller_t dev));
+ int (*iterate) (grub_usb_controller_iterate_hook_t hook, void *hook_data);
grub_usb_err_t (*setup_transfer) (grub_usb_controller_t dev,
grub_usb_transfer_t transfer);