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()
403 static int iwl_set_default_calib(struct iwl_drv *drv, const u8 *data) in iwl_set_default_calib() argument
409 IWL_ERR(drv, "Wrong ucode_type %u for default calibration.\n", in iwl_set_default_calib()
413 drv->fw.default_calib[ucode_type].flow_trigger = in iwl_set_default_calib()
415 drv->fw.default_calib[ucode_type].event_trigger = in iwl_set_default_calib()
421 static int iwl_set_ucode_api_flags(struct iwl_drv *drv, const u8 *data, in iwl_set_ucode_api_flags() argument
428 IWL_ERR(drv, "api_index larger than supported by driver\n"); in iwl_set_ucode_api_flags()
437 static int iwl_set_ucode_capabilities(struct iwl_drv *drv, const u8 *data, in iwl_set_ucode_capabilities() argument
444 IWL_ERR(drv, "api_index larger than supported by driver\n"); in iwl_set_ucode_capabilities()
453 static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv, in iwl_parse_v1_v2_firmware() argument
462 drv->fw.ucode_ver = le32_to_cpu(ucode->ver); in iwl_parse_v1_v2_firmware()
463 api_ver = IWL_UCODE_API(drv->fw.ucode_ver); in iwl_parse_v1_v2_firmware()
469 IWL_ERR(drv, "File size too small!\n"); in iwl_parse_v1_v2_firmware()
488 IWL_ERR(drv, "File size too small!\n"); in iwl_parse_v1_v2_firmware()
506 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) in iwl_parse_v1_v2_firmware()
511 snprintf(drv->fw.fw_version, in iwl_parse_v1_v2_firmware()
512 sizeof(drv->fw.fw_version), in iwl_parse_v1_v2_firmware()
514 IWL_UCODE_MAJOR(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
515 IWL_UCODE_MINOR(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
516 IWL_UCODE_API(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
517 IWL_UCODE_SERIAL(drv->fw.ucode_ver), in iwl_parse_v1_v2_firmware()
528 IWL_ERR(drv, in iwl_parse_v1_v2_firmware()
554 static int iwl_parse_tlv_firmware(struct iwl_drv *drv, in iwl_parse_tlv_firmware() argument
573 IWL_ERR(drv, "uCode has invalid length: %zd\n", len); in iwl_parse_tlv_firmware()
578 IWL_ERR(drv, "invalid uCode magic: 0X%x\n", in iwl_parse_tlv_firmware()
583 drv->fw.ucode_ver = le32_to_cpu(ucode->ver); in iwl_parse_tlv_firmware()
584 memcpy(drv->fw.human_readable, ucode->human_readable, in iwl_parse_tlv_firmware()
585 sizeof(drv->fw.human_readable)); in iwl_parse_tlv_firmware()
590 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) in iwl_parse_tlv_firmware()
595 snprintf(drv->fw.fw_version, in iwl_parse_tlv_firmware()
596 sizeof(drv->fw.fw_version), in iwl_parse_tlv_firmware()
598 IWL_UCODE_MAJOR(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
599 IWL_UCODE_MINOR(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
600 IWL_UCODE_API(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
601 IWL_UCODE_SERIAL(drv->fw.ucode_ver), in iwl_parse_tlv_firmware()
617 IWL_ERR(drv, "invalid TLV len: %zd/%u\n", in iwl_parse_tlv_firmware()
662 IWL_ERR(drv, "Found unexpected BOOT ucode\n"); in iwl_parse_tlv_firmware()
694 if (iwl_set_ucode_api_flags(drv, tlv_data, capa)) in iwl_parse_tlv_firmware()
700 if (iwl_set_ucode_capabilities(drv, tlv_data, capa)) in iwl_parse_tlv_firmware()
742 drv->fw.enhance_sensitivity_table = true; in iwl_parse_tlv_firmware()
771 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
776 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
781 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
786 if (iwl_set_default_calib(drv, tlv_data)) in iwl_parse_tlv_firmware()
792 drv->fw.phy_config = le32_to_cpup((__le32 *)tlv_data); in iwl_parse_tlv_firmware()
793 drv->fw.valid_tx_ant = (drv->fw.phy_config & in iwl_parse_tlv_firmware()
796 drv->fw.valid_rx_ant = (drv->fw.phy_config & in iwl_parse_tlv_firmware()
803 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
808 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
813 drv->fw.mvm_fw = true; in iwl_parse_tlv_firmware()
822 drv->fw.img[IWL_UCODE_REGULAR].is_dual_cpus = in iwl_parse_tlv_firmware()
824 drv->fw.img[IWL_UCODE_INIT].is_dual_cpus = in iwl_parse_tlv_firmware()
826 drv->fw.img[IWL_UCODE_WOWLAN].is_dual_cpus = in iwl_parse_tlv_firmware()
829 IWL_ERR(drv, "Driver support upto 2 CPUs\n"); in iwl_parse_tlv_firmware()
834 if (iwl_store_cscheme(&drv->fw, tlv_data, tlv_len)) in iwl_parse_tlv_firmware()
855 snprintf(drv->fw.fw_version, in iwl_parse_tlv_firmware()
856 sizeof(drv->fw.fw_version), "%u.%u.%u", in iwl_parse_tlv_firmware()
864 IWL_ERR(drv, in iwl_parse_tlv_firmware()
870 IWL_INFO(drv, "Found debug destination: %s\n", in iwl_parse_tlv_firmware()
873 drv->fw.dbg_dest_reg_num = in iwl_parse_tlv_firmware()
876 drv->fw.dbg_dest_reg_num /= in iwl_parse_tlv_firmware()
877 sizeof(drv->fw.dbg_dest_tlv->reg_ops[0]); in iwl_parse_tlv_firmware()
885 IWL_ERR(drv, in iwl_parse_tlv_firmware()
891 if (conf->id >= ARRAY_SIZE(drv->fw.dbg_conf_tlv)) { in iwl_parse_tlv_firmware()
892 IWL_ERR(drv, in iwl_parse_tlv_firmware()
899 IWL_ERR(drv, in iwl_parse_tlv_firmware()
908 IWL_INFO(drv, "Found debug configuration: %d\n", in iwl_parse_tlv_firmware()
920 if (trigger_id >= ARRAY_SIZE(drv->fw.dbg_trigger_tlv)) { in iwl_parse_tlv_firmware()
921 IWL_ERR(drv, in iwl_parse_tlv_firmware()
928 IWL_ERR(drv, in iwl_parse_tlv_firmware()
934 IWL_INFO(drv, "Found debug trigger: %u\n", trigger->id); in iwl_parse_tlv_firmware()
949 drv->fw.sdio_adma_addr = in iwl_parse_tlv_firmware()
953 IWL_DEBUG_INFO(drv, "unknown TLV: %d\n", tlv_type); in iwl_parse_tlv_firmware()
959 IWL_ERR(drv, in iwl_parse_tlv_firmware()
965 IWL_ERR(drv, "invalid TLV after parsing: %zd\n", len); in iwl_parse_tlv_firmware()
966 iwl_print_hex_dump(drv, IWL_DL_FW, (u8 *)data, len); in iwl_parse_tlv_firmware()
973 IWL_ERR(drv, "TLV %d has invalid size: %u\n", tlv_type, tlv_len); in iwl_parse_tlv_firmware()
975 iwl_print_hex_dump(drv, IWL_DL_FW, tlv_data, tlv_len); in iwl_parse_tlv_firmware()
980 static int iwl_alloc_ucode(struct iwl_drv *drv, in iwl_alloc_ucode() argument
988 if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]), in iwl_alloc_ucode()
994 static int validate_sec_sizes(struct iwl_drv *drv, in validate_sec_sizes() argument
998 IWL_DEBUG_INFO(drv, "f/w package hdr runtime inst size = %Zd\n", in validate_sec_sizes()
1001 IWL_DEBUG_INFO(drv, "f/w package hdr runtime data size = %Zd\n", in validate_sec_sizes()
1004 IWL_DEBUG_INFO(drv, "f/w package hdr init inst size = %Zd\n", in validate_sec_sizes()
1006 IWL_DEBUG_INFO(drv, "f/w package hdr init data size = %Zd\n", in validate_sec_sizes()
1012 IWL_ERR(drv, "uCode instr len %Zd too large to fit in\n", in validate_sec_sizes()
1020 IWL_ERR(drv, "uCode data len %Zd too large to fit in\n", in validate_sec_sizes()
1028 IWL_ERR(drv, "uCode init instr len %Zd too large to fit in\n", in validate_sec_sizes()
1036 IWL_ERR(drv, "uCode init data len %Zd too large to fit in\n", in validate_sec_sizes()
1045 _iwl_op_mode_start(struct iwl_drv *drv, struct iwlwifi_opmode_table *op) in _iwl_op_mode_start() argument
1052 drv->dbgfs_op_mode = debugfs_create_dir(op->name, in _iwl_op_mode_start()
1053 drv->dbgfs_drv); in _iwl_op_mode_start()
1054 if (!drv->dbgfs_op_mode) { in _iwl_op_mode_start()
1055 IWL_ERR(drv, in _iwl_op_mode_start()
1059 dbgfs_dir = drv->dbgfs_op_mode; in _iwl_op_mode_start()
1062 op_mode = ops->start(drv->trans, drv->cfg, &drv->fw, dbgfs_dir); in _iwl_op_mode_start()
1066 debugfs_remove_recursive(drv->dbgfs_op_mode); in _iwl_op_mode_start()
1067 drv->dbgfs_op_mode = NULL; in _iwl_op_mode_start()
1074 static void _iwl_op_mode_stop(struct iwl_drv *drv) in _iwl_op_mode_stop() argument
1077 if (drv->op_mode) { in _iwl_op_mode_stop()
1078 iwl_op_mode_stop(drv->op_mode); in _iwl_op_mode_stop()
1079 drv->op_mode = NULL; in _iwl_op_mode_stop()
1082 debugfs_remove_recursive(drv->dbgfs_op_mode); in _iwl_op_mode_stop()
1083 drv->dbgfs_op_mode = NULL; in _iwl_op_mode_stop()
1096 struct iwl_drv *drv = context; in iwl_req_fw_callback() local
1097 struct iwl_fw *fw = &drv->fw; in iwl_req_fw_callback()
1102 const unsigned int api_max = drv->cfg->ucode_api_max; in iwl_req_fw_callback()
1103 unsigned int api_ok = drv->cfg->ucode_api_ok; in iwl_req_fw_callback()
1104 const unsigned int api_min = drv->cfg->ucode_api_min; in iwl_req_fw_callback()
1123 if (drv->fw_index <= api_ok) in iwl_req_fw_callback()
1124 IWL_ERR(drv, in iwl_req_fw_callback()
1126 drv->firmware_name); in iwl_req_fw_callback()
1130 IWL_DEBUG_INFO(drv, "Loaded firmware file '%s' (%zd bytes).\n", in iwl_req_fw_callback()
1131 drv->firmware_name, ucode_raw->size); in iwl_req_fw_callback()
1135 IWL_ERR(drv, "File size way too small!\n"); in iwl_req_fw_callback()
1143 err = iwl_parse_v1_v2_firmware(drv, ucode_raw, pieces); in iwl_req_fw_callback()
1145 err = iwl_parse_tlv_firmware(drv, ucode_raw, pieces, in iwl_req_fw_callback()
1151 if (drv->fw.ucode_capa.api[0] & IWL_UCODE_TLV_API_NEW_VERSION) in iwl_req_fw_callback()
1152 api_ver = drv->fw.ucode_ver; in iwl_req_fw_callback()
1154 api_ver = IWL_UCODE_API(drv->fw.ucode_ver); in iwl_req_fw_callback()
1162 if (drv->fw_index != UCODE_EXPERIMENTAL_INDEX) { in iwl_req_fw_callback()
1164 IWL_ERR(drv, in iwl_req_fw_callback()
1173 IWL_ERR(drv, "Firmware has old API version, " in iwl_req_fw_callback()
1177 IWL_ERR(drv, "Firmware has old API version, " in iwl_req_fw_callback()
1180 IWL_ERR(drv, "New firmware can be obtained from " in iwl_req_fw_callback()
1189 if (!fw->mvm_fw && validate_sec_sizes(drv, pieces, drv->cfg)) in iwl_req_fw_callback()
1198 if (iwl_alloc_ucode(drv, pieces, i)) in iwl_req_fw_callback()
1202 drv->fw.dbg_dest_tlv = in iwl_req_fw_callback()
1206 drv->fw.dbg_dest_reg_num, GFP_KERNEL); in iwl_req_fw_callback()
1208 if (!drv->fw.dbg_dest_tlv) in iwl_req_fw_callback()
1212 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_conf_tlv); i++) { in iwl_req_fw_callback()
1214 drv->fw.dbg_conf_tlv_len[i] = in iwl_req_fw_callback()
1216 drv->fw.dbg_conf_tlv[i] = in iwl_req_fw_callback()
1218 drv->fw.dbg_conf_tlv_len[i], in iwl_req_fw_callback()
1220 if (!drv->fw.dbg_conf_tlv[i]) in iwl_req_fw_callback()
1243 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_trigger_tlv); i++) { in iwl_req_fw_callback()
1256 drv->fw.dbg_trigger_tlv_len[i] = in iwl_req_fw_callback()
1258 drv->fw.dbg_trigger_tlv[i] = in iwl_req_fw_callback()
1260 drv->fw.dbg_trigger_tlv_len[i], in iwl_req_fw_callback()
1262 if (!drv->fw.dbg_trigger_tlv[i]) in iwl_req_fw_callback()
1279 drv->cfg->base_params->max_event_log_size; in iwl_req_fw_callback()
1286 drv->cfg->base_params->max_event_log_size; in iwl_req_fw_callback()
1307 IWL_INFO(drv, "loaded firmware version %s op_mode %s\n", in iwl_req_fw_callback()
1308 drv->fw.fw_version, op->name); in iwl_req_fw_callback()
1311 list_add_tail(&drv->list, &op->drv); in iwl_req_fw_callback()
1314 drv->op_mode = _iwl_op_mode_start(drv, op); in iwl_req_fw_callback()
1316 if (!drv->op_mode) { in iwl_req_fw_callback()
1330 complete(&drv->request_firmware_complete); in iwl_req_fw_callback()
1341 IWL_ERR(drv, in iwl_req_fw_callback()
1352 if (iwl_request_firmware(drv, false)) in iwl_req_fw_callback()
1358 IWL_ERR(drv, "failed to allocate pci memory\n"); in iwl_req_fw_callback()
1359 iwl_dealloc_ucode(drv); in iwl_req_fw_callback()
1363 complete(&drv->request_firmware_complete); in iwl_req_fw_callback()
1364 device_release_driver(drv->trans->dev); in iwl_req_fw_callback()
1370 struct iwl_drv *drv; in iwl_drv_start() local
1373 drv = kzalloc(sizeof(*drv), GFP_KERNEL); in iwl_drv_start()
1374 if (!drv) { in iwl_drv_start()
1379 drv->trans = trans; in iwl_drv_start()
1380 drv->dev = trans->dev; in iwl_drv_start()
1381 drv->cfg = cfg; in iwl_drv_start()
1383 init_completion(&drv->request_firmware_complete); in iwl_drv_start()
1384 INIT_LIST_HEAD(&drv->list); in iwl_drv_start()
1388 drv->dbgfs_drv = debugfs_create_dir(dev_name(trans->dev), in iwl_drv_start()
1391 if (!drv->dbgfs_drv) { in iwl_drv_start()
1392 IWL_ERR(drv, "failed to create debugfs directory\n"); in iwl_drv_start()
1398 drv->trans->dbgfs_dir = debugfs_create_dir("trans", drv->dbgfs_drv); in iwl_drv_start()
1400 if (!drv->trans->dbgfs_dir) { in iwl_drv_start()
1401 IWL_ERR(drv, "failed to create transport debugfs directory\n"); in iwl_drv_start()
1407 ret = iwl_request_firmware(drv, true); in iwl_drv_start()
1413 return drv; in iwl_drv_start()
1418 debugfs_remove_recursive(drv->dbgfs_drv); in iwl_drv_start()
1421 kfree(drv); in iwl_drv_start()
1426 void iwl_drv_stop(struct iwl_drv *drv) in iwl_drv_stop() argument
1428 wait_for_completion(&drv->request_firmware_complete); in iwl_drv_stop()
1430 _iwl_op_mode_stop(drv); in iwl_drv_stop()
1432 iwl_dealloc_ucode(drv); in iwl_drv_stop()
1440 if (!list_empty(&drv->list)) in iwl_drv_stop()
1441 list_del(&drv->list); in iwl_drv_stop()
1445 debugfs_remove_recursive(drv->dbgfs_drv); in iwl_drv_stop()
1448 kfree(drv); in iwl_drv_stop()
1468 struct iwl_drv *drv; in iwl_opmode_register() local
1478 list_for_each_entry(drv, &op->drv, list) in iwl_opmode_register()
1479 drv->op_mode = _iwl_op_mode_start(drv, op); in iwl_opmode_register()
1492 struct iwl_drv *drv; in iwl_opmode_deregister() local
1501 list_for_each_entry(drv, &iwlwifi_opmode_table[i].drv, list) in iwl_opmode_deregister()
1502 _iwl_op_mode_stop(drv); in iwl_opmode_deregister()
1518 INIT_LIST_HEAD(&iwlwifi_opmode_table[i].drv); in iwl_drv_init()