Add Target/LUN ID checks.
This commit is contained in:
parent
4137ab7278
commit
1c92d062ed
@ -1430,6 +1430,24 @@ ata_cam_end_transaction(device_t dev, struct ata_request *request)
|
||||
ata_reinit(dev);
|
||||
}
|
||||
|
||||
static int
|
||||
ata_check_ids(device_t dev, union ccb *ccb)
|
||||
{
|
||||
struct ata_channel *ch = device_get_softc(dev);
|
||||
|
||||
if (ccb->ccb_h.target_id > ((ch->flags & ATA_NO_SLAVE) ? 0 : 1)) {
|
||||
ccb->ccb_h.status = CAM_TID_INVALID;
|
||||
xpt_done(ccb);
|
||||
return (-1);
|
||||
}
|
||||
if (ccb->ccb_h.target_lun != 0) {
|
||||
ccb->ccb_h.status = CAM_LUN_INVALID;
|
||||
xpt_done(ccb);
|
||||
return (-1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
{
|
||||
@ -1445,10 +1463,11 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
/* Common cases first */
|
||||
case XPT_ATA_IO: /* Execute the requested I/O operation */
|
||||
case XPT_SCSI_IO:
|
||||
if (ata_check_ids(dev, ccb))
|
||||
return;
|
||||
if ((ch->devices & ((ATA_ATA_MASTER | ATA_ATAPI_MASTER)
|
||||
<< ccb->ccb_h.target_id)) == 0) {
|
||||
ccb->ccb_h.status = CAM_SEL_TIMEOUT;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
if (ch->running)
|
||||
@ -1467,11 +1486,10 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
res->lba_mid = 0x14;
|
||||
}
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
ata_cam_begin_transaction(dev, ccb);
|
||||
break;
|
||||
return;
|
||||
case XPT_EN_LUN: /* Enable LUN as a target */
|
||||
case XPT_TARGET_IO: /* Execute target I/O request */
|
||||
case XPT_ACCEPT_TARGET_IO: /* Accept Host Target Mode CDB */
|
||||
@ -1479,13 +1497,14 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
case XPT_ABORT: /* Abort the specified CCB */
|
||||
/* XXX Implement */
|
||||
ccb->ccb_h.status = CAM_REQ_INVALID;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
case XPT_SET_TRAN_SETTINGS:
|
||||
{
|
||||
struct ccb_trans_settings *cts = &ccb->cts;
|
||||
struct ata_cam_device *d;
|
||||
|
||||
if (ata_check_ids(dev, ccb))
|
||||
return;
|
||||
if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
|
||||
d = &ch->curr[ccb->ccb_h.target_id];
|
||||
else
|
||||
@ -1520,7 +1539,6 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
d->atapi = cts->xport_specific.ata.atapi;
|
||||
}
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
case XPT_GET_TRAN_SETTINGS:
|
||||
@ -1528,6 +1546,8 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
struct ccb_trans_settings *cts = &ccb->cts;
|
||||
struct ata_cam_device *d;
|
||||
|
||||
if (ata_check_ids(dev, ccb))
|
||||
return;
|
||||
if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
|
||||
d = &ch->curr[ccb->ccb_h.target_id];
|
||||
else
|
||||
@ -1567,48 +1587,16 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
cts->xport_specific.ata.valid |= CTS_ATA_VALID_ATAPI;
|
||||
}
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
#if 0
|
||||
case XPT_CALC_GEOMETRY:
|
||||
{
|
||||
struct ccb_calc_geometry *ccg;
|
||||
uint32_t size_mb;
|
||||
uint32_t secs_per_cylinder;
|
||||
|
||||
ccg = &ccb->ccg;
|
||||
size_mb = ccg->volume_size
|
||||
/ ((1024L * 1024L) / ccg->block_size);
|
||||
if (size_mb >= 1024 && (aha->extended_trans != 0)) {
|
||||
if (size_mb >= 2048) {
|
||||
ccg->heads = 255;
|
||||
ccg->secs_per_track = 63;
|
||||
} else {
|
||||
ccg->heads = 128;
|
||||
ccg->secs_per_track = 32;
|
||||
}
|
||||
} else {
|
||||
ccg->heads = 64;
|
||||
ccg->secs_per_track = 32;
|
||||
}
|
||||
secs_per_cylinder = ccg->heads * ccg->secs_per_track;
|
||||
ccg->cylinders = ccg->volume_size / secs_per_cylinder;
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
case XPT_RESET_BUS: /* Reset the specified SCSI bus */
|
||||
case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */
|
||||
ata_reinit(dev);
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
case XPT_TERM_IO: /* Terminate the I/O process */
|
||||
/* XXX Implement */
|
||||
ccb->ccb_h.status = CAM_REQ_INVALID;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
case XPT_PATH_INQ: /* Path routing inquiry */
|
||||
{
|
||||
@ -1643,14 +1631,13 @@ ataaction(struct cam_sim *sim, union ccb *ccb)
|
||||
cpi->protocol_version = PROTO_VERSION_UNSPECIFIED;
|
||||
cpi->maxio = ch->dma.max_iosize ? ch->dma.max_iosize : DFLTPHYS;
|
||||
cpi->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ccb->ccb_h.status = CAM_REQ_INVALID;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
}
|
||||
xpt_done(ccb);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user