socsvn commit: r256486 - soc2013/zcore/head/usr.sbin/bhyve

zcore at FreeBSD.org zcore at FreeBSD.org
Sun Aug 25 10:17:10 UTC 2013


Author: zcore
Date: Sun Aug 25 10:17:10 2013
New Revision: 256486
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=256486

Log:
  support ATA_SETFEATURES

Modified:
  soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c

Modified: soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c
==============================================================================
--- soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c	Sun Aug 25 10:16:43 2013	(r256485)
+++ soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c	Sun Aug 25 10:17:10 2013	(r256486)
@@ -92,6 +92,7 @@
 	uint64_t rfis;
 	int atapi;
 	int reset;
+	uint8_t xfermode;
 
 	uint32_t clb;
 	uint32_t clbu;
@@ -283,10 +284,10 @@
 static void
 ahci_port_reset(struct ahci_port *pr)
 {
-	pr->ssts = 0;
 	pr->sctl = 0;
 	pr->serr = 0;
 	pr->sact = 0;
+	pr->xfermode = ATA_UDMA6;
 
 	if (!pr->bctx) {
 		pr->ssts = ATA_SS_DET_NO_DEVICE;
@@ -363,6 +364,8 @@
 		buf[60] = sectors;
 		buf[61] = (sectors >> 16);
 		buf[63] = 0x7;
+		if (p->xfermode & ATA_WDMA0)
+			buf[63] |= (1 << ((p->xfermode & 7) + 8));
 		buf[64] = 0x3;
 		buf[65] = 100;
 		buf[66] = 100;
@@ -378,7 +381,9 @@
 		buf[85] = (1 | 1 << 14);
 		buf[86] = (1 << 10 | 1 << 12 | 1 << 13);
 		buf[87] = (1 << 14);
-		buf[88] = (0x7f | 1 << 14);
+		buf[88] = 0x7f;
+		if (p->xfermode & ATA_UDMA0)
+			buf[88] |= (1 << ((p->xfermode & 7) + 8));
 		buf[93] = (1 | 1 <<14);
 		buf[100] = sectors;
 		buf[101] = (sectors >> 16);
@@ -401,7 +406,43 @@
 		hdr->prdbc = sizeof(buf) - len;
 		p->tfd = ATA_S_DSC | ATA_S_READY;
 		p->is |= AHCI_P_IX_DP;
-		ahci_generate_intr(p->pr_sc);
+		ahci_generate_intr(sc);
+		break;
+	}
+	case ATA_SETFEATURES:
+	{
+		switch (cfis[3]) {
+		case ATA_SF_ENAB_WCACHE:
+		case ATA_SF_DIS_WCACHE:
+		case ATA_SF_ENAB_RCACHE:
+		case ATA_SF_DIS_RCACHE:
+			p->tfd = ATA_S_DSC | ATA_S_READY;
+			p->is |= AHCI_P_IX_DP;
+			ahci_generate_intr(sc);
+			break;
+		case ATA_SF_SETXFER:
+		{
+			switch (cfis[12] & 0xf8) {
+			case ATA_PIO:
+			case ATA_PIO0:
+				break;
+			case ATA_WDMA0:
+			case ATA_UDMA0:
+				p->xfermode = (cfis[12] & 0x7);
+				break;
+			}
+			p->tfd = ATA_S_DSC | ATA_S_READY;
+			p->is |= AHCI_P_IX_DP;
+			ahci_generate_intr(sc);
+			break;
+		}
+		default:
+			p->tfd = ATA_S_ERROR | ATA_S_READY;
+			p->tfd |= (ATA_ERROR_ABORT << 8);
+			p->is |= AHCI_P_IX_DP;
+			ahci_generate_intr(sc);
+			break;
+		}
 		break;
 	}
 	default:


More information about the svn-soc-all mailing list