Skip to content

Commit

Permalink
usbip: dynamically allocate idev by nports found in sysfs
Browse files Browse the repository at this point in the history
As the amount of available ports varies by the kernels build
configuration. To remove the limitation of the fixed 128 ports
we allocate the amount of idevs by using the number we get
from the kernel.

Signed-off-by: Michael Grzeschik <[email protected]>
Acked-by: Shuah Khan (Samsung OSG) <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
mgrzeschik authored and gregkh committed May 31, 2018
1 parent dbafc28 commit de19ca6
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
32 changes: 19 additions & 13 deletions tools/usb/usbip/libsrc/vhci_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,11 +135,11 @@ static int refresh_imported_device_list(void)
return 0;
}

static int get_nports(void)
static int get_nports(struct udev_device *hc_device)
{
const char *attr_nports;

attr_nports = udev_device_get_sysattr_value(vhci_driver->hc_device, "nports");
attr_nports = udev_device_get_sysattr_value(hc_device, "nports");
if (!attr_nports) {
err("udev_device_get_sysattr_value nports failed");
return -1;
Expand Down Expand Up @@ -242,35 +242,41 @@ static int read_record(int rhport, char *host, unsigned long host_len,

int usbip_vhci_driver_open(void)
{
int nports;
struct udev_device *hc_device;

udev_context = udev_new();
if (!udev_context) {
err("udev_new failed");
return -1;
}

vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver));

/* will be freed in usbip_driver_close() */
vhci_driver->hc_device =
hc_device =
udev_device_new_from_subsystem_sysname(udev_context,
USBIP_VHCI_BUS_TYPE,
USBIP_VHCI_DEVICE_NAME);
if (!vhci_driver->hc_device) {
if (!hc_device) {
err("udev_device_new_from_subsystem_sysname failed");
goto err;
}

vhci_driver->nports = get_nports();
dbg("available ports: %d", vhci_driver->nports);

if (vhci_driver->nports <= 0) {
nports = get_nports(hc_device);
if (nports <= 0) {
err("no available ports");
goto err;
} else if (vhci_driver->nports > MAXNPORT) {
err("port number exceeds %d", MAXNPORT);
}
dbg("available ports: %d", nports);

vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver) +
nports * sizeof(struct usbip_imported_device));
if (!vhci_driver) {
err("vhci_driver allocation failed");
goto err;
}

vhci_driver->nports = nports;
vhci_driver->hc_device = hc_device;
vhci_driver->ncontrollers = get_ncontrollers();
dbg("available controllers: %d", vhci_driver->ncontrollers);

Expand All @@ -285,7 +291,7 @@ int usbip_vhci_driver_open(void)
return 0;

err:
udev_device_unref(vhci_driver->hc_device);
udev_device_unref(hc_device);

if (vhci_driver)
free(vhci_driver);
Expand Down
3 changes: 1 addition & 2 deletions tools/usb/usbip/libsrc/vhci_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

#define USBIP_VHCI_BUS_TYPE "platform"
#define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0"
#define MAXNPORT 128

enum hub_speed {
HUB_SPEED_HIGH = 0,
Expand Down Expand Up @@ -41,7 +40,7 @@ struct usbip_vhci_driver {

int ncontrollers;
int nports;
struct usbip_imported_device idev[MAXNPORT];
struct usbip_imported_device idev[];
};


Expand Down

0 comments on commit de19ca6

Please sign in to comment.