Changeset View
Changeset View
Standalone View
Standalone View
head/sys/cam/scsi/scsi_pass.c
Show First 20 Lines • Show All 1,140 Lines • ▼ Show 20 Lines | case XPT_SMP_IO: | ||||
numbufs = min(io_req->num_bufs, 2); | numbufs = min(io_req->num_bufs, 2); | ||||
data_ptrs[0] = &ccb->smpio.smp_request; | data_ptrs[0] = &ccb->smpio.smp_request; | ||||
data_ptrs[1] = &ccb->smpio.smp_response; | data_ptrs[1] = &ccb->smpio.smp_response; | ||||
break; | break; | ||||
case XPT_DEV_ADVINFO: | case XPT_DEV_ADVINFO: | ||||
numbufs = min(io_req->num_bufs, 1); | numbufs = min(io_req->num_bufs, 1); | ||||
data_ptrs[0] = (uint8_t **)&ccb->cdai.buf; | data_ptrs[0] = (uint8_t **)&ccb->cdai.buf; | ||||
break; | break; | ||||
case XPT_NVME_IO: | |||||
case XPT_NVME_ADMIN: | |||||
data_ptrs[0] = &ccb->nvmeio.data_ptr; | |||||
numbufs = min(io_req->num_bufs, 1); | |||||
break; | |||||
default: | default: | ||||
/* allow ourselves to be swapped once again */ | /* allow ourselves to be swapped once again */ | ||||
return; | return; | ||||
break; /* NOTREACHED */ | break; /* NOTREACHED */ | ||||
} | } | ||||
if (io_req->flags & PASS_IO_USER_SEG_MALLOC) { | if (io_req->flags & PASS_IO_USER_SEG_MALLOC) { | ||||
free(io_req->user_segptr, M_SCSIPASS); | free(io_req->user_segptr, M_SCSIPASS); | ||||
▲ Show 20 Lines • Show All 222 Lines • ▼ Show 20 Lines | case XPT_DEV_ADVINFO: | ||||
io_req->data_flags = CAM_DATA_VADDR; | io_req->data_flags = CAM_DATA_VADDR; | ||||
data_ptrs[0] = (uint8_t **)&ccb->cdai.buf; | data_ptrs[0] = (uint8_t **)&ccb->cdai.buf; | ||||
lengths[0] = ccb->cdai.bufsiz; | lengths[0] = ccb->cdai.bufsiz; | ||||
dirs[0] = CAM_DIR_IN; | dirs[0] = CAM_DIR_IN; | ||||
numbufs = 1; | numbufs = 1; | ||||
break; | break; | ||||
case XPT_NVME_ADMIN: | |||||
case XPT_NVME_IO: | |||||
if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_NONE) | |||||
return (0); | |||||
io_req->data_flags = ccb->ccb_h.flags & CAM_DATA_MASK; | |||||
/* | |||||
* We only support a single virtual address for NVMe | |||||
*/ | |||||
if ((ccb->ccb_h.flags & CAM_DATA_MASK) != CAM_DATA_VADDR) | |||||
return (EINVAL); | |||||
data_ptrs[0] = &ccb->nvmeio.data_ptr; | |||||
lengths[0] = ccb->nvmeio.dxfer_len; | |||||
dirs[0] = ccb->ccb_h.flags & CAM_DIR_MASK; | |||||
numbufs = 1; | |||||
maxmap = softc->maxio; | |||||
break; | |||||
default: | default: | ||||
return(EINVAL); | return(EINVAL); | ||||
break; /* NOTREACHED */ | break; /* NOTREACHED */ | ||||
} | } | ||||
io_req->num_bufs = numbufs; | io_req->num_bufs = numbufs; | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 557 Lines • ▼ Show 20 Lines | #endif | ||||
fc = ccb->ccb_h.func_code; | fc = ccb->ccb_h.func_code; | ||||
/* | /* | ||||
* If this function code has memory that can be mapped in | * If this function code has memory that can be mapped in | ||||
* or out, we need to call passmemsetup(). | * or out, we need to call passmemsetup(). | ||||
*/ | */ | ||||
if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) | if ((fc == XPT_SCSI_IO) || (fc == XPT_ATA_IO) | ||||
|| (fc == XPT_SMP_IO) || (fc == XPT_DEV_MATCH) | || (fc == XPT_SMP_IO) || (fc == XPT_DEV_MATCH) | ||||
|| (fc == XPT_DEV_ADVINFO)) { | || (fc == XPT_DEV_ADVINFO) | ||||
|| (fc == XPT_NVME_ADMIN) || (fc == XPT_NVME_IO)) { | |||||
error = passmemsetup(periph, io_req); | error = passmemsetup(periph, io_req); | ||||
if (error != 0) | if (error != 0) | ||||
goto camioqueue_error; | goto camioqueue_error; | ||||
} else | } else | ||||
io_req->mapinfo.num_bufs_used = 0; | io_req->mapinfo.num_bufs_used = 0; | ||||
cam_periph_lock(periph); | cam_periph_lock(periph); | ||||
▲ Show 20 Lines • Show All 289 Lines • Show Last 20 Lines |