After examining the cdupdate.c file, here's what I've gathered: order to do stuff in for firmware load: - 4x test_unit_ready on FAIL: just stop - prog_mode: sb.cdb_leng = 10; memset(sb.cdb,0,10); sb.cdb[0] = 0x3b; sb.cdb[1] = 0x5; sb.cdb[9] = 0x80; sb.data_leng = 0; sb.timeout = 1; on FAIL: just stop - sleep 1 - 4x test_unit_ready on FAIL: - restart_fas - sleep 1 - test_unit_ready - program_unit - load fw file on FAIL: return NOP - handle fw buffer (get size) on FAIL: return NOP - *understand uflgs* maybe only for pod ones, should be 0 for normal - select_unit sb.cdb[0] = 0x3b; sb.cdb[1] = 0x5; sb.cdb[2] = 1; sb.cdb[3] = uflgs; sb.cdb[6] = (u_char)(size >> 16); sb.cdb[7] = (u_char)(size >> 8); sb.cdb[8] = (u_char)size; sb.cdb[9] = 0x80; sb.data_leng = 0; sb.timeout = 1; on FAIL: return NOP - loop though MAX chunks - send_data memset(sb.cdb,0,10); sb.cdb[0] = 0x3b; sb.cdb[1] = 0x5; sb.cdb[2] = 2; sb.cdb[3] = (u_char)(offset >> 16); sb.cdb[4] = (u_char)(offset >> 8); sb.cdb[5] = (u_char)offset; sb.cdb[6] = (u_char)(amt >> 16); sb.cdb[7] = (u_char)(amt >> 8); sb.cdb[8] = (u_char)amt; sb.cdb[9] = 0x80; sb.data_leng = amt; sb.timeout = 180; db.data = ... chunk on FAIL: return FREAKY - return OK on FREAKY: warn loudly just stop on NOP: restart_fas.... just stop - restart_fas on FAIL: just stop - sleep 2 - 4x test_unit_ready on FAIL: just stop - DONE!