svn commit: r215468 - head/sys/dev/ata

Alexander Motin mav at FreeBSD.org
Thu Nov 18 19:28:46 UTC 2010


Author: mav
Date: Thu Nov 18 19:28:45 2010
New Revision: 215468
URL: http://svn.freebsd.org/changeset/base/215468

Log:
  Make ATA_CAM wrapper to report SATA power management capabilities to CAM to
  make it configure device to initiate transitions if controller configured
  to accept them. This makes hint.ata.X.pm_level=1 mode working.

Modified:
  head/sys/dev/ata/ata-all.c
  head/sys/dev/ata/ata-all.h

Modified: head/sys/dev/ata/ata-all.c
==============================================================================
--- head/sys/dev/ata/ata-all.c	Thu Nov 18 19:08:56 2010	(r215467)
+++ head/sys/dev/ata/ata-all.c	Thu Nov 18 19:28:45 2010	(r215468)
@@ -171,7 +171,12 @@ ata_attach(device_t dev)
 			ch->user[i].bytecount = 8192;
 		else
 			ch->user[i].bytecount = MAXPHYS;
+		ch->user[i].caps = 0;
 		ch->curr[i] = ch->user[i];
+		if (ch->pm_level > 0)
+			ch->user[i].caps |= CTS_SATA_CAPS_H_PMREQ;
+		if (ch->pm_level > 1)
+			ch->user[i].caps |= CTS_SATA_CAPS_D_PMREQ;
 	}
 #endif
 	callout_init(&ch->poll_callout, 1);
@@ -1627,6 +1632,8 @@ ataaction(struct cam_sim *sim, union ccb
 				d->bytecount = min(8192, cts->xport_specific.sata.bytecount);
 			if (cts->xport_specific.sata.valid & CTS_SATA_VALID_ATAPI)
 				d->atapi = cts->xport_specific.sata.atapi;
+			if (cts->xport_specific.sata.valid & CTS_SATA_VALID_CAPS)
+				d->caps = cts->xport_specific.sata.caps;
 		} else {
 			if (cts->xport_specific.ata.valid & CTS_ATA_VALID_MODE) {
 				if (cts->type == CTS_TYPE_CURRENT_SETTINGS) {
@@ -1672,9 +1679,21 @@ ataaction(struct cam_sim *sim, union 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.atapi = d->atapi;
 			cts->xport_specific.sata.valid |= CTS_SATA_VALID_ATAPI;

Modified: head/sys/dev/ata/ata-all.h
==============================================================================
--- head/sys/dev/ata/ata-all.h	Thu Nov 18 19:08:56 2010	(r215467)
+++ head/sys/dev/ata/ata-all.h	Thu Nov 18 19:28:45 2010	(r215468)
@@ -535,6 +535,7 @@ struct ata_cam_device {
 	int			mode;
 	u_int			bytecount;
 	u_int			atapi;
+	u_int			caps;
 };
 #endif
 


More information about the svn-src-head mailing list