PERFORCE change 163659 for review

Alexander Motin mav at FreeBSD.org
Sat Jun 6 19:38:38 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=163659

Change 163659 by mav at mav_mavbook on 2009/06/06 19:38:30

	Add new port typs SATA and teach AHCI controller report
	it's real data rate, and XPT to print it.

Affected files ...

.. //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#17 edit
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#89 edit
.. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.c#12 edit
.. //depot/projects/scottl-camlock/src/sys/dev/ahci/ahci.h#5 edit

Differences ...

==== //depot/projects/scottl-camlock/src/sys/cam/cam_ccb.h#17 (text+ko) ====

@@ -228,6 +228,7 @@
 	XPORT_PPB,	/* Parallel Port Bus */
 	XPORT_ATA,	/* AT Attachment */
 	XPORT_SAS,	/* Serial Attached SCSI */
+	XPORT_SATA,	/* Serial AT Attachment */
 } cam_xport;
 
 #define PROTO_VERSION_UNKNOWN (UINT_MAX - 1)
@@ -778,6 +779,11 @@
 	u_int32_t 	bitrate;	/* Mbps */
 };
 
+struct ccb_trans_settings_sata {
+	u_int     	valid;		/* Which fields to honor */
+#define	CTS_SATA_VALID_SPEED		0x1000
+	u_int32_t 	bitrate;	/* Mbps */
+};
 
 /* Get/Set transfer rate/width/disconnection/tag queueing settings */
 struct ccb_trans_settings {
@@ -796,6 +802,7 @@
 		struct ccb_trans_settings_spi spi;
 		struct ccb_trans_settings_fc fc;
 		struct ccb_trans_settings_sas sas;
+		struct ccb_trans_settings_sata sata;
 	} xport_specific;
 };
 

==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#89 (text+ko) ====

@@ -1080,19 +1080,20 @@
 		if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0)
 			speed *= (0x01 << spi->bus_width);
 	}
-
 	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_FC) {
 		struct	ccb_trans_settings_fc *fc = &cts.xport_specific.fc;
-		if (fc->valid & CTS_FC_VALID_SPEED) {
+		if (fc->valid & CTS_FC_VALID_SPEED)
 			speed = fc->bitrate;
-		}
 	}
-
 	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SAS) {
 		struct	ccb_trans_settings_sas *sas = &cts.xport_specific.sas;
-		if (sas->valid & CTS_SAS_VALID_SPEED) {
+		if (sas->valid & CTS_SAS_VALID_SPEED)
 			speed = sas->bitrate;
-		}
+	}
+	if (cts.ccb_h.status == CAM_REQ_CMP && cts.transport == XPORT_SATA) {
+		struct	ccb_trans_settings_sata *sata = &cts.xport_specific.sata;
+		if (sata->valid & CTS_SATA_VALID_SPEED)
+			speed = sata->bitrate;
 	}
 
 	mb = speed / 1000;
@@ -3802,6 +3803,7 @@
 			new_bus->xport = scsi_get_xport();
 			break;
 		case XPORT_ATA:
+		case XPORT_SATA:
 			new_bus->xport = ata_get_xport();
 			break;
 		default:

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

@@ -109,9 +109,6 @@
 	if (pci_get_progif(dev) != PCIP_STORAGE_SATA_AHCI_1_0)
 		return (ENXIO);
 
-	if (pci_get_devid(dev) != 0x2363197b)
-		return (ENXIO);
-
 	device_set_desc_copy(dev, "AHCI controller");
 	return (BUS_PROBE_VENDOR);
 }
@@ -1694,14 +1691,26 @@
 	/* Get default/user set transfer settings for the target */
 	{
 		struct	ccb_trans_settings *cts = &ccb->cts;
+		uint32_t status;
 
 		cts->protocol = PROTO_ATA;
 		cts->protocol_version = SCSI_REV_2;
-		cts->transport = XPORT_ATA;
+		cts->transport = XPORT_SATA;
 		cts->transport_version = 2;
 		cts->proto_specific.valid = 0;
-		cts->xport_specific.valid = 0;
-
+		cts->xport_specific.sata.valid = CTS_SATA_VALID_SPEED;
+		if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
+			status = ATA_IDX_INL(ch, ATA_SSTATUS) & ATA_SS_SPD_MASK;
+		else
+			status = ATA_IDX_INL(ch, ATA_SCONTROL) & ATA_SC_SPD_MASK;
+		if (status & ATA_SS_SPD_GEN3)
+			cts->xport_specific.sata.bitrate = 600000;
+		else if (status & ATA_SS_SPD_GEN2)
+			cts->xport_specific.sata.bitrate = 300000;
+		else if (status & ATA_SS_SPD_GEN1)
+			cts->xport_specific.sata.bitrate = 150000;
+		else
+			cts->xport_specific.sata.valid = 0;
 		ccb->ccb_h.status = CAM_REQ_CMP;
 		xpt_done(ccb);
 		break;
@@ -1764,7 +1773,7 @@
 		strncpy(cpi->hba_vid, "AHCI", HBA_IDLEN);
 		strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
 		cpi->unit_number = cam_sim_unit(sim);
-		cpi->transport = XPORT_ATA;
+		cpi->transport = XPORT_SATA;
 		cpi->transport_version = 2;
 		if ((ATA_ATAPI_MASTER << ccb->ccb_h.target_id) & ch->devices)
 			cpi->protocol = PROTO_SCSI;

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

@@ -97,6 +97,7 @@
 #define         ATA_SS_SPD_NO_SPEED     0x00000000
 #define         ATA_SS_SPD_GEN1         0x00000010
 #define         ATA_SS_SPD_GEN2         0x00000020
+#define         ATA_SS_SPD_GEN3         0x00000040
 
 #define         ATA_SS_IPM_MASK         0x00000f00
 #define         ATA_SS_IPM_NO_DEVICE    0x00000000
@@ -139,6 +140,7 @@
 #define         ATA_SC_SPD_NO_SPEED     0x00000000
 #define         ATA_SC_SPD_SPEED_GEN1   0x00000010
 #define         ATA_SC_SPD_SPEED_GEN2   0x00000020
+#define         ATA_SC_SPD_SPEED_GEN3   0x00000040
 
 #define         ATA_SC_IPM_MASK         0x00000f00
 #define         ATA_SC_IPM_NONE         0x00000000


More information about the p4-projects mailing list