From 688915b11aa7f8b92d12a2e4672d71e3626a0e6a Mon Sep 17 00:00:00 2001 From: Mathias Nyman Date: Thu, 23 Jul 2020 17:45:29 +0300 Subject: [PATCH] xhci: dbgcap: remove dbc dependency on dbctty specific flag dbc should not be aware of, or use any dbctty specific variables. currenly dbc driver reads the port->registered flag to see if the callbacks should be called. Only makes these decisions based on dbc internal state instead. Signed-off-by: Mathias Nyman Link: https://lore.kernel.org/r/20200723144530.9992-27-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman --- drivers/usb/host/xhci-dbgcap.c | 16 ++++++++++++---- drivers/usb/host/xhci-dbgtty.c | 5 +++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/usb/host/xhci-dbgcap.c b/drivers/usb/host/xhci-dbgcap.c index 47090bc..c57178d 100644 --- a/drivers/usb/host/xhci-dbgcap.c +++ b/drivers/usb/host/xhci-dbgcap.c @@ -630,14 +630,22 @@ static void xhci_dbc_stop(struct xhci_dbc *dbc) { int ret; unsigned long flags; - struct dbc_port *port = &dbc->port; WARN_ON(!dbc); - cancel_delayed_work_sync(&dbc->event_work); + switch (dbc->state) { + case DS_DISABLED: + return; + case DS_CONFIGURED: + case DS_STALLED: + if (dbc->driver->disconnect) + dbc->driver->disconnect(dbc); + break; + default: + break; + } - if (port->registered && dbc->driver->disconnect) - dbc->driver->disconnect(dbc); + cancel_delayed_work_sync(&dbc->event_work); spin_lock_irqsave(&dbc->lock, flags); ret = xhci_do_dbc_stop(dbc); diff --git a/drivers/usb/host/xhci-dbgtty.c b/drivers/usb/host/xhci-dbgtty.c index 3231cec7..3b306a2 100644 --- a/drivers/usb/host/xhci-dbgtty.c +++ b/drivers/usb/host/xhci-dbgtty.c @@ -399,6 +399,9 @@ int xhci_dbc_tty_register_device(struct xhci_dbc *dbc) struct device *tty_dev; struct dbc_port *port = &dbc->port; + if (port->registered) + return -EBUSY; + xhci_dbc_tty_init_port(dbc, port); tty_dev = tty_port_register_device(&port->port, dbc_tty_driver, 0, NULL); @@ -445,6 +448,8 @@ void xhci_dbc_tty_unregister_device(struct xhci_dbc *dbc) { struct dbc_port *port = &dbc->port; + if (!port->registered) + return; tty_unregister_device(dbc_tty_driver, 0); xhci_dbc_tty_exit_port(port); port->registered = false; -- 2.7.4