On 12/26/2016 12:18 AM, Nobuo Iwata wrote:
> Modification to the userspace tools including usbip/libsrc and 
> usbip/src.

Modification to do what? Could you please write a concise change
log describing what this patch does and why? Please note that the
information in the cover-letter doesn't go int this commit.

> 
> Changed corresponding to new vhci_sysfs.c.
> 
> nports in sysfs is used to get total number of ports. 
> 
> Old get_nports() ignores the last status line because 
> udev_device_get_sysattr_value() drops last new line. New version uses 
> nports attribute so it's doesn't have this problem.
> 
> status[.N] in sysfs are used.
> 
> parse_status() which reads all status lines is broken into open, close, 
> read-line and parse-line. Parse-line is reused to find free port and 
> get imported device.
> 
> In daemon, status was loaded into memory by 
> usbip_vhci_refresh_device_list() at receiving every request. The loaded 
> status is used to find free port. It is changed to read status directly 
> to find free port.
> 
> Wording inconsistencies are fixed according to the rule below.
> 
> rhport, HC_PORTS: ports within a controller (or root hub).
> port, nports: ports across the controllers.
> 
> Signed-off-by: Nobuo Iwata <nobuo.iw...@fujixerox.co.jp>
> ---
>  tools/usb/usbip/libsrc/vhci_driver.c | 396 ++++++++++++++-------------
>  tools/usb/usbip/libsrc/vhci_driver.h |  45 +--
>  tools/usb/usbip/src/usbip_attach.c   |  12 +-
>  tools/usb/usbip/src/usbip_port.c     |  13 +-
>  tools/usb/usbip/src/usbipd_app.c     |  31 +--
>  5 files changed, 242 insertions(+), 255 deletions(-)
> 
> diff --git a/tools/usb/usbip/libsrc/vhci_driver.c 
> b/tools/usb/usbip/libsrc/vhci_driver.c
> index 8b94ab5..844187d 100644
> --- a/tools/usb/usbip/libsrc/vhci_driver.c
> +++ b/tools/usb/usbip/libsrc/vhci_driver.c
> @@ -15,11 +15,24 @@
>  #undef  PROGNAME
>  #define PROGNAME "libusbip"
>  
> -struct usbip_vhci_driver *vhci_driver;
> -struct udev *udev_context;
> +static struct udev_device *vhci_hc_device;
> +static struct udev *udev_context;
> +static int vhci_nports;
>  
> -static struct usbip_imported_device *
> -imported_device_init(struct usbip_imported_device *idev, char *busid)
> +struct usbip_vhci_device {
> +     int port;
> +     uint32_t status;
> +
> +     uint32_t devid;
> +
> +     uint8_t busnum;
> +     uint8_t devnum;
> +
> +     /* usbip_class_device list */
> +     struct usbip_usb_device udev;
> +};
> +
> +static int imported_device_init(struct usbip_vhci_device *vdev, char *busid)
>  {
>       struct udev_device *sudev;
>  
> @@ -27,132 +40,131 @@ imported_device_init(struct usbip_imported_device 
> *idev, char *busid)
>                                                      "usb", busid);
>       if (!sudev) {
>               dbg("udev_device_new_from_subsystem_sysname failed: %s", busid);
> -             goto err;
> +             return -1;
>       }
> -     read_usb_device(sudev, &idev->udev);
> +     read_usb_device(sudev, &vdev->udev);
>       udev_device_unref(sudev);
>  
> -     return idev;
> -
> -err:
> -     return NULL;
> +     return 0;
>  }
>  
> +struct status_context {
> +     int controller;
> +     const char *c;
> +};
>  
> +#define OPEN_MODE_FIRST      0
> +#define OPEN_MODE_REOPEN     1
>  
> -static int parse_status(const char *value)
> -{
> -     int ret = 0;
> -     char *c;
> +static int open_hc_device(int mode);
>  
> +#define MAX_STATUS_NAME 16
>  
> -     for (int i = 0; i < vhci_driver->nports; i++)
> -             memset(&vhci_driver->idev[i], 0, sizeof(vhci_driver->idev[i]));
> +static int open_status(struct status_context *ctx, int mode)
> +{
> +     char name[MAX_STATUS_NAME+1];
>  
> +     if (mode == OPEN_MODE_FIRST)
> +             ctx->controller = 0;
> +     else
> +             (ctx->controller)++;
>  
> -     /* skip a header line */
> -     c = strchr(value, '\n');
> -     if (!c)
> +     if (open_hc_device(OPEN_MODE_REOPEN))
>               return -1;
> -     c++;
>  
> -     while (*c != '\0') {
> -             int port, status, speed, devid;
> -             unsigned long socket;
> -             char lbusid[SYSFS_BUS_ID_SIZE];
> -
> -             ret = sscanf(c, "%d %d %d %x %lx %31s\n",
> -                             &port, &status, &speed,
> -                             &devid, &socket, lbusid);
> -
> -             if (ret < 5) {
> -                     dbg("sscanf failed: %d", ret);
> -                     BUG();
> -             }
> -
> -             dbg("port %d status %d speed %d devid %x",
> -                             port, status, speed, devid);
> -             dbg("socket %lx lbusid %s", socket, lbusid);
> +     if (ctx->controller == 0)
> +             strcpy(name, "status");
> +     else
> +             snprintf(name, MAX_STATUS_NAME + 1,
> +                             "status.%d", ctx->controller);
> +     ctx->c = udev_device_get_sysattr_value(vhci_hc_device, name);
> +     if (ctx->c == NULL)
> +             return -1;
>  
> +     return 0;
> +}
>  
> -             /* if a device is connected, look at it */
> -             {
> -                     struct usbip_imported_device *idev = 
> &vhci_driver->idev[port];
> +static void close_status(struct status_context *ctx)
> +{
> +     ctx->c = NULL;
> +}
>  
> -                     idev->port      = port;
> -                     idev->status    = status;
> +static int next_status_line(struct status_context *ctx)
> +{
> +     const char *c = ctx->c;
>  
> -                     idev->devid     = devid;
> +     while ((c = strchr(c, '\n')) == NULL) {
> +             if (open_status(ctx, OPEN_MODE_REOPEN))
> +                     return -1;
> +             c = ctx->c;
> +     }
> +     ctx->c = c + 1;
> +     return 0;
> +}
>  
> -                     idev->busnum    = (devid >> 16);
> -                     idev->devnum    = (devid & 0x0000ffff);
> +static int parse_status_line(struct status_context *ctx,
> +                          struct usbip_vhci_device *vdev)
> +{
> +     int port, status, speed, devid;
> +     unsigned long socket;
> +     char lbusid[SYSFS_BUS_ID_SIZE];
> +     int ret;
>  
> -                     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;
> -                             }
> -                     }
> -             }
> +     if (next_status_line(ctx))
> +             return -1;
>  
> +     memset(vdev, 0, sizeof(struct usbip_vhci_device));
>  
> -             /* go to the next line */
> -             c = strchr(c, '\n');
> -             if (!c)
> -                     break;
> -             c++;
> +     if (ctx->c == NULL || *(ctx->c) == '\0') {
> +             dbg("no more data to scan");
> +             return -1;
>       }
>  
> -     dbg("exit");
> +     ret = sscanf(ctx->c, "%d %d %d %x %lx %31s\n",
> +                             &port, &status, &speed,
> +                             &devid, &socket, lbusid);
> +     if (ret < 6) {
> +             dbg("sscanf failed: %d", ret);
> +             return -1;
> +     }
>  
> -     return 0;
> -}
> +     dbg("port %d status %d speed %d devid %x", port, status, speed, devid);
> +     dbg("socket %lx lbusid %s", socket, lbusid);
>  
> -static int refresh_imported_device_list(void)
> -{
> -     const char *attr_status;
> +     vdev->port      = port;
> +     vdev->status    = status;
> +     vdev->devid     = devid;
> +     vdev->busnum    = (devid >> 16);
> +     vdev->devnum    = (devid & 0x0000ffff);
>  
> -     attr_status = udev_device_get_sysattr_value(vhci_driver->hc_device,
> -                                            "status");
> -     if (!attr_status) {
> -             err("udev_device_get_sysattr_value failed");
> -             return -1;
> +     if (vdev->status != VDEV_ST_NULL &&
> +         vdev->status != VDEV_ST_NOTASSIGNED) {
> +             if (imported_device_init(vdev, lbusid)) {
> +                     dbg("imported_device_init failed");
> +                     return -1;
> +             }
>       }
>  
> -     return parse_status(attr_status);
> +     return 0;
>  }
>  
>  static int get_nports(void)
>  {
> -     char *c;
> -     int nports = 0;
> -     const char *attr_status;
> +     const char *attr_nports;
>  
> -     attr_status = udev_device_get_sysattr_value(vhci_driver->hc_device,
> -                                            "status");
> -     if (!attr_status) {
> +     attr_nports = udev_device_get_sysattr_value(vhci_hc_device, "nports");
> +     if (!attr_nports) {
>               err("udev_device_get_sysattr_value failed");
>               return -1;
>       }
>  
> -     /* skip a header line */
> -     c = strchr(attr_status, '\n');
> -     if (!c)
> -             return 0;
> -     c++;
> -
> -     while (*c != '\0') {
> -             /* go to the next line */
> -             c = strchr(c, '\n');
> -             if (!c)
> -                     return nports;
> -             c++;
> -             nports += 1;
> +     vhci_nports = strtol(attr_nports, NULL, 10);
> +     if (vhci_nports <= 0) {
> +             err("invalid nports value");
> +             return -1;
>       }
>  
> -     return nports;
> +     return 0;
>  }
>  
>  static int __read_record(int rhport, char *buffer, size_t buffer_len)
> @@ -164,11 +176,11 @@ static int __read_record(int rhport, char *buffer, 
> size_t buffer_len)
>  
>       file = fopen(path, "r");
>       if (!file) {
> -             err("fopen");
> +             err("fopen %s", path);
>               return -1;
>       }
>       if (fgets(buffer, buffer_len, file) == NULL) {
> -             err("fgets");
> +             err("fgets %s", path);
>               fclose(file);
>               return -1;
>       }
> @@ -186,22 +198,22 @@ static int __read_record(int rhport, char *buffer, 
> size_t buffer_len)
>   * which is needed to properly validate the 3rd part without it being
>   * truncated to an acceptable length.
>   */
> -static int read_record(int rhport, char *host, int host_len,
> -             char *port, int port_len, char *busid, int busid_len)
> +static int read_record(int port, char *host, int host_len,
> +             char *serv, int serv_len, char *busid, int busid_len)
>  {
>       int part;
>       char *buffer, *start, *end;
>       char delim[] = {' ', ' ', '\n'};
> -     char * const str[] = {host, port, busid};
> -     int max_len[] = {host_len, port_len, busid_len};
> +     char * const str[] = {host, serv, busid};
> +     int max_len[] = {host_len, serv_len, busid_len};
>       int str_len;
> -     size_t buffer_len = host_len + port_len + busid_len + 4;
> +     size_t buffer_len = host_len + serv_len + busid_len + 4;
>  
> -     buffer = malloc(buffer_len);
> +     buffer = (char *)malloc(buffer_len);
>       if (!buffer)
>               goto err_out;
>  
> -     if (__read_record(rhport, buffer, buffer_len))
> +     if (__read_record(port, buffer, buffer_len))
>               goto err_free_buffer;
>  
>       /* validate the length of each of the 3 parts */
> @@ -229,25 +241,28 @@ static int read_record(int rhport, char *host, int 
> host_len,
>       return -1;
>  }
>  
> -#define OPEN_HC_MODE_FIRST   0
> -#define OPEN_HC_MODE_REOPEN  1
> -
>  static int open_hc_device(int mode)
>  {
> -     if (mode == OPEN_HC_MODE_REOPEN)
> -             udev_device_unref(vhci_driver->hc_device);
> +     if (vhci_hc_device && mode == OPEN_MODE_REOPEN)
> +             udev_device_unref(vhci_hc_device);
>  
> -     vhci_driver->hc_device =
> +     vhci_hc_device =
>               udev_device_new_from_subsystem_sysname(udev_context,
>                                                      USBIP_VHCI_BUS_TYPE,
>                                                      USBIP_VHCI_DRV_NAME);
> -     if (!vhci_driver->hc_device) {
> +     if (!vhci_hc_device) {
>               err("udev_device_new_from_subsystem_sysname failed");
>               return -1;
>       }
>       return 0;
>  }
>  
> +static void close_hc_device(void)
> +{
> +     udev_device_unref(vhci_hc_device);
> +     vhci_hc_device = NULL;
> +}
> +
>  /* ---------------------------------------------------------------------- */
>  
>  int usbip_vhci_driver_open(void)
> @@ -255,103 +270,90 @@ int usbip_vhci_driver_open(void)
>       udev_context = udev_new();
>       if (!udev_context) {
>               err("udev_new failed");
> -             return -1;
> +             goto err_out;
>       }
>  
> -     vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver));
> -
> -     if (open_hc_device(OPEN_HC_MODE_FIRST))
> -             goto err_free_driver;
> +     if (open_hc_device(OPEN_MODE_FIRST))
> +             goto err_unref_udev;
>  
> -     vhci_driver->nports = get_nports();
> -
> -     dbg("available ports: %d", vhci_driver->nports);
> -
> -     if (refresh_imported_device_list())
> -             goto err_unref_device;
> +     if (get_nports() || vhci_nports <= 0) {
> +             err("failed to get nports");
> +             goto err_close_hc;
> +     }
> +     dbg("available ports: %d", vhci_nports);
>  
>       return 0;
>  
> -err_unref_device:
> -     udev_device_unref(vhci_driver->hc_device);
> -err_free_driver:
> -     if (vhci_driver)
> -             free(vhci_driver);
> -
> -     vhci_driver = NULL;
> -
> +err_close_hc:
> +     close_hc_device();
> +err_unref_udev:
>       udev_unref(udev_context);
> -
> +     udev_context = NULL;
> +err_out:
>       return -1;
>  }
>  
>  
>  void usbip_vhci_driver_close(void)
>  {
> -     if (!vhci_driver)
> -             return;
> -
> -     udev_device_unref(vhci_driver->hc_device);
> -
> -     free(vhci_driver);
> +     close_hc_device();
>  
> -     vhci_driver = NULL;
> -
> -     udev_unref(udev_context);
> +     if (udev_context)
> +             udev_unref(udev_context);
>  }
>  
> -
> -int usbip_vhci_refresh_device_list(void)
> +int usbip_vhci_get_free_port(void)
>  {
> -     if (open_hc_device(OPEN_HC_MODE_REOPEN))
> -             goto err;
> -     if (refresh_imported_device_list())
> -             goto err;
> -
> -     return 0;
> -err:
> -     dbg("failed to refresh device list");
> -     return -1;
> -}
> +     struct status_context context;
> +     struct usbip_vhci_device vdev;
>  
> +     if (open_status(&context, OPEN_MODE_FIRST))
> +             return -1;
>  
> -int usbip_vhci_get_free_port(void)
> -{
> -     for (int i = 0; i < vhci_driver->nports; i++) {
> -             if (vhci_driver->idev[i].status == VDEV_ST_NULL)
> -                     return i;
> +     while (!parse_status_line(&context, &vdev)) {
> +             if (vdev.status == VDEV_ST_NULL) {
> +                     dbg("found free port %d", vdev.port);
> +                     close_status(&context);
> +                     return vdev.port;
> +             }
>       }
>  
> +     close_status(&context);
>       return -1;
>  }
>  
> -struct usbip_imported_device *usbip_vhci_find_device(char *host, char *busid)
> +int usbip_vhci_find_device(const char *host, const char *busid)
>  {
> -     struct usbip_imported_device *idev;
>       int ret;
>       char rhost[NI_MAXHOST];
>       char rbusid[SYSFS_BUS_ID_SIZE];
> +     struct status_context context;
> +     struct usbip_vhci_device vdev;
>  
> -     for (int i = 0; i < vhci_driver->nports; i++) {
> -             idev = &vhci_driver->idev[i];
> +     if (open_status(&context, OPEN_MODE_FIRST))
> +             return -1;
>  
> -             if (idev->status == VDEV_ST_NULL ||
> -                     idev->status == VDEV_ST_NOTASSIGNED)
> +     while (!parse_status_line(&context, &vdev)) {
> +             if (vdev.status == VDEV_ST_NULL ||
> +                     vdev.status == VDEV_ST_NOTASSIGNED)
>                       continue;
>  
> -             ret = read_record(idev->port, rhost, sizeof(rhost), NULL, 0,
> +             ret = read_record(vdev.port, rhost, sizeof(rhost), NULL, 0,
>                                 rbusid, sizeof(rbusid));
>               if (!ret &&
>                       !strncmp(host, rhost, sizeof(rhost)) &&
>                       !strncmp(busid, rbusid, sizeof(rbusid))) {
> -                     return vhci_driver->idev + i;
> +                     close_status(&context);
> +                     return vdev.port;
>               }
>       }
> -     return NULL;
> +     close_status(&context);
> +     return -1;
>  }
>  
> -int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid,
> -             uint32_t speed) {
> +int usbip_vhci_attach_device2(int port, int sockfd, uint32_t devid,
> +             uint32_t speed)
> +{
>       char buff[200]; /* what size should be ? */
>       char attach_attr_path[SYSFS_PATH_MAX];
>       char attr_attach[] = "attach";
> @@ -362,7 +364,7 @@ int usbip_vhci_attach_device2(uint8_t port, int sockfd, 
> uint32_t devid,
>                       port, sockfd, devid, speed);
>       dbg("writing: %s", buff);
>  
> -     path = udev_device_get_syspath(vhci_driver->hc_device);
> +     path = udev_device_get_syspath(vhci_hc_device);
>       snprintf(attach_attr_path, sizeof(attach_attr_path), "%s/%s",
>                path, attr_attach);
>       dbg("attach attribute path: %s", attach_attr_path);
> @@ -384,7 +386,7 @@ static unsigned long get_devid(uint8_t busnum, uint8_t 
> devnum)
>  }
>  
>  /* will be removed */
> -int usbip_vhci_attach_device(uint8_t port, int sockfd, uint8_t busnum,
> +int usbip_vhci_attach_device(int port, int sockfd, uint8_t busnum,
>               uint8_t devnum, uint32_t speed)
>  {
>       int devid = get_devid(busnum, devnum);
> @@ -392,7 +394,7 @@ int usbip_vhci_attach_device(uint8_t port, int sockfd, 
> uint8_t busnum,
>       return usbip_vhci_attach_device2(port, sockfd, devid, speed);
>  }
>  
> -int usbip_vhci_detach_device(uint8_t port)
> +int usbip_vhci_detach_device(int port)
>  {
>       char detach_attr_path[SYSFS_PATH_MAX];
>       char attr_detach[] = "detach";
> @@ -403,7 +405,7 @@ int usbip_vhci_detach_device(uint8_t port)
>       snprintf(buff, sizeof(buff), "%u", port);
>       dbg("writing: %s", buff);
>  
> -     path = udev_device_get_syspath(vhci_driver->hc_device);
> +     path = udev_device_get_syspath(vhci_hc_device);
>       snprintf(detach_attr_path, sizeof(detach_attr_path), "%s/%s",
>                path, attr_detach);
>       dbg("detach attribute path: %s", detach_attr_path);
> @@ -419,7 +421,7 @@ int usbip_vhci_detach_device(uint8_t port)
>       return 0;
>  }
>  
> -int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev)
> +static int usbip_vhci_imported_device_dump(struct usbip_vhci_device *vdev)
>  {
>       char product_name[100];
>       char host[NI_MAXHOST] = "unknown host";
> @@ -428,42 +430,68 @@ int usbip_vhci_imported_device_dump(struct 
> usbip_imported_device *idev)
>       int ret;
>       int read_record_error = 0;
>  
> -     if (idev->status == VDEV_ST_NULL || idev->status == VDEV_ST_NOTASSIGNED)
> +     if (vdev->status == VDEV_ST_NULL || vdev->status == VDEV_ST_NOTASSIGNED)
>               return 0;
>  
> -     ret = read_record(idev->port, host, sizeof(host), serv, sizeof(serv),
> +     ret = read_record(vdev->port, host, sizeof(host), serv, sizeof(serv),
>                         remote_busid, sizeof(remote_busid));
>       if (ret) {
>               err("read_record");
>               read_record_error = 1;
>       }
>  
> -     printf("Port %02d: <%s> at %s\n", idev->port,
> -            usbip_status_string(idev->status),
> -            usbip_speed_string(idev->udev.speed));
> +     printf("Port %02d: <%s> at %s\n", vdev->port,
> +            usbip_status_string(vdev->status),
> +            usbip_speed_string(vdev->udev.speed));
>  
>       usbip_names_get_product(product_name, sizeof(product_name),
> -                             idev->udev.idVendor, idev->udev.idProduct);
> +                             vdev->udev.idVendor, vdev->udev.idProduct);
>  
>       printf("       %s\n",  product_name);
>  
>       if (!read_record_error) {
> -             printf("%10s -> usbip://%s:%s/%s\n", idev->udev.busid,
> +             printf("%10s -> usbip://%s:%s/%s\n", vdev->udev.busid,
>                      host, serv, remote_busid);
>               printf("%10s -> remote bus/dev %03d/%03d\n", " ",
> -                    idev->busnum, idev->devnum);
> +                    vdev->busnum, vdev->devnum);
>       } else {
>               printf("%10s -> unknown host, remote port and remote busid\n",
> -                    idev->udev.busid);
> +                    vdev->udev.busid);
>               printf("%10s -> remote bus/dev %03d/%03d\n", " ",
> -                    idev->busnum, idev->devnum);
> +                    vdev->busnum, vdev->devnum);
> +     }
> +
> +     return 0;
> +}
> +
> +int usbip_vhci_imported_devices_dump(void)
> +{
> +     struct status_context context;
> +     struct usbip_vhci_device vdev;
> +
> +     if (open_status(&context, OPEN_MODE_FIRST))
> +             goto err_out;
> +
> +     while (!parse_status_line(&context, &vdev)) {
> +             if (vdev.status == VDEV_ST_NULL ||
> +                     vdev.status == VDEV_ST_NOTASSIGNED)
> +                     continue;
> +
> +             if (usbip_vhci_imported_device_dump(&vdev))
> +                     goto err_close;
>       }
> +     close_status(&context);
>  
>       return 0;
> +err_close:
> +     close_status(&context);
> +err_out:
> +     return -1;
>  }
>  
>  #define MAX_BUFF 100
> -int usbip_vhci_create_record(char *host, char *port, char *busid, int rhport)
> +int usbip_vhci_create_record(const char *host, const char *serv,
> +                          const char *busid, int port)
>  {
>       int fd;
>       char path[PATH_MAX+1];
> @@ -485,14 +513,14 @@ int usbip_vhci_create_record(char *host, char *port, 
> char *busid, int rhport)
>                       return -1;
>       }
>  
> -     snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", rhport);
> +     snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", port);
>  
>       fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0700);
>       if (fd < 0)
>               return -1;
>  
>       snprintf(buff, MAX_BUFF, "%s %s %s\n",
> -                     host, port, busid);
> +                     host, serv, busid);
>  
>       ret = write(fd, buff, strlen(buff));
>       if (ret != (ssize_t) strlen(buff)) {
> @@ -505,11 +533,11 @@ int usbip_vhci_create_record(char *host, char *port, 
> char *busid, int rhport)
>       return 0;
>  }
>  
> -int usbip_vhci_delete_record(int rhport)
> +int usbip_vhci_delete_record(int port)
>  {
>       char path[PATH_MAX+1];
>  
> -     snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", rhport);
> +     snprintf(path, PATH_MAX, VHCI_STATE_PATH"/port%d", port);
>  
>       remove(path);
>       rmdir(VHCI_STATE_PATH);
> diff --git a/tools/usb/usbip/libsrc/vhci_driver.h 
> b/tools/usb/usbip/libsrc/vhci_driver.h
> index a812851..5981bf3 100644
> --- a/tools/usb/usbip/libsrc/vhci_driver.h
> +++ b/tools/usb/usbip/libsrc/vhci_driver.h
> @@ -11,53 +11,22 @@
>  #include "usbip_common.h"
>  
>  #define USBIP_VHCI_BUS_TYPE "platform"
> -#define MAXNPORT 128
> -
> -struct usbip_imported_device {
> -     uint8_t port;
> -     uint32_t status;
> -
> -     uint32_t devid;
> -
> -     uint8_t busnum;
> -     uint8_t devnum;
> -
> -     /* usbip_class_device list */
> -     struct usbip_usb_device udev;
> -};
> -
> -struct usbip_vhci_driver {
> -
> -     /* /sys/devices/platform/vhci_hcd */
> -     struct udev_device *hc_device;
> -
> -     int nports;
> -     struct usbip_imported_device idev[MAXNPORT];
> -};
> -
> -
> -extern struct usbip_vhci_driver *vhci_driver;
>  
>  int usbip_vhci_driver_open(void);
>  void usbip_vhci_driver_close(void);
>  
> -int  usbip_vhci_refresh_device_list(void);
> -
> -
>  int usbip_vhci_get_free_port(void);
> -struct usbip_imported_device *usbip_vhci_find_device(char *host, char 
> *busid);
> -int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid,
> -             uint32_t speed);
> +int usbip_vhci_find_device(const char *host, const char *busid);
>  
>  /* will be removed */
> -int usbip_vhci_attach_device(uint8_t port, int sockfd, uint8_t busnum,
> -             uint8_t devnum, uint32_t speed);
> -
> -int usbip_vhci_detach_device(uint8_t port);
> +int usbip_vhci_attach_device(int port, int sockfd, uint8_t busnum,
> +                          uint8_t devnum, uint32_t speed);
> +int usbip_vhci_detach_device(int port);
>  
> -int usbip_vhci_create_record(char *host, char *port, char *busid, int 
> rhport);
> +int usbip_vhci_create_record(const char *host, const char *port,
> +                          const char *busid, int rhport);
>  int usbip_vhci_delete_record(int rhport);
>  
> -int usbip_vhci_imported_device_dump(struct usbip_imported_device *idev);
> +int usbip_vhci_imported_devices_dump(void);
>  
>  #endif /* __VHCI_DRIVER_H */
> diff --git a/tools/usb/usbip/src/usbip_attach.c 
> b/tools/usb/usbip/src/usbip_attach.c
> index 17a84ea..05e7666 100644
> --- a/tools/usb/usbip/src/usbip_attach.c
> +++ b/tools/usb/usbip/src/usbip_attach.c
> @@ -51,7 +51,7 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>                        char *host, char *port, char *busid)
>  {
>       int rc;
> -     int rhport;
> +     int port_nr;
>  
>       rc = usbip_vhci_driver_open();
>       if (rc < 0) {
> @@ -60,13 +60,13 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>       }
>  
>       do {
> -             rhport = usbip_vhci_get_free_port();
> -             if (rhport < 0) {
> +             port_nr = usbip_vhci_get_free_port();
> +             if (port_nr < 0) {
>                       err("no free port");
>                       goto err_driver_close;
>               }
>  
> -             rc = usbip_vhci_attach_device(rhport, sockfd, udev->busnum,
> +             rc = usbip_vhci_attach_device(port_nr, sockfd, udev->busnum,
>                                             udev->devnum, udev->speed);
>               if (rc < 0 && errno != EBUSY) {
>                       err("import device");
> @@ -75,7 +75,7 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>               }
>       } while (rc < 0);
>  
> -     rc = usbip_vhci_create_record(host, port, busid, rhport);
> +     rc = usbip_vhci_create_record(host, port, busid, port_nr);
>       if (rc < 0) {
>               err("record connection");
>               goto err_detach_device;
> @@ -86,7 +86,7 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>       return 0;
>  
>  err_detach_device:
> -     usbip_vhci_detach_device(rhport);
> +     usbip_vhci_detach_device(port_nr);
>  err_driver_close:
>       usbip_vhci_driver_close();
>  err_out:
> diff --git a/tools/usb/usbip/src/usbip_port.c 
> b/tools/usb/usbip/src/usbip_port.c
> index 7bd74fb..77cac68 100644
> --- a/tools/usb/usbip/src/usbip_port.c
> +++ b/tools/usb/usbip/src/usbip_port.c
> @@ -18,8 +18,6 @@
>  
>  static int list_imported_devices(void)
>  {
> -     int i;
> -     struct usbip_imported_device *idev;
>       int ret;
>  
>       if (usbip_names_init(USBIDS_FILE))
> @@ -27,18 +25,17 @@ static int list_imported_devices(void)
>  
>       ret = usbip_vhci_driver_open();
>       if (ret < 0) {
> -             err("open vhci_driver");
> +             err("open vhci driver");
>               goto err_names_free;
>       }
>  
>       printf("Imported USB devices\n");
>       printf("====================\n");
>  
> -     for (i = 0; i < vhci_driver->nports; i++) {
> -             idev = &vhci_driver->idev[i];
> -
> -             if (usbip_vhci_imported_device_dump(idev) < 0)
> -                     goto err_driver_close;
> +     ret = usbip_vhci_imported_devices_dump();
> +     if (ret < 0) {
> +             err("dump vhci devices");
> +             goto err_driver_close;
>       }
>  
>       usbip_vhci_driver_close();
> diff --git a/tools/usb/usbip/src/usbipd_app.c 
> b/tools/usb/usbip/src/usbipd_app.c
> index ce7438e..c5c0b77 100644
> --- a/tools/usb/usbip/src/usbipd_app.c
> +++ b/tools/usb/usbip/src/usbipd_app.c
> @@ -52,15 +52,9 @@ void driver_close(void)
>       usbip_vhci_driver_close();
>  }
>  
> -static int refresh_device_list(void)
> -{
> -     return usbip_vhci_refresh_device_list();
> -}
> -
>  struct usbipd_driver_ops usbipd_driver_ops = {
>       .open = driver_open,
>       .close = driver_close,
> -     .refresh_device_list = refresh_device_list,
>  };
>  
>  static int import_device(int sockfd, struct usbip_usb_device *udev,
> @@ -68,20 +62,20 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>                        uint32_t *status)
>  {
>       int rc;
> -     int rhport;
> +     int port_nr;
>  
>       dbg("Sockfd:%d", sockfd);
>       dump_usb_device(udev);
>  
>       do {
> -             rhport = usbip_vhci_get_free_port();
> -             if (rhport < 0) {
> +             port_nr = usbip_vhci_get_free_port();
> +             if (port_nr < 0) {
>                       err("no free port");
>                       *status = ST_NO_FREE_PORT;
>                       goto err_out;
>               }
>  
> -             rc = usbip_vhci_attach_device(rhport, sockfd, udev->busnum,
> +             rc = usbip_vhci_attach_device(port_nr, sockfd, udev->busnum,
>                                             udev->devnum, udev->speed);
>               if (rc < 0 && errno != EBUSY) {
>                       err("import device");
> @@ -90,7 +84,7 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>               }
>       } while (rc < 0);
>  
> -     rc = usbip_vhci_create_record(host, port, busid, rhport);
> +     rc = usbip_vhci_create_record(host, port, busid, port_nr);
>       if (rc < 0) {
>               err("record connection");
>               *status = ST_NA;
> @@ -100,7 +94,7 @@ static int import_device(int sockfd, struct 
> usbip_usb_device *udev,
>       return 0;
>  
>  err_detach_device:
> -     usbip_vhci_detach_device(rhport);
> +     usbip_vhci_detach_device(port_nr);
>  err_out:
>       return -1;
>  }
> @@ -139,24 +133,23 @@ static int recv_request_export(int sockfd, char *host, 
> char *port)
>  static int unimport_device(char *host, struct usbip_usb_device *udev,
>                          uint32_t *status)
>  {
> -     int rc;
> -     struct usbip_imported_device *idev;
> +     int port_nr, rc;
>  
> -     idev = usbip_vhci_find_device(host, udev->busid);
> -     if (idev == NULL) {
> +     port_nr = usbip_vhci_find_device(host, udev->busid);
> +     if (port_nr < 0) {
>               err("no imported port %s %s", host, udev->busid);
>               *status = ST_DEVICE_NOT_FOUND;
>               return -1;
>       }
>  
> -     rc = usbip_vhci_detach_device(idev->port);
> +     rc = usbip_vhci_detach_device(port_nr);
>       if (rc < 0) {
> -             err("no imported port %d %s %s", idev->port, host, udev->busid);
> +             err("no imported port %d %s %s", port_nr, host, udev->busid);
>               *status = ST_NA;
>               return -1;
>       }
>  
> -     usbip_vhci_delete_record(idev->port);
> +     usbip_vhci_delete_record(port_nr);
>  
>       return 0;
>  }
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to