diff options
author | mav <mav@FreeBSD.org> | 2010-05-02 12:07:47 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-05-02 12:07:47 +0000 |
commit | 90843ddc5c2afced3e89219701abb4384aba3190 (patch) | |
tree | b5c5b295203637665fed48360b91930d6b26ea37 /sys/dev/siis | |
parent | 4e502e1ceb65ddf828e427fe014e2a31cff0307a (diff) | |
download | FreeBSD-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.c | 12 | ||||
-rw-r--r-- | sys/dev/siis/siis.h | 1 |
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 */ |