On 05/22/2017 04:20 AM, Yuyang Du wrote: > From: Yuyang Du <yuyang.du@xxxxxxxxx> > > In parse_status(), all nports number of idev's are initiated to > 0 by memset(), it is simply wrong, because parse_status() reads > the status sys file one by one, therefore, it can only update the > according vhci_driver->idev's for it to parse. > > Reviewed-by: Krzysztof Opasiak <k.opasiak@xxxxxxxxxxx> > Signed-off-by: Yuyang Du <yuyang.du@xxxxxxxxx> Acked-by: Shuah Khan <shuahkh@xxxxxxxxxxxxxxx> thanks, -- Shuah > --- > tools/usb/usbip/libsrc/vhci_driver.c | 38 ++++++++++++++---------------------- > tools/usb/usbip/src/usbip_attach.c | 2 ++ > 2 files changed, 17 insertions(+), 23 deletions(-) > > diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c > index aa82c4b..f519c73 100644 > --- a/tools/usb/usbip/libsrc/vhci_driver.c > +++ b/tools/usb/usbip/libsrc/vhci_driver.c > @@ -36,18 +36,11 @@ imported_device_init(struct usbip_imported_device *idev, char *busid) > return NULL; > } > > - > - > static int parse_status(const char *value) > { > int ret = 0; > char *c; > > - > - for (int i = 0; i < vhci_driver->nports; i++) > - memset(&vhci_driver->idev[i], 0, sizeof(vhci_driver->idev[i])); > - > - > /* skip a header line */ > c = strchr(value, '\n'); > if (!c) > @@ -58,6 +51,7 @@ static int parse_status(const char *value) > int port, status, speed, devid; > unsigned long socket; > char lbusid[SYSFS_BUS_ID_SIZE]; > + struct usbip_imported_device *idev; > > ret = sscanf(c, "%d %d %d %x %lx %31s\n", > &port, &status, &speed, > @@ -72,30 +66,28 @@ static int parse_status(const char *value) > port, status, speed, devid); > dbg("socket %lx lbusid %s", socket, lbusid); > > - > /* if a device is connected, look at it */ > - { > - struct usbip_imported_device *idev = &vhci_driver->idev[port]; > + idev = &vhci_driver->idev[port]; > > - idev->port = port; > - idev->status = status; > + memset(idev, 0, sizeof(*idev)); > > - idev->devid = devid; > + idev->port = port; > + idev->status = status; > > - idev->busnum = (devid >> 16); > - idev->devnum = (devid & 0x0000ffff); > + idev->devid = devid; > > - if (idev->status != VDEV_ST_NULL > - && idev->status != VDEV_ST_NOTASSIGNED) { > - idev = imported_device_init(idev, lbusid); > - if (!idev) { > - dbg("imported_device_init failed"); > - return -1; > - } > + idev->busnum = (devid >> 16); > + idev->devnum = (devid & 0x0000ffff); > + > + if (idev->status != VDEV_ST_NULL > + && idev->status != VDEV_ST_NOTASSIGNED) { > + idev = imported_device_init(idev, lbusid); > + if (!idev) { > + dbg("imported_device_init failed"); > + return -1; > } > } > > - > /* go to the next line */ > c = strchr(c, '\n'); > if (!c) > diff --git a/tools/usb/usbip/src/usbip_attach.c b/tools/usb/usbip/src/usbip_attach.c > index 70a6b50..62a297f 100644 > --- a/tools/usb/usbip/src/usbip_attach.c > +++ b/tools/usb/usbip/src/usbip_attach.c > @@ -108,6 +108,8 @@ static int import_device(int sockfd, struct usbip_usb_device *udev) > return -1; > } > > + dbg("got free port %d", port); > + > rc = usbip_vhci_attach_device(port, sockfd, udev->busnum, > udev->devnum, udev->speed); > if (rc < 0) { > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html