aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/early
diff options
context:
space:
mode:
authorJan Beulich <JBeulich@suse.com>2012-09-18 07:23:02 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-18 12:20:48 -0400
commit9fa5780beea1274d498a224822397100022da7d4 (patch)
tree9dbc2d31f3af70502843bbebe8017828abd63136 /drivers/usb/early
parentee42f6c9fc62d1d4d45b0d75e5f947e6645d8c30 (diff)
USB EHCI/Xen: propagate controller reset information to hypervisor
Just like for the in-tree early console debug port driver, the hypervisor - when using a debug port based console - also needs to be told about controller resets, so it can suppress using and then re-initialize the debug port accordingly. Other than the in-tree driver, the hypervisor driver actually cares about doing this only for the device where the debug is port actually in use, i.e. it needs to be told the coordinates of the device being reset (quite obviously, leveraging the addition done for that would likely benefit the in-tree driver too). Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/early')
-rw-r--r--drivers/usb/early/ehci-dbgp.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c
index 89dcf155d57..e426ad626d7 100644
--- a/drivers/usb/early/ehci-dbgp.c
+++ b/drivers/usb/early/ehci-dbgp.c
@@ -491,7 +491,7 @@ static int ehci_wait_for_port(int port);
491 * Return -ENODEV for any general failure 491 * Return -ENODEV for any general failure
492 * Return -EIO if wait for port fails 492 * Return -EIO if wait for port fails
493 */ 493 */
494int dbgp_external_startup(void) 494static int _dbgp_external_startup(void)
495{ 495{
496 int devnum; 496 int devnum;
497 struct usb_debug_descriptor dbgp_desc; 497 struct usb_debug_descriptor dbgp_desc;
@@ -613,6 +613,11 @@ err:
613 goto try_again; 613 goto try_again;
614 return -ENODEV; 614 return -ENODEV;
615} 615}
616
617int dbgp_external_startup(struct usb_hcd *hcd)
618{
619 return xen_dbgp_external_startup(hcd) ?: _dbgp_external_startup();
620}
616EXPORT_SYMBOL_GPL(dbgp_external_startup); 621EXPORT_SYMBOL_GPL(dbgp_external_startup);
617 622
618static int ehci_reset_port(int port) 623static int ehci_reset_port(int port)
@@ -804,7 +809,7 @@ try_next_port:
804 dbgp_ehci_status("ehci skip - already configured"); 809 dbgp_ehci_status("ehci skip - already configured");
805 } 810 }
806 811
807 ret = dbgp_external_startup(); 812 ret = _dbgp_external_startup();
808 if (ret == -EIO) 813 if (ret == -EIO)
809 goto next_debug_port; 814 goto next_debug_port;
810 815
@@ -934,7 +939,7 @@ static void early_dbgp_write(struct console *con, const char *str, u32 n)
934 ctrl = readl(&ehci_debug->control); 939 ctrl = readl(&ehci_debug->control);
935 if (!(ctrl & DBGP_ENABLED)) { 940 if (!(ctrl & DBGP_ENABLED)) {
936 dbgp_not_safe = 1; 941 dbgp_not_safe = 1;
937 dbgp_external_startup(); 942 _dbgp_external_startup();
938 } else { 943 } else {
939 cmd |= CMD_RUN; 944 cmd |= CMD_RUN;
940 writel(cmd, &ehci_regs->command); 945 writel(cmd, &ehci_regs->command);
@@ -974,10 +979,14 @@ struct console early_dbgp_console = {
974 .index = -1, 979 .index = -1,
975}; 980};
976 981
977int dbgp_reset_prep(void) 982int dbgp_reset_prep(struct usb_hcd *hcd)
978{ 983{
984 int ret = xen_dbgp_reset_prep(hcd);
979 u32 ctrl; 985 u32 ctrl;
980 986
987 if (ret)
988 return ret;
989
981 dbgp_not_safe = 1; 990 dbgp_not_safe = 1;
982 if (!ehci_debug) 991 if (!ehci_debug)
983 return 0; 992 return 0;