summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-all.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-04-30 08:37:00 +0000
committermav <mav@FreeBSD.org>2010-04-30 08:37:00 +0000
commit1c92d062edb474dafbad2b4ddc7290843cbfe8f9 (patch)
tree50d007f13b227d381e8c394486f834e76d06fade /sys/dev/ata/ata-all.c
parent4137ab7278be374a5f49e3baea52bbb5c8e7543f (diff)
downloadFreeBSD-src-1c92d062edb474dafbad2b4ddc7290843cbfe8f9.zip
FreeBSD-src-1c92d062edb474dafbad2b4ddc7290843cbfe8f9.tar.gz
Add Target/LUN ID checks.
Diffstat (limited to 'sys/dev/ata/ata-all.c')
-rw-r--r--sys/dev/ata/ata-all.c65
1 files changed, 26 insertions, 39 deletions
diff --git a/sys/dev/ata/ata-all.c b/sys/dev/ata/ata-all.c
index 73dfa94..5c6f0db 100644
--- a/sys/dev/ata/ata-all.c
+++ b/sys/dev/ata/ata-all.c
@@ -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
OpenPOWER on IntegriCloud