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