1 /* 2 * 3 * Intel Management Engine Interface (Intel MEI) Linux driver 4 * Copyright (c) 2003-2012, Intel Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms and conditions of the GNU General Public License, 8 * version 2, as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 */ 16 17 #include <linux/sched.h> 18 #include <linux/wait.h> 19 #include <linux/delay.h> 20 #include <linux/slab.h> 21 #include <linux/pm_runtime.h> 22 23 #include <linux/mei.h> 24 25 #include "mei_dev.h" 26 #include "hbm.h" 27 #include "client.h" 28 29 /** 30 * mei_me_cl_init - initialize me client 31 * 32 * @me_cl: me client 33 */ 34 void mei_me_cl_init(struct mei_me_client *me_cl) 35 { 36 INIT_LIST_HEAD(&me_cl->list); 37 kref_init(&me_cl->refcnt); 38 } 39 40 /** 41 * mei_me_cl_get - increases me client refcount 42 * 43 * @me_cl: me client 44 * 45 * Locking: called under "dev->device_lock" lock 46 * 47 * Return: me client or NULL 48 */ 49 struct mei_me_client *mei_me_cl_get(struct mei_me_client *me_cl) 50 { 51 if (me_cl && kref_get_unless_zero(&me_cl->refcnt)) 52 return me_cl; 53 54 return NULL; 55 } 56 57 /** 58 * mei_me_cl_release - free me client 59 * 60 * Locking: called under "dev->device_lock" lock 61 * 62 * @ref: me_client refcount 63 */ 64 static void mei_me_cl_release(struct kref *ref) 65 { 66 struct mei_me_client *me_cl = 67 container_of(ref, struct mei_me_client, refcnt); 68 69 kfree(me_cl); 70 } 71 72 /** 73 * mei_me_cl_put - decrease me client refcount and free client if necessary 74 * 75 * Locking: called under "dev->device_lock" lock 76 * 77 * @me_cl: me client 78 */ 79 void mei_me_cl_put(struct mei_me_client *me_cl) 80 { 81 if (me_cl) 82 kref_put(&me_cl->refcnt, mei_me_cl_release); 83 } 84 85 /** 86 * __mei_me_cl_del - delete me client from the list and decrease 87 * reference counter 88 * 89 * @dev: mei device 90 * @me_cl: me client 91 * 92 * Locking: dev->me_clients_rwsem 93 */ 94 static void __mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl) 95 { 96 if (!me_cl) 97 return; 98 99 list_del_init(&me_cl->list); 100 mei_me_cl_put(me_cl); 101 } 102 103 /** 104 * mei_me_cl_del - delete me client from the list and decrease 105 * reference counter 106 * 107 * @dev: mei device 108 * @me_cl: me client 109 */ 110 void mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl) 111 { 112 down_write(&dev->me_clients_rwsem); 113 __mei_me_cl_del(dev, me_cl); 114 up_write(&dev->me_clients_rwsem); 115 } 116 117 /** 118 * mei_me_cl_add - add me client to the list 119 * 120 * @dev: mei device 121 * @me_cl: me client 122 */ 123 void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl) 124 { 125 down_write(&dev->me_clients_rwsem); 126 list_add(&me_cl->list, &dev->me_clients); 127 up_write(&dev->me_clients_rwsem); 128 } 129 130 /** 131 * __mei_me_cl_by_uuid - locate me client by uuid 132 * increases ref count 133 * 134 * @dev: mei device 135 * @uuid: me client uuid 136 * 137 * Return: me client or NULL if not found 138 * 139 * Locking: dev->me_clients_rwsem 140 */ 141 static struct mei_me_client *__mei_me_cl_by_uuid(struct mei_device *dev, 142 const uuid_le *uuid) 143 { 144 struct mei_me_client *me_cl; 145 const uuid_le *pn; 146 147 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); 148 149 list_for_each_entry(me_cl, &dev->me_clients, list) { 150 pn = &me_cl->props.protocol_name; 151 if (uuid_le_cmp(*uuid, *pn) == 0) 152 return mei_me_cl_get(me_cl); 153 } 154 155 return NULL; 156 } 157 158 /** 159 * mei_me_cl_by_uuid - locate me client by uuid 160 * increases ref count 161 * 162 * @dev: mei device 163 * @uuid: me client uuid 164 * 165 * Return: me client or NULL if not found 166 * 167 * Locking: dev->me_clients_rwsem 168 */ 169 struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev, 170 const uuid_le *uuid) 171 { 172 struct mei_me_client *me_cl; 173 174 down_read(&dev->me_clients_rwsem); 175 me_cl = __mei_me_cl_by_uuid(dev, uuid); 176 up_read(&dev->me_clients_rwsem); 177 178 return me_cl; 179 } 180 181 /** 182 * mei_me_cl_by_id - locate me client by client id 183 * increases ref count 184 * 185 * @dev: the device structure 186 * @client_id: me client id 187 * 188 * Return: me client or NULL if not found 189 * 190 * Locking: dev->me_clients_rwsem 191 */ 192 struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id) 193 { 194 195 struct mei_me_client *__me_cl, *me_cl = NULL; 196 197 down_read(&dev->me_clients_rwsem); 198 list_for_each_entry(__me_cl, &dev->me_clients, list) { 199 if (__me_cl->client_id == client_id) { 200 me_cl = mei_me_cl_get(__me_cl); 201 break; 202 } 203 } 204 up_read(&dev->me_clients_rwsem); 205 206 return me_cl; 207 } 208 209 /** 210 * __mei_me_cl_by_uuid_id - locate me client by client id and uuid 211 * increases ref count 212 * 213 * @dev: the device structure 214 * @uuid: me client uuid 215 * @client_id: me client id 216 * 217 * Return: me client or null if not found 218 * 219 * Locking: dev->me_clients_rwsem 220 */ 221 static struct mei_me_client *__mei_me_cl_by_uuid_id(struct mei_device *dev, 222 const uuid_le *uuid, u8 client_id) 223 { 224 struct mei_me_client *me_cl; 225 const uuid_le *pn; 226 227 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); 228 229 list_for_each_entry(me_cl, &dev->me_clients, list) { 230 pn = &me_cl->props.protocol_name; 231 if (uuid_le_cmp(*uuid, *pn) == 0 && 232 me_cl->client_id == client_id) 233 return mei_me_cl_get(me_cl); 234 } 235 236 return NULL; 237 } 238 239 240 /** 241 * mei_me_cl_by_uuid_id - locate me client by client id and uuid 242 * increases ref count 243 * 244 * @dev: the device structure 245 * @uuid: me client uuid 246 * @client_id: me client id 247 * 248 * Return: me client or null if not found 249 */ 250 struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev, 251 const uuid_le *uuid, u8 client_id) 252 { 253 struct mei_me_client *me_cl; 254 255 down_read(&dev->me_clients_rwsem); 256 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, client_id); 257 up_read(&dev->me_clients_rwsem); 258 259 return me_cl; 260 } 261 262 /** 263 * mei_me_cl_rm_by_uuid - remove all me clients matching uuid 264 * 265 * @dev: the device structure 266 * @uuid: me client uuid 267 * 268 * Locking: called under "dev->device_lock" lock 269 */ 270 void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid) 271 { 272 struct mei_me_client *me_cl; 273 274 dev_dbg(dev->dev, "remove %pUl\n", uuid); 275 276 down_write(&dev->me_clients_rwsem); 277 me_cl = __mei_me_cl_by_uuid(dev, uuid); 278 __mei_me_cl_del(dev, me_cl); 279 up_write(&dev->me_clients_rwsem); 280 } 281 282 /** 283 * mei_me_cl_rm_by_uuid_id - remove all me clients matching client id 284 * 285 * @dev: the device structure 286 * @uuid: me client uuid 287 * @id: me client id 288 * 289 * Locking: called under "dev->device_lock" lock 290 */ 291 void mei_me_cl_rm_by_uuid_id(struct mei_device *dev, const uuid_le *uuid, u8 id) 292 { 293 struct mei_me_client *me_cl; 294 295 dev_dbg(dev->dev, "remove %pUl %d\n", uuid, id); 296 297 down_write(&dev->me_clients_rwsem); 298 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, id); 299 __mei_me_cl_del(dev, me_cl); 300 up_write(&dev->me_clients_rwsem); 301 } 302 303 /** 304 * mei_me_cl_rm_all - remove all me clients 305 * 306 * @dev: the device structure 307 * 308 * Locking: called under "dev->device_lock" lock 309 */ 310 void mei_me_cl_rm_all(struct mei_device *dev) 311 { 312 struct mei_me_client *me_cl, *next; 313 314 down_write(&dev->me_clients_rwsem); 315 list_for_each_entry_safe(me_cl, next, &dev->me_clients, list) 316 __mei_me_cl_del(dev, me_cl); 317 up_write(&dev->me_clients_rwsem); 318 } 319 320 /** 321 * mei_cl_cmp_id - tells if the clients are the same 322 * 323 * @cl1: host client 1 324 * @cl2: host client 2 325 * 326 * Return: true - if the clients has same host and me ids 327 * false - otherwise 328 */ 329 static inline bool mei_cl_cmp_id(const struct mei_cl *cl1, 330 const struct mei_cl *cl2) 331 { 332 return cl1 && cl2 && 333 (cl1->host_client_id == cl2->host_client_id) && 334 (mei_cl_me_id(cl1) == mei_cl_me_id(cl2)); 335 } 336 337 /** 338 * mei_io_cb_free - free mei_cb_private related memory 339 * 340 * @cb: mei callback struct 341 */ 342 void mei_io_cb_free(struct mei_cl_cb *cb) 343 { 344 if (cb == NULL) 345 return; 346 347 list_del(&cb->list); 348 kfree(cb->buf.data); 349 kfree(cb); 350 } 351 352 /** 353 * mei_io_cb_init - allocate and initialize io callback 354 * 355 * @cl: mei client 356 * @type: operation type 357 * @fp: pointer to file structure 358 * 359 * Return: mei_cl_cb pointer or NULL; 360 */ 361 struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, enum mei_cb_file_ops type, 362 struct file *fp) 363 { 364 struct mei_cl_cb *cb; 365 366 cb = kzalloc(sizeof(struct mei_cl_cb), GFP_KERNEL); 367 if (!cb) 368 return NULL; 369 370 INIT_LIST_HEAD(&cb->list); 371 cb->file_object = fp; 372 cb->cl = cl; 373 cb->buf_idx = 0; 374 cb->fop_type = type; 375 return cb; 376 } 377 378 /** 379 * __mei_io_list_flush - removes and frees cbs belonging to cl. 380 * 381 * @list: an instance of our list structure 382 * @cl: host client, can be NULL for flushing the whole list 383 * @free: whether to free the cbs 384 */ 385 static void __mei_io_list_flush(struct mei_cl_cb *list, 386 struct mei_cl *cl, bool free) 387 { 388 struct mei_cl_cb *cb, *next; 389 390 /* enable removing everything if no cl is specified */ 391 list_for_each_entry_safe(cb, next, &list->list, list) { 392 if (!cl || mei_cl_cmp_id(cl, cb->cl)) { 393 list_del_init(&cb->list); 394 if (free) 395 mei_io_cb_free(cb); 396 } 397 } 398 } 399 400 /** 401 * mei_io_list_flush - removes list entry belonging to cl. 402 * 403 * @list: An instance of our list structure 404 * @cl: host client 405 */ 406 void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl) 407 { 408 __mei_io_list_flush(list, cl, false); 409 } 410 411 /** 412 * mei_io_list_free - removes cb belonging to cl and free them 413 * 414 * @list: An instance of our list structure 415 * @cl: host client 416 */ 417 static inline void mei_io_list_free(struct mei_cl_cb *list, struct mei_cl *cl) 418 { 419 __mei_io_list_flush(list, cl, true); 420 } 421 422 /** 423 * mei_io_cb_alloc_buf - allocate callback buffer 424 * 425 * @cb: io callback structure 426 * @length: size of the buffer 427 * 428 * Return: 0 on success 429 * -EINVAL if cb is NULL 430 * -ENOMEM if allocation failed 431 */ 432 int mei_io_cb_alloc_buf(struct mei_cl_cb *cb, size_t length) 433 { 434 if (!cb) 435 return -EINVAL; 436 437 if (length == 0) 438 return 0; 439 440 cb->buf.data = kmalloc(length, GFP_KERNEL); 441 if (!cb->buf.data) 442 return -ENOMEM; 443 cb->buf.size = length; 444 return 0; 445 } 446 447 /** 448 * mei_cl_alloc_cb - a convenient wrapper for allocating read cb 449 * 450 * @cl: host client 451 * @length: size of the buffer 452 * @type: operation type 453 * @fp: associated file pointer (might be NULL) 454 * 455 * Return: cb on success and NULL on failure 456 */ 457 struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length, 458 enum mei_cb_file_ops type, struct file *fp) 459 { 460 struct mei_cl_cb *cb; 461 462 cb = mei_io_cb_init(cl, type, fp); 463 if (!cb) 464 return NULL; 465 466 if (mei_io_cb_alloc_buf(cb, length)) { 467 mei_io_cb_free(cb); 468 return NULL; 469 } 470 471 return cb; 472 } 473 474 /** 475 * mei_cl_read_cb - find this cl's callback in the read list 476 * for a specific file 477 * 478 * @cl: host client 479 * @fp: file pointer (matching cb file object), may be NULL 480 * 481 * Return: cb on success, NULL if cb is not found 482 */ 483 struct mei_cl_cb *mei_cl_read_cb(const struct mei_cl *cl, const struct file *fp) 484 { 485 struct mei_cl_cb *cb; 486 487 list_for_each_entry(cb, &cl->rd_completed, list) 488 if (!fp || fp == cb->file_object) 489 return cb; 490 491 return NULL; 492 } 493 494 /** 495 * mei_cl_read_cb_flush - free client's read pending and completed cbs 496 * for a specific file 497 * 498 * @cl: host client 499 * @fp: file pointer (matching cb file object), may be NULL 500 */ 501 void mei_cl_read_cb_flush(const struct mei_cl *cl, const struct file *fp) 502 { 503 struct mei_cl_cb *cb, *next; 504 505 list_for_each_entry_safe(cb, next, &cl->rd_completed, list) 506 if (!fp || fp == cb->file_object) 507 mei_io_cb_free(cb); 508 509 510 list_for_each_entry_safe(cb, next, &cl->rd_pending, list) 511 if (!fp || fp == cb->file_object) 512 mei_io_cb_free(cb); 513 } 514 515 /** 516 * mei_cl_flush_queues - flushes queue lists belonging to cl. 517 * 518 * @cl: host client 519 * @fp: file pointer (matching cb file object), may be NULL 520 * 521 * Return: 0 on success, -EINVAL if cl or cl->dev is NULL. 522 */ 523 int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp) 524 { 525 struct mei_device *dev; 526 527 if (WARN_ON(!cl || !cl->dev)) 528 return -EINVAL; 529 530 dev = cl->dev; 531 532 cl_dbg(dev, cl, "remove list entry belonging to cl\n"); 533 mei_io_list_free(&cl->dev->write_list, cl); 534 mei_io_list_free(&cl->dev->write_waiting_list, cl); 535 mei_io_list_flush(&cl->dev->ctrl_wr_list, cl); 536 mei_io_list_flush(&cl->dev->ctrl_rd_list, cl); 537 mei_io_list_flush(&cl->dev->amthif_cmd_list, cl); 538 mei_io_list_flush(&cl->dev->amthif_rd_complete_list, cl); 539 540 mei_cl_read_cb_flush(cl, fp); 541 542 return 0; 543 } 544 545 546 /** 547 * mei_cl_init - initializes cl. 548 * 549 * @cl: host client to be initialized 550 * @dev: mei device 551 */ 552 void mei_cl_init(struct mei_cl *cl, struct mei_device *dev) 553 { 554 memset(cl, 0, sizeof(struct mei_cl)); 555 init_waitqueue_head(&cl->wait); 556 init_waitqueue_head(&cl->rx_wait); 557 init_waitqueue_head(&cl->tx_wait); 558 INIT_LIST_HEAD(&cl->rd_completed); 559 INIT_LIST_HEAD(&cl->rd_pending); 560 INIT_LIST_HEAD(&cl->link); 561 INIT_LIST_HEAD(&cl->device_link); 562 cl->writing_state = MEI_IDLE; 563 cl->state = MEI_FILE_INITIALIZING; 564 cl->dev = dev; 565 } 566 567 /** 568 * mei_cl_allocate - allocates cl structure and sets it up. 569 * 570 * @dev: mei device 571 * Return: The allocated file or NULL on failure 572 */ 573 struct mei_cl *mei_cl_allocate(struct mei_device *dev) 574 { 575 struct mei_cl *cl; 576 577 cl = kmalloc(sizeof(struct mei_cl), GFP_KERNEL); 578 if (!cl) 579 return NULL; 580 581 mei_cl_init(cl, dev); 582 583 return cl; 584 } 585 586 /** 587 * mei_cl_link - allocate host id in the host map 588 * 589 * @cl: host client 590 * @id: fixed host id or MEI_HOST_CLIENT_ID_ANY (-1) for generic one 591 * 592 * Return: 0 on success 593 * -EINVAL on incorrect values 594 * -EMFILE if open count exceeded. 595 */ 596 int mei_cl_link(struct mei_cl *cl, int id) 597 { 598 struct mei_device *dev; 599 long open_handle_count; 600 601 if (WARN_ON(!cl || !cl->dev)) 602 return -EINVAL; 603 604 dev = cl->dev; 605 606 /* If Id is not assigned get one*/ 607 if (id == MEI_HOST_CLIENT_ID_ANY) 608 id = find_first_zero_bit(dev->host_clients_map, 609 MEI_CLIENTS_MAX); 610 611 if (id >= MEI_CLIENTS_MAX) { 612 dev_err(dev->dev, "id exceeded %d", MEI_CLIENTS_MAX); 613 return -EMFILE; 614 } 615 616 open_handle_count = dev->open_handle_count + dev->iamthif_open_count; 617 if (open_handle_count >= MEI_MAX_OPEN_HANDLE_COUNT) { 618 dev_err(dev->dev, "open_handle_count exceeded %d", 619 MEI_MAX_OPEN_HANDLE_COUNT); 620 return -EMFILE; 621 } 622 623 dev->open_handle_count++; 624 625 cl->host_client_id = id; 626 list_add_tail(&cl->link, &dev->file_list); 627 628 set_bit(id, dev->host_clients_map); 629 630 cl->state = MEI_FILE_INITIALIZING; 631 632 cl_dbg(dev, cl, "link cl\n"); 633 return 0; 634 } 635 636 /** 637 * mei_cl_unlink - remove host client from the list 638 * 639 * @cl: host client 640 * 641 * Return: always 0 642 */ 643 int mei_cl_unlink(struct mei_cl *cl) 644 { 645 struct mei_device *dev; 646 647 /* don't shout on error exit path */ 648 if (!cl) 649 return 0; 650 651 /* wd and amthif might not be initialized */ 652 if (!cl->dev) 653 return 0; 654 655 dev = cl->dev; 656 657 cl_dbg(dev, cl, "unlink client"); 658 659 if (dev->open_handle_count > 0) 660 dev->open_handle_count--; 661 662 /* never clear the 0 bit */ 663 if (cl->host_client_id) 664 clear_bit(cl->host_client_id, dev->host_clients_map); 665 666 list_del_init(&cl->link); 667 668 cl->state = MEI_FILE_INITIALIZING; 669 670 return 0; 671 } 672 673 674 void mei_host_client_init(struct work_struct *work) 675 { 676 struct mei_device *dev = 677 container_of(work, struct mei_device, init_work); 678 struct mei_me_client *me_cl; 679 680 mutex_lock(&dev->device_lock); 681 682 683 me_cl = mei_me_cl_by_uuid(dev, &mei_amthif_guid); 684 if (me_cl) 685 mei_amthif_host_init(dev, me_cl); 686 mei_me_cl_put(me_cl); 687 688 me_cl = mei_me_cl_by_uuid(dev, &mei_wd_guid); 689 if (me_cl) 690 mei_wd_host_init(dev, me_cl); 691 mei_me_cl_put(me_cl); 692 693 me_cl = mei_me_cl_by_uuid(dev, &mei_nfc_guid); 694 if (me_cl) 695 mei_nfc_host_init(dev, me_cl); 696 mei_me_cl_put(me_cl); 697 698 699 dev->dev_state = MEI_DEV_ENABLED; 700 dev->reset_count = 0; 701 mutex_unlock(&dev->device_lock); 702 703 pm_runtime_mark_last_busy(dev->dev); 704 dev_dbg(dev->dev, "rpm: autosuspend\n"); 705 pm_runtime_autosuspend(dev->dev); 706 } 707 708 /** 709 * mei_hbuf_acquire - try to acquire host buffer 710 * 711 * @dev: the device structure 712 * Return: true if host buffer was acquired 713 */ 714 bool mei_hbuf_acquire(struct mei_device *dev) 715 { 716 if (mei_pg_state(dev) == MEI_PG_ON || 717 mei_pg_in_transition(dev)) { 718 dev_dbg(dev->dev, "device is in pg\n"); 719 return false; 720 } 721 722 if (!dev->hbuf_is_ready) { 723 dev_dbg(dev->dev, "hbuf is not ready\n"); 724 return false; 725 } 726 727 dev->hbuf_is_ready = false; 728 729 return true; 730 } 731 732 /** 733 * mei_cl_set_disconnected - set disconnected state and clear 734 * associated states and resources 735 * 736 * @cl: host client 737 */ 738 void mei_cl_set_disconnected(struct mei_cl *cl) 739 { 740 struct mei_device *dev = cl->dev; 741 742 if (cl->state == MEI_FILE_DISCONNECTED || 743 cl->state == MEI_FILE_INITIALIZING) 744 return; 745 746 cl->state = MEI_FILE_DISCONNECTED; 747 mei_io_list_flush(&dev->ctrl_rd_list, cl); 748 mei_io_list_flush(&dev->ctrl_wr_list, cl); 749 cl->mei_flow_ctrl_creds = 0; 750 cl->timer_count = 0; 751 752 if (!cl->me_cl) 753 return; 754 755 if (!WARN_ON(cl->me_cl->connect_count == 0)) 756 cl->me_cl->connect_count--; 757 758 if (cl->me_cl->connect_count == 0) 759 cl->me_cl->mei_flow_ctrl_creds = 0; 760 761 mei_me_cl_put(cl->me_cl); 762 cl->me_cl = NULL; 763 } 764 765 static int mei_cl_set_connecting(struct mei_cl *cl, struct mei_me_client *me_cl) 766 { 767 if (!mei_me_cl_get(me_cl)) 768 return -ENOENT; 769 770 /* only one connection is allowed for fixed address clients */ 771 if (me_cl->props.fixed_address) { 772 if (me_cl->connect_count) { 773 mei_me_cl_put(me_cl); 774 return -EBUSY; 775 } 776 } 777 778 cl->me_cl = me_cl; 779 cl->state = MEI_FILE_CONNECTING; 780 cl->me_cl->connect_count++; 781 782 return 0; 783 } 784 785 /* 786 * mei_cl_send_disconnect - send disconnect request 787 * 788 * @cl: host client 789 * @cb: callback block 790 * 791 * Return: 0, OK; otherwise, error. 792 */ 793 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) 794 { 795 struct mei_device *dev; 796 int ret; 797 798 dev = cl->dev; 799 800 ret = mei_hbm_cl_disconnect_req(dev, cl); 801 cl->status = ret; 802 if (ret) { 803 cl->state = MEI_FILE_DISCONNECT_REPLY; 804 return ret; 805 } 806 807 list_move_tail(&cb->list, &dev->ctrl_rd_list.list); 808 cl->timer_count = MEI_CONNECT_TIMEOUT; 809 810 return 0; 811 } 812 813 /** 814 * mei_cl_irq_disconnect - processes close related operation from 815 * interrupt thread context - send disconnect request 816 * 817 * @cl: client 818 * @cb: callback block. 819 * @cmpl_list: complete list. 820 * 821 * Return: 0, OK; otherwise, error. 822 */ 823 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, 824 struct mei_cl_cb *cmpl_list) 825 { 826 struct mei_device *dev = cl->dev; 827 u32 msg_slots; 828 int slots; 829 int ret; 830 831 msg_slots = mei_data2slots(sizeof(struct hbm_client_connect_request)); 832 slots = mei_hbuf_empty_slots(dev); 833 834 if (slots < msg_slots) 835 return -EMSGSIZE; 836 837 ret = mei_cl_send_disconnect(cl, cb); 838 if (ret) 839 list_move_tail(&cb->list, &cmpl_list->list); 840 841 return ret; 842 } 843 844 845 846 /** 847 * mei_cl_disconnect - disconnect host client from the me one 848 * 849 * @cl: host client 850 * 851 * Locking: called under "dev->device_lock" lock 852 * 853 * Return: 0 on success, <0 on failure. 854 */ 855 int mei_cl_disconnect(struct mei_cl *cl) 856 { 857 struct mei_device *dev; 858 struct mei_cl_cb *cb; 859 int rets; 860 861 if (WARN_ON(!cl || !cl->dev)) 862 return -ENODEV; 863 864 dev = cl->dev; 865 866 cl_dbg(dev, cl, "disconnecting"); 867 868 if (!mei_cl_is_connected(cl)) 869 return 0; 870 871 if (mei_cl_is_fixed_address(cl)) { 872 mei_cl_set_disconnected(cl); 873 return 0; 874 } 875 876 rets = pm_runtime_get(dev->dev); 877 if (rets < 0 && rets != -EINPROGRESS) { 878 pm_runtime_put_noidle(dev->dev); 879 cl_err(dev, cl, "rpm: get failed %d\n", rets); 880 return rets; 881 } 882 883 cl->state = MEI_FILE_DISCONNECTING; 884 885 cb = mei_io_cb_init(cl, MEI_FOP_DISCONNECT, NULL); 886 rets = cb ? 0 : -ENOMEM; 887 if (rets) 888 goto out; 889 890 cl_dbg(dev, cl, "add disconnect cb to control write list\n"); 891 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); 892 893 if (mei_hbuf_acquire(dev)) { 894 rets = mei_cl_send_disconnect(cl, cb); 895 if (rets) { 896 cl_err(dev, cl, "failed to disconnect.\n"); 897 goto out; 898 } 899 } 900 901 mutex_unlock(&dev->device_lock); 902 wait_event_timeout(cl->wait, cl->state == MEI_FILE_DISCONNECT_REPLY, 903 mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT)); 904 mutex_lock(&dev->device_lock); 905 906 rets = cl->status; 907 if (cl->state != MEI_FILE_DISCONNECT_REPLY) { 908 cl_dbg(dev, cl, "timeout on disconnect from FW client.\n"); 909 rets = -ETIME; 910 } 911 912 out: 913 /* we disconnect also on error */ 914 mei_cl_set_disconnected(cl); 915 if (!rets) 916 cl_dbg(dev, cl, "successfully disconnected from FW client.\n"); 917 918 cl_dbg(dev, cl, "rpm: autosuspend\n"); 919 pm_runtime_mark_last_busy(dev->dev); 920 pm_runtime_put_autosuspend(dev->dev); 921 922 mei_io_cb_free(cb); 923 return rets; 924 } 925 926 927 /** 928 * mei_cl_is_other_connecting - checks if other 929 * client with the same me client id is connecting 930 * 931 * @cl: private data of the file object 932 * 933 * Return: true if other client is connected, false - otherwise. 934 */ 935 static bool mei_cl_is_other_connecting(struct mei_cl *cl) 936 { 937 struct mei_device *dev; 938 struct mei_cl_cb *cb; 939 940 dev = cl->dev; 941 942 list_for_each_entry(cb, &dev->ctrl_rd_list.list, list) { 943 if (cb->fop_type == MEI_FOP_CONNECT && 944 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) 945 return true; 946 } 947 948 return false; 949 } 950 951 /** 952 * mei_cl_send_connect - send connect request 953 * 954 * @cl: host client 955 * @cb: callback block 956 * 957 * Return: 0, OK; otherwise, error. 958 */ 959 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) 960 { 961 struct mei_device *dev; 962 int ret; 963 964 dev = cl->dev; 965 966 ret = mei_hbm_cl_connect_req(dev, cl); 967 cl->status = ret; 968 if (ret) { 969 cl->state = MEI_FILE_DISCONNECT_REPLY; 970 return ret; 971 } 972 973 list_move_tail(&cb->list, &dev->ctrl_rd_list.list); 974 cl->timer_count = MEI_CONNECT_TIMEOUT; 975 return 0; 976 } 977 978 /** 979 * mei_cl_irq_connect - send connect request in irq_thread context 980 * 981 * @cl: host client 982 * @cb: callback block 983 * @cmpl_list: complete list 984 * 985 * Return: 0, OK; otherwise, error. 986 */ 987 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, 988 struct mei_cl_cb *cmpl_list) 989 { 990 struct mei_device *dev = cl->dev; 991 u32 msg_slots; 992 int slots; 993 int rets; 994 995 msg_slots = mei_data2slots(sizeof(struct hbm_client_connect_request)); 996 slots = mei_hbuf_empty_slots(dev); 997 998 if (mei_cl_is_other_connecting(cl)) 999 return 0; 1000 1001 if (slots < msg_slots) 1002 return -EMSGSIZE; 1003 1004 rets = mei_cl_send_connect(cl, cb); 1005 if (rets) 1006 list_move_tail(&cb->list, &cmpl_list->list); 1007 1008 return rets; 1009 } 1010 1011 /** 1012 * mei_cl_connect - connect host client to the me one 1013 * 1014 * @cl: host client 1015 * @me_cl: me client 1016 * @file: pointer to file structure 1017 * 1018 * Locking: called under "dev->device_lock" lock 1019 * 1020 * Return: 0 on success, <0 on failure. 1021 */ 1022 int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl, 1023 struct file *file) 1024 { 1025 struct mei_device *dev; 1026 struct mei_cl_cb *cb; 1027 int rets; 1028 1029 if (WARN_ON(!cl || !cl->dev || !me_cl)) 1030 return -ENODEV; 1031 1032 dev = cl->dev; 1033 1034 rets = mei_cl_set_connecting(cl, me_cl); 1035 if (rets) 1036 return rets; 1037 1038 if (mei_cl_is_fixed_address(cl)) { 1039 cl->state = MEI_FILE_CONNECTED; 1040 return 0; 1041 } 1042 1043 rets = pm_runtime_get(dev->dev); 1044 if (rets < 0 && rets != -EINPROGRESS) { 1045 pm_runtime_put_noidle(dev->dev); 1046 cl_err(dev, cl, "rpm: get failed %d\n", rets); 1047 goto nortpm; 1048 } 1049 1050 cb = mei_io_cb_init(cl, MEI_FOP_CONNECT, file); 1051 rets = cb ? 0 : -ENOMEM; 1052 if (rets) 1053 goto out; 1054 1055 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); 1056 1057 /* run hbuf acquire last so we don't have to undo */ 1058 if (!mei_cl_is_other_connecting(cl) && mei_hbuf_acquire(dev)) { 1059 rets = mei_cl_send_connect(cl, cb); 1060 if (rets) 1061 goto out; 1062 } 1063 1064 mutex_unlock(&dev->device_lock); 1065 wait_event_timeout(cl->wait, 1066 (cl->state == MEI_FILE_CONNECTED || 1067 cl->state == MEI_FILE_DISCONNECT_REPLY), 1068 mei_secs_to_jiffies(MEI_CL_CONNECT_TIMEOUT)); 1069 mutex_lock(&dev->device_lock); 1070 1071 if (!mei_cl_is_connected(cl)) { 1072 /* timeout or something went really wrong */ 1073 if (!cl->status) 1074 cl->status = -EFAULT; 1075 } 1076 1077 rets = cl->status; 1078 out: 1079 cl_dbg(dev, cl, "rpm: autosuspend\n"); 1080 pm_runtime_mark_last_busy(dev->dev); 1081 pm_runtime_put_autosuspend(dev->dev); 1082 1083 mei_io_cb_free(cb); 1084 1085 nortpm: 1086 if (!mei_cl_is_connected(cl)) 1087 mei_cl_set_disconnected(cl); 1088 1089 return rets; 1090 } 1091 1092 /** 1093 * mei_cl_alloc_linked - allocate and link host client 1094 * 1095 * @dev: the device structure 1096 * @id: fixed host id or MEI_HOST_CLIENT_ID_ANY (-1) for generic one 1097 * 1098 * Return: cl on success ERR_PTR on failure 1099 */ 1100 struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev, int id) 1101 { 1102 struct mei_cl *cl; 1103 int ret; 1104 1105 cl = mei_cl_allocate(dev); 1106 if (!cl) { 1107 ret = -ENOMEM; 1108 goto err; 1109 } 1110 1111 ret = mei_cl_link(cl, id); 1112 if (ret) 1113 goto err; 1114 1115 return cl; 1116 err: 1117 kfree(cl); 1118 return ERR_PTR(ret); 1119 } 1120 1121 1122 1123 /** 1124 * mei_cl_flow_ctrl_creds - checks flow_control credits for cl. 1125 * 1126 * @cl: private data of the file object 1127 * 1128 * Return: 1 if mei_flow_ctrl_creds >0, 0 - otherwise. 1129 */ 1130 int mei_cl_flow_ctrl_creds(struct mei_cl *cl) 1131 { 1132 int rets; 1133 1134 if (WARN_ON(!cl || !cl->me_cl)) 1135 return -EINVAL; 1136 1137 if (cl->mei_flow_ctrl_creds > 0) 1138 return 1; 1139 1140 if (mei_cl_is_fixed_address(cl)) { 1141 rets = mei_cl_read_start(cl, mei_cl_mtu(cl), NULL); 1142 if (rets && rets != -EBUSY) 1143 return rets; 1144 return 1; 1145 } 1146 1147 if (mei_cl_is_single_recv_buf(cl)) { 1148 if (cl->me_cl->mei_flow_ctrl_creds > 0) 1149 return 1; 1150 } 1151 return 0; 1152 } 1153 1154 /** 1155 * mei_cl_flow_ctrl_reduce - reduces flow_control. 1156 * 1157 * @cl: private data of the file object 1158 * 1159 * Return: 1160 * 0 on success 1161 * -EINVAL when ctrl credits are <= 0 1162 */ 1163 int mei_cl_flow_ctrl_reduce(struct mei_cl *cl) 1164 { 1165 if (WARN_ON(!cl || !cl->me_cl)) 1166 return -EINVAL; 1167 1168 if (mei_cl_is_fixed_address(cl)) 1169 return 0; 1170 1171 if (mei_cl_is_single_recv_buf(cl)) { 1172 if (WARN_ON(cl->me_cl->mei_flow_ctrl_creds <= 0)) 1173 return -EINVAL; 1174 cl->me_cl->mei_flow_ctrl_creds--; 1175 } else { 1176 if (WARN_ON(cl->mei_flow_ctrl_creds <= 0)) 1177 return -EINVAL; 1178 cl->mei_flow_ctrl_creds--; 1179 } 1180 return 0; 1181 } 1182 1183 /** 1184 * mei_cl_read_start - the start read client message function. 1185 * 1186 * @cl: host client 1187 * @length: number of bytes to read 1188 * @fp: pointer to file structure 1189 * 1190 * Return: 0 on success, <0 on failure. 1191 */ 1192 int mei_cl_read_start(struct mei_cl *cl, size_t length, struct file *fp) 1193 { 1194 struct mei_device *dev; 1195 struct mei_cl_cb *cb; 1196 int rets; 1197 1198 if (WARN_ON(!cl || !cl->dev)) 1199 return -ENODEV; 1200 1201 dev = cl->dev; 1202 1203 if (!mei_cl_is_connected(cl)) 1204 return -ENODEV; 1205 1206 /* HW currently supports only one pending read */ 1207 if (!list_empty(&cl->rd_pending)) 1208 return -EBUSY; 1209 1210 if (!mei_me_cl_is_active(cl->me_cl)) { 1211 cl_err(dev, cl, "no such me client\n"); 1212 return -ENOTTY; 1213 } 1214 1215 /* always allocate at least client max message */ 1216 length = max_t(size_t, length, mei_cl_mtu(cl)); 1217 cb = mei_cl_alloc_cb(cl, length, MEI_FOP_READ, fp); 1218 if (!cb) 1219 return -ENOMEM; 1220 1221 if (mei_cl_is_fixed_address(cl)) { 1222 list_add_tail(&cb->list, &cl->rd_pending); 1223 return 0; 1224 } 1225 1226 rets = pm_runtime_get(dev->dev); 1227 if (rets < 0 && rets != -EINPROGRESS) { 1228 pm_runtime_put_noidle(dev->dev); 1229 cl_err(dev, cl, "rpm: get failed %d\n", rets); 1230 goto nortpm; 1231 } 1232 1233 if (mei_hbuf_acquire(dev)) { 1234 rets = mei_hbm_cl_flow_control_req(dev, cl); 1235 if (rets < 0) 1236 goto out; 1237 1238 list_add_tail(&cb->list, &cl->rd_pending); 1239 } else { 1240 rets = 0; 1241 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); 1242 } 1243 1244 out: 1245 cl_dbg(dev, cl, "rpm: autosuspend\n"); 1246 pm_runtime_mark_last_busy(dev->dev); 1247 pm_runtime_put_autosuspend(dev->dev); 1248 nortpm: 1249 if (rets) 1250 mei_io_cb_free(cb); 1251 1252 return rets; 1253 } 1254 1255 /** 1256 * mei_cl_irq_write - write a message to device 1257 * from the interrupt thread context 1258 * 1259 * @cl: client 1260 * @cb: callback block. 1261 * @cmpl_list: complete list. 1262 * 1263 * Return: 0, OK; otherwise error. 1264 */ 1265 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, 1266 struct mei_cl_cb *cmpl_list) 1267 { 1268 struct mei_device *dev; 1269 struct mei_msg_data *buf; 1270 struct mei_msg_hdr mei_hdr; 1271 size_t len; 1272 u32 msg_slots; 1273 int slots; 1274 int rets; 1275 bool first_chunk; 1276 1277 if (WARN_ON(!cl || !cl->dev)) 1278 return -ENODEV; 1279 1280 dev = cl->dev; 1281 1282 buf = &cb->buf; 1283 1284 first_chunk = cb->buf_idx == 0; 1285 1286 rets = first_chunk ? mei_cl_flow_ctrl_creds(cl) : 1; 1287 if (rets < 0) 1288 return rets; 1289 1290 if (rets == 0) { 1291 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); 1292 return 0; 1293 } 1294 1295 slots = mei_hbuf_empty_slots(dev); 1296 len = buf->size - cb->buf_idx; 1297 msg_slots = mei_data2slots(len); 1298 1299 mei_hdr.host_addr = mei_cl_host_addr(cl); 1300 mei_hdr.me_addr = mei_cl_me_id(cl); 1301 mei_hdr.reserved = 0; 1302 mei_hdr.internal = cb->internal; 1303 1304 if (slots >= msg_slots) { 1305 mei_hdr.length = len; 1306 mei_hdr.msg_complete = 1; 1307 /* Split the message only if we can write the whole host buffer */ 1308 } else if (slots == dev->hbuf_depth) { 1309 msg_slots = slots; 1310 len = (slots * sizeof(u32)) - sizeof(struct mei_msg_hdr); 1311 mei_hdr.length = len; 1312 mei_hdr.msg_complete = 0; 1313 } else { 1314 /* wait for next time the host buffer is empty */ 1315 return 0; 1316 } 1317 1318 cl_dbg(dev, cl, "buf: size = %d idx = %lu\n", 1319 cb->buf.size, cb->buf_idx); 1320 1321 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); 1322 if (rets) { 1323 cl->status = rets; 1324 list_move_tail(&cb->list, &cmpl_list->list); 1325 return rets; 1326 } 1327 1328 cl->status = 0; 1329 cl->writing_state = MEI_WRITING; 1330 cb->buf_idx += mei_hdr.length; 1331 cb->completed = mei_hdr.msg_complete == 1; 1332 1333 if (first_chunk) { 1334 if (mei_cl_flow_ctrl_reduce(cl)) 1335 return -EIO; 1336 } 1337 1338 if (mei_hdr.msg_complete) 1339 list_move_tail(&cb->list, &dev->write_waiting_list.list); 1340 1341 return 0; 1342 } 1343 1344 /** 1345 * mei_cl_write - submit a write cb to mei device 1346 * assumes device_lock is locked 1347 * 1348 * @cl: host client 1349 * @cb: write callback with filled data 1350 * @blocking: block until completed 1351 * 1352 * Return: number of bytes sent on success, <0 on failure. 1353 */ 1354 int mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, bool blocking) 1355 { 1356 struct mei_device *dev; 1357 struct mei_msg_data *buf; 1358 struct mei_msg_hdr mei_hdr; 1359 int rets; 1360 1361 1362 if (WARN_ON(!cl || !cl->dev)) 1363 return -ENODEV; 1364 1365 if (WARN_ON(!cb)) 1366 return -EINVAL; 1367 1368 dev = cl->dev; 1369 1370 1371 buf = &cb->buf; 1372 1373 cl_dbg(dev, cl, "size=%d\n", buf->size); 1374 1375 rets = pm_runtime_get(dev->dev); 1376 if (rets < 0 && rets != -EINPROGRESS) { 1377 pm_runtime_put_noidle(dev->dev); 1378 cl_err(dev, cl, "rpm: get failed %d\n", rets); 1379 return rets; 1380 } 1381 1382 cb->buf_idx = 0; 1383 cl->writing_state = MEI_IDLE; 1384 1385 mei_hdr.host_addr = mei_cl_host_addr(cl); 1386 mei_hdr.me_addr = mei_cl_me_id(cl); 1387 mei_hdr.reserved = 0; 1388 mei_hdr.msg_complete = 0; 1389 mei_hdr.internal = cb->internal; 1390 1391 rets = mei_cl_flow_ctrl_creds(cl); 1392 if (rets < 0) 1393 goto err; 1394 1395 if (rets == 0) { 1396 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); 1397 rets = buf->size; 1398 goto out; 1399 } 1400 if (!mei_hbuf_acquire(dev)) { 1401 cl_dbg(dev, cl, "Cannot acquire the host buffer: not sending.\n"); 1402 rets = buf->size; 1403 goto out; 1404 } 1405 1406 /* Check for a maximum length */ 1407 if (buf->size > mei_hbuf_max_len(dev)) { 1408 mei_hdr.length = mei_hbuf_max_len(dev); 1409 mei_hdr.msg_complete = 0; 1410 } else { 1411 mei_hdr.length = buf->size; 1412 mei_hdr.msg_complete = 1; 1413 } 1414 1415 rets = mei_write_message(dev, &mei_hdr, buf->data); 1416 if (rets) 1417 goto err; 1418 1419 rets = mei_cl_flow_ctrl_reduce(cl); 1420 if (rets) 1421 goto err; 1422 1423 cl->writing_state = MEI_WRITING; 1424 cb->buf_idx = mei_hdr.length; 1425 cb->completed = mei_hdr.msg_complete == 1; 1426 1427 out: 1428 if (mei_hdr.msg_complete) 1429 list_add_tail(&cb->list, &dev->write_waiting_list.list); 1430 else 1431 list_add_tail(&cb->list, &dev->write_list.list); 1432 1433 if (blocking && cl->writing_state != MEI_WRITE_COMPLETE) { 1434 1435 mutex_unlock(&dev->device_lock); 1436 rets = wait_event_interruptible(cl->tx_wait, 1437 cl->writing_state == MEI_WRITE_COMPLETE); 1438 mutex_lock(&dev->device_lock); 1439 /* wait_event_interruptible returns -ERESTARTSYS */ 1440 if (rets) { 1441 if (signal_pending(current)) 1442 rets = -EINTR; 1443 goto err; 1444 } 1445 } 1446 1447 rets = buf->size; 1448 err: 1449 cl_dbg(dev, cl, "rpm: autosuspend\n"); 1450 pm_runtime_mark_last_busy(dev->dev); 1451 pm_runtime_put_autosuspend(dev->dev); 1452 1453 return rets; 1454 } 1455 1456 1457 /** 1458 * mei_cl_complete - processes completed operation for a client 1459 * 1460 * @cl: private data of the file object. 1461 * @cb: callback block. 1462 */ 1463 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) 1464 { 1465 struct mei_device *dev = cl->dev; 1466 1467 switch (cb->fop_type) { 1468 case MEI_FOP_WRITE: 1469 mei_io_cb_free(cb); 1470 cl->writing_state = MEI_WRITE_COMPLETE; 1471 if (waitqueue_active(&cl->tx_wait)) { 1472 wake_up_interruptible(&cl->tx_wait); 1473 } else { 1474 pm_runtime_mark_last_busy(dev->dev); 1475 pm_request_autosuspend(dev->dev); 1476 } 1477 break; 1478 1479 case MEI_FOP_READ: 1480 list_add_tail(&cb->list, &cl->rd_completed); 1481 if (waitqueue_active(&cl->rx_wait)) 1482 wake_up_interruptible_all(&cl->rx_wait); 1483 else 1484 mei_cl_bus_rx_event(cl); 1485 break; 1486 1487 case MEI_FOP_CONNECT: 1488 case MEI_FOP_DISCONNECT: 1489 if (waitqueue_active(&cl->wait)) 1490 wake_up(&cl->wait); 1491 1492 break; 1493 default: 1494 BUG_ON(0); 1495 } 1496 } 1497 1498 1499 /** 1500 * mei_cl_all_disconnect - disconnect forcefully all connected clients 1501 * 1502 * @dev: mei device 1503 */ 1504 void mei_cl_all_disconnect(struct mei_device *dev) 1505 { 1506 struct mei_cl *cl; 1507 1508 list_for_each_entry(cl, &dev->file_list, link) 1509 mei_cl_set_disconnected(cl); 1510 } 1511 1512 1513 /** 1514 * mei_cl_all_wakeup - wake up all readers and writers they can be interrupted 1515 * 1516 * @dev: mei device 1517 */ 1518 void mei_cl_all_wakeup(struct mei_device *dev) 1519 { 1520 struct mei_cl *cl; 1521 1522 list_for_each_entry(cl, &dev->file_list, link) { 1523 if (waitqueue_active(&cl->rx_wait)) { 1524 cl_dbg(dev, cl, "Waking up reading client!\n"); 1525 wake_up_interruptible(&cl->rx_wait); 1526 } 1527 if (waitqueue_active(&cl->tx_wait)) { 1528 cl_dbg(dev, cl, "Waking up writing client!\n"); 1529 wake_up_interruptible(&cl->tx_wait); 1530 } 1531 } 1532 } 1533 1534 /** 1535 * mei_cl_all_write_clear - clear all pending writes 1536 * 1537 * @dev: mei device 1538 */ 1539 void mei_cl_all_write_clear(struct mei_device *dev) 1540 { 1541 mei_io_list_free(&dev->write_list, NULL); 1542 mei_io_list_free(&dev->write_waiting_list, NULL); 1543 } 1544 1545 1546