Example #1
0
File: 53c8xx.c Project: DonCN/haiku
/*
** 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;
	}
}
Example #2
0
/*
** 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);
    }
}