Commit 38c8c0a9 authored by Michael Grzeschik's avatar Michael Grzeschik Committed by Greg Kroah-Hartman

usbip: dynamically allocate idev by nports found in sysfs

[ Upstream commit de19ca6f ]

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: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
Acked-by: default avatarShuah Khan (Samsung OSG) <shuah@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bc30588b
...@@ -135,11 +135,11 @@ static int refresh_imported_device_list(void) ...@@ -135,11 +135,11 @@ static int refresh_imported_device_list(void)
return 0; return 0;
} }
static int get_nports(void) static int get_nports(struct udev_device *hc_device)
{ {
const char *attr_nports; 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) { if (!attr_nports) {
err("udev_device_get_sysattr_value nports failed"); err("udev_device_get_sysattr_value nports failed");
return -1; return -1;
...@@ -242,35 +242,41 @@ static int read_record(int rhport, char *host, unsigned long host_len, ...@@ -242,35 +242,41 @@ static int read_record(int rhport, char *host, unsigned long host_len,
int usbip_vhci_driver_open(void) int usbip_vhci_driver_open(void)
{ {
int nports;
struct udev_device *hc_device;
udev_context = udev_new(); udev_context = udev_new();
if (!udev_context) { if (!udev_context) {
err("udev_new failed"); err("udev_new failed");
return -1; return -1;
} }
vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver));
/* will be freed in usbip_driver_close() */ /* will be freed in usbip_driver_close() */
vhci_driver->hc_device = hc_device =
udev_device_new_from_subsystem_sysname(udev_context, udev_device_new_from_subsystem_sysname(udev_context,
USBIP_VHCI_BUS_TYPE, USBIP_VHCI_BUS_TYPE,
USBIP_VHCI_DEVICE_NAME); USBIP_VHCI_DEVICE_NAME);
if (!vhci_driver->hc_device) { if (!hc_device) {
err("udev_device_new_from_subsystem_sysname failed"); err("udev_device_new_from_subsystem_sysname failed");
goto err; goto err;
} }
vhci_driver->nports = get_nports(); nports = get_nports(hc_device);
dbg("available ports: %d", vhci_driver->nports); if (nports <= 0) {
if (vhci_driver->nports <= 0) {
err("no available ports"); err("no available ports");
goto err; 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; goto err;
} }
vhci_driver->nports = nports;
vhci_driver->hc_device = hc_device;
vhci_driver->ncontrollers = get_ncontrollers(); vhci_driver->ncontrollers = get_ncontrollers();
dbg("available controllers: %d", vhci_driver->ncontrollers); dbg("available controllers: %d", vhci_driver->ncontrollers);
...@@ -285,7 +291,7 @@ int usbip_vhci_driver_open(void) ...@@ -285,7 +291,7 @@ int usbip_vhci_driver_open(void)
return 0; return 0;
err: err:
udev_device_unref(vhci_driver->hc_device); udev_device_unref(hc_device);
if (vhci_driver) if (vhci_driver)
free(vhci_driver); free(vhci_driver);
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#define USBIP_VHCI_BUS_TYPE "platform" #define USBIP_VHCI_BUS_TYPE "platform"
#define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0" #define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0"
#define MAXNPORT 128
enum hub_speed { enum hub_speed {
HUB_SPEED_HIGH = 0, HUB_SPEED_HIGH = 0,
...@@ -41,7 +40,7 @@ struct usbip_vhci_driver { ...@@ -41,7 +40,7 @@ struct usbip_vhci_driver {
int ncontrollers; int ncontrollers;
int nports; int nports;
struct usbip_imported_device idev[MAXNPORT]; struct usbip_imported_device idev[];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment