mei: bus: add client protocol version to the device alias

The device alias now looks like mei:S:uuid:N:*
In that way we can bind different drivers to clients with
different protocol versions if required.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Tomas Winkler 2015-09-10 10:18:01 +03:00 committed by Greg Kroah-Hartman
parent 40b7320ee4
commit b26864cad1
6 changed files with 30 additions and 10 deletions

View File

@ -453,17 +453,26 @@ struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev,
{ {
const struct mei_cl_device_id *id; const struct mei_cl_device_id *id;
const uuid_le *uuid; const uuid_le *uuid;
u8 version;
bool match;
uuid = mei_me_cl_uuid(cldev->me_cl); uuid = mei_me_cl_uuid(cldev->me_cl);
version = mei_me_cl_ver(cldev->me_cl);
id = cldrv->id_table; id = cldrv->id_table;
while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) { while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) {
if (!uuid_le_cmp(*uuid, id->uuid)) { if (!uuid_le_cmp(*uuid, id->uuid)) {
match = true;
if (!cldev->name[0]) if (cldev->name[0])
return id; if (strncmp(cldev->name, id->name,
sizeof(id->name)))
match = false;
if (!strncmp(cldev->name, id->name, sizeof(id->name))) if (id->version != MEI_CL_VERSION_ANY)
if (id->version != version)
match = false;
if (match)
return id; return id;
} }
@ -647,7 +656,8 @@ static int mei_cl_device_uevent(struct device *dev, struct kobj_uevent_env *env)
if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name)) if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
return -ENOMEM; return -ENOMEM;
if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:", cldev->name, uuid)) if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:%02X:",
cldev->name, uuid, version))
return -ENOMEM; return -ENOMEM;
return 0; return 0;
@ -737,8 +747,10 @@ static bool mei_cl_dev_setup(struct mei_device *bus,
mei_cl_dev_fixup(cldev); mei_cl_dev_fixup(cldev);
if (cldev->do_match) if (cldev->do_match)
dev_set_name(&cldev->dev, "mei:%s:%pUl", dev_set_name(&cldev->dev, "mei:%s:%pUl:%02X",
cldev->name, mei_me_cl_uuid(cldev->me_cl)); cldev->name,
mei_me_cl_uuid(cldev->me_cl),
mei_me_cl_ver(cldev->me_cl));
return cldev->do_match == 1; return cldev->do_match == 1;
} }
@ -754,7 +766,9 @@ static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
{ {
int ret; int ret;
dev_dbg(cldev->bus->dev, "adding %pUL\n", mei_me_cl_uuid(cldev->me_cl)); dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n",
mei_me_cl_uuid(cldev->me_cl),
mei_me_cl_ver(cldev->me_cl));
ret = device_add(&cldev->dev); ret = device_add(&cldev->dev);
if (!ret) if (!ret)
cldev->is_added = 1; cldev->is_added = 1;

View File

@ -67,7 +67,7 @@ static int microread_mei_remove(struct mei_cl_device *device)
} }
static struct mei_cl_device_id microread_mei_tbl[] = { static struct mei_cl_device_id microread_mei_tbl[] = {
{ MICROREAD_DRIVER_NAME, MEI_NFC_UUID}, { MICROREAD_DRIVER_NAME, MEI_NFC_UUID, MEI_CL_VERSION_ANY},
/* required last entry */ /* required last entry */
{ } { }

View File

@ -67,7 +67,7 @@ static int pn544_mei_remove(struct mei_cl_device *device)
} }
static struct mei_cl_device_id pn544_mei_tbl[] = { static struct mei_cl_device_id pn544_mei_tbl[] = {
{ PN544_DRIVER_NAME, MEI_NFC_UUID}, { PN544_DRIVER_NAME, MEI_NFC_UUID, MEI_CL_VERSION_ANY},
/* required last entry */ /* required last entry */
{ } { }

View File

@ -601,11 +601,13 @@ struct ipack_device_id {
#define MEI_CL_MODULE_PREFIX "mei:" #define MEI_CL_MODULE_PREFIX "mei:"
#define MEI_CL_NAME_SIZE 32 #define MEI_CL_NAME_SIZE 32
#define MEI_CL_VERSION_ANY 0xff
/** /**
* struct mei_cl_device_id - MEI client device identifier * struct mei_cl_device_id - MEI client device identifier
* @name: helper name * @name: helper name
* @uuid: client uuid * @uuid: client uuid
* @version: client protocol version
* @driver_info: information used by the driver. * @driver_info: information used by the driver.
* *
* identifies mei client device by uuid and name * identifies mei client device by uuid and name
@ -613,6 +615,7 @@ struct ipack_device_id {
struct mei_cl_device_id { struct mei_cl_device_id {
char name[MEI_CL_NAME_SIZE]; char name[MEI_CL_NAME_SIZE];
uuid_le uuid; uuid_le uuid;
__u8 version;
kernel_ulong_t driver_info; kernel_ulong_t driver_info;
}; };

View File

@ -185,6 +185,7 @@ int main(void)
DEVID(mei_cl_device_id); DEVID(mei_cl_device_id);
DEVID_FIELD(mei_cl_device_id, name); DEVID_FIELD(mei_cl_device_id, name);
DEVID_FIELD(mei_cl_device_id, uuid); DEVID_FIELD(mei_cl_device_id, uuid);
DEVID_FIELD(mei_cl_device_id, version);
DEVID(rio_device_id); DEVID(rio_device_id);
DEVID_FIELD(rio_device_id, did); DEVID_FIELD(rio_device_id, did);

View File

@ -1202,16 +1202,18 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias)
} }
ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry);
/* Looks like: mei:S:uuid */ /* Looks like: mei:S:uuid:N:* */
static int do_mei_entry(const char *filename, void *symval, static int do_mei_entry(const char *filename, void *symval,
char *alias) char *alias)
{ {
DEF_FIELD_ADDR(symval, mei_cl_device_id, name); DEF_FIELD_ADDR(symval, mei_cl_device_id, name);
DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid); DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid);
DEF_FIELD(symval, mei_cl_device_id, version);
sprintf(alias, MEI_CL_MODULE_PREFIX); sprintf(alias, MEI_CL_MODULE_PREFIX);
sprintf(alias + strlen(alias), "%s:", (*name)[0] ? *name : "*"); sprintf(alias + strlen(alias), "%s:", (*name)[0] ? *name : "*");
add_uuid(alias, *uuid); add_uuid(alias, *uuid);
ADD(alias, ":", version != MEI_CL_VERSION_ANY, version);
strcat(alias, ":*"); strcat(alias, ":*");