xref: /linux/drivers/misc/mei/bus.c (revision 47679cde604d6977b390d5b0fc83dedf8a82f66d)
1 /*
2  * Intel Management Engine Interface (Intel MEI) Linux driver
3  * Copyright (c) 2012-2013, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  */
15 
16 #include <linux/module.h>
17 #include <linux/device.h>
18 #include <linux/kernel.h>
19 #include <linux/sched.h>
20 #include <linux/init.h>
21 #include <linux/errno.h>
22 #include <linux/slab.h>
23 #include <linux/mutex.h>
24 #include <linux/interrupt.h>
25 #include <linux/mei_cl_bus.h>
26 
27 #include "mei_dev.h"
28 #include "client.h"
29 
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)
32 
33 /**
34  * __mei_cl_send - internal client send (write)
35  *
36  * @cl: host client
37  * @buf: buffer to send
38  * @length: buffer length
39  * @blocking: wait for write completion
40  *
41  * Return: written size bytes or < 0 on error
42  */
43 ssize_t __mei_cl_send(struct mei_cl *cl, u8 *buf, size_t length,
44 			bool blocking)
45 {
46 	struct mei_device *bus;
47 	struct mei_cl_cb *cb = NULL;
48 	ssize_t rets;
49 
50 	if (WARN_ON(!cl || !cl->dev))
51 		return -ENODEV;
52 
53 	bus = cl->dev;
54 
55 	mutex_lock(&bus->device_lock);
56 	if (bus->dev_state != MEI_DEV_ENABLED) {
57 		rets = -ENODEV;
58 		goto out;
59 	}
60 
61 	if (!mei_cl_is_connected(cl)) {
62 		rets = -ENODEV;
63 		goto out;
64 	}
65 
66 	/* Check if we have an ME client device */
67 	if (!mei_me_cl_is_active(cl->me_cl)) {
68 		rets = -ENOTTY;
69 		goto out;
70 	}
71 
72 	if (length > mei_cl_mtu(cl)) {
73 		rets = -EFBIG;
74 		goto out;
75 	}
76 
77 	cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, NULL);
78 	if (!cb) {
79 		rets = -ENOMEM;
80 		goto out;
81 	}
82 
83 	memcpy(cb->buf.data, buf, length);
84 
85 	rets = mei_cl_write(cl, cb, blocking);
86 
87 out:
88 	mutex_unlock(&bus->device_lock);
89 	if (rets < 0)
90 		mei_io_cb_free(cb);
91 
92 	return rets;
93 }
94 
95 /**
96  * __mei_cl_recv - internal client receive (read)
97  *
98  * @cl: host client
99  * @buf: buffer to receive
100  * @length: buffer length
101  *
102  * Return: read size in bytes of < 0 on error
103  */
104 ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length)
105 {
106 	struct mei_device *bus;
107 	struct mei_cl_cb *cb;
108 	size_t r_length;
109 	ssize_t rets;
110 
111 	if (WARN_ON(!cl || !cl->dev))
112 		return -ENODEV;
113 
114 	bus = cl->dev;
115 
116 	mutex_lock(&bus->device_lock);
117 	if (bus->dev_state != MEI_DEV_ENABLED) {
118 		rets = -ENODEV;
119 		goto out;
120 	}
121 
122 	cb = mei_cl_read_cb(cl, NULL);
123 	if (cb)
124 		goto copy;
125 
126 	rets = mei_cl_read_start(cl, length, NULL);
127 	if (rets && rets != -EBUSY)
128 		goto out;
129 
130 	/* wait on event only if there is no other waiter */
131 	if (list_empty(&cl->rd_completed) && !waitqueue_active(&cl->rx_wait)) {
132 
133 		mutex_unlock(&bus->device_lock);
134 
135 		if (wait_event_interruptible(cl->rx_wait,
136 				(!list_empty(&cl->rd_completed)) ||
137 				(!mei_cl_is_connected(cl)))) {
138 
139 			if (signal_pending(current))
140 				return -EINTR;
141 			return -ERESTARTSYS;
142 		}
143 
144 		mutex_lock(&bus->device_lock);
145 
146 		if (!mei_cl_is_connected(cl)) {
147 			rets = -EBUSY;
148 			goto out;
149 		}
150 	}
151 
152 	cb = mei_cl_read_cb(cl, NULL);
153 	if (!cb) {
154 		rets = 0;
155 		goto out;
156 	}
157 
158 copy:
159 	if (cb->status) {
160 		rets = cb->status;
161 		goto free;
162 	}
163 
164 	r_length = min_t(size_t, length, cb->buf_idx);
165 	memcpy(buf, cb->buf.data, r_length);
166 	rets = r_length;
167 
168 free:
169 	mei_io_cb_free(cb);
170 out:
171 	mutex_unlock(&bus->device_lock);
172 
173 	return rets;
174 }
175 
176 /**
177  * mei_cldev_send - me device send  (write)
178  *
179  * @cldev: me client device
180  * @buf: buffer to send
181  * @length: buffer length
182  *
183  * Return: written size in bytes or < 0 on error
184  */
185 ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length)
186 {
187 	struct mei_cl *cl = cldev->cl;
188 
189 	if (cl == NULL)
190 		return -ENODEV;
191 
192 	return __mei_cl_send(cl, buf, length, 1);
193 }
194 EXPORT_SYMBOL_GPL(mei_cldev_send);
195 
196 /**
197  * mei_cldev_recv - client receive (read)
198  *
199  * @cldev: me client device
200  * @buf: buffer to receive
201  * @length: buffer length
202  *
203  * Return: read size in bytes of < 0 on error
204  */
205 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length)
206 {
207 	struct mei_cl *cl = cldev->cl;
208 
209 	if (cl == NULL)
210 		return -ENODEV;
211 
212 	return __mei_cl_recv(cl, buf, length);
213 }
214 EXPORT_SYMBOL_GPL(mei_cldev_recv);
215 
216 /**
217  * mei_cl_bus_event_work  - dispatch rx event for a bus device
218  *    and schedule new work
219  *
220  * @work: work
221  */
222 static void mei_cl_bus_event_work(struct work_struct *work)
223 {
224 	struct mei_cl_device *cldev;
225 
226 	cldev = container_of(work, struct mei_cl_device, event_work);
227 
228 	if (cldev->event_cb)
229 		cldev->event_cb(cldev, cldev->events, cldev->event_context);
230 
231 	cldev->events = 0;
232 
233 	/* Prepare for the next read */
234 	if (cldev->events_mask & BIT(MEI_CL_EVENT_RX))
235 		mei_cl_read_start(cldev->cl, 0, NULL);
236 }
237 
238 /**
239  * mei_cl_bus_notify_event - schedule notify cb on bus client
240  *
241  * @cl: host client
242  *
243  * Return: true if event was scheduled
244  *         false if the client is not waiting for event
245  */
246 bool mei_cl_bus_notify_event(struct mei_cl *cl)
247 {
248 	struct mei_cl_device *cldev = cl->cldev;
249 
250 	if (!cldev || !cldev->event_cb)
251 		return false;
252 
253 	if (!(cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF)))
254 		return false;
255 
256 	if (!cl->notify_ev)
257 		return false;
258 
259 	set_bit(MEI_CL_EVENT_NOTIF, &cldev->events);
260 
261 	schedule_work(&cldev->event_work);
262 
263 	cl->notify_ev = false;
264 
265 	return true;
266 }
267 
268 /**
269  * mei_cl_bus_rx_event  - schedule rx event
270  *
271  * @cl: host client
272  *
273  * Return: true if event was scheduled
274  *         false if the client is not waiting for event
275  */
276 bool mei_cl_bus_rx_event(struct mei_cl *cl)
277 {
278 	struct mei_cl_device *cldev = cl->cldev;
279 
280 	if (!cldev || !cldev->event_cb)
281 		return false;
282 
283 	if (!(cldev->events_mask & BIT(MEI_CL_EVENT_RX)))
284 		return false;
285 
286 	set_bit(MEI_CL_EVENT_RX, &cldev->events);
287 
288 	schedule_work(&cldev->event_work);
289 
290 	return true;
291 }
292 
293 /**
294  * mei_cldev_register_event_cb - register event callback
295  *
296  * @cldev: me client devices
297  * @event_cb: callback function
298  * @events_mask: requested events bitmask
299  * @context: driver context data
300  *
301  * Return: 0 on success
302  *         -EALREADY if an callback is already registered
303  *         <0 on other errors
304  */
305 int mei_cldev_register_event_cb(struct mei_cl_device *cldev,
306 				unsigned long events_mask,
307 				mei_cldev_event_cb_t event_cb, void *context)
308 {
309 	int ret;
310 
311 	if (cldev->event_cb)
312 		return -EALREADY;
313 
314 	cldev->events = 0;
315 	cldev->events_mask = events_mask;
316 	cldev->event_cb = event_cb;
317 	cldev->event_context = context;
318 	INIT_WORK(&cldev->event_work, mei_cl_bus_event_work);
319 
320 	if (cldev->events_mask & BIT(MEI_CL_EVENT_RX)) {
321 		ret = mei_cl_read_start(cldev->cl, 0, NULL);
322 		if (ret && ret != -EBUSY)
323 			return ret;
324 	}
325 
326 	if (cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF)) {
327 		mutex_lock(&cldev->cl->dev->device_lock);
328 		ret = mei_cl_notify_request(cldev->cl, NULL, event_cb ? 1 : 0);
329 		mutex_unlock(&cldev->cl->dev->device_lock);
330 		if (ret)
331 			return ret;
332 	}
333 
334 	return 0;
335 }
336 EXPORT_SYMBOL_GPL(mei_cldev_register_event_cb);
337 
338 /**
339  * mei_cldev_get_drvdata - driver data getter
340  *
341  * @cldev: mei client device
342  *
343  * Return: driver private data
344  */
345 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev)
346 {
347 	return dev_get_drvdata(&cldev->dev);
348 }
349 EXPORT_SYMBOL_GPL(mei_cldev_get_drvdata);
350 
351 /**
352  * mei_cldev_set_drvdata - driver data setter
353  *
354  * @cldev: mei client device
355  * @data: data to store
356  */
357 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data)
358 {
359 	dev_set_drvdata(&cldev->dev, data);
360 }
361 EXPORT_SYMBOL_GPL(mei_cldev_set_drvdata);
362 
363 /**
364  * mei_cldev_uuid - return uuid of the underlying me client
365  *
366  * @cldev: mei client device
367  *
368  * Return: me client uuid
369  */
370 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev)
371 {
372 	return mei_me_cl_uuid(cldev->me_cl);
373 }
374 EXPORT_SYMBOL_GPL(mei_cldev_uuid);
375 
376 /**
377  * mei_cldev_ver - return protocol version of the underlying me client
378  *
379  * @cldev: mei client device
380  *
381  * Return: me client protocol version
382  */
383 u8 mei_cldev_ver(const struct mei_cl_device *cldev)
384 {
385 	return mei_me_cl_ver(cldev->me_cl);
386 }
387 EXPORT_SYMBOL_GPL(mei_cldev_ver);
388 
389 /**
390  * mei_cldev_enabled - check whether the device is enabled
391  *
392  * @cldev: mei client device
393  *
394  * Return: true if me client is initialized and connected
395  */
396 bool mei_cldev_enabled(struct mei_cl_device *cldev)
397 {
398 	return cldev->cl && mei_cl_is_connected(cldev->cl);
399 }
400 EXPORT_SYMBOL_GPL(mei_cldev_enabled);
401 
402 /**
403  * mei_cldev_enable_device - enable me client device
404  *     create connection with me client
405  *
406  * @cldev: me client device
407  *
408  * Return: 0 on success and < 0 on error
409  */
410 int mei_cldev_enable(struct mei_cl_device *cldev)
411 {
412 	struct mei_device *bus = cldev->bus;
413 	struct mei_cl *cl;
414 	int ret;
415 
416 	cl = cldev->cl;
417 
418 	if (!cl) {
419 		mutex_lock(&bus->device_lock);
420 		cl = mei_cl_alloc_linked(bus);
421 		mutex_unlock(&bus->device_lock);
422 		if (IS_ERR(cl))
423 			return PTR_ERR(cl);
424 		/* update pointers */
425 		cldev->cl = cl;
426 		cl->cldev = cldev;
427 	}
428 
429 	mutex_lock(&bus->device_lock);
430 	if (mei_cl_is_connected(cl)) {
431 		ret = 0;
432 		goto out;
433 	}
434 
435 	if (!mei_me_cl_is_active(cldev->me_cl)) {
436 		dev_err(&cldev->dev, "me client is not active\n");
437 		ret = -ENOTTY;
438 		goto out;
439 	}
440 
441 	ret = mei_cl_connect(cl, cldev->me_cl, NULL);
442 	if (ret < 0)
443 		dev_err(&cldev->dev, "cannot connect\n");
444 
445 out:
446 	mutex_unlock(&bus->device_lock);
447 
448 	return ret;
449 }
450 EXPORT_SYMBOL_GPL(mei_cldev_enable);
451 
452 /**
453  * mei_cldev_disable - disable me client device
454  *     disconnect form the me client
455  *
456  * @cldev: me client device
457  *
458  * Return: 0 on success and < 0 on error
459  */
460 int mei_cldev_disable(struct mei_cl_device *cldev)
461 {
462 	struct mei_device *bus;
463 	struct mei_cl *cl;
464 	int err;
465 
466 	if (!cldev || !cldev->cl)
467 		return -ENODEV;
468 
469 	cl = cldev->cl;
470 
471 	bus = cldev->bus;
472 
473 	cldev->event_cb = NULL;
474 
475 	mutex_lock(&bus->device_lock);
476 
477 	if (!mei_cl_is_connected(cl)) {
478 		dev_err(bus->dev, "Already disconnected");
479 		err = 0;
480 		goto out;
481 	}
482 
483 	err = mei_cl_disconnect(cl);
484 	if (err < 0)
485 		dev_err(bus->dev, "Could not disconnect from the ME client");
486 
487 out:
488 	/* Flush queues and remove any pending read */
489 	mei_cl_flush_queues(cl, NULL);
490 	mei_cl_unlink(cl);
491 
492 	kfree(cl);
493 	cldev->cl = NULL;
494 
495 	mutex_unlock(&bus->device_lock);
496 	return err;
497 }
498 EXPORT_SYMBOL_GPL(mei_cldev_disable);
499 
500 /**
501  * mei_cl_device_find - find matching entry in the driver id table
502  *
503  * @cldev: me client device
504  * @cldrv: me client driver
505  *
506  * Return: id on success; NULL if no id is matching
507  */
508 static const
509 struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev,
510 					    struct mei_cl_driver *cldrv)
511 {
512 	const struct mei_cl_device_id *id;
513 	const uuid_le *uuid;
514 	u8 version;
515 	bool match;
516 
517 	uuid = mei_me_cl_uuid(cldev->me_cl);
518 	version = mei_me_cl_ver(cldev->me_cl);
519 
520 	id = cldrv->id_table;
521 	while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) {
522 		if (!uuid_le_cmp(*uuid, id->uuid)) {
523 			match = true;
524 
525 			if (cldev->name[0])
526 				if (strncmp(cldev->name, id->name,
527 					    sizeof(id->name)))
528 					match = false;
529 
530 			if (id->version != MEI_CL_VERSION_ANY)
531 				if (id->version != version)
532 					match = false;
533 			if (match)
534 				return id;
535 		}
536 
537 		id++;
538 	}
539 
540 	return NULL;
541 }
542 
543 /**
544  * mei_cl_device_match  - device match function
545  *
546  * @dev: device
547  * @drv: driver
548  *
549  * Return:  1 if matching device was found 0 otherwise
550  */
551 static int mei_cl_device_match(struct device *dev, struct device_driver *drv)
552 {
553 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
554 	struct mei_cl_driver *cldrv = to_mei_cl_driver(drv);
555 	const struct mei_cl_device_id *found_id;
556 
557 	if (!cldev)
558 		return 0;
559 
560 	if (!cldev->do_match)
561 		return 0;
562 
563 	if (!cldrv || !cldrv->id_table)
564 		return 0;
565 
566 	found_id = mei_cl_device_find(cldev, cldrv);
567 	if (found_id)
568 		return 1;
569 
570 	return 0;
571 }
572 
573 /**
574  * mei_cl_device_probe - bus probe function
575  *
576  * @dev: device
577  *
578  * Return:  0 on success; < 0 otherwise
579  */
580 static int mei_cl_device_probe(struct device *dev)
581 {
582 	struct mei_cl_device *cldev;
583 	struct mei_cl_driver *cldrv;
584 	const struct mei_cl_device_id *id;
585 
586 	cldev = to_mei_cl_device(dev);
587 	cldrv = to_mei_cl_driver(dev->driver);
588 
589 	if (!cldev)
590 		return 0;
591 
592 	if (!cldrv || !cldrv->probe)
593 		return -ENODEV;
594 
595 	id = mei_cl_device_find(cldev, cldrv);
596 	if (!id)
597 		return -ENODEV;
598 
599 	__module_get(THIS_MODULE);
600 
601 	return cldrv->probe(cldev, id);
602 }
603 
604 /**
605  * mei_cl_device_remove - remove device from the bus
606  *
607  * @dev: device
608  *
609  * Return:  0 on success; < 0 otherwise
610  */
611 static int mei_cl_device_remove(struct device *dev)
612 {
613 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
614 	struct mei_cl_driver *cldrv;
615 	int ret = 0;
616 
617 	if (!cldev || !dev->driver)
618 		return 0;
619 
620 	if (cldev->event_cb) {
621 		cldev->event_cb = NULL;
622 		cancel_work_sync(&cldev->event_work);
623 	}
624 
625 	cldrv = to_mei_cl_driver(dev->driver);
626 	if (cldrv->remove)
627 		ret = cldrv->remove(cldev);
628 
629 	module_put(THIS_MODULE);
630 	dev->driver = NULL;
631 	return ret;
632 
633 }
634 
635 static ssize_t name_show(struct device *dev, struct device_attribute *a,
636 			     char *buf)
637 {
638 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
639 	size_t len;
640 
641 	len = snprintf(buf, PAGE_SIZE, "%s", cldev->name);
642 
643 	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
644 }
645 static DEVICE_ATTR_RO(name);
646 
647 static ssize_t uuid_show(struct device *dev, struct device_attribute *a,
648 			     char *buf)
649 {
650 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
651 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
652 	size_t len;
653 
654 	len = snprintf(buf, PAGE_SIZE, "%pUl", uuid);
655 
656 	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
657 }
658 static DEVICE_ATTR_RO(uuid);
659 
660 static ssize_t version_show(struct device *dev, struct device_attribute *a,
661 			     char *buf)
662 {
663 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
664 	u8 version = mei_me_cl_ver(cldev->me_cl);
665 	size_t len;
666 
667 	len = snprintf(buf, PAGE_SIZE, "%02X", version);
668 
669 	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
670 }
671 static DEVICE_ATTR_RO(version);
672 
673 static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
674 			     char *buf)
675 {
676 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
677 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
678 	size_t len;
679 
680 	len = snprintf(buf, PAGE_SIZE, "mei:%s:%pUl:", cldev->name, uuid);
681 	return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
682 }
683 static DEVICE_ATTR_RO(modalias);
684 
685 static struct attribute *mei_cldev_attrs[] = {
686 	&dev_attr_name.attr,
687 	&dev_attr_uuid.attr,
688 	&dev_attr_version.attr,
689 	&dev_attr_modalias.attr,
690 	NULL,
691 };
692 ATTRIBUTE_GROUPS(mei_cldev);
693 
694 /**
695  * mei_cl_device_uevent - me client bus uevent handler
696  *
697  * @dev: device
698  * @env: uevent kobject
699  *
700  * Return: 0 on success -ENOMEM on when add_uevent_var fails
701  */
702 static int mei_cl_device_uevent(struct device *dev, struct kobj_uevent_env *env)
703 {
704 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
705 	const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
706 	u8 version = mei_me_cl_ver(cldev->me_cl);
707 
708 	if (add_uevent_var(env, "MEI_CL_VERSION=%d", version))
709 		return -ENOMEM;
710 
711 	if (add_uevent_var(env, "MEI_CL_UUID=%pUl", uuid))
712 		return -ENOMEM;
713 
714 	if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
715 		return -ENOMEM;
716 
717 	if (add_uevent_var(env, "MODALIAS=mei:%s:%pUl:%02X:",
718 			   cldev->name, uuid, version))
719 		return -ENOMEM;
720 
721 	return 0;
722 }
723 
724 static struct bus_type mei_cl_bus_type = {
725 	.name		= "mei",
726 	.dev_groups	= mei_cldev_groups,
727 	.match		= mei_cl_device_match,
728 	.probe		= mei_cl_device_probe,
729 	.remove		= mei_cl_device_remove,
730 	.uevent		= mei_cl_device_uevent,
731 };
732 
733 static struct mei_device *mei_dev_bus_get(struct mei_device *bus)
734 {
735 	if (bus)
736 		get_device(bus->dev);
737 
738 	return bus;
739 }
740 
741 static void mei_dev_bus_put(struct mei_device *bus)
742 {
743 	if (bus)
744 		put_device(bus->dev);
745 }
746 
747 static void mei_cl_bus_dev_release(struct device *dev)
748 {
749 	struct mei_cl_device *cldev = to_mei_cl_device(dev);
750 
751 	if (!cldev)
752 		return;
753 
754 	mei_me_cl_put(cldev->me_cl);
755 	mei_dev_bus_put(cldev->bus);
756 	kfree(cldev);
757 }
758 
759 static struct device_type mei_cl_device_type = {
760 	.release	= mei_cl_bus_dev_release,
761 };
762 
763 /**
764  * mei_cl_bus_set_name - set device name for me client device
765  *
766  * @cldev: me client device
767  */
768 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
769 {
770 	dev_set_name(&cldev->dev, "mei:%s:%pUl:%02X",
771 		     cldev->name,
772 		     mei_me_cl_uuid(cldev->me_cl),
773 		     mei_me_cl_ver(cldev->me_cl));
774 }
775 
776 /**
777  * mei_cl_bus_dev_alloc - initialize and allocate mei client device
778  *
779  * @bus: mei device
780  * @me_cl: me client
781  *
782  * Return: allocated device structur or NULL on allocation failure
783  */
784 static struct mei_cl_device *mei_cl_bus_dev_alloc(struct mei_device *bus,
785 						  struct mei_me_client *me_cl)
786 {
787 	struct mei_cl_device *cldev;
788 
789 	cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL);
790 	if (!cldev)
791 		return NULL;
792 
793 	device_initialize(&cldev->dev);
794 	cldev->dev.parent = bus->dev;
795 	cldev->dev.bus    = &mei_cl_bus_type;
796 	cldev->dev.type   = &mei_cl_device_type;
797 	cldev->bus        = mei_dev_bus_get(bus);
798 	cldev->me_cl      = mei_me_cl_get(me_cl);
799 	mei_cl_bus_set_name(cldev);
800 	cldev->is_added   = 0;
801 	INIT_LIST_HEAD(&cldev->bus_list);
802 
803 	return cldev;
804 }
805 
806 /**
807  * mei_cl_dev_setup - setup me client device
808  *    run fix up routines and set the device name
809  *
810  * @bus: mei device
811  * @cldev: me client device
812  *
813  * Return: true if the device is eligible for enumeration
814  */
815 static bool mei_cl_bus_dev_setup(struct mei_device *bus,
816 				 struct mei_cl_device *cldev)
817 {
818 	cldev->do_match = 1;
819 	mei_cl_bus_dev_fixup(cldev);
820 
821 	/* the device name can change during fix up */
822 	if (cldev->do_match)
823 		mei_cl_bus_set_name(cldev);
824 
825 	return cldev->do_match == 1;
826 }
827 
828 /**
829  * mei_cl_bus_dev_add - add me client devices
830  *
831  * @cldev: me client device
832  *
833  * Return: 0 on success; < 0 on failre
834  */
835 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
836 {
837 	int ret;
838 
839 	dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n",
840 		mei_me_cl_uuid(cldev->me_cl),
841 		mei_me_cl_ver(cldev->me_cl));
842 	ret = device_add(&cldev->dev);
843 	if (!ret)
844 		cldev->is_added = 1;
845 
846 	return ret;
847 }
848 
849 /**
850  * mei_cl_bus_dev_stop - stop the driver
851  *
852  * @cldev: me client device
853  */
854 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev)
855 {
856 	if (cldev->is_added)
857 		device_release_driver(&cldev->dev);
858 }
859 
860 /**
861  * mei_cl_bus_dev_destroy - destroy me client devices object
862  *
863  * @cldev: me client device
864  *
865  * Locking: called under "dev->cl_bus_lock" lock
866  */
867 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev)
868 {
869 
870 	WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock));
871 
872 	if (!cldev->is_added)
873 		return;
874 
875 	device_del(&cldev->dev);
876 
877 	list_del_init(&cldev->bus_list);
878 
879 	cldev->is_added = 0;
880 	put_device(&cldev->dev);
881 }
882 
883 /**
884  * mei_cl_bus_remove_device - remove a devices form the bus
885  *
886  * @cldev: me client device
887  */
888 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev)
889 {
890 	mei_cl_bus_dev_stop(cldev);
891 	mei_cl_bus_dev_destroy(cldev);
892 }
893 
894 /**
895  * mei_cl_bus_remove_devices - remove all devices form the bus
896  *
897  * @bus: mei device
898  */
899 void mei_cl_bus_remove_devices(struct mei_device *bus)
900 {
901 	struct mei_cl_device *cldev, *next;
902 
903 	mutex_lock(&bus->cl_bus_lock);
904 	list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list)
905 		mei_cl_bus_remove_device(cldev);
906 	mutex_unlock(&bus->cl_bus_lock);
907 }
908 
909 
910 /**
911  * mei_cl_bus_dev_init - allocate and initializes an mei client devices
912  *     based on me client
913  *
914  * @bus: mei device
915  * @me_cl: me client
916  *
917  * Locking: called under "dev->cl_bus_lock" lock
918  */
919 static void mei_cl_bus_dev_init(struct mei_device *bus,
920 				struct mei_me_client *me_cl)
921 {
922 	struct mei_cl_device *cldev;
923 
924 	WARN_ON(!mutex_is_locked(&bus->cl_bus_lock));
925 
926 	dev_dbg(bus->dev, "initializing %pUl", mei_me_cl_uuid(me_cl));
927 
928 	if (me_cl->bus_added)
929 		return;
930 
931 	cldev = mei_cl_bus_dev_alloc(bus, me_cl);
932 	if (!cldev)
933 		return;
934 
935 	me_cl->bus_added = true;
936 	list_add_tail(&cldev->bus_list, &bus->device_list);
937 
938 }
939 
940 /**
941  * mei_cl_bus_rescan - scan me clients list and add create
942  *    devices for eligible clients
943  *
944  * @bus: mei device
945  */
946 void mei_cl_bus_rescan(struct mei_device *bus)
947 {
948 	struct mei_cl_device *cldev, *n;
949 	struct mei_me_client *me_cl;
950 
951 	mutex_lock(&bus->cl_bus_lock);
952 
953 	down_read(&bus->me_clients_rwsem);
954 	list_for_each_entry(me_cl, &bus->me_clients, list)
955 		mei_cl_bus_dev_init(bus, me_cl);
956 	up_read(&bus->me_clients_rwsem);
957 
958 	list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) {
959 
960 		if (!mei_me_cl_is_active(cldev->me_cl)) {
961 			mei_cl_bus_remove_device(cldev);
962 			continue;
963 		}
964 
965 		if (cldev->is_added)
966 			continue;
967 
968 		if (mei_cl_bus_dev_setup(bus, cldev))
969 			mei_cl_bus_dev_add(cldev);
970 		else {
971 			list_del_init(&cldev->bus_list);
972 			put_device(&cldev->dev);
973 		}
974 	}
975 	mutex_unlock(&bus->cl_bus_lock);
976 
977 	dev_dbg(bus->dev, "rescan end");
978 }
979 
980 void mei_cl_bus_rescan_work(struct work_struct *work)
981 {
982 	struct mei_device *bus =
983 		container_of(work, struct mei_device, bus_rescan_work);
984 	struct mei_me_client *me_cl;
985 
986 	mutex_lock(&bus->device_lock);
987 	me_cl = mei_me_cl_by_uuid(bus, &mei_amthif_guid);
988 	if (me_cl)
989 		mei_amthif_host_init(bus, me_cl);
990 	mei_me_cl_put(me_cl);
991 	mutex_unlock(&bus->device_lock);
992 
993 	mei_cl_bus_rescan(bus);
994 }
995 
996 int __mei_cldev_driver_register(struct mei_cl_driver *cldrv,
997 				struct module *owner)
998 {
999 	int err;
1000 
1001 	cldrv->driver.name = cldrv->name;
1002 	cldrv->driver.owner = owner;
1003 	cldrv->driver.bus = &mei_cl_bus_type;
1004 
1005 	err = driver_register(&cldrv->driver);
1006 	if (err)
1007 		return err;
1008 
1009 	pr_debug("mei: driver [%s] registered\n", cldrv->driver.name);
1010 
1011 	return 0;
1012 }
1013 EXPORT_SYMBOL_GPL(__mei_cldev_driver_register);
1014 
1015 void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv)
1016 {
1017 	driver_unregister(&cldrv->driver);
1018 
1019 	pr_debug("mei: driver [%s] unregistered\n", cldrv->driver.name);
1020 }
1021 EXPORT_SYMBOL_GPL(mei_cldev_driver_unregister);
1022 
1023 
1024 int __init mei_cl_bus_init(void)
1025 {
1026 	return bus_register(&mei_cl_bus_type);
1027 }
1028 
1029 void __exit mei_cl_bus_exit(void)
1030 {
1031 	bus_unregister(&mei_cl_bus_type);
1032 }
1033