SBP2 SCSI notes:

sbp *sbp_init(dir node *, int numorbs)
int sbp_runcmd(sbp *, sbp_cmd *);
orb *sbp_construct_orb(data *, orb data *, void *callback, cbarg)
void sbp_free(sbp *);

cmd - u_int8_t cmd[12]
      int cmdlen
      u_char *data
      int datalen (0 if data uio)
      u_int16_t lun;
      int r/w
      void (*cb)(void *, sbp2_status *)
      void *cb_arg
 
status -

	u_int8_t resp;
	u_int8_t sbp_status;
	u_int8_t object;
	u_int8_t serial_error;
	u_int32_t *data
	u_int16_t datalen;

	crc check

status orb

src
resp
dead
len 
sbp status
u_int32_t *data

sbp2 management struct:

struct ieee1394_softc *dev
mgmt register
csr regs
loginid
speed
maxpayload
mgmt orb timeout
orb size
sbp state

orb:

*need addr for orb address range
*need addr for data address range
*need addr for page table address range

abuf *
abuf count
inuse
void *request

fwscsi:

sbp2 struct
orb *
orbcount

init sbp2 (ieeesoftc and sbp2 struct)

send login packet
setup handlers for login resp
and status fifo

get login resp and clear handler
get status but leave handler for unsolicated responses.

login resp has mgmt registers pointer, save it
also contains login id, save it

setup dummy orb and get agent ready by having it fetch this

return dummy orb or NULL on error

scsi-init

setup generic status callback 

request -
 Accept packet through request routine

examine packet for data vs. cmd

cmd: 

construct orb with no data addr

data:

determine direction bit

examine packet for uio vs direct map:

direct map: 

setup read callback if <= 64k in size

else setup uio and do uio

uio:

setup unrestricted page table in 64k chunks
setup callback for each chunk
setup callback for page table

find current end of orb chain
DIAG - make sure there's room for a new orb
add new orb into chain 
setup callback to read that orb
ring doorbell

status callback - mark orb as not in use, pull data and call scsipi_done with
status
unregister all callback associated with orb

extend orbs -

allocate more orb pointers


config rom -

a typical match routine will

	find_type(type code) == X type
	find_type(type code) == X type
	...

	ex
		
	find_type(unit spec id) == sbp2
	find_type(unit sw version) == scsi

	in attach:

	call sbp2_register_print for unit directory -- fwscsi_rom_print
	direcotory entries need print callback pointer

