{
        struct iwl_fw_ini_fifo_error_dump_range *range = range_ptr;
        struct iwl_ini_txf_iter_data *iter;
+       struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data;
        u32 offs = le32_to_cpu(reg->offset), addr;
        u32 registers_size =
-               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32);
-       __le32 *val = range->data;
+               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(*reg_dump);
+       __le32 *data;
        unsigned long flags;
        int i;
 
 
        iwl_write_prph_no_grab(fwrt->trans, TXF_LARC_NUM + offs, iter->fifo);
 
-       /* read txf registers */
+       /*
+        * read txf registers. for each register, write to the dump the
+        * register address and its value
+        */
        for (i = 0; i < le32_to_cpu(reg->fifos.num_of_registers); i++) {
                addr = le32_to_cpu(reg->start_addr[i]) + offs;
 
-               *val++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
+               reg_dump->addr = cpu_to_le32(addr);
+               reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans,
+                                                                  addr));
+
+               reg_dump++;
        }
 
        if (reg->fifos.header_only) {
 
        /* Read FIFO */
        addr = TXF_READ_MODIFY_DATA + offs;
-       for (i = 0; i < iter->fifo_size; i += sizeof(__le32))
-               *val++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
+       data = (void *)reg_dump;
+       for (i = 0; i < iter->fifo_size; i += sizeof(*data))
+               *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
 
 out:
        iwl_trans_release_nic_access(fwrt->trans, &flags);
 {
        struct iwl_fw_ini_fifo_error_dump_range *range = range_ptr;
        struct iwl_ini_rxf_data rxf_data;
+       struct iwl_fw_ini_error_dump_register *reg_dump = (void *)range->data;
        u32 offs = le32_to_cpu(reg->offset), addr;
        u32 registers_size =
-               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32);
-       __le32 *val = range->data;
+               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(*reg_dump);
+       __le32 *data;
        unsigned long flags;
        int i;
 
        range->num_of_registers = reg->fifos.num_of_registers;
        range->range_data_size = cpu_to_le32(rxf_data.size + registers_size);
 
-       /* read rxf registers */
+       /*
+        * read rxf registers. for each register, write to the dump the
+        * register address and its value
+        */
        for (i = 0; i < le32_to_cpu(reg->fifos.num_of_registers); i++) {
                addr = le32_to_cpu(reg->start_addr[i]) + offs;
 
-               *val++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
+               reg_dump->addr = cpu_to_le32(addr);
+               reg_dump->data = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans,
+                                                                  addr));
+
+               reg_dump++;
        }
 
        if (reg->fifos.header_only) {
 
        /* Read FIFO */
        addr =  RXF_FIFO_RD_FENCE_INC + offs;
-       for (i = 0; i < rxf_data.size; i += sizeof(__le32))
-               *val++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
+       data = (void *)reg_dump;
+       for (i = 0; i < rxf_data.size; i += sizeof(*data))
+               *data++ = cpu_to_le32(iwl_read_prph_no_grab(fwrt->trans, addr));
 
 out:
        iwl_trans_release_nic_access(fwrt->trans, &flags);
        void *fifo_iter = fwrt->dump.fifo_iter;
        u32 size = 0;
        u32 fifo_hdr = sizeof(struct iwl_fw_ini_fifo_error_dump_range) +
-               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32);
+               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32) * 2;
 
        fwrt->dump.fifo_iter = &iter;
        while (iwl_ini_txf_iter(fwrt, reg)) {
        struct iwl_ini_rxf_data rx_data;
        u32 size = sizeof(struct iwl_fw_ini_fifo_error_dump) +
                sizeof(struct iwl_fw_ini_fifo_error_dump_range) +
-               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32);
+               le32_to_cpu(reg->fifos.num_of_registers) * sizeof(__le32) * 2;
 
        if (reg->fifos.header_only)
                return size;
 
 /* This bit is used to differentiate between lmac and umac rxf */
 #define IWL_RXF_UMAC_BIT BIT(31)
 
+/**
+ * struct iwl_fw_ini_error_dump_register - ini register dump
+ * @addr: address of the register
+ * @data: data of the register
+ */
+struct iwl_fw_ini_error_dump_register {
+       __le32 addr;
+       __le32 data;
+} __packed;
+
 /**
  * struct iwl_fw_ini_fifo_error_dump_range - ini fifo range dump
  * @fifo_num: the fifo num. In case of rxf and umac rxf, set BIT(31) to
  *     distinguish between lmac and umac
  * @num_of_registers: num of registers to dump, dword size each
- * @range_data_size: the size of the registers and fifo data
- * @data: fifo data
+ * @range_data_size: the size of the data
+ * @data: consist of
+ *     num_of_registers * (register address + register value) + fifo data
  */
 struct iwl_fw_ini_fifo_error_dump_range {
        __le32 fifo_num;