Author: mav
Date: Tue Nov 23 21:42:26 2010
New Revision: 215777
URL: http://svn.freebsd.org/changeset/base/215777

Log:
  MFC r215468:
  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:
  stable/8/sys/dev/ata/ata-all.c
  stable/8/sys/dev/ata/ata-all.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/ata/ata-all.c
==============================================================================
--- stable/8/sys/dev/ata/ata-all.c      Tue Nov 23 21:40:21 2010        
(r215776)
+++ stable/8/sys/dev/ata/ata-all.c      Tue Nov 23 21:42:26 2010        
(r215777)
@@ -170,7 +170,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);
@@ -1626,6 +1631,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) {
@@ -1671,9 +1678,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: stable/8/sys/dev/ata/ata-all.h
==============================================================================
--- stable/8/sys/dev/ata/ata-all.h      Tue Nov 23 21:40:21 2010        
(r215776)
+++ stable/8/sys/dev/ata/ata-all.h      Tue Nov 23 21:42:26 2010        
(r215777)
@@ -535,6 +535,7 @@ struct ata_cam_device {
        int                     mode;
        u_int                   bytecount;
        u_int                   atapi;
+       u_int                   caps;
 };
 #endif
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to