• Home
  • Raw
  • Download

Lines Matching +full:reboot +full:- +full:offset

6  * Copyright (C) 2007-2008 Intel Corporation. All rights reserved.
35 * Intel Corporation <linux-wimax@intel.com>
37 * Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
38 * - Initial implementation
43 * The 2400m and derived devices work in two modes: boot-mode or
48 * system, when it crashes and when you ask it to reboot. There are
49 * two submodes of the boot mode: signed and non-signed. Signed takes
50 * firmwares signed with a certain private key, non-signed takes any
58 * reboot barker (4 le32 words with the same value). We ack it by
60 * reboot ack barker (4 le32 words with value I2400M_ACK_BARKER) and
89 * warm reset request that will take us to boot-mode. If we time out
90 * waiting for a reboot barker, that means maybe we are already in
91 * boot mode, so we send a reboot barker.
102 * This code is bus-generic; the bus-specific driver provides back end
144 * i2400m->bus_bm_cmd_send()
145 * i2400m->bus_bm_wait_for_ack
149 * i2400m_bm_cmd_prepare Used by bus-drivers to prep
165 #include "debug-levels.h"
177 * Prepare a boot-mode command for delivery
193 const u32 *checksum_ptr = (void *) cmd->payload; in i2400m_bm_cmd_prepare()
194 for (i = 0; i < cmd->data_size / 4; i++) in i2400m_bm_cmd_prepare()
196 checksum += cmd->command + cmd->target_addr + cmd->data_size; in i2400m_bm_cmd_prepare()
197 cmd->block_checksum = cpu_to_le32(checksum); in i2400m_bm_cmd_prepare()
237 return -ENOMEM; in i2400m_zrealloc_2x()
261 barker->data[0] = le32_to_cpu(barker_id); in i2400m_barker_db_add()
262 barker->data[1] = le32_to_cpu(barker_id); in i2400m_barker_db_add()
263 barker->data[2] = le32_to_cpu(barker_id); in i2400m_barker_db_add()
264 barker->data[3] = le32_to_cpu(barker_id); in i2400m_barker_db_add()
308 * recognize. This is a comma-separated list of 32-bit hex
330 result = -ENOMEM; in i2400m_barker_db_init()
342 "a 32-bit number\n", in i2400m_barker_db_init()
344 result = -EINVAL; in i2400m_barker_db_init()
377 * barker, this function will set i2400m->barker to point to the right
382 * Return: 0 if @buf matches a known boot barker. -ENOENT if the
384 * -EILSEQ if the buffer doesn't have the right size.
394 result = -ENOENT; in i2400m_is_boot_barker()
400 if (i2400m->barker in i2400m_is_boot_barker()
401 && !memcmp(buf, i2400m->barker, sizeof(i2400m->barker->data))) { in i2400m_is_boot_barker()
402 unsigned index = (i2400m->barker - i2400m_barker_db) in i2400m_is_boot_barker()
403 / sizeof(*i2400m->barker); in i2400m_is_boot_barker()
404 d_printf(2, dev, "boot barker cache-confirmed #%u/%08x\n", in i2400m_is_boot_barker()
405 index, le32_to_cpu(i2400m->barker->data[0])); in i2400m_is_boot_barker()
411 BUILD_BUG_ON(sizeof(barker->data) != 16); in i2400m_is_boot_barker()
412 if (memcmp(buf, barker->data, sizeof(barker->data))) in i2400m_is_boot_barker()
415 if (i2400m->barker == NULL) { in i2400m_is_boot_barker()
416 i2400m->barker = barker; in i2400m_is_boot_barker()
418 i, le32_to_cpu(barker->data[0])); in i2400m_is_boot_barker()
419 if (barker->data[0] == le32_to_cpu(I2400M_NBOOT_BARKER)) in i2400m_is_boot_barker()
420 i2400m->sboot = 0; in i2400m_is_boot_barker()
422 i2400m->sboot = 1; in i2400m_is_boot_barker()
423 } else if (i2400m->barker != barker) { in i2400m_is_boot_barker()
427 le32_to_cpu(i2400m->barker->data[0]), in i2400m_is_boot_barker()
428 le32_to_cpu(barker->data[0])); in i2400m_is_boot_barker()
429 result = -EIO; in i2400m_is_boot_barker()
432 i, le32_to_cpu(barker->data[0])); in i2400m_is_boot_barker()
452 * Way too long function -- maybe it should be further split
459 ssize_t result = -ENOMEM; in __i2400m_bm_ack_verify()
465 result = -EIO; in __i2400m_bm_ack_verify()
466 dev_err(dev, "boot-mode cmd %d: HW BUG? notification didn't " in __i2400m_bm_ack_verify()
473 result = -ERESTARTSYS; in __i2400m_bm_ack_verify()
474 d_printf(6, dev, "boot-mode cmd %d: HW boot barker\n", opcode); in __i2400m_bm_ack_verify()
479 result = -EISCONN; in __i2400m_bm_ack_verify()
480 d_printf(3, dev, "boot-mode cmd %d: HW reboot ack barker\n", in __i2400m_bm_ack_verify()
487 ack->data_size = le32_to_cpu(ack->data_size); in __i2400m_bm_ack_verify()
488 ack->target_addr = le32_to_cpu(ack->target_addr); in __i2400m_bm_ack_verify()
489 ack->block_checksum = le32_to_cpu(ack->block_checksum); in __i2400m_bm_ack_verify()
490 d_printf(5, dev, "boot-mode cmd %d: notification for opcode %u " in __i2400m_bm_ack_verify()
497 result = -EIO; in __i2400m_bm_ack_verify()
499 dev_err(dev, "boot-mode cmd %d: HW BUG? wrong signature " in __i2400m_bm_ack_verify()
503 if (opcode != -1 && opcode != i2400m_brh_get_opcode(ack)) { in __i2400m_bm_ack_verify()
504 dev_err(dev, "boot-mode cmd %d: HW BUG? " in __i2400m_bm_ack_verify()
510 dev_err(dev, "boot-mode cmd %d: error; hw response %u\n", in __i2400m_bm_ack_verify()
514 if (ack_size < ack->data_size + sizeof(*ack)) { in __i2400m_bm_ack_verify()
515 dev_err(dev, "boot-mode cmd %d: SW BUG " in __i2400m_bm_ack_verify()
518 (size_t) le32_to_cpu(ack->data_size) + sizeof(*ack)); in __i2400m_bm_ack_verify()
540 * i2400m_bm_cmd - Execute a boot mode command
554 * You can use the i2400m->bm_cmd_buf to stage your commands and
560 * bus-specific drivers padding requirements.
566 * You *cannot* use i2400m->bm_ack_buf for this buffer.
577 * -ERESTARTSYS The device has rebooted
579 * Executes a boot-mode command and waits for a response, doing basic
581 * waiting for a response until a non-zero one is received (timing out
590 ssize_t result = -ENOMEM, rx_bytes; in i2400m_bm_cmd()
592 int opcode = cmd == NULL ? -1 : i2400m_brh_get_opcode(cmd); in i2400m_bm_cmd()
597 BUG_ON(i2400m->boot_mode == 0); in i2400m_bm_cmd()
600 result = i2400m->bus_bm_cmd_send(i2400m, cmd, cmd_size, flags); in i2400m_bm_cmd()
605 "boot-mode cmd %d csum %u rr %u da %u: " in i2400m_bm_cmd()
610 cmd->target_addr, cmd->data_size, in i2400m_bm_cmd()
611 cmd->block_checksum); in i2400m_bm_cmd()
613 result = i2400m->bus_bm_wait_for_ack(i2400m, ack, ack_size); in i2400m_bm_cmd()
615 dev_err(dev, "boot-mode cmd %d: error waiting for an ack: %d\n", in i2400m_bm_cmd()
639 * i2400m_download_chunk - write a single chunk of data to the device's memory
664 buf = i2400m->bm_cmd_buf; in i2400m_download_chunk()
665 memcpy(buf->cmd_payload, chunk, __chunk_len); in i2400m_download_chunk()
666 memset(buf->cmd_payload + __chunk_len, 0xad, chunk_len - __chunk_len); in i2400m_download_chunk()
668 buf->cmd.command = i2400m_brh_command(I2400M_BRH_WRITE, in i2400m_download_chunk()
671 buf->cmd.target_addr = cpu_to_le32(addr); in i2400m_download_chunk()
672 buf->cmd.data_size = cpu_to_le32(__chunk_len); in i2400m_download_chunk()
673 ret = i2400m_bm_cmd(i2400m, &buf->cmd, sizeof(buf->cmd) + chunk_len, in i2400m_download_chunk()
692 * Returns: < 0 errno code on error or the offset to the jump instruction.
708 size_t offset, /* iterator offset */ in i2400m_dnload_bcf() local
719 offset = le32_to_cpu(bcf->header_len) * sizeof(u32); in i2400m_dnload_bcf()
721 bh = (void *) bcf + offset; in i2400m_dnload_bcf()
722 data_size = le32_to_cpu(bh->data_size); in i2400m_dnload_bcf()
726 section, offset, sizeof(*bh) + data_size, in i2400m_dnload_bcf()
727 le32_to_cpu(bh->target_addr)); in i2400m_dnload_bcf()
736 d_printf(5, dev, "jump found @%zu\n", offset); in i2400m_dnload_bcf()
739 if (offset + section_size > bcf_len) { in i2400m_dnload_bcf()
742 i2400m->fw_name, section, in i2400m_dnload_bcf()
743 offset + section_size, bcf_len); in i2400m_dnload_bcf()
744 ret = -EINVAL; in i2400m_dnload_bcf()
752 "failed %d\n", i2400m->fw_name, section, in i2400m_dnload_bcf()
753 offset, sizeof(*bh) + data_size, (int) ret); in i2400m_dnload_bcf()
756 offset += section_size; in i2400m_dnload_bcf()
759 ret = offset; in i2400m_dnload_bcf()
769 * Indicate if the device emitted a reboot barker that indicates
775 return likely(i2400m->sboot); in i2400m_boot_is_signed()
785 * @offset: [byte] offset into @bcf for the command we need to send.
787 * Depending on the boot mode (signed vs non-signed), different
793 const struct i2400m_bcf_hdr *bcf, size_t offset) in i2400m_dnload_finalize() argument
804 d_fnstart(3, dev, "offset %zu\n", offset); in i2400m_dnload_finalize()
805 cmd = (void *) bcf + offset; in i2400m_dnload_finalize()
809 le32_to_cpu(cmd->target_addr)); in i2400m_dnload_finalize()
810 cmd_buf = i2400m->bm_cmd_buf; in i2400m_dnload_finalize()
811 memcpy(&cmd_buf->cmd, cmd, sizeof(*cmd)); in i2400m_dnload_finalize()
812 cmd = &cmd_buf->cmd; in i2400m_dnload_finalize()
815 cmd->data_size = 0; in i2400m_dnload_finalize()
820 le32_to_cpu(cmd->target_addr)); in i2400m_dnload_finalize()
821 cmd_buf = i2400m->bm_cmd_buf; in i2400m_dnload_finalize()
822 memcpy(&cmd_buf->cmd, cmd, sizeof(*cmd)); in i2400m_dnload_finalize()
825 + le32_to_cpu(bcf_hdr->key_size) * sizeof(u32) in i2400m_dnload_finalize()
826 + le32_to_cpu(bcf_hdr->exponent_size) * sizeof(u32); in i2400m_dnload_finalize()
828 le32_to_cpu(bcf_hdr->modulus_size) * sizeof(u32); in i2400m_dnload_finalize()
829 memcpy(cmd_buf->cmd_pl, in i2400m_dnload_finalize()
832 ret = i2400m_bm_cmd(i2400m, &cmd_buf->cmd, in i2400m_dnload_finalize()
833 sizeof(cmd_buf->cmd) + signature_block_size, in i2400m_dnload_finalize()
842 * i2400m_bootrom_init - Reboots a powered device into boot mode
846 * I2400M_BRI_SOFT: a reboot barker has been seen
849 * I2400M_BRI_NO_REBOOT: Don't send a reboot command, but wait
850 * for a reboot barker notification. This is a one shot; if
851 * the state machine needs to send a reboot command it will.
859 * Tries hard enough to put the device in boot-mode. There are two
862 * a. (1) send a reboot command and (2) get a reboot barker
864 * b. (1) echo/ack the reboot sending the reboot barker back and (2)
874 * the reboot barker (the device might send different ones depending
876 * echo/ack reboot barker being sent back, it doesn't understand
878 * what to send to it -- cold reset and bus reset seem to have little
891 int count = i2400m->bus_bm_retries; in i2400m_bootrom_init()
899 result = -ENOMEM; in i2400m_bootrom_init()
900 cmd = i2400m->bm_cmd_buf; in i2400m_bootrom_init()
905 if (--count < 0) in i2400m_bootrom_init()
907 d_printf(4, dev, "device reboot: reboot command [%d # left]\n", in i2400m_bootrom_init()
915 case -ERESTARTSYS: in i2400m_bootrom_init()
919 * i2400m->barker and we are good to go. in i2400m_bootrom_init()
921 d_printf(4, dev, "device reboot: got reboot barker\n"); in i2400m_bootrom_init()
923 case -EISCONN: /* we don't know how it got here...but we follow it */ in i2400m_bootrom_init()
924 d_printf(4, dev, "device reboot: got ack barker - whatever\n"); in i2400m_bootrom_init()
926 case -ETIMEDOUT: in i2400m_bootrom_init()
933 if (i2400m->barker != NULL) { in i2400m_bootrom_init()
934 dev_err(dev, "device boot: reboot barker timed out, " in i2400m_bootrom_init()
936 le32_to_cpu(i2400m->barker->data[0])); in i2400m_bootrom_init()
941 memcpy(cmd, barker->data, sizeof(barker->data)); in i2400m_bootrom_init()
945 if (result == -EISCONN) { in i2400m_bootrom_init()
949 i, le32_to_cpu(barker->data[0])); in i2400m_bootrom_init()
956 result = -ESHUTDOWN; in i2400m_bootrom_init()
957 case -EPROTO: in i2400m_bootrom_init()
958 case -ESHUTDOWN: /* dev is gone */ in i2400m_bootrom_init()
959 case -EINTR: /* user cancelled */ in i2400m_bootrom_init()
962 dev_err(dev, "device reboot: error %d while waiting " in i2400m_bootrom_init()
963 "for reboot barker - rebooting\n", result); in i2400m_bootrom_init()
967 /* At this point we ack back with 4 REBOOT barkers and expect in i2400m_bootrom_init()
968 * 4 ACK barkers. This is ugly, as we send a raw command -- in i2400m_bootrom_init()
969 * hence the cast. _bm_cmd() will catch the reboot ack in i2400m_bootrom_init()
970 * notification and report it as -EISCONN. */ in i2400m_bootrom_init()
972 d_printf(4, dev, "device reboot ack: sending ack [%d # left]\n", count); in i2400m_bootrom_init()
973 memcpy(cmd, i2400m->barker->data, sizeof(i2400m->barker->data)); in i2400m_bootrom_init()
977 case -ERESTARTSYS: in i2400m_bootrom_init()
978 d_printf(4, dev, "reboot ack: got reboot barker - retrying\n"); in i2400m_bootrom_init()
979 if (--count < 0) in i2400m_bootrom_init()
982 case -EISCONN: in i2400m_bootrom_init()
983 d_printf(4, dev, "reboot ack: got ack barker - good\n"); in i2400m_bootrom_init()
985 case -ETIMEDOUT: /* no response, maybe it is the other type? */ in i2400m_bootrom_init()
986 if (ack_timeout_cnt-- < 0) { in i2400m_bootrom_init()
987 d_printf(4, dev, "reboot ack timedout: retrying\n"); in i2400m_bootrom_init()
990 dev_err(dev, "reboot ack timedout too long: " in i2400m_bootrom_init()
991 "trying reboot\n"); in i2400m_bootrom_init()
995 case -EPROTO: in i2400m_bootrom_init()
996 case -ESHUTDOWN: /* dev is gone */ in i2400m_bootrom_init()
999 dev_err(dev, "device reboot ack: error %d while waiting for " in i2400m_bootrom_init()
1000 "reboot ack barker - rebooting\n", result); in i2400m_bootrom_init()
1003 d_printf(2, dev, "device reboot ack: got ack barker - boot done\n"); in i2400m_bootrom_init()
1012 dev_err(dev, "Timed out waiting for reboot ack\n"); in i2400m_bootrom_init()
1013 result = -ETIMEDOUT; in i2400m_bootrom_init()
1031 struct net_device *net_dev = i2400m->wimax_dev.net_dev; in i2400m_read_mac_addr()
1039 cmd = i2400m->bm_cmd_buf; in i2400m_read_mac_addr()
1040 cmd->command = i2400m_brh_command(I2400M_BRH_READ, 0, 1); in i2400m_read_mac_addr()
1041 cmd->target_addr = cpu_to_le32(0x00203fe8); in i2400m_read_mac_addr()
1042 cmd->data_size = cpu_to_le32(6); in i2400m_read_mac_addr()
1050 if (i2400m->bus_bm_mac_addr_impaired == 1) { in i2400m_read_mac_addr()
1059 net_dev->addr_len = ETH_ALEN; in i2400m_read_mac_addr()
1060 memcpy(net_dev->dev_addr, ack_buf.ack_pl, ETH_ALEN); in i2400m_read_mac_addr()
1081 if (i2400m->bus_bm_pokes_table) { in i2400m_dnload_init_nonsigned()
1082 while (i2400m->bus_bm_pokes_table[i].address) { in i2400m_dnload_init_nonsigned()
1085 &i2400m->bus_bm_pokes_table[i].data, in i2400m_dnload_init_nonsigned()
1086 sizeof(i2400m->bus_bm_pokes_table[i].data), in i2400m_dnload_init_nonsigned()
1087 i2400m->bus_bm_pokes_table[i].address, 1, 1); in i2400m_dnload_init_nonsigned()
1106 * Returns: 0 if ok, < 0 errno code on error, -ERESTARTSYS if the hw
1125 cmd_buf = i2400m->bm_cmd_buf; in i2400m_dnload_init_signed()
1126 cmd_buf->cmd.command = in i2400m_dnload_init_signed()
1128 cmd_buf->cmd.target_addr = 0; in i2400m_dnload_init_signed()
1129 cmd_buf->cmd.data_size = cpu_to_le32(sizeof(cmd_buf->cmd_pl)); in i2400m_dnload_init_signed()
1130 memcpy(&cmd_buf->cmd_pl, bcf_hdr, sizeof(*bcf_hdr)); in i2400m_dnload_init_signed()
1131 ret = i2400m_bm_cmd(i2400m, &cmd_buf->cmd, sizeof(*cmd_buf), in i2400m_dnload_init_signed()
1144 * (signed or non-signed).
1156 if (result == -ERESTARTSYS) in i2400m_dnload_init()
1161 i2400m->fw_name, result); in i2400m_dnload_init()
1163 /* non-signed boot process without pokes */ in i2400m_dnload_init()
1164 d_printf(1, dev, "non-signed boot\n"); in i2400m_dnload_init()
1166 if (result == -ERESTARTSYS) in i2400m_dnload_init()
1169 dev_err(dev, "firmware %s: non-signed download " in i2400m_dnload_init()
1171 i2400m->fw_name, result); in i2400m_dnload_init()
1186 * file, and update i2400m->fw_bcf_hdr to point to them.
1191 size_t index, size_t offset) in i2400m_fw_hdr_check() argument
1198 module_type = le32_to_cpu(bcf_hdr->module_type); in i2400m_fw_hdr_check()
1199 header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); in i2400m_fw_hdr_check()
1200 major_version = (le32_to_cpu(bcf_hdr->header_version) & 0xffff0000) in i2400m_fw_hdr_check()
1202 minor_version = le32_to_cpu(bcf_hdr->header_version) & 0x0000ffff; in i2400m_fw_hdr_check()
1203 module_id = le32_to_cpu(bcf_hdr->module_id); in i2400m_fw_hdr_check()
1204 module_vendor = le32_to_cpu(bcf_hdr->module_vendor); in i2400m_fw_hdr_check()
1205 date = le32_to_cpu(bcf_hdr->date); in i2400m_fw_hdr_check()
1206 size = sizeof(u32) * le32_to_cpu(bcf_hdr->size); in i2400m_fw_hdr_check()
1210 i2400m->fw_name, index, offset, in i2400m_fw_hdr_check()
1218 i2400m->fw_name, index, offset, in i2400m_fw_hdr_check()
1220 return -EBADF; in i2400m_fw_hdr_check()
1226 i2400m->fw_name, index, offset, in i2400m_fw_hdr_check()
1228 return -EBADF; in i2400m_fw_hdr_check()
1234 i2400m->fw_name, index, offset, module_vendor); in i2400m_fw_hdr_check()
1235 return -EBADF; in i2400m_fw_hdr_check()
1241 i2400m->fw_name, index, offset, date); in i2400m_fw_hdr_check()
1255 * file, and update i2400m->fw_hdrs to point to them.
1270 size_t leftover, offset, header_len, size; in i2400m_fw_check() local
1272 leftover = top - itr; in i2400m_fw_check()
1273 offset = itr - bcf; in i2400m_fw_check()
1277 i2400m->fw_name, leftover, offset); in i2400m_fw_check()
1283 header_len = sizeof(u32) * le32_to_cpu(bcf_hdr->header_len); in i2400m_fw_check()
1284 size = sizeof(u32) * le32_to_cpu(bcf_hdr->size); in i2400m_fw_check()
1290 result = i2400m_fw_hdr_check(i2400m, bcf_hdr, headers, offset); in i2400m_fw_check()
1294 /* +1 -> we need to account for the one we'll in i2400m_fw_check()
1298 (void **) &i2400m->fw_hdrs, &slots, in i2400m_fw_check()
1299 sizeof(i2400m->fw_hdrs[0]), in i2400m_fw_check()
1304 i2400m->fw_hdrs[used_slots] = bcf_hdr; in i2400m_fw_check()
1309 i2400m->fw_name); in i2400m_fw_check()
1310 result = -EBADF; in i2400m_fw_check()
1328 u32 barker = le32_to_cpu(i2400m->barker->data[0]) in i2400m_bcf_hdr_match()
1330 u32 module_id = le32_to_cpu(bcf_hdr->module_id) in i2400m_bcf_hdr_match()
1347 u32 barker = le32_to_cpu(i2400m->barker->data[0]); in i2400m_bcf_hdr_find()
1351 bcf_hdr = i2400m->fw_hdrs[0]; in i2400m_bcf_hdr_find()
1352 d_printf(1, dev, "using BCF header #%u/%08x for non-signed " in i2400m_bcf_hdr_find()
1353 "barker\n", 0, le32_to_cpu(bcf_hdr->module_id)); in i2400m_bcf_hdr_find()
1356 for (bcf_itr = i2400m->fw_hdrs; *bcf_itr != NULL; bcf_itr++, i++) { in i2400m_bcf_hdr_find()
1360 i, le32_to_cpu(bcf_hdr->module_id)); in i2400m_bcf_hdr_find()
1364 i, le32_to_cpu(bcf_hdr->module_id)); in i2400m_bcf_hdr_find()
1382 * Note we only reinitialize boot-mode if the flags say so. Some hw
1392 int count = i2400m->bus_bm_retries; in i2400m_fw_dnload()
1398 i2400m->boot_mode = 1; in i2400m_fw_dnload()
1401 if (count-- == 0) { in i2400m_fw_dnload()
1402 ret = -ERESTARTSYS; in i2400m_fw_dnload()
1418 * offset of the jump instruction to _dnload_finalize() in i2400m_fw_dnload()
1424 ret = -EBADF; in i2400m_fw_dnload()
1430 if (ret == -ERESTARTSYS) in i2400m_fw_dnload()
1440 bcf_size = sizeof(u32) * le32_to_cpu(bcf_hdr->size); in i2400m_fw_dnload()
1442 if (ret == -ERESTARTSYS) in i2400m_fw_dnload()
1446 i2400m->fw_name, ret); in i2400m_fw_dnload()
1451 if (ret == -ERESTARTSYS) in i2400m_fw_dnload()
1456 i2400m->fw_name, ret); in i2400m_fw_dnload()
1461 i2400m->fw_name); in i2400m_fw_dnload()
1462 i2400m->boot_mode = 0; in i2400m_fw_dnload()
1490 bcf = (void *) fw->data; in i2400m_fw_bootstrap()
1491 ret = i2400m_fw_check(i2400m, bcf, fw->size); in i2400m_fw_bootstrap()
1493 ret = i2400m_fw_dnload(i2400m, bcf, fw->size, flags); in i2400m_fw_bootstrap()
1496 i2400m->fw_name, ret); in i2400m_fw_bootstrap()
1497 kfree(i2400m->fw_hdrs); in i2400m_fw_bootstrap()
1498 i2400m->fw_hdrs = NULL; in i2400m_fw_bootstrap()
1516 release_firmware(i2400m_fw->fw); in i2400m_fw_destroy()
1525 kref_get(&i2400m_fw->kref); in i2400m_fw_get()
1533 kref_put(&i2400m_fw->kref, i2400m_fw_destroy); in i2400m_fw_put()
1538 * i2400m_dev_bootstrap - Bring the device to a known state and upload firmware
1550 * single-threade; all I/Os are synchronous.
1562 ret = -ENODEV; in i2400m_dev_bootstrap()
1563 spin_lock(&i2400m->rx_lock); in i2400m_dev_bootstrap()
1564 i2400m_fw = i2400m_fw_get(i2400m->fw_cached); in i2400m_dev_bootstrap()
1565 spin_unlock(&i2400m->rx_lock); in i2400m_dev_bootstrap()
1571 i2400m->fw_name); in i2400m_dev_bootstrap()
1572 ret = i2400m_fw_bootstrap(i2400m, i2400m_fw->fw, flags); in i2400m_dev_bootstrap()
1578 for (itr = 0, ret = -ENOENT; ; itr++) { in i2400m_dev_bootstrap()
1579 fw_name = i2400m->bus_fw_names[itr]; in i2400m_dev_bootstrap()
1591 i2400m->fw_name = fw_name; in i2400m_dev_bootstrap()
1596 i2400m->fw_name = NULL; in i2400m_dev_bootstrap()
1611 /* if there is anything there, free it -- now, this'd be weird */ in i2400m_fw_cache()
1612 spin_lock(&i2400m->rx_lock); in i2400m_fw_cache()
1613 i2400m_fw = i2400m->fw_cached; in i2400m_fw_cache()
1614 spin_unlock(&i2400m->rx_lock); in i2400m_fw_cache()
1621 if (i2400m->fw_name == NULL) { in i2400m_fw_cache()
1630 kref_init(&i2400m_fw->kref); in i2400m_fw_cache()
1631 result = request_firmware(&i2400m_fw->fw, i2400m->fw_name, dev); in i2400m_fw_cache()
1634 i2400m->fw_name, result); in i2400m_fw_cache()
1638 dev_info(dev, "firmware %s: cached\n", i2400m->fw_name); in i2400m_fw_cache()
1640 spin_lock(&i2400m->rx_lock); in i2400m_fw_cache()
1641 i2400m->fw_cached = i2400m_fw; in i2400m_fw_cache()
1642 spin_unlock(&i2400m->rx_lock); in i2400m_fw_cache()
1650 spin_lock(&i2400m->rx_lock); in i2400m_fw_uncache()
1651 i2400m_fw = i2400m->fw_cached; in i2400m_fw_uncache()
1652 i2400m->fw_cached = NULL; in i2400m_fw_uncache()
1653 spin_unlock(&i2400m->rx_lock); in i2400m_fw_uncache()