/* ** scsi_sim_action performes the scsi i/o command embedded in the ** passed ccb. ** ** The target/lun ids are assumed to be in range. */ static long sim_action(Symbios *s, CCB_HEADER *ccbh) { ccbh->cam_status = CAM_REQ_INPROG; switch(ccbh->cam_func_code){ case XPT_SCSI_IO: return sim_execute_scsi_io(s,ccbh); case XPT_PATH_INQ: return sim_path_inquiry(s,ccbh); case XPT_EXTENDED_PATH_INQ: return sim_extended_path_inquiry(s, ccbh); default: ccbh->cam_status = CAM_REQ_INVALID; return -1; } }
/* ** scsi_sim_action performes the scsi i/o command embedded in the ** passed ccb. ** ** The target/lun ids are assumed to be in range. */ static long sim_action(BusLogic *bl, CCB_HEADER *ccbh) { static long (*sim_functions[])(BusLogic *, CCB_HEADER *) = { sim_invalid, /* do nothing */ sim_execute_scsi_io, /* execute a scsi i/o command */ sim_invalid, /* get device type info */ sim_path_inquiry, /* path inquiry */ sim_sim_release_queue, /* release a frozen SIM queue */ sim_set_async_callback, /* set async callback parameters */ sim_invalid, /* set device type info */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_invalid, /* invalid function code */ sim_abort, /* abort the selected CCB */ sim_reset_bus, /* reset a SCSI bus */ sim_reset_device, /* reset a SCSI device */ sim_terminate_process /* terminate an i/o process */ }; uchar op; /* d_printf("buslogic: sim_execute(), op = %d\n", ccbh->cam_func_code); */ /* check for function codes out of range of dispatch table */ op = ccbh->cam_func_code; if ((op >= sizeof (sim_functions) / sizeof (long (*)())) && (op != XPT_EXTENDED_PATH_INQ)) { /* check for our vendor-uniques (if any) here... */ ccbh->cam_status = CAM_REQ_INVALID; return -1; } ccbh->cam_status = CAM_REQ_INPROG; if (op == XPT_EXTENDED_PATH_INQ) { return sim_extended_path_inquiry(bl, ccbh); } else { return (*sim_functions [op])(bl, ccbh); } }