On 26-09-24 12:19 pm, hbuczynski wrote: > From: "hubert.buczynski" <Hubert.Buczynski.ext@xxxxxxx> > > The commit "5a444bea usb: gadget: u_serial: Set start_delayed during > suspend" caused invocation of the gs_start_io in the gserial_resume. > The gs_start_io doesn't check the ptr of the 'port.tty'. As a result, the > tty_wakeup function is passed on to the NULL ptr causing kernel panic. > [...] > > If the device sends data and does not receive msg from the host then the > field port->read_started contains a positive value. After disconnecting > the cable, gserial_suspend() is invoked and the port->start_delayed is set > to true. Connecting the cable again causes invocation of the > gserial_resume(). > The callstack after connecting the cable looks like the following: > gserial_resume() > --> gs_start_io() > --> tty_wakeup() - with NULL argument > > Fixes: 5a444bea37e2 ("usb: gadget: u_serial: Set start_delayed during suspend") > > Signed-off-by: hubert.buczynski <Hubert.Buczynski.ext@xxxxxxx> > --- > drivers/usb/gadget/function/u_serial.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c > index 5111fcc0cac3..384f219fe01d 100644 > --- a/drivers/usb/gadget/function/u_serial.c > +++ b/drivers/usb/gadget/function/u_serial.c > @@ -564,7 +564,7 @@ static int gs_start_io(struct gs_port *port) > port->n_read = 0; > started = gs_start_rx(port); > > - if (started) { > + if (started && port->port.tty) { > gs_start_tx(port); > /* Unblock any pending writes into our circular buffer, in case > * we didn't in gs_start_tx() */ Commit ffd603f21423 ("usb: gadget: u_serial: Add null pointer check in gs_start_io") fixed this issue. Please try adding it into your builds. Regards, Prashanth K