1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * This module provides an interface to trigger and test firmware loading. 4 * 5 * It is designed to be used for basic evaluation of the firmware loading 6 * subsystem (for example when validating firmware verification). It lacks 7 * any extra dependencies, and will not normally be loaded by the system 8 * unless explicitly requested by name. 9 */ 10 11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 12 13 #include <linux/init.h> 14 #include <linux/module.h> 15 #include <linux/printk.h> 16 #include <linux/completion.h> 17 #include <linux/firmware.h> 18 #include <linux/device.h> 19 #include <linux/fs.h> 20 #include <linux/miscdevice.h> 21 #include <linux/sizes.h> 22 #include <linux/slab.h> 23 #include <linux/uaccess.h> 24 #include <linux/delay.h> 25 #include <linux/kthread.h> 26 #include <linux/vmalloc.h> 27 #include <linux/efi_embedded_fw.h> 28 29 MODULE_IMPORT_NS(TEST_FIRMWARE); 30 31 #define TEST_FIRMWARE_NAME "test-firmware.bin" 32 #define TEST_FIRMWARE_NUM_REQS 4 33 #define TEST_FIRMWARE_BUF_SIZE SZ_1K 34 #define TEST_UPLOAD_MAX_SIZE SZ_2K 35 #define TEST_UPLOAD_BLK_SIZE 37 /* Avoid powers of two in testing */ 36 37 static DEFINE_MUTEX(test_fw_mutex); 38 static const struct firmware *test_firmware; 39 static LIST_HEAD(test_upload_list); 40 41 struct test_batched_req { 42 u8 idx; 43 int rc; 44 bool sent; 45 const struct firmware *fw; 46 const char *name; 47 struct completion completion; 48 struct task_struct *task; 49 struct device *dev; 50 }; 51 52 /** 53 * test_config - represents configuration for the test for different triggers 54 * 55 * @name: the name of the firmware file to look for 56 * @into_buf: when the into_buf is used if this is true 57 * request_firmware_into_buf() will be used instead. 58 * @buf_size: size of buf to allocate when into_buf is true 59 * @file_offset: file offset to request when calling request_firmware_into_buf 60 * @partial: partial read opt when calling request_firmware_into_buf 61 * @sync_direct: when the sync trigger is used if this is true 62 * request_firmware_direct() will be used instead. 63 * @send_uevent: whether or not to send a uevent for async requests 64 * @num_requests: number of requests to try per test case. This is trigger 65 * specific. 66 * @reqs: stores all requests information 67 * @read_fw_idx: index of thread from which we want to read firmware results 68 * from through the read_fw trigger. 69 * @upload_name: firmware name to be used with upload_read sysfs node 70 * @test_result: a test may use this to collect the result from the call 71 * of the request_firmware*() calls used in their tests. In order of 72 * priority we always keep first any setup error. If no setup errors were 73 * found then we move on to the first error encountered while running the 74 * API. Note that for async calls this typically will be a successful 75 * result (0) unless of course you've used bogus parameters, or the system 76 * is out of memory. In the async case the callback is expected to do a 77 * bit more homework to figure out what happened, unfortunately the only 78 * information passed today on error is the fact that no firmware was 79 * found so we can only assume -ENOENT on async calls if the firmware is 80 * NULL. 81 * 82 * Errors you can expect: 83 * 84 * API specific: 85 * 86 * 0: success for sync, for async it means request was sent 87 * -EINVAL: invalid parameters or request 88 * -ENOENT: files not found 89 * 90 * System environment: 91 * 92 * -ENOMEM: memory pressure on system 93 * -ENODEV: out of number of devices to test 94 * -EINVAL: an unexpected error has occurred 95 * @req_firmware: if @sync_direct is true this is set to 96 * request_firmware_direct(), otherwise request_firmware() 97 */ 98 struct test_config { 99 char *name; 100 bool into_buf; 101 size_t buf_size; 102 size_t file_offset; 103 bool partial; 104 bool sync_direct; 105 bool send_uevent; 106 u8 num_requests; 107 u8 read_fw_idx; 108 char *upload_name; 109 110 /* 111 * These below don't belong her but we'll move them once we create 112 * a struct fw_test_device and stuff the misc_dev under there later. 113 */ 114 struct test_batched_req *reqs; 115 int test_result; 116 int (*req_firmware)(const struct firmware **fw, const char *name, 117 struct device *device); 118 }; 119 120 struct upload_inject_err { 121 const char *prog; 122 enum fw_upload_err err_code; 123 }; 124 125 struct test_firmware_upload { 126 char *name; 127 struct list_head node; 128 char *buf; 129 size_t size; 130 bool cancel_request; 131 struct upload_inject_err inject; 132 struct fw_upload *fwl; 133 }; 134 135 static struct test_config *test_fw_config; 136 137 static struct test_firmware_upload *upload_lookup_name(const char *name) 138 { 139 struct test_firmware_upload *tst; 140 141 list_for_each_entry(tst, &test_upload_list, node) 142 if (strncmp(name, tst->name, strlen(tst->name)) == 0) 143 return tst; 144 145 return NULL; 146 } 147 148 static ssize_t test_fw_misc_read(struct file *f, char __user *buf, 149 size_t size, loff_t *offset) 150 { 151 ssize_t rc = 0; 152 153 mutex_lock(&test_fw_mutex); 154 if (test_firmware) 155 rc = simple_read_from_buffer(buf, size, offset, 156 test_firmware->data, 157 test_firmware->size); 158 mutex_unlock(&test_fw_mutex); 159 return rc; 160 } 161 162 static const struct file_operations test_fw_fops = { 163 .owner = THIS_MODULE, 164 .read = test_fw_misc_read, 165 }; 166 167 static void __test_release_all_firmware(void) 168 { 169 struct test_batched_req *req; 170 u8 i; 171 172 if (!test_fw_config->reqs) 173 return; 174 175 for (i = 0; i < test_fw_config->num_requests; i++) { 176 req = &test_fw_config->reqs[i]; 177 if (req->fw) 178 release_firmware(req->fw); 179 } 180 181 vfree(test_fw_config->reqs); 182 test_fw_config->reqs = NULL; 183 } 184 185 static void test_release_all_firmware(void) 186 { 187 mutex_lock(&test_fw_mutex); 188 __test_release_all_firmware(); 189 mutex_unlock(&test_fw_mutex); 190 } 191 192 193 static void __test_firmware_config_free(void) 194 { 195 __test_release_all_firmware(); 196 kfree_const(test_fw_config->name); 197 test_fw_config->name = NULL; 198 } 199 200 /* 201 * XXX: move to kstrncpy() once merged. 202 * 203 * Users should use kfree_const() when freeing these. 204 */ 205 static int __kstrncpy(char **dst, const char *name, size_t count, gfp_t gfp) 206 { 207 *dst = kstrndup(name, count, gfp); 208 if (!*dst) 209 return -ENOSPC; 210 return count; 211 } 212 213 static int __test_firmware_config_init(void) 214 { 215 int ret; 216 217 ret = __kstrncpy(&test_fw_config->name, TEST_FIRMWARE_NAME, 218 strlen(TEST_FIRMWARE_NAME), GFP_KERNEL); 219 if (ret < 0) 220 goto out; 221 222 test_fw_config->num_requests = TEST_FIRMWARE_NUM_REQS; 223 test_fw_config->send_uevent = true; 224 test_fw_config->into_buf = false; 225 test_fw_config->buf_size = TEST_FIRMWARE_BUF_SIZE; 226 test_fw_config->file_offset = 0; 227 test_fw_config->partial = false; 228 test_fw_config->sync_direct = false; 229 test_fw_config->req_firmware = request_firmware; 230 test_fw_config->test_result = 0; 231 test_fw_config->reqs = NULL; 232 test_fw_config->upload_name = NULL; 233 234 return 0; 235 236 out: 237 __test_firmware_config_free(); 238 return ret; 239 } 240 241 static ssize_t reset_store(struct device *dev, 242 struct device_attribute *attr, 243 const char *buf, size_t count) 244 { 245 int ret; 246 247 mutex_lock(&test_fw_mutex); 248 249 __test_firmware_config_free(); 250 251 ret = __test_firmware_config_init(); 252 if (ret < 0) { 253 ret = -ENOMEM; 254 pr_err("could not alloc settings for config trigger: %d\n", 255 ret); 256 goto out; 257 } 258 259 pr_info("reset\n"); 260 ret = count; 261 262 out: 263 mutex_unlock(&test_fw_mutex); 264 265 return ret; 266 } 267 static DEVICE_ATTR_WO(reset); 268 269 static ssize_t config_show(struct device *dev, 270 struct device_attribute *attr, 271 char *buf) 272 { 273 int len = 0; 274 275 mutex_lock(&test_fw_mutex); 276 277 len += scnprintf(buf, PAGE_SIZE - len, 278 "Custom trigger configuration for: %s\n", 279 dev_name(dev)); 280 281 if (test_fw_config->name) 282 len += scnprintf(buf + len, PAGE_SIZE - len, 283 "name:\t%s\n", 284 test_fw_config->name); 285 else 286 len += scnprintf(buf + len, PAGE_SIZE - len, 287 "name:\tEMPTY\n"); 288 289 len += scnprintf(buf + len, PAGE_SIZE - len, 290 "num_requests:\t%u\n", test_fw_config->num_requests); 291 292 len += scnprintf(buf + len, PAGE_SIZE - len, 293 "send_uevent:\t\t%s\n", 294 test_fw_config->send_uevent ? 295 "FW_ACTION_UEVENT" : 296 "FW_ACTION_NOUEVENT"); 297 len += scnprintf(buf + len, PAGE_SIZE - len, 298 "into_buf:\t\t%s\n", 299 test_fw_config->into_buf ? "true" : "false"); 300 len += scnprintf(buf + len, PAGE_SIZE - len, 301 "buf_size:\t%zu\n", test_fw_config->buf_size); 302 len += scnprintf(buf + len, PAGE_SIZE - len, 303 "file_offset:\t%zu\n", test_fw_config->file_offset); 304 len += scnprintf(buf + len, PAGE_SIZE - len, 305 "partial:\t\t%s\n", 306 test_fw_config->partial ? "true" : "false"); 307 len += scnprintf(buf + len, PAGE_SIZE - len, 308 "sync_direct:\t\t%s\n", 309 test_fw_config->sync_direct ? "true" : "false"); 310 len += scnprintf(buf + len, PAGE_SIZE - len, 311 "read_fw_idx:\t%u\n", test_fw_config->read_fw_idx); 312 if (test_fw_config->upload_name) 313 len += scnprintf(buf + len, PAGE_SIZE - len, 314 "upload_name:\t%s\n", 315 test_fw_config->upload_name); 316 else 317 len += scnprintf(buf + len, PAGE_SIZE - len, 318 "upload_name:\tEMPTY\n"); 319 320 mutex_unlock(&test_fw_mutex); 321 322 return len; 323 } 324 static DEVICE_ATTR_RO(config); 325 326 static ssize_t config_name_store(struct device *dev, 327 struct device_attribute *attr, 328 const char *buf, size_t count) 329 { 330 int ret; 331 332 mutex_lock(&test_fw_mutex); 333 kfree_const(test_fw_config->name); 334 ret = __kstrncpy(&test_fw_config->name, buf, count, GFP_KERNEL); 335 mutex_unlock(&test_fw_mutex); 336 337 return ret; 338 } 339 340 /* 341 * As per sysfs_kf_seq_show() the buf is max PAGE_SIZE. 342 */ 343 static ssize_t config_test_show_str(char *dst, 344 char *src) 345 { 346 int len; 347 348 mutex_lock(&test_fw_mutex); 349 len = snprintf(dst, PAGE_SIZE, "%s\n", src); 350 mutex_unlock(&test_fw_mutex); 351 352 return len; 353 } 354 355 static int test_dev_config_update_bool(const char *buf, size_t size, 356 bool *cfg) 357 { 358 int ret; 359 360 mutex_lock(&test_fw_mutex); 361 if (strtobool(buf, cfg) < 0) 362 ret = -EINVAL; 363 else 364 ret = size; 365 mutex_unlock(&test_fw_mutex); 366 367 return ret; 368 } 369 370 static ssize_t test_dev_config_show_bool(char *buf, bool val) 371 { 372 return snprintf(buf, PAGE_SIZE, "%d\n", val); 373 } 374 375 static int test_dev_config_update_size_t(const char *buf, 376 size_t size, 377 size_t *cfg) 378 { 379 int ret; 380 long new; 381 382 ret = kstrtol(buf, 10, &new); 383 if (ret) 384 return ret; 385 386 mutex_lock(&test_fw_mutex); 387 *(size_t *)cfg = new; 388 mutex_unlock(&test_fw_mutex); 389 390 /* Always return full write size even if we didn't consume all */ 391 return size; 392 } 393 394 static ssize_t test_dev_config_show_size_t(char *buf, size_t val) 395 { 396 return snprintf(buf, PAGE_SIZE, "%zu\n", val); 397 } 398 399 static ssize_t test_dev_config_show_int(char *buf, int val) 400 { 401 return snprintf(buf, PAGE_SIZE, "%d\n", val); 402 } 403 404 static int test_dev_config_update_u8(const char *buf, size_t size, u8 *cfg) 405 { 406 u8 val; 407 int ret; 408 409 ret = kstrtou8(buf, 10, &val); 410 if (ret) 411 return ret; 412 413 mutex_lock(&test_fw_mutex); 414 *(u8 *)cfg = val; 415 mutex_unlock(&test_fw_mutex); 416 417 /* Always return full write size even if we didn't consume all */ 418 return size; 419 } 420 421 static ssize_t test_dev_config_show_u8(char *buf, u8 val) 422 { 423 return snprintf(buf, PAGE_SIZE, "%u\n", val); 424 } 425 426 static ssize_t config_name_show(struct device *dev, 427 struct device_attribute *attr, 428 char *buf) 429 { 430 return config_test_show_str(buf, test_fw_config->name); 431 } 432 static DEVICE_ATTR_RW(config_name); 433 434 static ssize_t config_upload_name_store(struct device *dev, 435 struct device_attribute *attr, 436 const char *buf, size_t count) 437 { 438 struct test_firmware_upload *tst; 439 int ret = count; 440 441 mutex_lock(&test_fw_mutex); 442 tst = upload_lookup_name(buf); 443 if (tst) 444 test_fw_config->upload_name = tst->name; 445 else 446 ret = -EINVAL; 447 mutex_unlock(&test_fw_mutex); 448 449 return ret; 450 } 451 452 static ssize_t config_upload_name_show(struct device *dev, 453 struct device_attribute *attr, 454 char *buf) 455 { 456 return config_test_show_str(buf, test_fw_config->upload_name); 457 } 458 static DEVICE_ATTR_RW(config_upload_name); 459 460 static ssize_t config_num_requests_store(struct device *dev, 461 struct device_attribute *attr, 462 const char *buf, size_t count) 463 { 464 int rc; 465 466 mutex_lock(&test_fw_mutex); 467 if (test_fw_config->reqs) { 468 pr_err("Must call release_all_firmware prior to changing config\n"); 469 rc = -EINVAL; 470 mutex_unlock(&test_fw_mutex); 471 goto out; 472 } 473 mutex_unlock(&test_fw_mutex); 474 475 rc = test_dev_config_update_u8(buf, count, 476 &test_fw_config->num_requests); 477 478 out: 479 return rc; 480 } 481 482 static ssize_t config_num_requests_show(struct device *dev, 483 struct device_attribute *attr, 484 char *buf) 485 { 486 return test_dev_config_show_u8(buf, test_fw_config->num_requests); 487 } 488 static DEVICE_ATTR_RW(config_num_requests); 489 490 static ssize_t config_into_buf_store(struct device *dev, 491 struct device_attribute *attr, 492 const char *buf, size_t count) 493 { 494 return test_dev_config_update_bool(buf, 495 count, 496 &test_fw_config->into_buf); 497 } 498 499 static ssize_t config_into_buf_show(struct device *dev, 500 struct device_attribute *attr, 501 char *buf) 502 { 503 return test_dev_config_show_bool(buf, test_fw_config->into_buf); 504 } 505 static DEVICE_ATTR_RW(config_into_buf); 506 507 static ssize_t config_buf_size_store(struct device *dev, 508 struct device_attribute *attr, 509 const char *buf, size_t count) 510 { 511 int rc; 512 513 mutex_lock(&test_fw_mutex); 514 if (test_fw_config->reqs) { 515 pr_err("Must call release_all_firmware prior to changing config\n"); 516 rc = -EINVAL; 517 mutex_unlock(&test_fw_mutex); 518 goto out; 519 } 520 mutex_unlock(&test_fw_mutex); 521 522 rc = test_dev_config_update_size_t(buf, count, 523 &test_fw_config->buf_size); 524 525 out: 526 return rc; 527 } 528 529 static ssize_t config_buf_size_show(struct device *dev, 530 struct device_attribute *attr, 531 char *buf) 532 { 533 return test_dev_config_show_size_t(buf, test_fw_config->buf_size); 534 } 535 static DEVICE_ATTR_RW(config_buf_size); 536 537 static ssize_t config_file_offset_store(struct device *dev, 538 struct device_attribute *attr, 539 const char *buf, size_t count) 540 { 541 int rc; 542 543 mutex_lock(&test_fw_mutex); 544 if (test_fw_config->reqs) { 545 pr_err("Must call release_all_firmware prior to changing config\n"); 546 rc = -EINVAL; 547 mutex_unlock(&test_fw_mutex); 548 goto out; 549 } 550 mutex_unlock(&test_fw_mutex); 551 552 rc = test_dev_config_update_size_t(buf, count, 553 &test_fw_config->file_offset); 554 555 out: 556 return rc; 557 } 558 559 static ssize_t config_file_offset_show(struct device *dev, 560 struct device_attribute *attr, 561 char *buf) 562 { 563 return test_dev_config_show_size_t(buf, test_fw_config->file_offset); 564 } 565 static DEVICE_ATTR_RW(config_file_offset); 566 567 static ssize_t config_partial_store(struct device *dev, 568 struct device_attribute *attr, 569 const char *buf, size_t count) 570 { 571 return test_dev_config_update_bool(buf, 572 count, 573 &test_fw_config->partial); 574 } 575 576 static ssize_t config_partial_show(struct device *dev, 577 struct device_attribute *attr, 578 char *buf) 579 { 580 return test_dev_config_show_bool(buf, test_fw_config->partial); 581 } 582 static DEVICE_ATTR_RW(config_partial); 583 584 static ssize_t config_sync_direct_store(struct device *dev, 585 struct device_attribute *attr, 586 const char *buf, size_t count) 587 { 588 int rc = test_dev_config_update_bool(buf, count, 589 &test_fw_config->sync_direct); 590 591 if (rc == count) 592 test_fw_config->req_firmware = test_fw_config->sync_direct ? 593 request_firmware_direct : 594 request_firmware; 595 return rc; 596 } 597 598 static ssize_t config_sync_direct_show(struct device *dev, 599 struct device_attribute *attr, 600 char *buf) 601 { 602 return test_dev_config_show_bool(buf, test_fw_config->sync_direct); 603 } 604 static DEVICE_ATTR_RW(config_sync_direct); 605 606 static ssize_t config_send_uevent_store(struct device *dev, 607 struct device_attribute *attr, 608 const char *buf, size_t count) 609 { 610 return test_dev_config_update_bool(buf, count, 611 &test_fw_config->send_uevent); 612 } 613 614 static ssize_t config_send_uevent_show(struct device *dev, 615 struct device_attribute *attr, 616 char *buf) 617 { 618 return test_dev_config_show_bool(buf, test_fw_config->send_uevent); 619 } 620 static DEVICE_ATTR_RW(config_send_uevent); 621 622 static ssize_t config_read_fw_idx_store(struct device *dev, 623 struct device_attribute *attr, 624 const char *buf, size_t count) 625 { 626 return test_dev_config_update_u8(buf, count, 627 &test_fw_config->read_fw_idx); 628 } 629 630 static ssize_t config_read_fw_idx_show(struct device *dev, 631 struct device_attribute *attr, 632 char *buf) 633 { 634 return test_dev_config_show_u8(buf, test_fw_config->read_fw_idx); 635 } 636 static DEVICE_ATTR_RW(config_read_fw_idx); 637 638 639 static ssize_t trigger_request_store(struct device *dev, 640 struct device_attribute *attr, 641 const char *buf, size_t count) 642 { 643 int rc; 644 char *name; 645 646 name = kstrndup(buf, count, GFP_KERNEL); 647 if (!name) 648 return -ENOSPC; 649 650 pr_info("loading '%s'\n", name); 651 652 mutex_lock(&test_fw_mutex); 653 release_firmware(test_firmware); 654 test_firmware = NULL; 655 rc = request_firmware(&test_firmware, name, dev); 656 if (rc) { 657 pr_info("load of '%s' failed: %d\n", name, rc); 658 goto out; 659 } 660 pr_info("loaded: %zu\n", test_firmware->size); 661 rc = count; 662 663 out: 664 mutex_unlock(&test_fw_mutex); 665 666 kfree(name); 667 668 return rc; 669 } 670 static DEVICE_ATTR_WO(trigger_request); 671 672 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE 673 extern struct list_head efi_embedded_fw_list; 674 extern bool efi_embedded_fw_checked; 675 676 static ssize_t trigger_request_platform_store(struct device *dev, 677 struct device_attribute *attr, 678 const char *buf, size_t count) 679 { 680 static const u8 test_data[] = { 681 0x55, 0xaa, 0x55, 0xaa, 0x01, 0x02, 0x03, 0x04, 682 0x55, 0xaa, 0x55, 0xaa, 0x05, 0x06, 0x07, 0x08, 683 0x55, 0xaa, 0x55, 0xaa, 0x10, 0x20, 0x30, 0x40, 684 0x55, 0xaa, 0x55, 0xaa, 0x50, 0x60, 0x70, 0x80 685 }; 686 struct efi_embedded_fw efi_embedded_fw; 687 const struct firmware *firmware = NULL; 688 bool saved_efi_embedded_fw_checked; 689 char *name; 690 int rc; 691 692 name = kstrndup(buf, count, GFP_KERNEL); 693 if (!name) 694 return -ENOSPC; 695 696 pr_info("inserting test platform fw '%s'\n", name); 697 efi_embedded_fw.name = name; 698 efi_embedded_fw.data = (void *)test_data; 699 efi_embedded_fw.length = sizeof(test_data); 700 list_add(&efi_embedded_fw.list, &efi_embedded_fw_list); 701 saved_efi_embedded_fw_checked = efi_embedded_fw_checked; 702 efi_embedded_fw_checked = true; 703 704 pr_info("loading '%s'\n", name); 705 rc = firmware_request_platform(&firmware, name, dev); 706 if (rc) { 707 pr_info("load of '%s' failed: %d\n", name, rc); 708 goto out; 709 } 710 if (firmware->size != sizeof(test_data) || 711 memcmp(firmware->data, test_data, sizeof(test_data)) != 0) { 712 pr_info("firmware contents mismatch for '%s'\n", name); 713 rc = -EINVAL; 714 goto out; 715 } 716 pr_info("loaded: %zu\n", firmware->size); 717 rc = count; 718 719 out: 720 efi_embedded_fw_checked = saved_efi_embedded_fw_checked; 721 release_firmware(firmware); 722 list_del(&efi_embedded_fw.list); 723 kfree(name); 724 725 return rc; 726 } 727 static DEVICE_ATTR_WO(trigger_request_platform); 728 #endif 729 730 static DECLARE_COMPLETION(async_fw_done); 731 732 static void trigger_async_request_cb(const struct firmware *fw, void *context) 733 { 734 test_firmware = fw; 735 complete(&async_fw_done); 736 } 737 738 static ssize_t trigger_async_request_store(struct device *dev, 739 struct device_attribute *attr, 740 const char *buf, size_t count) 741 { 742 int rc; 743 char *name; 744 745 name = kstrndup(buf, count, GFP_KERNEL); 746 if (!name) 747 return -ENOSPC; 748 749 pr_info("loading '%s'\n", name); 750 751 mutex_lock(&test_fw_mutex); 752 release_firmware(test_firmware); 753 test_firmware = NULL; 754 rc = request_firmware_nowait(THIS_MODULE, 1, name, dev, GFP_KERNEL, 755 NULL, trigger_async_request_cb); 756 if (rc) { 757 pr_info("async load of '%s' failed: %d\n", name, rc); 758 kfree(name); 759 goto out; 760 } 761 /* Free 'name' ASAP, to test for race conditions */ 762 kfree(name); 763 764 wait_for_completion(&async_fw_done); 765 766 if (test_firmware) { 767 pr_info("loaded: %zu\n", test_firmware->size); 768 rc = count; 769 } else { 770 pr_err("failed to async load firmware\n"); 771 rc = -ENOMEM; 772 } 773 774 out: 775 mutex_unlock(&test_fw_mutex); 776 777 return rc; 778 } 779 static DEVICE_ATTR_WO(trigger_async_request); 780 781 static ssize_t trigger_custom_fallback_store(struct device *dev, 782 struct device_attribute *attr, 783 const char *buf, size_t count) 784 { 785 int rc; 786 char *name; 787 788 name = kstrndup(buf, count, GFP_KERNEL); 789 if (!name) 790 return -ENOSPC; 791 792 pr_info("loading '%s' using custom fallback mechanism\n", name); 793 794 mutex_lock(&test_fw_mutex); 795 release_firmware(test_firmware); 796 test_firmware = NULL; 797 rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, name, 798 dev, GFP_KERNEL, NULL, 799 trigger_async_request_cb); 800 if (rc) { 801 pr_info("async load of '%s' failed: %d\n", name, rc); 802 kfree(name); 803 goto out; 804 } 805 /* Free 'name' ASAP, to test for race conditions */ 806 kfree(name); 807 808 wait_for_completion(&async_fw_done); 809 810 if (test_firmware) { 811 pr_info("loaded: %zu\n", test_firmware->size); 812 rc = count; 813 } else { 814 pr_err("failed to async load firmware\n"); 815 rc = -ENODEV; 816 } 817 818 out: 819 mutex_unlock(&test_fw_mutex); 820 821 return rc; 822 } 823 static DEVICE_ATTR_WO(trigger_custom_fallback); 824 825 static int test_fw_run_batch_request(void *data) 826 { 827 struct test_batched_req *req = data; 828 829 if (!req) { 830 test_fw_config->test_result = -EINVAL; 831 return -EINVAL; 832 } 833 834 if (test_fw_config->into_buf) { 835 void *test_buf; 836 837 test_buf = kzalloc(TEST_FIRMWARE_BUF_SIZE, GFP_KERNEL); 838 if (!test_buf) 839 return -ENOSPC; 840 841 if (test_fw_config->partial) 842 req->rc = request_partial_firmware_into_buf 843 (&req->fw, 844 req->name, 845 req->dev, 846 test_buf, 847 test_fw_config->buf_size, 848 test_fw_config->file_offset); 849 else 850 req->rc = request_firmware_into_buf 851 (&req->fw, 852 req->name, 853 req->dev, 854 test_buf, 855 test_fw_config->buf_size); 856 if (!req->fw) 857 kfree(test_buf); 858 } else { 859 req->rc = test_fw_config->req_firmware(&req->fw, 860 req->name, 861 req->dev); 862 } 863 864 if (req->rc) { 865 pr_info("#%u: batched sync load failed: %d\n", 866 req->idx, req->rc); 867 if (!test_fw_config->test_result) 868 test_fw_config->test_result = req->rc; 869 } else if (req->fw) { 870 req->sent = true; 871 pr_info("#%u: batched sync loaded %zu\n", 872 req->idx, req->fw->size); 873 } 874 complete(&req->completion); 875 876 req->task = NULL; 877 878 return 0; 879 } 880 881 /* 882 * We use a kthread as otherwise the kernel serializes all our sync requests 883 * and we would not be able to mimic batched requests on a sync call. Batched 884 * requests on a sync call can for instance happen on a device driver when 885 * multiple cards are used and firmware loading happens outside of probe. 886 */ 887 static ssize_t trigger_batched_requests_store(struct device *dev, 888 struct device_attribute *attr, 889 const char *buf, size_t count) 890 { 891 struct test_batched_req *req; 892 int rc; 893 u8 i; 894 895 mutex_lock(&test_fw_mutex); 896 897 test_fw_config->reqs = 898 vzalloc(array3_size(sizeof(struct test_batched_req), 899 test_fw_config->num_requests, 2)); 900 if (!test_fw_config->reqs) { 901 rc = -ENOMEM; 902 goto out_unlock; 903 } 904 905 pr_info("batched sync firmware loading '%s' %u times\n", 906 test_fw_config->name, test_fw_config->num_requests); 907 908 for (i = 0; i < test_fw_config->num_requests; i++) { 909 req = &test_fw_config->reqs[i]; 910 req->fw = NULL; 911 req->idx = i; 912 req->name = test_fw_config->name; 913 req->dev = dev; 914 init_completion(&req->completion); 915 req->task = kthread_run(test_fw_run_batch_request, req, 916 "%s-%u", KBUILD_MODNAME, req->idx); 917 if (!req->task || IS_ERR(req->task)) { 918 pr_err("Setting up thread %u failed\n", req->idx); 919 req->task = NULL; 920 rc = -ENOMEM; 921 goto out_bail; 922 } 923 } 924 925 rc = count; 926 927 /* 928 * We require an explicit release to enable more time and delay of 929 * calling release_firmware() to improve our chances of forcing a 930 * batched request. If we instead called release_firmware() right away 931 * then we might miss on an opportunity of having a successful firmware 932 * request pass on the opportunity to be come a batched request. 933 */ 934 935 out_bail: 936 for (i = 0; i < test_fw_config->num_requests; i++) { 937 req = &test_fw_config->reqs[i]; 938 if (req->task || req->sent) 939 wait_for_completion(&req->completion); 940 } 941 942 /* Override any worker error if we had a general setup error */ 943 if (rc < 0) 944 test_fw_config->test_result = rc; 945 946 out_unlock: 947 mutex_unlock(&test_fw_mutex); 948 949 return rc; 950 } 951 static DEVICE_ATTR_WO(trigger_batched_requests); 952 953 /* 954 * We wait for each callback to return with the lock held, no need to lock here 955 */ 956 static void trigger_batched_cb(const struct firmware *fw, void *context) 957 { 958 struct test_batched_req *req = context; 959 960 if (!req) { 961 test_fw_config->test_result = -EINVAL; 962 return; 963 } 964 965 /* forces *some* batched requests to queue up */ 966 if (!req->idx) 967 ssleep(2); 968 969 req->fw = fw; 970 971 /* 972 * Unfortunately the firmware API gives us nothing other than a null FW 973 * if the firmware was not found on async requests. Best we can do is 974 * just assume -ENOENT. A better API would pass the actual return 975 * value to the callback. 976 */ 977 if (!fw && !test_fw_config->test_result) 978 test_fw_config->test_result = -ENOENT; 979 980 complete(&req->completion); 981 } 982 983 static 984 ssize_t trigger_batched_requests_async_store(struct device *dev, 985 struct device_attribute *attr, 986 const char *buf, size_t count) 987 { 988 struct test_batched_req *req; 989 bool send_uevent; 990 int rc; 991 u8 i; 992 993 mutex_lock(&test_fw_mutex); 994 995 test_fw_config->reqs = 996 vzalloc(array3_size(sizeof(struct test_batched_req), 997 test_fw_config->num_requests, 2)); 998 if (!test_fw_config->reqs) { 999 rc = -ENOMEM; 1000 goto out; 1001 } 1002 1003 pr_info("batched loading '%s' custom fallback mechanism %u times\n", 1004 test_fw_config->name, test_fw_config->num_requests); 1005 1006 send_uevent = test_fw_config->send_uevent ? FW_ACTION_UEVENT : 1007 FW_ACTION_NOUEVENT; 1008 1009 for (i = 0; i < test_fw_config->num_requests; i++) { 1010 req = &test_fw_config->reqs[i]; 1011 req->name = test_fw_config->name; 1012 req->fw = NULL; 1013 req->idx = i; 1014 init_completion(&req->completion); 1015 rc = request_firmware_nowait(THIS_MODULE, send_uevent, 1016 req->name, 1017 dev, GFP_KERNEL, req, 1018 trigger_batched_cb); 1019 if (rc) { 1020 pr_info("#%u: batched async load failed setup: %d\n", 1021 i, rc); 1022 req->rc = rc; 1023 goto out_bail; 1024 } else 1025 req->sent = true; 1026 } 1027 1028 rc = count; 1029 1030 out_bail: 1031 1032 /* 1033 * We require an explicit release to enable more time and delay of 1034 * calling release_firmware() to improve our chances of forcing a 1035 * batched request. If we instead called release_firmware() right away 1036 * then we might miss on an opportunity of having a successful firmware 1037 * request pass on the opportunity to be come a batched request. 1038 */ 1039 1040 for (i = 0; i < test_fw_config->num_requests; i++) { 1041 req = &test_fw_config->reqs[i]; 1042 if (req->sent) 1043 wait_for_completion(&req->completion); 1044 } 1045 1046 /* Override any worker error if we had a general setup error */ 1047 if (rc < 0) 1048 test_fw_config->test_result = rc; 1049 1050 out: 1051 mutex_unlock(&test_fw_mutex); 1052 1053 return rc; 1054 } 1055 static DEVICE_ATTR_WO(trigger_batched_requests_async); 1056 1057 static void upload_release(struct test_firmware_upload *tst) 1058 { 1059 firmware_upload_unregister(tst->fwl); 1060 kfree(tst->buf); 1061 kfree(tst->name); 1062 kfree(tst); 1063 } 1064 1065 static void upload_release_all(void) 1066 { 1067 struct test_firmware_upload *tst, *tmp; 1068 1069 list_for_each_entry_safe(tst, tmp, &test_upload_list, node) { 1070 list_del(&tst->node); 1071 upload_release(tst); 1072 } 1073 test_fw_config->upload_name = NULL; 1074 } 1075 1076 /* 1077 * This table is replicated from .../firmware_loader/sysfs_upload.c 1078 * and needs to be kept in sync. 1079 */ 1080 static const char * const fw_upload_err_str[] = { 1081 [FW_UPLOAD_ERR_NONE] = "none", 1082 [FW_UPLOAD_ERR_HW_ERROR] = "hw-error", 1083 [FW_UPLOAD_ERR_TIMEOUT] = "timeout", 1084 [FW_UPLOAD_ERR_CANCELED] = "user-abort", 1085 [FW_UPLOAD_ERR_BUSY] = "device-busy", 1086 [FW_UPLOAD_ERR_INVALID_SIZE] = "invalid-file-size", 1087 [FW_UPLOAD_ERR_RW_ERROR] = "read-write-error", 1088 [FW_UPLOAD_ERR_WEAROUT] = "flash-wearout", 1089 }; 1090 1091 static void upload_err_inject_error(struct test_firmware_upload *tst, 1092 const u8 *p, const char *prog) 1093 { 1094 enum fw_upload_err err; 1095 1096 for (err = FW_UPLOAD_ERR_NONE + 1; err < FW_UPLOAD_ERR_MAX; err++) { 1097 if (strncmp(p, fw_upload_err_str[err], 1098 strlen(fw_upload_err_str[err])) == 0) { 1099 tst->inject.prog = prog; 1100 tst->inject.err_code = err; 1101 return; 1102 } 1103 } 1104 } 1105 1106 static void upload_err_inject_prog(struct test_firmware_upload *tst, 1107 const u8 *p) 1108 { 1109 static const char * const progs[] = { 1110 "preparing:", "transferring:", "programming:" 1111 }; 1112 int i; 1113 1114 for (i = 0; i < ARRAY_SIZE(progs); i++) { 1115 if (strncmp(p, progs[i], strlen(progs[i])) == 0) { 1116 upload_err_inject_error(tst, p + strlen(progs[i]), 1117 progs[i]); 1118 return; 1119 } 1120 } 1121 } 1122 1123 #define FIVE_MINUTES_MS (5 * 60 * 1000) 1124 static enum fw_upload_err 1125 fw_upload_wait_on_cancel(struct test_firmware_upload *tst) 1126 { 1127 int ms_delay; 1128 1129 for (ms_delay = 0; ms_delay < FIVE_MINUTES_MS; ms_delay += 100) { 1130 msleep(100); 1131 if (tst->cancel_request) 1132 return FW_UPLOAD_ERR_CANCELED; 1133 } 1134 return FW_UPLOAD_ERR_NONE; 1135 } 1136 1137 static enum fw_upload_err test_fw_upload_prepare(struct fw_upload *fwl, 1138 const u8 *data, u32 size) 1139 { 1140 struct test_firmware_upload *tst = fwl->dd_handle; 1141 enum fw_upload_err ret = FW_UPLOAD_ERR_NONE; 1142 const char *progress = "preparing:"; 1143 1144 tst->cancel_request = false; 1145 1146 if (!size || size > TEST_UPLOAD_MAX_SIZE) { 1147 ret = FW_UPLOAD_ERR_INVALID_SIZE; 1148 goto err_out; 1149 } 1150 1151 if (strncmp(data, "inject:", strlen("inject:")) == 0) 1152 upload_err_inject_prog(tst, data + strlen("inject:")); 1153 1154 memset(tst->buf, 0, TEST_UPLOAD_MAX_SIZE); 1155 tst->size = size; 1156 1157 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE || 1158 strncmp(tst->inject.prog, progress, strlen(progress)) != 0) 1159 return FW_UPLOAD_ERR_NONE; 1160 1161 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED) 1162 ret = fw_upload_wait_on_cancel(tst); 1163 else 1164 ret = tst->inject.err_code; 1165 1166 err_out: 1167 /* 1168 * The cleanup op only executes if the prepare op succeeds. 1169 * If the prepare op fails, it must do it's own clean-up. 1170 */ 1171 tst->inject.err_code = FW_UPLOAD_ERR_NONE; 1172 tst->inject.prog = NULL; 1173 1174 return ret; 1175 } 1176 1177 static enum fw_upload_err test_fw_upload_write(struct fw_upload *fwl, 1178 const u8 *data, u32 offset, 1179 u32 size, u32 *written) 1180 { 1181 struct test_firmware_upload *tst = fwl->dd_handle; 1182 const char *progress = "transferring:"; 1183 u32 blk_size; 1184 1185 if (tst->cancel_request) 1186 return FW_UPLOAD_ERR_CANCELED; 1187 1188 blk_size = min_t(u32, TEST_UPLOAD_BLK_SIZE, size); 1189 memcpy(tst->buf + offset, data + offset, blk_size); 1190 1191 *written = blk_size; 1192 1193 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE || 1194 strncmp(tst->inject.prog, progress, strlen(progress)) != 0) 1195 return FW_UPLOAD_ERR_NONE; 1196 1197 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED) 1198 return fw_upload_wait_on_cancel(tst); 1199 1200 return tst->inject.err_code; 1201 } 1202 1203 static enum fw_upload_err test_fw_upload_complete(struct fw_upload *fwl) 1204 { 1205 struct test_firmware_upload *tst = fwl->dd_handle; 1206 const char *progress = "programming:"; 1207 1208 if (tst->cancel_request) 1209 return FW_UPLOAD_ERR_CANCELED; 1210 1211 if (tst->inject.err_code == FW_UPLOAD_ERR_NONE || 1212 strncmp(tst->inject.prog, progress, strlen(progress)) != 0) 1213 return FW_UPLOAD_ERR_NONE; 1214 1215 if (tst->inject.err_code == FW_UPLOAD_ERR_CANCELED) 1216 return fw_upload_wait_on_cancel(tst); 1217 1218 return tst->inject.err_code; 1219 } 1220 1221 static void test_fw_upload_cancel(struct fw_upload *fwl) 1222 { 1223 struct test_firmware_upload *tst = fwl->dd_handle; 1224 1225 tst->cancel_request = true; 1226 } 1227 1228 static void test_fw_cleanup(struct fw_upload *fwl) 1229 { 1230 struct test_firmware_upload *tst = fwl->dd_handle; 1231 1232 tst->inject.err_code = FW_UPLOAD_ERR_NONE; 1233 tst->inject.prog = NULL; 1234 } 1235 1236 static const struct fw_upload_ops upload_test_ops = { 1237 .prepare = test_fw_upload_prepare, 1238 .write = test_fw_upload_write, 1239 .poll_complete = test_fw_upload_complete, 1240 .cancel = test_fw_upload_cancel, 1241 .cleanup = test_fw_cleanup 1242 }; 1243 1244 static ssize_t upload_register_store(struct device *dev, 1245 struct device_attribute *attr, 1246 const char *buf, size_t count) 1247 { 1248 struct test_firmware_upload *tst; 1249 struct fw_upload *fwl; 1250 char *name; 1251 int ret; 1252 1253 name = kstrndup(buf, count, GFP_KERNEL); 1254 if (!name) 1255 return -ENOMEM; 1256 1257 mutex_lock(&test_fw_mutex); 1258 tst = upload_lookup_name(name); 1259 if (tst) { 1260 ret = -EEXIST; 1261 goto free_name; 1262 } 1263 1264 tst = kzalloc(sizeof(*tst), GFP_KERNEL); 1265 if (!tst) { 1266 ret = -ENOMEM; 1267 goto free_name; 1268 } 1269 1270 tst->name = name; 1271 tst->buf = kzalloc(TEST_UPLOAD_MAX_SIZE, GFP_KERNEL); 1272 if (!tst->buf) { 1273 ret = -ENOMEM; 1274 goto free_tst; 1275 } 1276 1277 fwl = firmware_upload_register(THIS_MODULE, dev, tst->name, 1278 &upload_test_ops, tst); 1279 if (IS_ERR(fwl)) { 1280 ret = PTR_ERR(fwl); 1281 goto free_buf; 1282 } 1283 1284 tst->fwl = fwl; 1285 list_add_tail(&tst->node, &test_upload_list); 1286 mutex_unlock(&test_fw_mutex); 1287 return count; 1288 1289 free_buf: 1290 kfree(tst->buf); 1291 1292 free_tst: 1293 kfree(tst); 1294 1295 free_name: 1296 mutex_unlock(&test_fw_mutex); 1297 kfree(name); 1298 1299 return ret; 1300 } 1301 static DEVICE_ATTR_WO(upload_register); 1302 1303 static ssize_t upload_unregister_store(struct device *dev, 1304 struct device_attribute *attr, 1305 const char *buf, size_t count) 1306 { 1307 struct test_firmware_upload *tst; 1308 int ret = count; 1309 1310 mutex_lock(&test_fw_mutex); 1311 tst = upload_lookup_name(buf); 1312 if (!tst) { 1313 ret = -EINVAL; 1314 goto out; 1315 } 1316 1317 if (test_fw_config->upload_name == tst->name) 1318 test_fw_config->upload_name = NULL; 1319 1320 list_del(&tst->node); 1321 upload_release(tst); 1322 1323 out: 1324 mutex_unlock(&test_fw_mutex); 1325 return ret; 1326 } 1327 static DEVICE_ATTR_WO(upload_unregister); 1328 1329 static ssize_t test_result_show(struct device *dev, 1330 struct device_attribute *attr, 1331 char *buf) 1332 { 1333 return test_dev_config_show_int(buf, test_fw_config->test_result); 1334 } 1335 static DEVICE_ATTR_RO(test_result); 1336 1337 static ssize_t release_all_firmware_store(struct device *dev, 1338 struct device_attribute *attr, 1339 const char *buf, size_t count) 1340 { 1341 test_release_all_firmware(); 1342 return count; 1343 } 1344 static DEVICE_ATTR_WO(release_all_firmware); 1345 1346 static ssize_t read_firmware_show(struct device *dev, 1347 struct device_attribute *attr, 1348 char *buf) 1349 { 1350 struct test_batched_req *req; 1351 u8 idx; 1352 ssize_t rc = 0; 1353 1354 mutex_lock(&test_fw_mutex); 1355 1356 idx = test_fw_config->read_fw_idx; 1357 if (idx >= test_fw_config->num_requests) { 1358 rc = -ERANGE; 1359 goto out; 1360 } 1361 1362 if (!test_fw_config->reqs) { 1363 rc = -EINVAL; 1364 goto out; 1365 } 1366 1367 req = &test_fw_config->reqs[idx]; 1368 if (!req->fw) { 1369 pr_err("#%u: failed to async load firmware\n", idx); 1370 rc = -ENOENT; 1371 goto out; 1372 } 1373 1374 pr_info("#%u: loaded %zu\n", idx, req->fw->size); 1375 1376 if (req->fw->size > PAGE_SIZE) { 1377 pr_err("Testing interface must use PAGE_SIZE firmware for now\n"); 1378 rc = -EINVAL; 1379 goto out; 1380 } 1381 memcpy(buf, req->fw->data, req->fw->size); 1382 1383 rc = req->fw->size; 1384 out: 1385 mutex_unlock(&test_fw_mutex); 1386 1387 return rc; 1388 } 1389 static DEVICE_ATTR_RO(read_firmware); 1390 1391 static ssize_t upload_read_show(struct device *dev, 1392 struct device_attribute *attr, 1393 char *buf) 1394 { 1395 struct test_firmware_upload *tst = NULL; 1396 struct test_firmware_upload *tst_iter; 1397 int ret = -EINVAL; 1398 1399 if (!test_fw_config->upload_name) { 1400 pr_err("Set config_upload_name before using upload_read\n"); 1401 return -EINVAL; 1402 } 1403 1404 mutex_lock(&test_fw_mutex); 1405 list_for_each_entry(tst_iter, &test_upload_list, node) 1406 if (tst_iter->name == test_fw_config->upload_name) { 1407 tst = tst_iter; 1408 break; 1409 } 1410 1411 if (!tst) { 1412 pr_err("Firmware name not found: %s\n", 1413 test_fw_config->upload_name); 1414 goto out; 1415 } 1416 1417 if (tst->size > PAGE_SIZE) { 1418 pr_err("Testing interface must use PAGE_SIZE firmware for now\n"); 1419 goto out; 1420 } 1421 1422 memcpy(buf, tst->buf, tst->size); 1423 ret = tst->size; 1424 out: 1425 mutex_unlock(&test_fw_mutex); 1426 return ret; 1427 } 1428 static DEVICE_ATTR_RO(upload_read); 1429 1430 #define TEST_FW_DEV_ATTR(name) &dev_attr_##name.attr 1431 1432 static struct attribute *test_dev_attrs[] = { 1433 TEST_FW_DEV_ATTR(reset), 1434 1435 TEST_FW_DEV_ATTR(config), 1436 TEST_FW_DEV_ATTR(config_name), 1437 TEST_FW_DEV_ATTR(config_num_requests), 1438 TEST_FW_DEV_ATTR(config_into_buf), 1439 TEST_FW_DEV_ATTR(config_buf_size), 1440 TEST_FW_DEV_ATTR(config_file_offset), 1441 TEST_FW_DEV_ATTR(config_partial), 1442 TEST_FW_DEV_ATTR(config_sync_direct), 1443 TEST_FW_DEV_ATTR(config_send_uevent), 1444 TEST_FW_DEV_ATTR(config_read_fw_idx), 1445 TEST_FW_DEV_ATTR(config_upload_name), 1446 1447 /* These don't use the config at all - they could be ported! */ 1448 TEST_FW_DEV_ATTR(trigger_request), 1449 TEST_FW_DEV_ATTR(trigger_async_request), 1450 TEST_FW_DEV_ATTR(trigger_custom_fallback), 1451 #ifdef CONFIG_EFI_EMBEDDED_FIRMWARE 1452 TEST_FW_DEV_ATTR(trigger_request_platform), 1453 #endif 1454 1455 /* These use the config and can use the test_result */ 1456 TEST_FW_DEV_ATTR(trigger_batched_requests), 1457 TEST_FW_DEV_ATTR(trigger_batched_requests_async), 1458 1459 TEST_FW_DEV_ATTR(release_all_firmware), 1460 TEST_FW_DEV_ATTR(test_result), 1461 TEST_FW_DEV_ATTR(read_firmware), 1462 TEST_FW_DEV_ATTR(upload_read), 1463 TEST_FW_DEV_ATTR(upload_register), 1464 TEST_FW_DEV_ATTR(upload_unregister), 1465 NULL, 1466 }; 1467 1468 ATTRIBUTE_GROUPS(test_dev); 1469 1470 static struct miscdevice test_fw_misc_device = { 1471 .minor = MISC_DYNAMIC_MINOR, 1472 .name = "test_firmware", 1473 .fops = &test_fw_fops, 1474 .groups = test_dev_groups, 1475 }; 1476 1477 static int __init test_firmware_init(void) 1478 { 1479 int rc; 1480 1481 test_fw_config = kzalloc(sizeof(struct test_config), GFP_KERNEL); 1482 if (!test_fw_config) 1483 return -ENOMEM; 1484 1485 rc = __test_firmware_config_init(); 1486 if (rc) { 1487 kfree(test_fw_config); 1488 pr_err("could not init firmware test config: %d\n", rc); 1489 return rc; 1490 } 1491 1492 rc = misc_register(&test_fw_misc_device); 1493 if (rc) { 1494 __test_firmware_config_free(); 1495 kfree(test_fw_config); 1496 pr_err("could not register misc device: %d\n", rc); 1497 return rc; 1498 } 1499 1500 pr_warn("interface ready\n"); 1501 1502 return 0; 1503 } 1504 1505 module_init(test_firmware_init); 1506 1507 static void __exit test_firmware_exit(void) 1508 { 1509 mutex_lock(&test_fw_mutex); 1510 release_firmware(test_firmware); 1511 misc_deregister(&test_fw_misc_device); 1512 upload_release_all(); 1513 __test_firmware_config_free(); 1514 kfree(test_fw_config); 1515 mutex_unlock(&test_fw_mutex); 1516 1517 pr_warn("removed interface\n"); 1518 } 1519 1520 module_exit(test_firmware_exit); 1521 1522 MODULE_AUTHOR("Kees Cook <keescook@chromium.org>"); 1523 MODULE_LICENSE("GPL"); 1524