summaryrefslogtreecommitdiffstats
path: root/sys/dev/siis
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-05-02 12:07:47 +0000
committermav <mav@FreeBSD.org>2010-05-02 12:07:47 +0000
commit90843ddc5c2afced3e89219701abb4384aba3190 (patch)
treeb5c5b295203637665fed48360b91930d6b26ea37 /sys/dev/siis
parent4e502e1ceb65ddf828e427fe014e2a31cff0307a (diff)
downloadFreeBSD-src-90843ddc5c2afced3e89219701abb4384aba3190.zip
FreeBSD-src-90843ddc5c2afced3e89219701abb4384aba3190.tar.gz
Make SATA XPT negotiate and enable some additional SATA features, such as:
- device initiated power management (some devices support only this way); - Automatic Partial to Slumber Transition (more power saving); - DMA auto-activation (expected to slightly improve performance). More features could be added later, when hardware supports.
Diffstat (limited to 'sys/dev/siis')
-rw-r--r--sys/dev/siis/siis.c12
-rw-r--r--sys/dev/siis/siis.h1
2 files changed, 13 insertions, 0 deletions
diff --git a/sys/dev/siis/siis.c b/sys/dev/siis/siis.c
index c60d8e4..937d04c 100644
--- a/sys/dev/siis/siis.c
+++ b/sys/dev/siis/siis.c
@@ -448,6 +448,8 @@ siis_ch_attach(device_t dev)
ch->user[i].bytecount = 8192;
ch->user[i].tags = SIIS_MAX_SLOTS;
ch->curr[i] = ch->user[i];
+ if (ch->pm_level)
+ ch->user[i].caps = CTS_SATA_CAPS_H_PMREQ;
}
mtx_init(&ch->mtx, "SIIS channel lock", NULL, MTX_DEF);
rid = ch->unit;
@@ -1697,6 +1699,8 @@ siisaction(struct cam_sim *sim, union ccb *ccb)
}
if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS)
d->atapi = cts->xport_specific.sata.atapi;
+ if (cts->xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
+ d->caps = cts->xport_specific.sata.caps;
ccb->ccb_h.status = CAM_REQ_CMP;
break;
}
@@ -1729,9 +1733,17 @@ siisaction(struct cam_sim *sim, union ccb *ccb)
cts->xport_specific.sata.valid |=
CTS_SATA_VALID_REVISION;
}
+ cts->xport_specific.sata.caps = d->caps & CTS_SATA_CAPS_D;
+ if (ch->pm_level)
+ cts->xport_specific.sata.caps |= CTS_SATA_CAPS_H_PMREQ;
+ cts->xport_specific.sata.caps &=
+ ch->user[ccb->ccb_h.target_id].caps;
+ cts->xport_specific.sata.valid |= CTS_SATA_VALID_CAPS;
} else {
cts->xport_specific.sata.revision = d->revision;
cts->xport_specific.sata.valid |= CTS_SATA_VALID_REVISION;
+ cts->xport_specific.sata.caps = d->caps;
+ cts->xport_specific.sata.valid |= CTS_SATA_VALID_CAPS;
}
cts->xport_specific.sata.mode = d->mode;
cts->xport_specific.sata.valid |= CTS_SATA_VALID_MODE;
diff --git a/sys/dev/siis/siis.h b/sys/dev/siis/siis.h
index 92b4e26..5317628 100644
--- a/sys/dev/siis/siis.h
+++ b/sys/dev/siis/siis.h
@@ -358,6 +358,7 @@ struct siis_device {
u_int bytecount;
u_int atapi;
u_int tags;
+ u_int caps;
};
/* structure describing an ATA channel */
OpenPOWER on IntegriCloud