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 (!mei_cl_is_connected(cl)) { 57 rets = -ENODEV; 58 goto out; 59 } 60 61 /* Check if we have an ME client device */ 62 if (!mei_me_cl_is_active(cl->me_cl)) { 63 rets = -ENOTTY; 64 goto out; 65 } 66 67 if (length > mei_cl_mtu(cl)) { 68 rets = -EFBIG; 69 goto out; 70 } 71 72 cb = mei_cl_alloc_cb(cl, length, MEI_FOP_WRITE, NULL); 73 if (!cb) { 74 rets = -ENOMEM; 75 goto out; 76 } 77 78 memcpy(cb->buf.data, buf, length); 79 80 rets = mei_cl_write(cl, cb, blocking); 81 82 out: 83 mutex_unlock(&bus->device_lock); 84 if (rets < 0) 85 mei_io_cb_free(cb); 86 87 return rets; 88 } 89 90 /** 91 * __mei_cl_recv - internal client receive (read) 92 * 93 * @cl: host client 94 * @buf: buffer to send 95 * @length: buffer length 96 * 97 * Return: read size in bytes of < 0 on error 98 */ 99 ssize_t __mei_cl_recv(struct mei_cl *cl, u8 *buf, size_t length) 100 { 101 struct mei_device *bus; 102 struct mei_cl_cb *cb; 103 size_t r_length; 104 ssize_t rets; 105 106 if (WARN_ON(!cl || !cl->dev)) 107 return -ENODEV; 108 109 bus = cl->dev; 110 111 mutex_lock(&bus->device_lock); 112 113 cb = mei_cl_read_cb(cl, NULL); 114 if (cb) 115 goto copy; 116 117 rets = mei_cl_read_start(cl, length, NULL); 118 if (rets && rets != -EBUSY) 119 goto out; 120 121 /* wait on event only if there is no other waiter */ 122 if (list_empty(&cl->rd_completed) && !waitqueue_active(&cl->rx_wait)) { 123 124 mutex_unlock(&bus->device_lock); 125 126 if (wait_event_interruptible(cl->rx_wait, 127 (!list_empty(&cl->rd_completed)) || 128 (!mei_cl_is_connected(cl)))) { 129 130 if (signal_pending(current)) 131 return -EINTR; 132 return -ERESTARTSYS; 133 } 134 135 mutex_lock(&bus->device_lock); 136 137 if (!mei_cl_is_connected(cl)) { 138 rets = -EBUSY; 139 goto out; 140 } 141 } 142 143 cb = mei_cl_read_cb(cl, NULL); 144 if (!cb) { 145 rets = 0; 146 goto out; 147 } 148 149 copy: 150 if (cb->status) { 151 rets = cb->status; 152 goto free; 153 } 154 155 r_length = min_t(size_t, length, cb->buf_idx); 156 memcpy(buf, cb->buf.data, r_length); 157 rets = r_length; 158 159 free: 160 mei_io_cb_free(cb); 161 out: 162 mutex_unlock(&bus->device_lock); 163 164 return rets; 165 } 166 167 /** 168 * mei_cl_send - me device send (write) 169 * 170 * @cldev: me client device 171 * @buf: buffer to send 172 * @length: buffer length 173 * 174 * Return: written size in bytes or < 0 on error 175 */ 176 ssize_t mei_cl_send(struct mei_cl_device *cldev, u8 *buf, size_t length) 177 { 178 struct mei_cl *cl = cldev->cl; 179 180 if (cl == NULL) 181 return -ENODEV; 182 183 return __mei_cl_send(cl, buf, length, 1); 184 } 185 EXPORT_SYMBOL_GPL(mei_cl_send); 186 187 /** 188 * mei_cl_recv - client receive (read) 189 * 190 * @cldev: me client device 191 * @buf: buffer to send 192 * @length: buffer length 193 * 194 * Return: read size in bytes of < 0 on error 195 */ 196 ssize_t mei_cl_recv(struct mei_cl_device *cldev, u8 *buf, size_t length) 197 { 198 struct mei_cl *cl = cldev->cl; 199 200 if (cl == NULL) 201 return -ENODEV; 202 203 return __mei_cl_recv(cl, buf, length); 204 } 205 EXPORT_SYMBOL_GPL(mei_cl_recv); 206 207 /** 208 * mei_bus_event_work - dispatch rx event for a bus device 209 * and schedule new work 210 * 211 * @work: work 212 */ 213 static void mei_bus_event_work(struct work_struct *work) 214 { 215 struct mei_cl_device *cldev; 216 217 cldev = container_of(work, struct mei_cl_device, event_work); 218 219 if (cldev->event_cb) 220 cldev->event_cb(cldev, cldev->events, cldev->event_context); 221 222 cldev->events = 0; 223 224 /* Prepare for the next read */ 225 if (cldev->events_mask & BIT(MEI_CL_EVENT_RX)) 226 mei_cl_read_start(cldev->cl, 0, NULL); 227 } 228 229 /** 230 * mei_cl_bus_notify_event - schedule notify cb on bus client 231 * 232 * @cl: host client 233 */ 234 void mei_cl_bus_notify_event(struct mei_cl *cl) 235 { 236 struct mei_cl_device *cldev = cl->cldev; 237 238 if (!cldev || !cldev->event_cb) 239 return; 240 241 if (!(cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF))) 242 return; 243 244 if (!cl->notify_ev) 245 return; 246 247 set_bit(MEI_CL_EVENT_NOTIF, &cldev->events); 248 249 schedule_work(&cldev->event_work); 250 251 cl->notify_ev = false; 252 } 253 254 /** 255 * mei_cl_bus_rx_event - schedule rx evenet 256 * 257 * @cl: host client 258 */ 259 void mei_cl_bus_rx_event(struct mei_cl *cl) 260 { 261 struct mei_cl_device *cldev = cl->cldev; 262 263 if (!cldev || !cldev->event_cb) 264 return; 265 266 if (!(cldev->events_mask & BIT(MEI_CL_EVENT_RX))) 267 return; 268 269 set_bit(MEI_CL_EVENT_RX, &cldev->events); 270 271 schedule_work(&cldev->event_work); 272 } 273 274 /** 275 * mei_cl_register_event_cb - register event callback 276 * 277 * @cldev: me client devices 278 * @event_cb: callback function 279 * @events_mask: requested events bitmask 280 * @context: driver context data 281 * 282 * Return: 0 on success 283 * -EALREADY if an callback is already registered 284 * <0 on other errors 285 */ 286 int mei_cl_register_event_cb(struct mei_cl_device *cldev, 287 unsigned long events_mask, 288 mei_cl_event_cb_t event_cb, void *context) 289 { 290 int ret; 291 292 if (cldev->event_cb) 293 return -EALREADY; 294 295 cldev->events = 0; 296 cldev->events_mask = events_mask; 297 cldev->event_cb = event_cb; 298 cldev->event_context = context; 299 INIT_WORK(&cldev->event_work, mei_bus_event_work); 300 301 if (cldev->events_mask & BIT(MEI_CL_EVENT_RX)) { 302 ret = mei_cl_read_start(cldev->cl, 0, NULL); 303 if (ret && ret != -EBUSY) 304 return ret; 305 } 306 307 if (cldev->events_mask & BIT(MEI_CL_EVENT_NOTIF)) { 308 mutex_lock(&cldev->cl->dev->device_lock); 309 ret = mei_cl_notify_request(cldev->cl, NULL, event_cb ? 1 : 0); 310 mutex_unlock(&cldev->cl->dev->device_lock); 311 if (ret) 312 return ret; 313 } 314 315 return 0; 316 } 317 EXPORT_SYMBOL_GPL(mei_cl_register_event_cb); 318 319 /** 320 * mei_cl_get_drvdata - driver data getter 321 * 322 * @cldev: mei client device 323 * 324 * Return: driver private data 325 */ 326 void *mei_cl_get_drvdata(const struct mei_cl_device *cldev) 327 { 328 return dev_get_drvdata(&cldev->dev); 329 } 330 EXPORT_SYMBOL_GPL(mei_cl_get_drvdata); 331 332 /** 333 * mei_cl_set_drvdata - driver data setter 334 * 335 * @cldev: mei client device 336 * @data: data to store 337 */ 338 void mei_cl_set_drvdata(struct mei_cl_device *cldev, void *data) 339 { 340 dev_set_drvdata(&cldev->dev, data); 341 } 342 EXPORT_SYMBOL_GPL(mei_cl_set_drvdata); 343 344 /** 345 * mei_cl_enable_device - enable me client device 346 * create connection with me client 347 * 348 * @cldev: me client device 349 * 350 * Return: 0 on success and < 0 on error 351 */ 352 int mei_cl_enable_device(struct mei_cl_device *cldev) 353 { 354 struct mei_device *bus = cldev->bus; 355 struct mei_cl *cl; 356 int ret; 357 358 cl = cldev->cl; 359 360 if (!cl) { 361 mutex_lock(&bus->device_lock); 362 cl = mei_cl_alloc_linked(bus, MEI_HOST_CLIENT_ID_ANY); 363 mutex_unlock(&bus->device_lock); 364 if (IS_ERR(cl)) 365 return PTR_ERR(cl); 366 /* update pointers */ 367 cldev->cl = cl; 368 cl->cldev = cldev; 369 } 370 371 mutex_lock(&bus->device_lock); 372 if (mei_cl_is_connected(cl)) { 373 ret = 0; 374 goto out; 375 } 376 377 if (!mei_me_cl_is_active(cldev->me_cl)) { 378 dev_err(&cldev->dev, "me client is not active\n"); 379 ret = -ENOTTY; 380 goto out; 381 } 382 383 ret = mei_cl_connect(cl, cldev->me_cl, NULL); 384 if (ret < 0) 385 dev_err(&cldev->dev, "cannot connect\n"); 386 387 out: 388 mutex_unlock(&bus->device_lock); 389 390 return ret; 391 } 392 EXPORT_SYMBOL_GPL(mei_cl_enable_device); 393 394 /** 395 * mei_cl_disable_device - disable me client device 396 * disconnect form the me client 397 * 398 * @cldev: me client device 399 * 400 * Return: 0 on success and < 0 on error 401 */ 402 int mei_cl_disable_device(struct mei_cl_device *cldev) 403 { 404 struct mei_device *bus; 405 struct mei_cl *cl; 406 int err; 407 408 if (!cldev || !cldev->cl) 409 return -ENODEV; 410 411 cl = cldev->cl; 412 413 bus = cldev->bus; 414 415 cldev->event_cb = NULL; 416 417 mutex_lock(&bus->device_lock); 418 419 if (!mei_cl_is_connected(cl)) { 420 dev_err(bus->dev, "Already disconnected"); 421 err = 0; 422 goto out; 423 } 424 425 err = mei_cl_disconnect(cl); 426 if (err < 0) 427 dev_err(bus->dev, "Could not disconnect from the ME client"); 428 429 out: 430 /* Flush queues and remove any pending read */ 431 mei_cl_flush_queues(cl, NULL); 432 mei_cl_unlink(cl); 433 434 kfree(cl); 435 cldev->cl = NULL; 436 437 mutex_unlock(&bus->device_lock); 438 return err; 439 } 440 EXPORT_SYMBOL_GPL(mei_cl_disable_device); 441 442 /** 443 * mei_cl_device_find - find matching entry in the driver id table 444 * 445 * @cldev: me client device 446 * @cldrv: me client driver 447 * 448 * Return: id on success; NULL if no id is matching 449 */ 450 static const 451 struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev, 452 struct mei_cl_driver *cldrv) 453 { 454 const struct mei_cl_device_id *id; 455 const uuid_le *uuid; 456 457 uuid = mei_me_cl_uuid(cldev->me_cl); 458 459 id = cldrv->id_table; 460 while (uuid_le_cmp(NULL_UUID_LE, id->uuid)) { 461 if (!uuid_le_cmp(*uuid, id->uuid)) { 462 463 if (!cldev->name[0]) 464 return id; 465 466 if (!strncmp(cldev->name, id->name, sizeof(id->name))) 467 return id; 468 } 469 470 id++; 471 } 472 473 return NULL; 474 } 475 476 /** 477 * mei_cl_device_match - device match function 478 * 479 * @dev: device 480 * @drv: driver 481 * 482 * Return: 1 if matching device was found 0 otherwise 483 */ 484 static int mei_cl_device_match(struct device *dev, struct device_driver *drv) 485 { 486 struct mei_cl_device *cldev = to_mei_cl_device(dev); 487 struct mei_cl_driver *cldrv = to_mei_cl_driver(drv); 488 const struct mei_cl_device_id *found_id; 489 490 if (!cldev) 491 return 0; 492 493 if (!cldev->do_match) 494 return 0; 495 496 if (!cldrv || !cldrv->id_table) 497 return 0; 498 499 found_id = mei_cl_device_find(cldev, cldrv); 500 if (found_id) 501 return 1; 502 503 return 0; 504 } 505 506 /** 507 * mei_cl_device_probe - bus probe function 508 * 509 * @dev: device 510 * 511 * Return: 0 on success; < 0 otherwise 512 */ 513 static int mei_cl_device_probe(struct device *dev) 514 { 515 struct mei_cl_device *cldev; 516 struct mei_cl_driver *cldrv; 517 const struct mei_cl_device_id *id; 518 519 cldev = to_mei_cl_device(dev); 520 cldrv = to_mei_cl_driver(dev->driver); 521 522 if (!cldev) 523 return 0; 524 525 if (!cldrv || !cldrv->probe) 526 return -ENODEV; 527 528 id = mei_cl_device_find(cldev, cldrv); 529 if (!id) 530 return -ENODEV; 531 532 __module_get(THIS_MODULE); 533 534 return cldrv->probe(cldev, id); 535 } 536 537 /** 538 * mei_cl_device_remove - remove device from the bus 539 * 540 * @dev: device 541 * 542 * Return: 0 on success; < 0 otherwise 543 */ 544 static int mei_cl_device_remove(struct device *dev) 545 { 546 struct mei_cl_device *cldev = to_mei_cl_device(dev); 547 struct mei_cl_driver *cldrv; 548 int ret = 0; 549 550 if (!cldev || !dev->driver) 551 return 0; 552 553 if (cldev->event_cb) { 554 cldev->event_cb = NULL; 555 cancel_work_sync(&cldev->event_work); 556 } 557 558 cldrv = to_mei_cl_driver(dev->driver); 559 if (cldrv->remove) 560 ret = cldrv->remove(cldev); 561 562 module_put(THIS_MODULE); 563 dev->driver = NULL; 564 return ret; 565 566 } 567 568 static ssize_t name_show(struct device *dev, struct device_attribute *a, 569 char *buf) 570 { 571 struct mei_cl_device *cldev = to_mei_cl_device(dev); 572 size_t len; 573 574 len = snprintf(buf, PAGE_SIZE, "%s", cldev->name); 575 576 return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; 577 } 578 static DEVICE_ATTR_RO(name); 579 580 static ssize_t uuid_show(struct device *dev, struct device_attribute *a, 581 char *buf) 582 { 583 struct mei_cl_device *cldev = to_mei_cl_device(dev); 584 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 585 size_t len; 586 587 len = snprintf(buf, PAGE_SIZE, "%pUl", uuid); 588 589 return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; 590 } 591 static DEVICE_ATTR_RO(uuid); 592 593 static ssize_t modalias_show(struct device *dev, struct device_attribute *a, 594 char *buf) 595 { 596 struct mei_cl_device *cldev = to_mei_cl_device(dev); 597 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 598 size_t len; 599 600 len = snprintf(buf, PAGE_SIZE, "mei:%s:" MEI_CL_UUID_FMT ":", 601 cldev->name, MEI_CL_UUID_ARGS(uuid->b)); 602 603 return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; 604 } 605 static DEVICE_ATTR_RO(modalias); 606 607 static struct attribute *mei_cl_dev_attrs[] = { 608 &dev_attr_name.attr, 609 &dev_attr_uuid.attr, 610 &dev_attr_modalias.attr, 611 NULL, 612 }; 613 ATTRIBUTE_GROUPS(mei_cl_dev); 614 615 /** 616 * mei_cl_device_uevent - me client bus uevent handler 617 * 618 * @dev: device 619 * @env: uevent kobject 620 * 621 * Return: 0 on success -ENOMEM on when add_uevent_var fails 622 */ 623 static int mei_cl_device_uevent(struct device *dev, struct kobj_uevent_env *env) 624 { 625 struct mei_cl_device *cldev = to_mei_cl_device(dev); 626 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); 627 628 if (add_uevent_var(env, "MEI_CL_UUID=%pUl", uuid)) 629 return -ENOMEM; 630 631 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name)) 632 return -ENOMEM; 633 634 if (add_uevent_var(env, "MODALIAS=mei:%s:" MEI_CL_UUID_FMT ":", 635 cldev->name, MEI_CL_UUID_ARGS(uuid->b))) 636 return -ENOMEM; 637 638 return 0; 639 } 640 641 static struct bus_type mei_cl_bus_type = { 642 .name = "mei", 643 .dev_groups = mei_cl_dev_groups, 644 .match = mei_cl_device_match, 645 .probe = mei_cl_device_probe, 646 .remove = mei_cl_device_remove, 647 .uevent = mei_cl_device_uevent, 648 }; 649 650 static struct mei_device *mei_dev_bus_get(struct mei_device *bus) 651 { 652 if (bus) 653 get_device(bus->dev); 654 655 return bus; 656 } 657 658 static void mei_dev_bus_put(struct mei_device *bus) 659 { 660 if (bus) 661 put_device(bus->dev); 662 } 663 664 static void mei_cl_dev_release(struct device *dev) 665 { 666 struct mei_cl_device *cldev = to_mei_cl_device(dev); 667 668 if (!cldev) 669 return; 670 671 mei_me_cl_put(cldev->me_cl); 672 mei_dev_bus_put(cldev->bus); 673 kfree(cldev); 674 } 675 676 static struct device_type mei_cl_device_type = { 677 .release = mei_cl_dev_release, 678 }; 679 680 /** 681 * mei_cl_dev_alloc - initialize and allocate mei client device 682 * 683 * @bus: mei device 684 * @me_cl: me client 685 * 686 * Return: allocated device structur or NULL on allocation failure 687 */ 688 static struct mei_cl_device *mei_cl_dev_alloc(struct mei_device *bus, 689 struct mei_me_client *me_cl) 690 { 691 struct mei_cl_device *cldev; 692 693 cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL); 694 if (!cldev) 695 return NULL; 696 697 device_initialize(&cldev->dev); 698 cldev->dev.parent = bus->dev; 699 cldev->dev.bus = &mei_cl_bus_type; 700 cldev->dev.type = &mei_cl_device_type; 701 cldev->bus = mei_dev_bus_get(bus); 702 cldev->me_cl = mei_me_cl_get(me_cl); 703 cldev->is_added = 0; 704 INIT_LIST_HEAD(&cldev->bus_list); 705 706 return cldev; 707 } 708 709 /** 710 * mei_cl_dev_setup - setup me client device 711 * run fix up routines and set the device name 712 * 713 * @bus: mei device 714 * @cldev: me client device 715 * 716 * Return: true if the device is eligible for enumeration 717 */ 718 static bool mei_cl_dev_setup(struct mei_device *bus, 719 struct mei_cl_device *cldev) 720 { 721 cldev->do_match = 1; 722 mei_cl_dev_fixup(cldev); 723 724 if (cldev->do_match) 725 dev_set_name(&cldev->dev, "mei:%s:%pUl", 726 cldev->name, mei_me_cl_uuid(cldev->me_cl)); 727 728 return cldev->do_match == 1; 729 } 730 731 /** 732 * mei_cl_bus_dev_add - add me client devices 733 * 734 * @cldev: me client device 735 * 736 * Return: 0 on success; < 0 on failre 737 */ 738 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev) 739 { 740 int ret; 741 742 dev_dbg(cldev->bus->dev, "adding %pUL\n", mei_me_cl_uuid(cldev->me_cl)); 743 ret = device_add(&cldev->dev); 744 if (!ret) 745 cldev->is_added = 1; 746 747 return ret; 748 } 749 750 /** 751 * mei_cl_bus_dev_stop - stop the driver 752 * 753 * @cldev: me client device 754 */ 755 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev) 756 { 757 if (cldev->is_added) 758 device_release_driver(&cldev->dev); 759 } 760 761 /** 762 * mei_cl_bus_dev_destroy - destroy me client devices object 763 * 764 * @cldev: me client device 765 */ 766 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev) 767 { 768 if (!cldev->is_added) 769 return; 770 771 device_del(&cldev->dev); 772 773 mutex_lock(&cldev->bus->cl_bus_lock); 774 list_del_init(&cldev->bus_list); 775 mutex_unlock(&cldev->bus->cl_bus_lock); 776 777 cldev->is_added = 0; 778 put_device(&cldev->dev); 779 } 780 781 /** 782 * mei_cl_bus_remove_device - remove a devices form the bus 783 * 784 * @cldev: me client device 785 */ 786 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev) 787 { 788 mei_cl_bus_dev_stop(cldev); 789 mei_cl_bus_dev_destroy(cldev); 790 } 791 792 /** 793 * mei_cl_bus_remove_devices - remove all devices form the bus 794 * 795 * @bus: mei device 796 */ 797 void mei_cl_bus_remove_devices(struct mei_device *bus) 798 { 799 struct mei_cl_device *cldev, *next; 800 801 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list) 802 mei_cl_bus_remove_device(cldev); 803 } 804 805 806 /** 807 * mei_cl_dev_init - allocate and initializes an mei client devices 808 * based on me client 809 * 810 * @bus: mei device 811 * @me_cl: me client 812 */ 813 static void mei_cl_dev_init(struct mei_device *bus, struct mei_me_client *me_cl) 814 { 815 struct mei_cl_device *cldev; 816 817 dev_dbg(bus->dev, "initializing %pUl", mei_me_cl_uuid(me_cl)); 818 819 if (me_cl->bus_added) 820 return; 821 822 cldev = mei_cl_dev_alloc(bus, me_cl); 823 if (!cldev) 824 return; 825 826 mutex_lock(&cldev->bus->cl_bus_lock); 827 me_cl->bus_added = true; 828 list_add_tail(&cldev->bus_list, &bus->device_list); 829 mutex_unlock(&cldev->bus->cl_bus_lock); 830 831 } 832 833 /** 834 * mei_cl_bus_rescan - scan me clients list and add create 835 * devices for eligible clients 836 * 837 * @bus: mei device 838 */ 839 void mei_cl_bus_rescan(struct mei_device *bus) 840 { 841 struct mei_cl_device *cldev, *n; 842 struct mei_me_client *me_cl; 843 844 down_read(&bus->me_clients_rwsem); 845 list_for_each_entry(me_cl, &bus->me_clients, list) 846 mei_cl_dev_init(bus, me_cl); 847 up_read(&bus->me_clients_rwsem); 848 849 mutex_lock(&bus->cl_bus_lock); 850 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) { 851 852 if (!mei_me_cl_is_active(cldev->me_cl)) { 853 mei_cl_bus_remove_device(cldev); 854 continue; 855 } 856 857 if (cldev->is_added) 858 continue; 859 860 if (mei_cl_dev_setup(bus, cldev)) 861 mei_cl_bus_dev_add(cldev); 862 else { 863 list_del_init(&cldev->bus_list); 864 put_device(&cldev->dev); 865 } 866 } 867 mutex_unlock(&bus->cl_bus_lock); 868 869 dev_dbg(bus->dev, "rescan end"); 870 } 871 872 int __mei_cl_driver_register(struct mei_cl_driver *cldrv, struct module *owner) 873 { 874 int err; 875 876 cldrv->driver.name = cldrv->name; 877 cldrv->driver.owner = owner; 878 cldrv->driver.bus = &mei_cl_bus_type; 879 880 err = driver_register(&cldrv->driver); 881 if (err) 882 return err; 883 884 pr_debug("mei: driver [%s] registered\n", cldrv->driver.name); 885 886 return 0; 887 } 888 EXPORT_SYMBOL_GPL(__mei_cl_driver_register); 889 890 void mei_cl_driver_unregister(struct mei_cl_driver *cldrv) 891 { 892 driver_unregister(&cldrv->driver); 893 894 pr_debug("mei: driver [%s] unregistered\n", cldrv->driver.name); 895 } 896 EXPORT_SYMBOL_GPL(mei_cl_driver_unregister); 897 898 899 int __init mei_cl_bus_init(void) 900 { 901 return bus_register(&mei_cl_bus_type); 902 } 903 904 void __exit mei_cl_bus_exit(void) 905 { 906 bus_unregister(&mei_cl_bus_type); 907 } 908