Commit e9f2f688 authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: interface: clean up device-id handling

Clean up the device id-handling and make sure we never allocate invalid
device ids due to a missing upper bound.
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 984c9d38
...@@ -32,8 +32,6 @@ struct gb_bundle { ...@@ -32,8 +32,6 @@ struct gb_bundle {
}; };
#define to_gb_bundle(d) container_of(d, struct gb_bundle, dev) #define to_gb_bundle(d) container_of(d, struct gb_bundle, dev)
#define GB_DEVICE_ID_BAD 0xff
/* Greybus "private" definitions" */ /* Greybus "private" definitions" */
struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id, struct gb_bundle *gb_bundle_create(struct gb_interface *intf, u8 bundle_id,
u8 class); u8 class);
......
...@@ -54,10 +54,11 @@ ...@@ -54,10 +54,11 @@
/* Fixed IDs for control/svc protocols */ /* Fixed IDs for control/svc protocols */
/* Device ID of SVC and AP */ /* SVC switch-port device ids */
#define GB_DEVICE_ID_SVC 0 #define GB_SVC_DEVICE_ID_SVC 0
#define GB_DEVICE_ID_AP 1 #define GB_SVC_DEVICE_ID_AP 1
#define GB_DEVICE_ID_MODULES_START 2 #define GB_SVC_DEVICE_ID_MIN 2
#define GB_SVC_DEVICE_ID_MAX 31
#define GB_SVC_CPORT_ID 0 #define GB_SVC_CPORT_ID 0
#define GB_CONTROL_BUNDLE_ID 0 #define GB_CONTROL_BUNDLE_ID 0
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
#include "greybus.h" #include "greybus.h"
#define GB_INTERFACE_DEVICE_ID_BAD 0xff
static int gb_interface_route_create(struct gb_interface *intf) static int gb_interface_route_create(struct gb_interface *intf)
{ {
struct gb_svc *svc = intf->hd->svc; struct gb_svc *svc = intf->hd->svc;
...@@ -17,16 +20,10 @@ static int gb_interface_route_create(struct gb_interface *intf) ...@@ -17,16 +20,10 @@ static int gb_interface_route_create(struct gb_interface *intf)
u8 device_id; u8 device_id;
int ret; int ret;
/* /* Allocate an interface device id. */
* Create a device id for the interface:
* - device id 0 (GB_DEVICE_ID_SVC) belongs to the SVC
* - device id 1 (GB_DEVICE_ID_AP) belongs to the AP
*
* XXX Do we need to allocate device ID for SVC or the AP here? And what
* XXX about an AP with multiple interface blocks?
*/
ret = ida_simple_get(&svc->device_id_map, ret = ida_simple_get(&svc->device_id_map,
GB_DEVICE_ID_MODULES_START, 0, GFP_KERNEL); GB_SVC_DEVICE_ID_MIN, GB_SVC_DEVICE_ID_MAX + 1,
GFP_KERNEL);
if (ret < 0) { if (ret < 0) {
dev_err(&intf->dev, "failed to allocate device id: %d\n", ret); dev_err(&intf->dev, "failed to allocate device id: %d\n", ret);
return ret; return ret;
...@@ -40,8 +37,8 @@ static int gb_interface_route_create(struct gb_interface *intf) ...@@ -40,8 +37,8 @@ static int gb_interface_route_create(struct gb_interface *intf)
goto err_ida_remove; goto err_ida_remove;
} }
/* Create a two-way route between the AP and the new interface. */ /* FIXME: Hard-coded AP device id. */
ret = gb_svc_route_create(svc, svc->ap_intf_id, GB_DEVICE_ID_AP, ret = gb_svc_route_create(svc, svc->ap_intf_id, GB_SVC_DEVICE_ID_AP,
intf_id, device_id); intf_id, device_id);
if (ret) { if (ret) {
dev_err(&intf->dev, "failed to create route: %d\n", ret); dev_err(&intf->dev, "failed to create route: %d\n", ret);
...@@ -67,12 +64,12 @@ static void gb_interface_route_destroy(struct gb_interface *intf) ...@@ -67,12 +64,12 @@ static void gb_interface_route_destroy(struct gb_interface *intf)
{ {
struct gb_svc *svc = intf->hd->svc; struct gb_svc *svc = intf->hd->svc;
if (intf->device_id == GB_DEVICE_ID_BAD) if (intf->device_id == GB_INTERFACE_DEVICE_ID_BAD)
return; return;
gb_svc_route_destroy(svc, svc->ap_intf_id, intf->interface_id); gb_svc_route_destroy(svc, svc->ap_intf_id, intf->interface_id);
ida_simple_remove(&svc->device_id_map, intf->device_id); ida_simple_remove(&svc->device_id_map, intf->device_id);
intf->device_id = GB_DEVICE_ID_BAD; intf->device_id = GB_INTERFACE_DEVICE_ID_BAD;
} }
/* /*
...@@ -257,7 +254,7 @@ struct gb_interface *gb_interface_create(struct gb_host_device *hd, ...@@ -257,7 +254,7 @@ struct gb_interface *gb_interface_create(struct gb_host_device *hd,
INIT_LIST_HEAD(&intf->manifest_descs); INIT_LIST_HEAD(&intf->manifest_descs);
/* Invalid device id to start with */ /* Invalid device id to start with */
intf->device_id = GB_DEVICE_ID_BAD; intf->device_id = GB_INTERFACE_DEVICE_ID_BAD;
intf->dev.parent = &hd->dev; intf->dev.parent = &hd->dev;
intf->dev.bus = &greybus_bus_type; intf->dev.bus = &greybus_bus_type;
......
...@@ -21,7 +21,7 @@ struct gb_interface { ...@@ -21,7 +21,7 @@ struct gb_interface {
struct list_head links; /* gb_host_device->interfaces */ struct list_head links; /* gb_host_device->interfaces */
struct list_head manifest_descs; struct list_head manifest_descs;
u8 interface_id; /* Physical location within the Endo */ u8 interface_id; /* Physical location within the Endo */
u8 device_id; /* Device id allocated for the interface block by the SVC */ u8 device_id;
/* Information taken from the manifest descriptor */ /* Information taken from the manifest descriptor */
char *vendor_string; char *vendor_string;
......
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