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:
parent
40b7320ee4
commit
b26864cad1
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
{ }
|
{ }
|
||||||
|
|
|
@ -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 */
|
||||||
{ }
|
{ }
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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, ":*");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue