Lines Matching refs:drv

139 	struct list_head drv;		/* list of devices using this op_mode */  member
157 static void iwl_free_fw_desc(struct iwl_drv *drv, struct fw_desc *desc) in iwl_free_fw_desc() argument
164 static void iwl_free_fw_img(struct iwl_drv *drv, struct fw_img *img) in iwl_free_fw_img() argument
168 iwl_free_fw_desc(drv, &img->sec[i]); in iwl_free_fw_img()
171 static void iwl_dealloc_ucode(struct iwl_drv *drv) in iwl_dealloc_ucode() argument
175 kfree(drv->fw.dbg_dest_tlv); in iwl_dealloc_ucode()
176 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_conf_tlv); i++) in iwl_dealloc_ucode()
177 kfree(drv->fw.dbg_conf_tlv[i]); in iwl_dealloc_ucode()
178 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_trigger_tlv); i++) in iwl_dealloc_ucode()
179 kfree(drv->fw.dbg_trigger_tlv[i]); in iwl_dealloc_ucode()
182 iwl_free_fw_img(drv, drv->fw.img + i); in iwl_dealloc_ucode()
185 static int iwl_alloc_fw_desc(struct iwl_drv *drv, struct fw_desc *desc, in iwl_alloc_fw_desc() argument
213 static int iwl_request_firmware(struct iwl_drv *drv, bool first) in iwl_request_firmware() argument
215 const char *name_pre = drv->cfg->fw_name_pre; in iwl_request_firmware()
220 drv->fw_index = UCODE_EXPERIMENTAL_INDEX; in iwl_request_firmware()
222 } else if (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) { in iwl_request_firmware()
224 drv->fw_index = drv->cfg->ucode_api_max; in iwl_request_firmware()
225 sprintf(tag, "%d", drv->fw_index); in iwl_request_firmware()
227 drv->fw_index--; in iwl_request_firmware()
228 sprintf(tag, "%d", drv->fw_index); in iwl_request_firmware()
231 if (drv->fw_index < drv->cfg->ucode_api_min) { in iwl_request_firmware()
232 IWL_ERR(drv, "no suitable firmware found!\n"); in iwl_request_firmware()
236 snprintf(drv->firmware_name, sizeof(drv->firmware_name), "%s%s.ucode", in iwl_request_firmware()
243 if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { in iwl_request_firmware()
244 char rev_step = 'A' + CSR_HW_REV_STEP(drv->trans->hw_rev); in iwl_request_firmware()
246 snprintf(drv->firmware_name, sizeof(drv->firmware_name), in iwl_request_firmware()
250 IWL_DEBUG_INFO(drv, "attempting to load firmware %s'%s'\n", in iwl_request_firmware()
251 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) in iwl_request_firmware()
253 drv->firmware_name); in iwl_request_firmware()
255 return request_firmware_nowait(THIS_MODULE, 1, drv->firmware_name, in iwl_request_firmware()
256 drv->trans->dev, in iwl_request_firmware()
257 GFP_KERNEL, drv, iwl_req_fw_callback); in iwl_request_firmware()
427 static int iwl_set_default_calib(struct iwl_drv *drv, const u8 *data) in iwl_set_default_calib() argument
433 IWL_ERR(drv, "Wrong ucode_type %u for default calibration.\n", in iwl_set_default_calib()
437 drv->fw.default_calib[ucode_type].flow_trigger = in iwl_set_default_calib()
439 drv->fw.default_calib[ucode_type].event_trigger = in iwl_set_default_calib()
445 static int iwl_set_ucode_api_flags(struct iwl_drv *drv, const u8 *data, in iwl_set_ucode_api_flags() argument
454 IWL_ERR(drv, "api_index larger than supported by driver\n"); in iwl_set_ucode_api_flags()
467 static int iwl_set_ucode_capabilities(struct iwl_drv *drv, const u8 *data, in iwl_set_ucode_capabilities() argument
476 IWL_ERR(drv, "api_index larger than supported by driver\n"); in iwl_set_ucode_capabilities()
489 static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv, in iwl_parse_v1_v2_firmware() argument
498 drv->fw.ucode_ver = le32_to_cpu(ucode->ver); in iwl_parse_v1_v2_firmware()
499 api_ver = IWL_UCODE_API(drv->fw.ucode_ver); in iwl_parse_v1_v2_firmware()
505 IWL_ERR(drv, "File size too small!\n"); in iwl_parse_v1_v2_firmware()
524 IWL_ERR(drv, "File size too small!\n"); in iwl_parse_v1_v2_firmware()
542 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) in iwl_parse_v1_v2_firmware()
547 snprintf(drv->fw.fw_version, in iwl_parse_v1_v2_firmware()
548 sizeof(drv->fw.fw_version), in iwl_parse_v1_v2_firmware()
550 IWL_UCODE_MAJOR(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
551 IWL_UCODE_MINOR(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
552 IWL_UCODE_API(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
553 IWL_UCODE_SERIAL(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
564 IWL_ERR(drv, in iwl_parse_v1_v2_firmware()
590 static int iwl_parse_tlv_firmware(struct iwl_drv *drv, in iwl_parse_tlv_firmware() argument
611 IWL_ERR(drv, "uCode has invalid length: %zd\n", len); in iwl_parse_tlv_firmware()
616 IWL_ERR(drv, "invalid uCode magic: 0X%x\n", in iwl_parse_tlv_firmware()
621 drv->fw.ucode_ver = le32_to_cpu(ucode->ver); in iwl_parse_tlv_firmware()
622 memcpy(drv->fw.human_readable, ucode->human_readable, in iwl_parse_tlv_firmware()
623 sizeof(drv->fw.human_readable)); in iwl_parse_tlv_firmware()
628 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) in iwl_parse_tlv_firmware()
633 snprintf(drv->fw.fw_version, in iwl_parse_tlv_firmware()
634 sizeof(drv->fw.fw_version), in iwl_parse_tlv_firmware()
636 IWL_UCODE_MAJOR(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
637 IWL_UCODE_MINOR(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
638 IWL_UCODE_API(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
639 IWL_UCODE_SERIAL(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
655 IWL_ERR(drv, "invalid TLV len: %zd/%u\n", in iwl_parse_tlv_firmware()
700 IWL_ERR(drv, "Found unexpected BOOT ucode\n"); in iwl_parse_tlv_firmware()
732 if (iwl_set_ucode_api_flags(drv, tlv_data, capa)) in iwl_parse_tlv_firmware()
738 if (iwl_set_ucode_capabilities(drv, tlv_data, capa)) in iwl_parse_tlv_firmware()
780 drv->fw.enhance_sensitivity_table = true; in iwl_parse_tlv_firmware()
809 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
814 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
819 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
824 if (iwl_set_default_calib(drv, tlv_data)) in iwl_parse_tlv_firmware()
830 drv->fw.phy_config = le32_to_cpup((__le32 *)tlv_data); in iwl_parse_tlv_firmware()
831 drv->fw.valid_tx_ant = (drv->fw.phy_config & in iwl_parse_tlv_firmware()
834 drv->fw.valid_rx_ant = (drv->fw.phy_config & in iwl_parse_tlv_firmware()
841 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
846 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
851 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
860 drv->fw.img[IWL_UCODE_REGULAR].is_dual_cpus = in iwl_parse_tlv_firmware()
862 drv->fw.img[IWL_UCODE_INIT].is_dual_cpus = in iwl_parse_tlv_firmware()
864 drv->fw.img[IWL_UCODE_WOWLAN].is_dual_cpus = in iwl_parse_tlv_firmware()
867 IWL_ERR(drv, "Driver support upto 2 CPUs\n"); in iwl_parse_tlv_firmware()
872 if (iwl_store_cscheme(&drv->fw, tlv_data, tlv_len)) in iwl_parse_tlv_firmware()
893 snprintf(drv->fw.fw_version, in iwl_parse_tlv_firmware()
894 sizeof(drv->fw.fw_version), "%u.%u.%u", in iwl_parse_tlv_firmware()
902 IWL_ERR(drv, in iwl_parse_tlv_firmware()
908 IWL_INFO(drv, "Found debug destination: %s\n", in iwl_parse_tlv_firmware()
911 drv->fw.dbg_dest_reg_num = in iwl_parse_tlv_firmware()
914 drv->fw.dbg_dest_reg_num /= in iwl_parse_tlv_firmware()
915 sizeof(drv->fw.dbg_dest_tlv->reg_ops[0]); in iwl_parse_tlv_firmware()
923 IWL_ERR(drv, in iwl_parse_tlv_firmware()
929 if (conf->id >= ARRAY_SIZE(drv->fw.dbg_conf_tlv)) { in iwl_parse_tlv_firmware()
930 IWL_ERR(drv, in iwl_parse_tlv_firmware()
937 IWL_ERR(drv, in iwl_parse_tlv_firmware()
946 IWL_INFO(drv, "Found debug configuration: %d\n", in iwl_parse_tlv_firmware()
958 if (trigger_id >= ARRAY_SIZE(drv->fw.dbg_trigger_tlv)) { in iwl_parse_tlv_firmware()
959 IWL_ERR(drv, in iwl_parse_tlv_firmware()
966 IWL_ERR(drv, in iwl_parse_tlv_firmware()
972 IWL_INFO(drv, "Found debug trigger: %u\n", trigger->id); in iwl_parse_tlv_firmware()
989 IWL_DEBUG_FW(drv, in iwl_parse_tlv_firmware()
994 IWL_ERR(drv, in iwl_parse_tlv_firmware()
1001 IWL_ERR(drv, in iwl_parse_tlv_firmware()
1007 drv->fw.img[IWL_UCODE_REGULAR].paging_mem_size = in iwl_parse_tlv_firmware()
1010 drv->fw.img[usniffer_img].paging_mem_size = in iwl_parse_tlv_firmware()
1016 drv->fw.sdio_adma_addr = in iwl_parse_tlv_firmware()
1020 if (iwl_store_gscan_capa(&drv->fw, tlv_data, tlv_len)) in iwl_parse_tlv_firmware()
1025 IWL_DEBUG_INFO(drv, "unknown TLV: %d\n", tlv_type); in iwl_parse_tlv_firmware()
1031 IWL_ERR(drv, in iwl_parse_tlv_firmware()
1037 IWL_ERR(drv, "invalid TLV after parsing: %zd\n", len); in iwl_parse_tlv_firmware()
1038 iwl_print_hex_dump(drv, IWL_DL_FW, (u8 *)data, len); in iwl_parse_tlv_firmware()
1055 IWL_ERR(drv, "TLV %d has invalid size: %u\n", tlv_type, tlv_len); in iwl_parse_tlv_firmware()
1057 iwl_print_hex_dump(drv, IWL_DL_FW, tlv_data, tlv_len); in iwl_parse_tlv_firmware()
1062 static int iwl_alloc_ucode(struct iwl_drv *drv, in iwl_alloc_ucode() argument
1070 if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]), in iwl_alloc_ucode()
1076 static int validate_sec_sizes(struct iwl_drv *drv, in validate_sec_sizes() argument
1080 IWL_DEBUG_INFO(drv, "f/w package hdr runtime inst size = %Zd\n", in validate_sec_sizes()
1083 IWL_DEBUG_INFO(drv, "f/w package hdr runtime data size = %Zd\n", in validate_sec_sizes()
1086 IWL_DEBUG_INFO(drv, "f/w package hdr init inst size = %Zd\n", in validate_sec_sizes()
1088 IWL_DEBUG_INFO(drv, "f/w package hdr init data size = %Zd\n", in validate_sec_sizes()
1094 IWL_ERR(drv, "uCode instr len %Zd too large to fit in\n", in validate_sec_sizes()
1102 IWL_ERR(drv, "uCode data len %Zd too large to fit in\n", in validate_sec_sizes()
1110 IWL_ERR(drv, "uCode init instr len %Zd too large to fit in\n", in validate_sec_sizes()
1118 IWL_ERR(drv, "uCode init data len %Zd too large to fit in\n", in validate_sec_sizes()
1127 _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op) in _iwl_op_mode_start() argument
1134 drv->dbgfs_op_mode = debugfs_create_dir(op->name, in _iwl_op_mode_start()
1135 drv->dbgfs_drv); in _iwl_op_mode_start()
1136 if (!drv->dbgfs_op_mode) { in _iwl_op_mode_start()
1137 IWL_ERR(drv, in _iwl_op_mode_start()
1141 dbgfs_dir = drv->dbgfs_op_mode; in _iwl_op_mode_start()
1144 op_mode = ops->start(drv->trans, drv->cfg, &drv->fw, dbgfs_dir); in _iwl_op_mode_start()
1148 debugfs_remove_recursive(drv->dbgfs_op_mode); in _iwl_op_mode_start()
1149 drv->dbgfs_op_mode = NULL; in _iwl_op_mode_start()
1156 static void _iwl_op_mode_stop(struct iwl_drv *drv) in _iwl_op_mode_stop() argument
1159 if (drv->op_mode) { in _iwl_op_mode_stop()
1160 iwl_op_mode_stop(drv->op_mode); in _iwl_op_mode_stop()
1161 drv->op_mode = NULL; in _iwl_op_mode_stop()
1164 debugfs_remove_recursive(drv->dbgfs_op_mode); in _iwl_op_mode_stop()
1165 drv->dbgfs_op_mode = NULL; in _iwl_op_mode_stop()
1178 struct iwl_drv *drv = context; in iwl_req_fw_callback() local
1179 struct iwl_fw *fw = &drv->fw; in iwl_req_fw_callback()
1184 const unsigned int api_max = drv->cfg->ucode_api_max; in iwl_req_fw_callback()
1185 unsigned int api_ok = drv->cfg->ucode_api_ok; in iwl_req_fw_callback()
1186 const unsigned int api_min = drv->cfg->ucode_api_min; in iwl_req_fw_callback()
1205 if (drv->fw_index <= api_ok) in iwl_req_fw_callback()
1206 IWL_ERR(drv, in iwl_req_fw_callback()
1208 drv->firmware_name); in iwl_req_fw_callback()
1212 IWL_DEBUG_INFO(drv, "Loaded firmware file '%s' (%zd bytes).\n", in iwl_req_fw_callback()
1213 drv->firmware_name, ucode_raw->size); in iwl_req_fw_callback()
1217 IWL_ERR(drv, "File size way too small!\n"); in iwl_req_fw_callback()
1225 err = iwl_parse_v1_v2_firmware(drv, ucode_raw, pieces); in iwl_req_fw_callback()
1227 err = iwl_parse_tlv_firmware(drv, ucode_raw, pieces, in iwl_req_fw_callback()
1233 if (fw_has_api(&drv->fw.ucode_capa, IWL_UCODE_TLV_API_NEW_VERSION)) in iwl_req_fw_callback()
1234 api_ver = drv->fw.ucode_ver; in iwl_req_fw_callback()
1236 api_ver = IWL_UCODE_API(drv->fw.ucode_ver); in iwl_req_fw_callback()
1244 if (drv->fw_index != UCODE_EXPERIMENTAL_INDEX) { in iwl_req_fw_callback()
1246 IWL_ERR(drv, in iwl_req_fw_callback()
1255 IWL_ERR(drv, "Firmware has old API version, " in iwl_req_fw_callback()
1259 IWL_ERR(drv, "Firmware has old API version, " in iwl_req_fw_callback()
1262 IWL_ERR(drv, "New firmware can be obtained from " in iwl_req_fw_callback()
1271 if (!fw->mvm_fw && validate_sec_sizes(drv, pieces, drv->cfg)) in iwl_req_fw_callback()
1280 if (iwl_alloc_ucode(drv, pieces, i)) in iwl_req_fw_callback()
1284 drv->fw.dbg_dest_tlv = in iwl_req_fw_callback()
1288 drv->fw.dbg_dest_reg_num, GFP_KERNEL); in iwl_req_fw_callback()
1290 if (!drv->fw.dbg_dest_tlv) in iwl_req_fw_callback()
1294 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_conf_tlv); i++) { in iwl_req_fw_callback()
1296 drv->fw.dbg_conf_tlv_len[i] = in iwl_req_fw_callback()
1298 drv->fw.dbg_conf_tlv[i] = in iwl_req_fw_callback()
1300 drv->fw.dbg_conf_tlv_len[i], in iwl_req_fw_callback()
1302 if (!drv->fw.dbg_conf_tlv[i]) in iwl_req_fw_callback()
1327 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_trigger_tlv); i++) { in iwl_req_fw_callback()
1340 drv->fw.dbg_trigger_tlv_len[i] = in iwl_req_fw_callback()
1342 drv->fw.dbg_trigger_tlv[i] = in iwl_req_fw_callback()
1344 drv->fw.dbg_trigger_tlv_len[i], in iwl_req_fw_callback()
1346 if (!drv->fw.dbg_trigger_tlv[i]) in iwl_req_fw_callback()
1363 drv->cfg->base_params->max_event_log_size; in iwl_req_fw_callback()
1370 drv->cfg->base_params->max_event_log_size; in iwl_req_fw_callback()
1391 IWL_INFO(drv, "loaded firmware version %s op_mode %s\n", in iwl_req_fw_callback()
1392 drv->fw.fw_version, op->name); in iwl_req_fw_callback()
1395 list_add_tail(&drv->list, &op->drv); in iwl_req_fw_callback()
1398 drv->op_mode = _iwl_op_mode_start(drv, op); in iwl_req_fw_callback()
1400 if (!drv->op_mode) { in iwl_req_fw_callback()
1414 complete(&drv->request_firmware_complete); in iwl_req_fw_callback()
1425 IWL_ERR(drv, in iwl_req_fw_callback()
1436 if (iwl_request_firmware(drv, false)) in iwl_req_fw_callback()
1442 IWL_ERR(drv, "failed to allocate pci memory\n"); in iwl_req_fw_callback()
1443 iwl_dealloc_ucode(drv); in iwl_req_fw_callback()
1447 complete(&drv->request_firmware_complete); in iwl_req_fw_callback()
1448 device_release_driver(drv->trans->dev); in iwl_req_fw_callback()
1454 struct iwl_drv *drv; in iwl_drv_start() local
1457 drv = kzalloc(sizeof(*drv), GFP_KERNEL); in iwl_drv_start()
1458 if (!drv) { in iwl_drv_start()
1463 drv->trans = trans; in iwl_drv_start()
1464 drv->dev = trans->dev; in iwl_drv_start()
1465 drv->cfg = cfg; in iwl_drv_start()
1467 init_completion(&drv->request_firmware_complete); in iwl_drv_start()
1468 INIT_LIST_HEAD(&drv->list); in iwl_drv_start()
1472 drv->dbgfs_drv = debugfs_create_dir(dev_name(trans->dev), in iwl_drv_start()
1475 if (!drv->dbgfs_drv) { in iwl_drv_start()
1476 IWL_ERR(drv, "failed to create debugfs directory\n"); in iwl_drv_start()
1482 drv->trans->dbgfs_dir = debugfs_create_dir("trans", drv->dbgfs_drv); in iwl_drv_start()
1484 if (!drv->trans->dbgfs_dir) { in iwl_drv_start()
1485 IWL_ERR(drv, "failed to create transport debugfs directory\n"); in iwl_drv_start()
1491 ret = iwl_request_firmware(drv, true); in iwl_drv_start()
1497 return drv; in iwl_drv_start()
1502 debugfs_remove_recursive(drv->dbgfs_drv); in iwl_drv_start()
1505 kfree(drv); in iwl_drv_start()
1510 void iwl_drv_stop(struct iwl_drv *drv) in iwl_drv_stop() argument
1512 wait_for_completion(&drv->request_firmware_complete); in iwl_drv_stop()
1514 _iwl_op_mode_stop(drv); in iwl_drv_stop()
1516 iwl_dealloc_ucode(drv); in iwl_drv_stop()
1524 if (!list_empty(&drv->list)) in iwl_drv_stop()
1525 list_del(&drv->list); in iwl_drv_stop()
1529 debugfs_remove_recursive(drv->dbgfs_drv); in iwl_drv_stop()
1532 kfree(drv); in iwl_drv_stop()
1552 struct iwl_drv *drv; in iwl_opmode_register() local
1562 list_for_each_entry(drv, &op->drv, list) in iwl_opmode_register()
1563 drv->op_mode = _iwl_op_mode_start(drv, op); in iwl_opmode_register()
1576 struct iwl_drv *drv; in iwl_opmode_deregister() local
1585 list_for_each_entry(drv, &iwlwifi_opmode_table[i].drv, list) in iwl_opmode_deregister()
1586 _iwl_op_mode_stop(drv); in iwl_opmode_deregister()
1602 INIT_LIST_HEAD(&iwlwifi_opmode_table[i].drv); in iwl_drv_init()