REG_MBOX
REG_WR16(qlt, REG_MBOX(1), 0);
REG_WR16(qlt, REG_MBOX(2), 0);
REG_WR16(qlt, REG_MBOX(3), 0);
REG_WR16(qlt, REG_MBOX(4), 0);
REG_WR16(qlt, REG_MBOX(5), 0);
REG_WR16(qlt, REG_MBOX(6), 0);
REG_WR16(qlt, REG_MBOX(7), 0);
REG_WR16(qlt, REG_MBOX(8), 0);
REG_WR16(qlt, REG_MBOX(0), MBC_GET_RESOURCE_COUNTS);
rcount = REG_RD16(qlt, REG_MBOX(3));
REG_WR16(qlt, REG_MBOX(0), MBC_SET_ADDITIONAL_FIRMWARE_OPT);
REG_WR16(qlt, REG_MBOX(1), OPT_PUREX_ENABLE);
REG_WR16(qlt, REG_MBOX(2), 0x0);
REG_WR16(qlt, REG_MBOX(3), 0x0);
REG_WR16(qlt, REG_MBOX(0), MBC_SET_PARAMETERS);
REG_WR16(qlt, REG_MBOX(1), PARAM_TYPE(PUREX_ELS_CMDS));
REG_WR16(qlt, REG_MBOX(3), LSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(2), MSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(7), LSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(6), MSW(MSD(da)));
while (REG_RD16(qlt, REG_MBOX(0)) != 0) {
REG_WR16(qlt, REG_MBOX(0), MBC_VERIFY_CHECKSUM);
REG_WR16(qlt, REG_MBOX(1), MSW(start_addr));
REG_WR16(qlt, REG_MBOX(2), LSW(start_addr));
REG_WR16(qlt, REG_MBOX(0), MBC_EXECUTE_FIRMWARE);
REG_WR16(qlt, REG_MBOX(1), MSW(start_addr));
REG_WR16(qlt, REG_MBOX(2), LSW(start_addr));
REG_WR16(qlt, REG_MBOX(3), 0);
REG_WR16(qlt, REG_MBOX(4), 1);
REG_WR16(qlt, REG_MBOX(4), 0);
REG_WR16(qlt, REG_MBOX(4), 0);
(REG_RD16(qlt, REG_MBOX(3)) << 16 |
REG_RD16(qlt, REG_MBOX(2)));
REG_WR16(qlt, REG_MBOX(0), MBC_ABOUT_FIRMWARE);
qlt->fw_major = REG_RD16(qlt, REG_MBOX(1));
qlt->fw_minor = REG_RD16(qlt, REG_MBOX(2));
qlt->fw_subminor = REG_RD16(qlt, REG_MBOX(3));
qlt->fw_endaddrlo = REG_RD16(qlt, REG_MBOX(4));
qlt->fw_endaddrhi = REG_RD16(qlt, REG_MBOX(5));
qlt->fw_attr = REG_RD16(qlt, REG_MBOX(6));
REG_RD16(qlt, REG_MBOX(4)),
REG_RD16(qlt, REG_MBOX(5)));
REG_RD16(qlt, REG_MBOX(18)),
REG_RD16(qlt, REG_MBOX(19)));
REG_RD16(qlt, REG_MBOX(20)),
REG_RD16(qlt, REG_MBOX(21)));
REG_RD16(qlt, REG_MBOX(22)),
REG_RD16(qlt, REG_MBOX(23)));
REG_RD16(qlt, REG_MBOX(24)),
REG_RD16(qlt, REG_MBOX(25)));
REG_WR16(qlt, REG_MBOX(0), MBC_LOAD_RAM_EXTENDED);
REG_WR16(qlt, REG_MBOX(1), LSW(risc_addr));
REG_WR16(qlt, REG_MBOX(8), MSW(cur_risc_addr));
REG_WR16(qlt, REG_MBOX(3), LSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(2), MSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(7), LSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(6), MSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(5), LSW(words_being_sent));
REG_WR16(qlt, REG_MBOX(4), MSW(words_being_sent));
uint16_t mbox0 = REG_RD16(qlt, REG_MBOX(0));
mbox0 = REG_RD16(qlt, REG_MBOX(0));
mbox1 = REG_RD16(qlt, REG_MBOX(1));
mbox2 = REG_RD16(qlt, REG_MBOX(2));
mbox3 = REG_RD16(qlt, REG_MBOX(3));
mbox4 = REG_RD16(qlt, REG_MBOX(4));
mbox5 = REG_RD16(qlt, REG_MBOX(5));
mbox6 = REG_RD16(qlt, REG_MBOX(6));
mbox7 = REG_RD16(qlt, REG_MBOX(7));
REG_WR16(qlt, REG_MBOX(i), mcp->to_fw[i]);
mbox1 = REG_RD16(qlt, REG_MBOX(1));
mbox2 = REG_RD16(qlt, REG_MBOX(2));
mbox3 = REG_RD16(qlt, REG_MBOX(3));
mbox4 = REG_RD16(qlt, REG_MBOX(4));
mbox5 = REG_RD16(qlt, REG_MBOX(5));
mbox6 = REG_RD16(qlt, REG_MBOX(6));
REG_RD16(qlt, REG_MBOX(i));
uint16_t mbox1 = REG_RD16(qlt, REG_MBOX(1));
uint16_t mbox2 = REG_RD16(qlt, REG_MBOX(2));
uint16_t mbox3 = REG_RD16(qlt, REG_MBOX(3));
uint16_t mbox4 = REG_RD16(qlt, REG_MBOX(4));
uint16_t mbox5 = REG_RD16(qlt, REG_MBOX(5));
uint16_t mbox6 = REG_RD16(qlt, REG_MBOX(6));
REG_RD16(qlt, REG_MBOX(i));
REG_WR16(qlt, REG_MBOX(0), MBC_DUMP_RAM_EXTENDED);
REG_WR16(qlt, REG_MBOX(3), LSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(2), MSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(7), LSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(6), MSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(5), LSW(words));
REG_WR16(qlt, REG_MBOX(4), MSW(words));
REG_WR16(qlt, REG_MBOX(1), LSW(addr));
REG_WR16(qlt, REG_MBOX(8), MSW(addr));
REG_WR16(qlt, REG_MBOX(0), MBC_MPI_RAM);
REG_WR16(qlt, REG_MBOX(3), LSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(2), MSW(LSD(da)));
REG_WR16(qlt, REG_MBOX(7), LSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(6), MSW(MSD(da)));
REG_WR16(qlt, REG_MBOX(5), LSW(words));
REG_WR16(qlt, REG_MBOX(4), MSW(words));
REG_WR16(qlt, REG_MBOX(1), LSW(addr));
REG_WR16(qlt, REG_MBOX(8), MSW(addr));
REG_WR16(qlt, REG_MBOX(9), direction);
REG_WR16(qlt, REG_MBOX(0), MBC_WRITE_RAM_EXTENDED);
REG_WR16(qlt, REG_MBOX(1), LSW(risc_address));
REG_WR16(qlt, REG_MBOX(2), LSW(data));
REG_WR16(qlt, REG_MBOX(3), MSW(data));
REG_WR16(qlt, REG_MBOX(8), MSW(risc_address));
REG_WR16(qlt, REG_MBOX(0), MBC_READ_RAM_EXTENDED);
REG_WR16(qlt, REG_MBOX(1), LSW(risc_address));
REG_WR16(qlt, REG_MBOX(2), MSW(risc_address));
*data = REG_RD16(qlt, REG_MBOX(2));
*data |= (REG_RD16(qlt, REG_MBOX(3)) << 16);