Lines Matching refs:fwrt

92 static void iwl_read_radio_regs(struct iwl_fw_runtime *fwrt,  in iwl_read_radio_regs()  argument
99 IWL_DEBUG_INFO(fwrt, "WRT radio registers dump\n"); in iwl_read_radio_regs()
101 if (!iwl_trans_grab_nic_access(fwrt->trans, &flags)) in iwl_read_radio_regs()
111 iwl_write_prph_no_grab(fwrt->trans, RSP_RADIO_CMD, rd_cmd); in iwl_read_radio_regs()
112 *pos = (u8)iwl_read_prph_no_grab(fwrt->trans, RSP_RADIO_RDDAT); in iwl_read_radio_regs()
119 iwl_trans_release_nic_access(fwrt->trans, &flags); in iwl_read_radio_regs()
122 static void iwl_fwrt_dump_rxf(struct iwl_fw_runtime *fwrt, in iwl_fwrt_dump_rxf() argument
145 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
148 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
151 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
154 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
157 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
161 iwl_trans_write_prph(fwrt->trans, RXF_SET_FENCE_MODE + offset, 0x1); in iwl_fwrt_dump_rxf()
163 iwl_trans_write_prph(fwrt->trans, RXF_LD_WR2FENCE + offset, 0x1); in iwl_fwrt_dump_rxf()
165 iwl_trans_write_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
171 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_rxf()
177 static void iwl_fwrt_dump_txf(struct iwl_fw_runtime *fwrt, in iwl_fwrt_dump_txf() argument
200 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
203 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
206 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
209 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
212 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
216 iwl_trans_write_prph(fwrt->trans, TXF_READ_MODIFY_ADDR + offset, in iwl_fwrt_dump_txf()
220 iwl_trans_read_prph(fwrt->trans, TXF_READ_MODIFY_DATA + offset); in iwl_fwrt_dump_txf()
225 fifo_data[i] = iwl_trans_read_prph(fwrt->trans, in iwl_fwrt_dump_txf()
231 static void iwl_fw_dump_fifos(struct iwl_fw_runtime *fwrt, in iwl_fw_dump_fifos() argument
235 struct iwl_fwrt_shared_mem_cfg *cfg = &fwrt->smem_cfg; in iwl_fw_dump_fifos()
241 IWL_DEBUG_INFO(fwrt, "WRT FIFO dump\n"); in iwl_fw_dump_fifos()
243 if (!iwl_trans_grab_nic_access(fwrt->trans, &flags)) in iwl_fw_dump_fifos()
246 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_RXF)) { in iwl_fw_dump_fifos()
248 iwl_fwrt_dump_rxf(fwrt, dump_data, in iwl_fw_dump_fifos()
251 iwl_fwrt_dump_rxf(fwrt, dump_data, cfg->rxfifo2_size, in iwl_fw_dump_fifos()
254 if (fwrt->smem_cfg.num_lmacs > 1) in iwl_fw_dump_fifos()
255 iwl_fwrt_dump_rxf(fwrt, dump_data, in iwl_fw_dump_fifos()
260 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_TXF)) { in iwl_fw_dump_fifos()
262 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; i++) { in iwl_fw_dump_fifos()
264 iwl_trans_write_prph(fwrt->trans, TXF_LARC_NUM, i); in iwl_fw_dump_fifos()
265 iwl_fwrt_dump_txf(fwrt, dump_data, in iwl_fw_dump_fifos()
270 if (fwrt->smem_cfg.num_lmacs > 1) { in iwl_fw_dump_fifos()
271 for (i = 0; i < fwrt->smem_cfg.num_txfifo_entries; in iwl_fw_dump_fifos()
274 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_fifos()
277 iwl_fwrt_dump_txf(fwrt, dump_data, in iwl_fw_dump_fifos()
285 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_INTERNAL_TXF) && in iwl_fw_dump_fifos()
286 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_dump_fifos()
290 i < ARRAY_SIZE(fwrt->smem_cfg.internal_txfifo_size); in iwl_fw_dump_fifos()
294 fifo_len = fwrt->smem_cfg.internal_txfifo_size[i]; in iwl_fw_dump_fifos()
309 iwl_trans_write_prph(fwrt->trans, TXF_CPU2_NUM, i + in iwl_fw_dump_fifos()
310 fwrt->smem_cfg.num_txfifo_entries); in iwl_fw_dump_fifos()
313 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
316 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
319 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
322 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
325 cpu_to_le32(iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
329 iwl_trans_write_prph(fwrt->trans, in iwl_fw_dump_fifos()
334 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
341 iwl_trans_read_prph(fwrt->trans, in iwl_fw_dump_fifos()
347 iwl_trans_release_nic_access(fwrt->trans, &flags); in iwl_fw_dump_fifos()
559 void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt) in iwl_fw_error_dump() argument
570 const struct iwl_fw_dbg_mem_seg_tlv *fw_dbg_mem = fwrt->fw->dbg_mem_tlv; in iwl_fw_error_dump()
571 struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg; in iwl_fw_error_dump()
573 u32 smem_len = fwrt->fw->n_dbg_mem_tlv ? 0 : fwrt->trans->cfg->smem_len; in iwl_fw_error_dump()
574 u32 sram2_len = fwrt->fw->n_dbg_mem_tlv ? in iwl_fw_error_dump()
575 0 : fwrt->trans->cfg->dccm2_len; in iwl_fw_error_dump()
579 IWL_DEBUG_INFO(fwrt, "WRT dump start\n"); in iwl_fw_error_dump()
582 if (test_bit(STATUS_TRANS_DEAD, &fwrt->trans->status)) { in iwl_fw_error_dump()
583 IWL_ERR(fwrt, "Skip fw error dump since bus is dead\n"); in iwl_fw_error_dump()
587 if (fwrt->dump.trig && in iwl_fw_error_dump()
588 fwrt->dump.trig->mode & IWL_FW_DBG_TRIGGER_MONITOR_ONLY) in iwl_fw_error_dump()
596 if (!fwrt->trans->cfg->dccm_offset || !fwrt->trans->cfg->dccm_len) { in iwl_fw_error_dump()
599 img = &fwrt->fw->img[fwrt->cur_fw_img]; in iwl_fw_error_dump()
603 sram_ofs = fwrt->trans->cfg->dccm_offset; in iwl_fw_error_dump()
604 sram_len = fwrt->trans->cfg->dccm_len; in iwl_fw_error_dump()
608 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) { in iwl_fw_error_dump()
611 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_RXF)) { in iwl_fw_error_dump()
635 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_TXF)) { in iwl_fw_error_dump()
656 if ((fwrt->fw->dbg_dump_mask & in iwl_fw_error_dump()
658 fw_has_capa(&fwrt->fw->ucode_capa, in iwl_fw_error_dump()
675 if (!fwrt->trans->cfg->gen2 && in iwl_fw_error_dump()
676 fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PRPH)) { in iwl_fw_error_dump()
690 if (!fwrt->trans->cfg->gen2 && in iwl_fw_error_dump()
691 fwrt->trans->cfg->mq_rx_supported && in iwl_fw_error_dump()
692 fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PRPH)) { in iwl_fw_error_dump()
706 if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_7000 && in iwl_fw_error_dump()
707 fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_RADIO_REG)) in iwl_fw_error_dump()
716 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_DEV_FW_INFO)) in iwl_fw_error_dump()
718 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM_CFG)) in iwl_fw_error_dump()
721 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM)) { in iwl_fw_error_dump()
733 for (i = 0; i < fwrt->fw->n_dbg_mem_tlv; i++) { in iwl_fw_error_dump()
740 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING) && in iwl_fw_error_dump()
741 !fwrt->trans->cfg->gen2 && in iwl_fw_error_dump()
742 fwrt->fw->img[fwrt->cur_fw_img].paging_mem_size && in iwl_fw_error_dump()
743 fwrt->fw_paging_db[0].fw_paging_block) in iwl_fw_error_dump()
744 file_len += fwrt->num_of_paging_blk * in iwl_fw_error_dump()
755 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_ERROR_INFO) && in iwl_fw_error_dump()
756 fwrt->dump.desc) in iwl_fw_error_dump()
758 fwrt->dump.desc->len; in iwl_fw_error_dump()
760 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM) && in iwl_fw_error_dump()
761 !fwrt->fw->n_dbg_mem_tlv) in iwl_fw_error_dump()
775 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_DEV_FW_INFO)) { in iwl_fw_error_dump()
780 fwrt->trans->cfg->device_family == in iwl_fw_error_dump()
785 cpu_to_le32(CSR_HW_REV_STEP(fwrt->trans->hw_rev)); in iwl_fw_error_dump()
786 memcpy(dump_info->fw_human_readable, fwrt->fw->human_readable, in iwl_fw_error_dump()
788 strncpy(dump_info->dev_human_readable, fwrt->trans->cfg->name, in iwl_fw_error_dump()
790 strncpy(dump_info->bus_human_readable, fwrt->dev->bus->name, in iwl_fw_error_dump()
796 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM_CFG)) { in iwl_fw_error_dump()
827 if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) { in iwl_fw_error_dump()
828 iwl_fw_dump_fifos(fwrt, &dump_data); in iwl_fw_error_dump()
830 iwl_read_radio_regs(fwrt, &dump_data); in iwl_fw_error_dump()
833 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_ERROR_INFO) && in iwl_fw_error_dump()
834 fwrt->dump.desc) { in iwl_fw_error_dump()
837 fwrt->dump.desc->len); in iwl_fw_error_dump()
839 memcpy(dump_trig, &fwrt->dump.desc->trig_desc, in iwl_fw_error_dump()
840 sizeof(*dump_trig) + fwrt->dump.desc->len); in iwl_fw_error_dump()
849 if (!fwrt->fw->n_dbg_mem_tlv && in iwl_fw_error_dump()
850 fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM)) { in iwl_fw_error_dump()
856 iwl_trans_read_mem_bytes(fwrt->trans, sram_ofs, dump_mem->data, in iwl_fw_error_dump()
861 for (i = 0; i < fwrt->fw->n_dbg_mem_tlv; i++) { in iwl_fw_error_dump()
866 if (!(fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM))) in iwl_fw_error_dump()
875 IWL_DEBUG_INFO(fwrt, "WRT memory dump. Type=%u\n", in iwl_fw_error_dump()
880 iwl_trans_read_mem_bytes(fwrt->trans, ofs, in iwl_fw_error_dump()
886 success = iwl_read_prph_block(fwrt->trans, ofs, len, in iwl_fw_error_dump()
902 if (smem_len && fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM)) { in iwl_fw_error_dump()
903 IWL_DEBUG_INFO(fwrt, "WRT SMEM dump\n"); in iwl_fw_error_dump()
908 dump_mem->offset = cpu_to_le32(fwrt->trans->cfg->smem_offset); in iwl_fw_error_dump()
909 iwl_trans_read_mem_bytes(fwrt->trans, in iwl_fw_error_dump()
910 fwrt->trans->cfg->smem_offset, in iwl_fw_error_dump()
915 if (sram2_len && fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM)) { in iwl_fw_error_dump()
916 IWL_DEBUG_INFO(fwrt, "WRT SRAM dump\n"); in iwl_fw_error_dump()
921 dump_mem->offset = cpu_to_le32(fwrt->trans->cfg->dccm2_offset); in iwl_fw_error_dump()
922 iwl_trans_read_mem_bytes(fwrt->trans, in iwl_fw_error_dump()
923 fwrt->trans->cfg->dccm2_offset, in iwl_fw_error_dump()
929 if (fwrt->fw->dbg_dump_mask & BIT(IWL_FW_ERROR_DUMP_PAGING) && in iwl_fw_error_dump()
930 !fwrt->trans->cfg->gen2 && in iwl_fw_error_dump()
931 fwrt->fw->img[fwrt->cur_fw_img].paging_mem_size && in iwl_fw_error_dump()
932 fwrt->fw_paging_db[0].fw_paging_block) { in iwl_fw_error_dump()
933 IWL_DEBUG_INFO(fwrt, "WRT paging dump\n"); in iwl_fw_error_dump()
934 for (i = 1; i < fwrt->num_of_paging_blk + 1; i++) { in iwl_fw_error_dump()
937 fwrt->fw_paging_db[i].fw_paging_block; in iwl_fw_error_dump()
938 dma_addr_t addr = fwrt->fw_paging_db[i].fw_paging_phys; in iwl_fw_error_dump()
945 dma_sync_single_for_cpu(fwrt->trans->dev, addr, in iwl_fw_error_dump()
955 iwl_dump_prph(fwrt->trans, &dump_data, in iwl_fw_error_dump()
959 if (fwrt->trans->cfg->mq_rx_supported) in iwl_fw_error_dump()
960 iwl_dump_prph(fwrt->trans, &dump_data, in iwl_fw_error_dump()
966 fw_error_dump->trans_ptr = iwl_trans_dump_data(fwrt->trans, in iwl_fw_error_dump()
967 fwrt->dump.trig); in iwl_fw_error_dump()
985 dev_coredumpsg(fwrt->trans->dev, sg_dump_data, file_len, in iwl_fw_error_dump()
993 iwl_fw_free_dump_desc(fwrt); in iwl_fw_error_dump()
994 clear_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status); in iwl_fw_error_dump()
995 IWL_DEBUG_INFO(fwrt, "WRT dump done\n"); in iwl_fw_error_dump()
1006 int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt, in iwl_fw_dbg_collect_desc() argument
1027 if (WARN((fwrt->trans->state == IWL_TRANS_NO_FW) && in iwl_fw_dbg_collect_desc()
1028 fwrt->smem_cfg.num_lmacs, in iwl_fw_dbg_collect_desc()
1032 if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status)) in iwl_fw_dbg_collect_desc()
1035 if (WARN_ON(fwrt->dump.desc)) in iwl_fw_dbg_collect_desc()
1036 iwl_fw_free_dump_desc(fwrt); in iwl_fw_dbg_collect_desc()
1038 IWL_WARN(fwrt, "Collecting data: trigger %d fired.\n", in iwl_fw_dbg_collect_desc()
1041 fwrt->dump.desc = desc; in iwl_fw_dbg_collect_desc()
1042 fwrt->dump.trig = trigger; in iwl_fw_dbg_collect_desc()
1044 schedule_delayed_work(&fwrt->dump.wk, delay); in iwl_fw_dbg_collect_desc()
1050 int iwl_fw_dbg_collect(struct iwl_fw_runtime *fwrt, in iwl_fw_dbg_collect() argument
1058 IWL_WARN(fwrt, "Force restart: trigger %d fired.\n", trig); in iwl_fw_dbg_collect()
1059 iwl_force_nmi(fwrt->trans); in iwl_fw_dbg_collect()
1071 return iwl_fw_dbg_collect_desc(fwrt, desc, trigger); in iwl_fw_dbg_collect()
1075 int iwl_fw_dbg_collect_trig(struct iwl_fw_runtime *fwrt, in iwl_fw_dbg_collect_trig() argument
1102 ret = iwl_fw_dbg_collect(fwrt, le32_to_cpu(trigger->id), buf, len, in iwl_fw_dbg_collect_trig()
1113 int iwl_fw_start_dbg_conf(struct iwl_fw_runtime *fwrt, u8 conf_id) in iwl_fw_start_dbg_conf() argument
1119 if (WARN_ONCE(conf_id >= ARRAY_SIZE(fwrt->fw->dbg_conf_tlv), in iwl_fw_start_dbg_conf()
1124 if ((!fwrt->fw->dbg_conf_tlv[conf_id] || in iwl_fw_start_dbg_conf()
1125 !fwrt->fw->dbg_conf_tlv[conf_id]->num_of_hcmds) && in iwl_fw_start_dbg_conf()
1129 if (!fwrt->fw->dbg_conf_tlv[conf_id]) in iwl_fw_start_dbg_conf()
1132 if (fwrt->dump.conf != FW_DBG_INVALID) in iwl_fw_start_dbg_conf()
1133 IWL_WARN(fwrt, "FW already configured (%d) - re-configuring\n", in iwl_fw_start_dbg_conf()
1134 fwrt->dump.conf); in iwl_fw_start_dbg_conf()
1137 iwl_fw_trigger_timestamp(fwrt, 1); in iwl_fw_start_dbg_conf()
1140 ptr = (void *)&fwrt->fw->dbg_conf_tlv[conf_id]->hcmd; in iwl_fw_start_dbg_conf()
1141 for (i = 0; i < fwrt->fw->dbg_conf_tlv[conf_id]->num_of_hcmds; i++) { in iwl_fw_start_dbg_conf()
1149 ret = iwl_trans_send_cmd(fwrt->trans, &hcmd); in iwl_fw_start_dbg_conf()
1157 fwrt->dump.conf = conf_id; in iwl_fw_start_dbg_conf()
1165 struct iwl_fw_runtime *fwrt = in iwl_fw_error_dump_wk() local
1168 if (fwrt->ops && fwrt->ops->dump_start && in iwl_fw_error_dump_wk()
1169 fwrt->ops->dump_start(fwrt->ops_ctx)) in iwl_fw_error_dump_wk()
1172 if (fwrt->ops && fwrt->ops->fw_running && in iwl_fw_error_dump_wk()
1173 !fwrt->ops->fw_running(fwrt->ops_ctx)) { in iwl_fw_error_dump_wk()
1174 IWL_ERR(fwrt, "Firmware not running - cannot dump error\n"); in iwl_fw_error_dump_wk()
1175 iwl_fw_free_dump_desc(fwrt); in iwl_fw_error_dump_wk()
1176 clear_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status); in iwl_fw_error_dump_wk()
1180 if (fwrt->trans->cfg->device_family == IWL_DEVICE_FAMILY_7000) { in iwl_fw_error_dump_wk()
1182 iwl_fw_dbg_stop_recording(fwrt); in iwl_fw_error_dump_wk()
1184 iwl_fw_error_dump(fwrt); in iwl_fw_error_dump_wk()
1187 if (!test_bit(STATUS_FW_ERROR, &fwrt->trans->status) && in iwl_fw_error_dump_wk()
1188 fwrt->fw->dbg_dest_tlv) { in iwl_fw_error_dump_wk()
1189 iwl_clear_bits_prph(fwrt->trans, in iwl_fw_error_dump_wk()
1191 iwl_clear_bits_prph(fwrt->trans, in iwl_fw_error_dump_wk()
1193 iwl_set_bits_prph(fwrt->trans, in iwl_fw_error_dump_wk()
1197 u32 in_sample = iwl_read_prph(fwrt->trans, DBGC_IN_SAMPLE); in iwl_fw_error_dump_wk()
1198 u32 out_ctrl = iwl_read_prph(fwrt->trans, DBGC_OUT_CTRL); in iwl_fw_error_dump_wk()
1200 iwl_fw_dbg_stop_recording(fwrt); in iwl_fw_error_dump_wk()
1204 iwl_fw_error_dump(fwrt); in iwl_fw_error_dump_wk()
1207 if (!test_bit(STATUS_FW_ERROR, &fwrt->trans->status) && in iwl_fw_error_dump_wk()
1208 fwrt->fw->dbg_dest_tlv) { in iwl_fw_error_dump_wk()
1209 iwl_write_prph(fwrt->trans, DBGC_IN_SAMPLE, in_sample); in iwl_fw_error_dump_wk()
1210 iwl_write_prph(fwrt->trans, DBGC_OUT_CTRL, out_ctrl); in iwl_fw_error_dump_wk()
1214 if (fwrt->ops && fwrt->ops->dump_end) in iwl_fw_error_dump_wk()
1215 fwrt->ops->dump_end(fwrt->ops_ctx); in iwl_fw_error_dump_wk()