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!
	 


