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