svn commit: r202616 - in stable/8/sys: cam/ata dev/ata

Alexander Motin mav at FreeBSD.org
Tue Jan 19 13:00:33 UTC 2010


Author: mav
Date: Tue Jan 19 13:00:33 2010
New Revision: 202616
URL: http://svn.freebsd.org/changeset/base/202616

Log:
  MFC r201990:
  - Report SATA in legacy emulation mode still as SATA.
  - Make ATA XPT able to handle such case.

Modified:
  stable/8/sys/cam/ata/ata_xpt.c
  stable/8/sys/dev/ata/ata-all.c
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/cam/ata/ata_xpt.c
==============================================================================
--- stable/8/sys/cam/ata/ata_xpt.c	Tue Jan 19 12:58:29 2010	(r202615)
+++ stable/8/sys/cam/ata/ata_xpt.c	Tue Jan 19 13:00:33 2010	(r202616)
@@ -1001,7 +1001,6 @@ typedef struct {
 	union	ccb *request_ccb;
 	struct 	ccb_pathinq *cpi;
 	int	counter;
-	int	found;
 } ata_scan_bus_info;
 
 /*
@@ -1049,14 +1048,11 @@ ata_scan_bus(struct cam_periph *periph, 
 		}
 		scan_info->request_ccb = request_ccb;
 		scan_info->cpi = &work_ccb->cpi;
-		if (scan_info->cpi->transport == XPORT_ATA)
-			scan_info->found = 0x0003;
-		else
-			scan_info->found = 0x8001;
-		scan_info->counter = 0;
 		/* If PM supported, probe it first. */
 		if (scan_info->cpi->hba_inquiry & PI_SATAPM)
-			scan_info->counter = 15;
+			scan_info->counter = scan_info->cpi->max_target;
+		else
+			scan_info->counter = 0;
 
 		work_ccb = xpt_alloc_ccb_nowait();
 		if (work_ccb == NULL) {
@@ -1073,10 +1069,11 @@ ata_scan_bus(struct cam_periph *periph, 
 		/* Free the current request path- we're done with it. */
 		xpt_free_path(work_ccb->ccb_h.path);
 		/* If there is PMP... */
-		if (scan_info->counter == 15) {
+		if ((scan_info->cpi->hba_inquiry & PI_SATAPM) &&
+		    (scan_info->counter == scan_info->cpi->max_target)) {
 			if (work_ccb->ccb_h.ppriv_field1 != 0) {
 				/* everything else willbe probed by it */
-				scan_info->found = 0x8000;
+				goto done;
 			} else {
 				struct ccb_trans_settings cts;
 
@@ -1091,11 +1088,10 @@ ata_scan_bus(struct cam_periph *periph, 
 				xpt_action((union ccb *)&cts);
 			}
 		}
-take_next:
-		/* Take next device. Wrap from 15 (PM) to 0. */
-		scan_info->counter = (scan_info->counter + 1 ) & 0x0f;
-		if (scan_info->counter > scan_info->cpi->max_target -
-		    ((scan_info->cpi->hba_inquiry & PI_SATAPM) ? 1 : 0)) {
+		if (scan_info->counter ==
+		    ((scan_info->cpi->hba_inquiry & PI_SATAPM) ?
+		    0 : scan_info->cpi->max_target)) {
+done:
 			xpt_free_ccb(work_ccb);
 			xpt_free_ccb((union ccb *)scan_info->cpi);
 			request_ccb = scan_info->request_ccb;
@@ -1104,9 +1100,10 @@ take_next:
 			xpt_done(request_ccb);
 			break;
 		}
+		/* Take next device. Wrap from max (PMP) to 0. */
+		scan_info->counter = (scan_info->counter + 1 ) %
+		    (scan_info->cpi->max_target + 1);
 scan_next:
-		if ((scan_info->found & (1 << scan_info->counter)) == 0)
-			goto take_next;
 		status = xpt_create_path(&path, xpt_periph,
 		    scan_info->request_ccb->ccb_h.path_id,
 		    scan_info->counter, 0);

Modified: stable/8/sys/dev/ata/ata-all.c
==============================================================================
--- stable/8/sys/dev/ata/ata-all.c	Tue Jan 19 12:58:29 2010	(r202615)
+++ stable/8/sys/dev/ata/ata-all.c	Tue Jan 19 13:00:33 2010	(r202616)
@@ -1473,7 +1473,7 @@ ataaction(struct cam_sim *sim, union ccb
 			d = &ch->curr[ccb->ccb_h.target_id];
 		else
 			d = &ch->user[ccb->ccb_h.target_id];
-		if ((ch->flags & ATA_SATA) && (ch->flags & ATA_NO_SLAVE)) {
+		if (ch->flags & ATA_SATA) {
 			if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION)
 				d->revision = cts->xport_specific.sata.revision;
 			if (cts->xport_specific.ata.valid & CTS_SATA_VALID_MODE) {
@@ -1497,8 +1497,6 @@ ataaction(struct cam_sim *sim, union ccb
 			}
 			if (cts->xport_specific.ata.valid & CTS_ATA_VALID_BYTECOUNT)
 				d->bytecount = cts->xport_specific.ata.bytecount;
-			if (ch->flags & ATA_SATA)
-				d->bytecount = min(8192, d->bytecount);
 		}
 		ccb->ccb_h.status = CAM_REQ_CMP;
 		xpt_done(ccb);
@@ -1515,7 +1513,7 @@ ataaction(struct cam_sim *sim, union ccb
 			d = &ch->user[ccb->ccb_h.target_id];
 		cts->protocol = PROTO_ATA;
 		cts->protocol_version = PROTO_VERSION_UNSPECIFIED;
-		if ((ch->flags & ATA_SATA) && (ch->flags & ATA_NO_SLAVE)) {
+		if (ch->flags & ATA_SATA) {
 			cts->transport = XPORT_SATA;
 			cts->transport_version = XPORT_VERSION_UNSPECIFIED;
 			cts->xport_specific.sata.mode = d->mode;
@@ -1604,7 +1602,7 @@ ataaction(struct cam_sim *sim, union ccb
 		strncpy(cpi->hba_vid, "ATA", HBA_IDLEN);
 		strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
 		cpi->unit_number = cam_sim_unit(sim);
-		if ((ch->flags & ATA_SATA) && (ch->flags & ATA_NO_SLAVE))
+		if (ch->flags & ATA_SATA)
 			cpi->transport = XPORT_SATA;
 		else
 			cpi->transport = XPORT_ATA;


More information about the svn-src-stable-8 mailing list