Re: [PATCH 6/9] dev-serial: add always-plugged property to ensure USB device is always attached

2020-10-27 Thread Mark Cave-Ayland

On 27/10/2020 08:09, Gerd Hoffmann wrote:


  case CHR_EVENT_OPENED:
-if (!s->dev.attached) {
+if (!s->always_plugged && !s->dev.attached) {
  usb_device_attach(>dev, _abort);
  }


Not needed (but doesn't hurt either).


Okay I'll leave this as-is for now.


  break;
  case CHR_EVENT_CLOSED:
-if (s->dev.attached) {
+if (!s->always_plugged && s->dev.attached) {
  usb_device_detach(>dev);
  }


Ok.


-if (qemu_chr_fe_backend_open(>cs) && !dev->attached) {
+if (s->always_plugged || (qemu_chr_fe_backend_open(>cs) &&
+  !dev->attached)) {


The dev->attached check should not be skipped, i.e. the logic should be
((always_plugged || open) && !attached).


Let me test this, and if it works I'll post a v2 shortly.


ATB,

Mark.



Re: [PATCH 6/9] dev-serial: add always-plugged property to ensure USB device is always attached

2020-10-27 Thread Gerd Hoffmann
>  case CHR_EVENT_OPENED:
> -if (!s->dev.attached) {
> +if (!s->always_plugged && !s->dev.attached) {
>  usb_device_attach(>dev, _abort);
>  }

Not needed (but doesn't hurt either).

>  break;
>  case CHR_EVENT_CLOSED:
> -if (s->dev.attached) {
> +if (!s->always_plugged && s->dev.attached) {
>  usb_device_detach(>dev);
>  }

Ok.

> -if (qemu_chr_fe_backend_open(>cs) && !dev->attached) {
> +if (s->always_plugged || (qemu_chr_fe_backend_open(>cs) &&
> +  !dev->attached)) {

The dev->attached check should not be skipped, i.e. the logic should be
((always_plugged || open) && !attached).

take care,
  Gerd




Re: [PATCH 6/9] dev-serial: add always-plugged property to ensure USB device is always attached

2020-10-26 Thread Samuel Thibault
Mark Cave-Ayland, le lun. 26 oct. 2020 08:33:58 +, a ecrit:
> Some operating systems will generate a new device ID when a USB device is 
> unplugged
> and then replugged into the USB. If this is done whilst switching between 
> multiple
> applications over a virtual serial port, the change of device ID requires 
> going
> back into the OS/application to locate the new device accordingly.
> 
> Add a new always-plugged property that if specified will ensure that the 
> device
> always remains attached to the USB regardless of the state of the backend
> chardev.
> 
> Signed-off-by: Mark Cave-Ayland 

Reviewed-by: Samuel Thibault 

> ---
>  hw/usb/dev-serial.c | 9 ++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
> index 92c35615eb..919e25e1d9 100644
> --- a/hw/usb/dev-serial.c
> +++ b/hw/usb/dev-serial.c
> @@ -97,6 +97,7 @@ struct USBSerialState {
>  uint8_t event_chr;
>  uint8_t error_chr;
>  uint8_t event_trigger;
> +bool always_plugged;
>  QEMUSerialSetParams params;
>  int latency;/* ms */
>  CharBackend cs;
> @@ -516,12 +517,12 @@ static void usb_serial_event(void *opaque, QEMUChrEvent 
> event)
>  s->event_trigger |= FTDI_BI;
>  break;
>  case CHR_EVENT_OPENED:
> -if (!s->dev.attached) {
> +if (!s->always_plugged && !s->dev.attached) {
>  usb_device_attach(>dev, _abort);
>  }
>  break;
>  case CHR_EVENT_CLOSED:
> -if (s->dev.attached) {
> +if (!s->always_plugged && s->dev.attached) {
>  usb_device_detach(>dev);
>  }
>  break;
> @@ -556,7 +557,8 @@ static void usb_serial_realize(USBDevice *dev, Error 
> **errp)
>   usb_serial_event, NULL, s, NULL, true);
>  usb_serial_handle_reset(dev);
>  
> -if (qemu_chr_fe_backend_open(>cs) && !dev->attached) {
> +if (s->always_plugged || (qemu_chr_fe_backend_open(>cs) &&
> +  !dev->attached)) {
>  usb_device_attach(dev, _abort);
>  }
>  s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
> @@ -584,6 +586,7 @@ static const VMStateDescription vmstate_usb_serial = {
>  
>  static Property serial_properties[] = {
>  DEFINE_PROP_CHR("chardev", USBSerialState, cs),
> +DEFINE_PROP_BOOL("always-plugged", USBSerialState, always_plugged, 
> false),
>  DEFINE_PROP_END_OF_LIST(),
>  };
>  
> -- 
> 2.20.1
> 

-- 
Samuel
"...[Linux's] capacity to talk via any medium except smoke signals."
(By Dr. Greg Wettstein, Roger Maris Cancer Center)



[PATCH 6/9] dev-serial: add always-plugged property to ensure USB device is always attached

2020-10-26 Thread Mark Cave-Ayland
Some operating systems will generate a new device ID when a USB device is 
unplugged
and then replugged into the USB. If this is done whilst switching between 
multiple
applications over a virtual serial port, the change of device ID requires going
back into the OS/application to locate the new device accordingly.

Add a new always-plugged property that if specified will ensure that the device
always remains attached to the USB regardless of the state of the backend
chardev.

Signed-off-by: Mark Cave-Ayland 
---
 hw/usb/dev-serial.c | 9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 92c35615eb..919e25e1d9 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -97,6 +97,7 @@ struct USBSerialState {
 uint8_t event_chr;
 uint8_t error_chr;
 uint8_t event_trigger;
+bool always_plugged;
 QEMUSerialSetParams params;
 int latency;/* ms */
 CharBackend cs;
@@ -516,12 +517,12 @@ static void usb_serial_event(void *opaque, QEMUChrEvent 
event)
 s->event_trigger |= FTDI_BI;
 break;
 case CHR_EVENT_OPENED:
-if (!s->dev.attached) {
+if (!s->always_plugged && !s->dev.attached) {
 usb_device_attach(>dev, _abort);
 }
 break;
 case CHR_EVENT_CLOSED:
-if (s->dev.attached) {
+if (!s->always_plugged && s->dev.attached) {
 usb_device_detach(>dev);
 }
 break;
@@ -556,7 +557,8 @@ static void usb_serial_realize(USBDevice *dev, Error **errp)
  usb_serial_event, NULL, s, NULL, true);
 usb_serial_handle_reset(dev);
 
-if (qemu_chr_fe_backend_open(>cs) && !dev->attached) {
+if (s->always_plugged || (qemu_chr_fe_backend_open(>cs) &&
+  !dev->attached)) {
 usb_device_attach(dev, _abort);
 }
 s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
@@ -584,6 +586,7 @@ static const VMStateDescription vmstate_usb_serial = {
 
 static Property serial_properties[] = {
 DEFINE_PROP_CHR("chardev", USBSerialState, cs),
+DEFINE_PROP_BOOL("always-plugged", USBSerialState, always_plugged, false),
 DEFINE_PROP_END_OF_LIST(),
 };
 
-- 
2.20.1