diff options
-rw-r--r-- | Documentation/ABI/testing/sysfs-bus-mei | 2 | ||||
-rw-r--r-- | drivers/misc/mei/bus.c | 42 | ||||
-rw-r--r-- | drivers/misc/mei/mei_dev.h | 2 | ||||
-rw-r--r-- | drivers/nfc/mei_phy.h | 3 | ||||
-rw-r--r-- | drivers/nfc/microread/mei.c | 2 | ||||
-rw-r--r-- | drivers/nfc/pn544/mei.c | 2 | ||||
-rw-r--r-- | include/linux/mod_devicetable.h | 13 | ||||
-rw-r--r-- | scripts/mod/devicetable-offsets.c | 1 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 18 |
9 files changed, 72 insertions, 13 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-mei b/Documentation/ABI/testing/sysfs-bus-mei index 2066f0bbd453..91967a70313a 100644 --- a/Documentation/ABI/testing/sysfs-bus-mei +++ b/Documentation/ABI/testing/sysfs-bus-mei | |||
@@ -4,4 +4,4 @@ KernelVersion: 3.10 | |||
4 | Contact: Samuel Ortiz <sameo@linux.intel.com> | 4 | Contact: Samuel Ortiz <sameo@linux.intel.com> |
5 | linux-mei@linux.intel.com | 5 | linux-mei@linux.intel.com |
6 | Description: Stores the same MODALIAS value emitted by uevent | 6 | Description: Stores the same MODALIAS value emitted by uevent |
7 | Format: mei:<mei device name> | 7 | Format: mei:<mei device name>:<device uuid>: |
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c index 1101d6efaf27..17b00baa53b1 100644 --- a/drivers/misc/mei/bus.c +++ b/drivers/misc/mei/bus.c | |||
@@ -30,23 +30,40 @@ | |||
30 | #define to_mei_cl_driver(d) container_of(d, struct mei_cl_driver, driver) | 30 | #define to_mei_cl_driver(d) container_of(d, struct mei_cl_driver, driver) |
31 | #define to_mei_cl_device(d) container_of(d, struct mei_cl_device, dev) | 31 | #define to_mei_cl_device(d) container_of(d, struct mei_cl_device, dev) |
32 | 32 | ||
33 | static inline uuid_le uuid_le_cast(const __u8 uuid[16]) | ||
34 | { | ||
35 | return *(uuid_le *)uuid; | ||
36 | } | ||
37 | |||
33 | static int mei_cl_device_match(struct device *dev, struct device_driver *drv) | 38 | static int mei_cl_device_match(struct device *dev, struct device_driver *drv) |
34 | { | 39 | { |
35 | struct mei_cl_device *device = to_mei_cl_device(dev); | 40 | struct mei_cl_device *device = to_mei_cl_device(dev); |
36 | struct mei_cl_driver *driver = to_mei_cl_driver(drv); | 41 | struct mei_cl_driver *driver = to_mei_cl_driver(drv); |
37 | const struct mei_cl_device_id *id; | 42 | const struct mei_cl_device_id *id; |
43 | const uuid_le *uuid; | ||
44 | const char *name; | ||
38 | 45 | ||
39 | if (!device) | 46 | if (!device) |
40 | return 0; | 47 | return 0; |
41 | 48 | ||
49 | uuid = mei_me_cl_uuid(device->me_cl); | ||
50 | name = device->name; | ||
51 | |||
42 | if (!driver || !driver->id_table) | 52 | if (!driver || !driver->id_table) |
43 | return 0; | 53 | return 0; |
44 | 54 | ||
45 | id = driver->id_table; | 55 | id = driver->id_table; |
46 | 56 | ||
47 | while (id->name[0]) { | 57 | while (uuid_le_cmp(NULL_UUID_LE, uuid_le_cast(id->uuid))) { |
48 | if (!strncmp(dev_name(dev), id->name, sizeof(id->name))) | 58 | |
49 | return 1; | 59 | if (!uuid_le_cmp(*uuid, uuid_le_cast(id->uuid))) { |
60 | if (id->name[0]) { | ||
61 | if (!strncmp(name, id->name, sizeof(id->name))) | ||
62 | return 1; | ||
63 | } else { | ||
64 | return 1; | ||
65 | } | ||
66 | } | ||
50 | 67 | ||
51 | id++; | 68 | id++; |
52 | } | 69 | } |
@@ -69,7 +86,7 @@ static int mei_cl_device_probe(struct device *dev) | |||
69 | 86 | ||
70 | dev_dbg(dev, "Device probe\n"); | 87 | dev_dbg(dev, "Device probe\n"); |
71 | 88 | ||
72 | strlcpy(id.name, dev_name(dev), sizeof(id.name)); | 89 | strlcpy(id.name, device->name, sizeof(id.name)); |
73 | 90 | ||
74 | return driver->probe(device, &id); | 91 | return driver->probe(device, &id); |
75 | } | 92 | } |
@@ -100,9 +117,12 @@ static int mei_cl_device_remove(struct device *dev) | |||
100 | static ssize_t modalias_show(struct device *dev, struct device_attribute *a, | 117 | static ssize_t modalias_show(struct device *dev, struct device_attribute *a, |
101 | char *buf) | 118 | char *buf) |
102 | { | 119 | { |
103 | int len; | 120 | struct mei_cl_device *device = to_mei_cl_device(dev); |
121 | const uuid_le *uuid = mei_me_cl_uuid(device->me_cl); | ||
122 | size_t len; | ||
104 | 123 | ||
105 | len = snprintf(buf, PAGE_SIZE, "mei:%s\n", dev_name(dev)); | 124 | len = snprintf(buf, PAGE_SIZE, "mei:%s:" MEI_CL_UUID_FMT ":", |
125 | device->name, MEI_CL_UUID_ARGS(uuid->b)); | ||
106 | 126 | ||
107 | return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; | 127 | return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; |
108 | } | 128 | } |
@@ -116,7 +136,11 @@ ATTRIBUTE_GROUPS(mei_cl_dev); | |||
116 | 136 | ||
117 | static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env) | 137 | static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env) |
118 | { | 138 | { |
119 | if (add_uevent_var(env, "MODALIAS=mei:%s", dev_name(dev))) | 139 | struct mei_cl_device *device = to_mei_cl_device(dev); |
140 | const uuid_le *uuid = mei_me_cl_uuid(device->me_cl); | ||
141 | |||
142 | if (add_uevent_var(env, "MODALIAS=mei:%s:" MEI_CL_UUID_FMT ":", | ||
143 | device->name, MEI_CL_UUID_ARGS(uuid->b))) | ||
120 | return -ENOMEM; | 144 | return -ENOMEM; |
121 | 145 | ||
122 | return 0; | 146 | return 0; |
@@ -185,7 +209,9 @@ struct mei_cl_device *mei_cl_add_device(struct mei_device *dev, | |||
185 | device->dev.bus = &mei_cl_bus_type; | 209 | device->dev.bus = &mei_cl_bus_type; |
186 | device->dev.type = &mei_cl_device_type; | 210 | device->dev.type = &mei_cl_device_type; |
187 | 211 | ||
188 | dev_set_name(&device->dev, "%s", name); | 212 | strlcpy(device->name, name, sizeof(device->name)); |
213 | |||
214 | dev_set_name(&device->dev, "mei:%s:%pUl", name, mei_me_cl_uuid(me_cl)); | ||
189 | 215 | ||
190 | status = device_register(&device->dev); | 216 | status = device_register(&device->dev); |
191 | if (status) { | 217 | if (status) { |
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h index 79ab78184523..ab719e674edf 100644 --- a/drivers/misc/mei/mei_dev.h +++ b/drivers/misc/mei/mei_dev.h | |||
@@ -376,6 +376,7 @@ struct mei_cl *mei_cl_bus_find_cl_by_uuid(struct mei_device *dev, uuid_le uuid); | |||
376 | * @dev: linux driver model device pointer | 376 | * @dev: linux driver model device pointer |
377 | * @me_cl: me client | 377 | * @me_cl: me client |
378 | * @cl: mei client | 378 | * @cl: mei client |
379 | * @name: device name | ||
379 | * @ops: ME transport ops | 380 | * @ops: ME transport ops |
380 | * @event_work: async work to execute event callback | 381 | * @event_work: async work to execute event callback |
381 | * @event_cb: Drivers register this callback to get asynchronous ME | 382 | * @event_cb: Drivers register this callback to get asynchronous ME |
@@ -389,6 +390,7 @@ struct mei_cl_device { | |||
389 | 390 | ||
390 | struct mei_me_client *me_cl; | 391 | struct mei_me_client *me_cl; |
391 | struct mei_cl *cl; | 392 | struct mei_cl *cl; |
393 | char name[MEI_CL_NAME_SIZE]; | ||
392 | 394 | ||
393 | const struct mei_cl_ops *ops; | 395 | const struct mei_cl_ops *ops; |
394 | 396 | ||
diff --git a/drivers/nfc/mei_phy.h b/drivers/nfc/mei_phy.h index d669900f8278..06608c28ff14 100644 --- a/drivers/nfc/mei_phy.h +++ b/drivers/nfc/mei_phy.h | |||
@@ -3,7 +3,10 @@ | |||
3 | 3 | ||
4 | #include <linux/mei_cl_bus.h> | 4 | #include <linux/mei_cl_bus.h> |
5 | #include <net/nfc/hci.h> | 5 | #include <net/nfc/hci.h> |
6 | #include <linux/uuid.h> | ||
6 | 7 | ||
8 | #define MEI_NFC_UUID __UUID_LE(0x0bb17a78, 0x2a8e, 0x4c50, \ | ||
9 | 0x94, 0xd4, 0x50, 0x26, 0x67, 0x23, 0x77, 0x5c) | ||
7 | #define MEI_NFC_HEADER_SIZE 10 | 10 | #define MEI_NFC_HEADER_SIZE 10 |
8 | #define MEI_NFC_MAX_HCI_PAYLOAD 300 | 11 | #define MEI_NFC_MAX_HCI_PAYLOAD 300 |
9 | 12 | ||
diff --git a/drivers/nfc/microread/mei.c b/drivers/nfc/microread/mei.c index 2d1395be64ae..f9f5fc97cdd7 100644 --- a/drivers/nfc/microread/mei.c +++ b/drivers/nfc/microread/mei.c | |||
@@ -67,7 +67,7 @@ static int microread_mei_remove(struct mei_cl_device *device) | |||
67 | } | 67 | } |
68 | 68 | ||
69 | static struct mei_cl_device_id microread_mei_tbl[] = { | 69 | static struct mei_cl_device_id microread_mei_tbl[] = { |
70 | { MICROREAD_DRIVER_NAME }, | 70 | { MICROREAD_DRIVER_NAME, MEI_NFC_UUID}, |
71 | 71 | ||
72 | /* required last entry */ | 72 | /* required last entry */ |
73 | { } | 73 | { } |
diff --git a/drivers/nfc/pn544/mei.c b/drivers/nfc/pn544/mei.c index 330cd4031009..101a37e12efa 100644 --- a/drivers/nfc/pn544/mei.c +++ b/drivers/nfc/pn544/mei.c | |||
@@ -67,7 +67,7 @@ static int pn544_mei_remove(struct mei_cl_device *device) | |||
67 | } | 67 | } |
68 | 68 | ||
69 | static struct mei_cl_device_id pn544_mei_tbl[] = { | 69 | static struct mei_cl_device_id pn544_mei_tbl[] = { |
70 | { PN544_DRIVER_NAME }, | 70 | { PN544_DRIVER_NAME, MEI_NFC_UUID}, |
71 | 71 | ||
72 | /* required last entry */ | 72 | /* required last entry */ |
73 | { } | 73 | { } |
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h index 3bfd56778c29..2d2b2b571d61 100644 --- a/include/linux/mod_devicetable.h +++ b/include/linux/mod_devicetable.h | |||
@@ -599,9 +599,22 @@ struct ipack_device_id { | |||
599 | 599 | ||
600 | #define MEI_CL_MODULE_PREFIX "mei:" | 600 | #define MEI_CL_MODULE_PREFIX "mei:" |
601 | #define MEI_CL_NAME_SIZE 32 | 601 | #define MEI_CL_NAME_SIZE 32 |
602 | #define MEI_CL_UUID_FMT "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" | ||
603 | #define MEI_CL_UUID_ARGS(_u) \ | ||
604 | _u[0], _u[1], _u[2], _u[3], _u[4], _u[5], _u[6], _u[7], \ | ||
605 | _u[8], _u[9], _u[10], _u[11], _u[12], _u[13], _u[14], _u[15] | ||
602 | 606 | ||
607 | /** | ||
608 | * struct mei_cl_device_id - MEI client device identifier | ||
609 | * @name: helper name | ||
610 | * @uuid: client uuid | ||
611 | * @driver_info: information used by the driver. | ||
612 | * | ||
613 | * identifies mei client device by uuid and name | ||
614 | */ | ||
603 | struct mei_cl_device_id { | 615 | struct mei_cl_device_id { |
604 | char name[MEI_CL_NAME_SIZE]; | 616 | char name[MEI_CL_NAME_SIZE]; |
617 | __u8 uuid[16]; | ||
605 | kernel_ulong_t driver_info; | 618 | kernel_ulong_t driver_info; |
606 | }; | 619 | }; |
607 | 620 | ||
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index fce36d0f6898..091f6290a651 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c | |||
@@ -182,6 +182,7 @@ int main(void) | |||
182 | 182 | ||
183 | DEVID(mei_cl_device_id); | 183 | DEVID(mei_cl_device_id); |
184 | DEVID_FIELD(mei_cl_device_id, name); | 184 | DEVID_FIELD(mei_cl_device_id, name); |
185 | DEVID_FIELD(mei_cl_device_id, uuid); | ||
185 | 186 | ||
186 | DEVID(rio_device_id); | 187 | DEVID(rio_device_id); |
187 | DEVID_FIELD(rio_device_id, did); | 188 | DEVID_FIELD(rio_device_id, did); |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 78691d51a479..62c517f4b592 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -131,6 +131,15 @@ static inline void add_wildcard(char *str) | |||
131 | strcat(str + len, "*"); | 131 | strcat(str + len, "*"); |
132 | } | 132 | } |
133 | 133 | ||
134 | static inline void add_uuid(char *str, __u8 uuid[16]) | ||
135 | { | ||
136 | int len = strlen(str); | ||
137 | int i; | ||
138 | |||
139 | for (i = 0; i < 16; i++) | ||
140 | sprintf(str + len + (i << 1), "%02x", uuid[i]); | ||
141 | } | ||
142 | |||
134 | /** | 143 | /** |
135 | * Check that sizeof(device_id type) are consistent with size of section | 144 | * Check that sizeof(device_id type) are consistent with size of section |
136 | * in .o file. If in-consistent then userspace and kernel does not agree | 145 | * in .o file. If in-consistent then userspace and kernel does not agree |
@@ -1160,13 +1169,18 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias) | |||
1160 | } | 1169 | } |
1161 | ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); | 1170 | ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); |
1162 | 1171 | ||
1163 | /* Looks like: mei:S */ | 1172 | /* Looks like: mei:S:uuid */ |
1164 | static int do_mei_entry(const char *filename, void *symval, | 1173 | static int do_mei_entry(const char *filename, void *symval, |
1165 | char *alias) | 1174 | char *alias) |
1166 | { | 1175 | { |
1167 | DEF_FIELD_ADDR(symval, mei_cl_device_id, name); | 1176 | DEF_FIELD_ADDR(symval, mei_cl_device_id, name); |
1177 | DEF_FIELD_ADDR(symval, mei_cl_device_id, uuid); | ||
1178 | |||
1179 | sprintf(alias, MEI_CL_MODULE_PREFIX); | ||
1180 | sprintf(alias + strlen(alias), "%s:", (*name)[0] ? *name : "*"); | ||
1181 | add_uuid(alias, *uuid); | ||
1168 | 1182 | ||
1169 | sprintf(alias, MEI_CL_MODULE_PREFIX "%s", *name); | 1183 | strcat(alias, ":*"); |
1170 | 1184 | ||
1171 | return 1; | 1185 | return 1; |
1172 | } | 1186 | } |