From c4cd7fbe3e2e8ff4cbe6d0db8c3356aeee614af5 Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Sun, 15 Nov 2020 19:51:42 +0100 Subject: [PATCH 17/22] grub-core/bus/usb: Add function pointer for attach/detach events The xHCI code needs to be called for attaching or detaching a device. Introduce two functions pointers and call it from the USB hub code. Will be used in future commits, currently this doesn't change any functionality. Signed-off-by: Patrick Rudolph --- grub-core/bus/usb/ehci.c | 2 ++ grub-core/bus/usb/ohci.c | 2 ++ grub-core/bus/usb/uhci.c | 2 ++ grub-core/bus/usb/usbhub.c | 19 +++++++++++++++++++ include/grub/usb.h | 4 ++++ 5 files changed, 29 insertions(+) diff --git a/grub-core/bus/usb/ehci.c b/grub-core/bus/usb/ehci.c index 9abebc6bd..953b851c0 100644 --- a/grub-core/bus/usb/ehci.c +++ b/grub-core/bus/usb/ehci.c @@ -1812,6 +1812,8 @@ static struct grub_usb_controller_dev usb_controller = { .hubports = grub_ehci_hubports, .portstatus = grub_ehci_portstatus, .detect_dev = grub_ehci_detect_dev, + .attach_dev = NULL, + .detach_dev = NULL, /* estimated max. count of TDs for one bulk transfer */ .max_bulk_tds = GRUB_EHCI_N_TD * 3 / 4 }; diff --git a/grub-core/bus/usb/ohci.c b/grub-core/bus/usb/ohci.c index 5363a61f6..7a3f3e154 100644 --- a/grub-core/bus/usb/ohci.c +++ b/grub-core/bus/usb/ohci.c @@ -1440,6 +1440,8 @@ static struct grub_usb_controller_dev usb_controller = .hubports = grub_ohci_hubports, .portstatus = grub_ohci_portstatus, .detect_dev = grub_ohci_detect_dev, + .attach_dev = NULL, + .detach_dev = NULL, /* estimated max. count of TDs for one bulk transfer */ .max_bulk_tds = GRUB_OHCI_TDS * 3 / 4 }; diff --git a/grub-core/bus/usb/uhci.c b/grub-core/bus/usb/uhci.c index 0fdea4c1e..03c4605b2 100644 --- a/grub-core/bus/usb/uhci.c +++ b/grub-core/bus/usb/uhci.c @@ -845,6 +845,8 @@ static struct grub_usb_controller_dev usb_controller = .hubports = grub_uhci_hubports, .portstatus = grub_uhci_portstatus, .detect_dev = grub_uhci_detect_dev, + .attach_dev = NULL, + .detach_dev = NULL, /* estimated max. count of TDs for one bulk transfer */ .max_bulk_tds = N_TD * 3 / 4 }; diff --git a/grub-core/bus/usb/usbhub.c b/grub-core/bus/usb/usbhub.c index 2ae29cba1..8e963e84b 100644 --- a/grub-core/bus/usb/usbhub.c +++ b/grub-core/bus/usb/usbhub.c @@ -66,6 +66,15 @@ grub_usb_hub_add_dev (grub_usb_controller_t controller, dev->split_hubport = split_hubport; dev->split_hubaddr = split_hubaddr; + if (controller->dev->attach_dev) { + err = controller->dev->attach_dev (controller, dev); + if (err) + { + grub_free (dev); + return NULL; + } + } + err = grub_usb_device_initialize (dev); if (err) { @@ -405,6 +414,8 @@ static void detach_device (grub_usb_device_t dev) { unsigned i; + grub_usb_err_t err; + int k; if (!dev) return; @@ -425,6 +436,14 @@ detach_device (grub_usb_device_t dev) if (inter && inter->detach_hook) inter->detach_hook (dev, i, k); } + if (dev->controller.dev->detach_dev) { + err = dev->controller.dev->detach_dev (&dev->controller, dev); + if (err) + { + // XXX + } + } + grub_usb_devs[dev->addr] = 0; } diff --git a/include/grub/usb.h b/include/grub/usb.h index ea6ee8c2c..4dd179db2 100644 --- a/include/grub/usb.h +++ b/include/grub/usb.h @@ -126,6 +126,10 @@ struct grub_usb_controller_dev grub_usb_speed_t (*detect_dev) (grub_usb_controller_t dev, int port, int *changed); + grub_usb_err_t (*attach_dev) (grub_usb_controller_t ctrl, grub_usb_device_t dev); + + grub_usb_err_t (*detach_dev) (grub_usb_controller_t ctrl, grub_usb_device_t dev); + /* Per controller flag - port reset pending, don't do another reset */ grub_uint64_t pending_reset; -- 2.39.2