PERFORCE change 177583 for review

Alexander Motin mav at FreeBSD.org
Sun May 2 05:36:55 UTC 2010


http://p4web.freebsd.org/@@177583?ac=10

Change 177583 by mav at mav_mavtest on 2010/05/02 05:36:16

	Add SATA capabilities reporting support in mvs.
	Tune power management a bit.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.c#22 edit
.. //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.h#12 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.c#22 (text+ko) ====

@@ -121,6 +121,11 @@
 		ch->user[i].bytecount = (ch->quirks & MVS_Q_GENIIE) ? 8192 : 2048;
 		ch->user[i].tags = MVS_MAX_SLOTS;
 		ch->curr[i] = ch->user[i];
+		if (ch->pm_level) {
+			ch->user[i].caps = CTS_SATA_CAPS_H_PMREQ |
+			    CTS_SATA_CAPS_H_APST |
+			    CTS_SATA_CAPS_D_PMREQ | CTS_SATA_CAPS_D_APST;
+		}
 	}
 	rid = ch->unit;
 	if (!(ch->r_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
@@ -615,6 +620,7 @@
 {
 	struct mvs_channel *ch = device_get_softc(dev);
 	uint32_t work;
+	int timeout = 0;
 
 	work = ATA_INL(ch->r_mem, SATA_SS);
 	if (work & SATA_SS_IPM_ACTIVE)
@@ -624,6 +630,11 @@
 	work &= ~SATA_SC_SPM_MASK;
 	work |= SATA_SC_SPM_ACTIVE;
 	ATA_OUTL(ch->r_mem, SATA_SC, work);
+	/* Wait for transition to happen. */
+	while ((ATA_INL(ch->r_mem, SATA_SS) & SATA_SS_IPM_ACTIVE) == 0 &&
+	    timeout++ < 100) {
+		DELAY(100);
+	}
 }
 
 static void
@@ -1484,9 +1495,10 @@
 	if (slot->state < MVS_SLOT_RUNNING)
 		return;
 	device_printf(dev, "Timeout on slot %d\n", slot->slot);
-	device_printf(dev, "iec %08x serr %08x edma_s %08x "
+	device_printf(dev, "iec %08x sstat %08x serr %08x edma_s %08x "
 	    "dma_c %08x dma_s %08x rs %08x status %02x\n",
-	    ATA_INL(ch->r_mem, EDMA_IEC), ATA_INL(ch->r_mem, SATA_SE),
+	    ATA_INL(ch->r_mem, EDMA_IEC),
+	    ATA_INL(ch->r_mem, SATA_SS), ATA_INL(ch->r_mem, SATA_SE),
 	    ATA_INL(ch->r_mem, EDMA_S), ATA_INL(ch->r_mem, DMA_C),
 	    ATA_INL(ch->r_mem, DMA_S), ch->rslots,
 	    ATA_INB(ch->r_mem, ATA_ALTSTAT));
@@ -1653,7 +1665,8 @@
 	    et != MVS_ERR_TIMEOUT)
 		mvs_rearm_timeout(dev);
 	/* Start PM timer. */
-	if (ch->numrslots == 0 && ch->pm_level > 3) {
+	if (ch->numrslots == 0 && ch->pm_level > 3 &&
+	    (ch->curr[ch->pm_present ? 15 : 0].caps & CTS_SATA_CAPS_D_PMREQ)) {
 		callout_schedule(&ch->pm_timer,
 		    (ch->pm_level == 4) ? hz / 1000 : hz / 8);
 	}
@@ -2037,6 +2050,8 @@
 			ch->pm_present = cts->xport_specific.sata.pm_present;
 		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;
 		ccb->ccb_h.status = CAM_REQ_CMP;
 		break;
 	}
@@ -2069,9 +2084,17 @@
 				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;

==== //depot/projects/scottl-camlock/src/sys/dev/mvs/mvs.h#12 (text+ko) ====

@@ -507,6 +507,7 @@
 	u_int			bytecount;
 	u_int			atapi;
 	u_int			tags;
+	u_int			caps;
 };
 
 enum mvs_edma_mode {


More information about the p4-projects mailing list