Date: Sat, 7 Sep 2013 16:05:58 GMT From: zcore@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r257081 - soc2013/zcore/head/usr.sbin/bhyve Message-ID: <201309071605.r87G5wIG076231@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: zcore Date: Sat Sep 7 16:05:58 2013 New Revision: 257081 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=257081 Log: support ATA_WRITE_DMA 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 Sat Sep 7 16:04:26 2013 (r257080) +++ soc2013/zcore/head/usr.sbin/bhyve/pci_ahci.c Sat Sep 7 16:05:58 2013 (r257081) @@ -94,7 +94,8 @@ int atapi; int reset; int mult_sectors; - uint32_t unhandled; + uint32_t unhandled_read; + uint32_t unhandled_write; uint8_t xfermode; uint32_t clb; @@ -311,9 +312,9 @@ } static void -read_dma(struct ahci_port *p, int slot, uint8_t *cfis) +handle_dma(struct ahci_port *p, int slot, uint8_t *cfis) { - int i, err; + int i, err, readop = 1; uint64_t lba; uint32_t len; struct ahci_ioreq *aior; @@ -322,6 +323,17 @@ struct ahci_prdt_entry *prdt = (struct ahci_prdt_entry *)(cfis + 0x80); struct ahci_cmd_hdr *hdr = p->cmd_lst + slot * AHCI_CL_SIZE; + if (cfis[2] == ATA_WRITE_DMA) + readop = 0; + + if (!p->iofree) { + if (readop) + p->unhandled_read |= (1 << slot); + else + p->unhandled_write |= (1 << slot); + return; + } + lba = ((cfis[7] & 0xf) << 24) | (cfis[6] << 16) | (cfis[5] << 8) | cfis[4]; lba *= blockif_sectsz(p->bctx); @@ -335,10 +347,6 @@ /* * Pull request off free list */ - if (!p->iofree) { - p->unhandled |= (1 << slot); - return; - } aior = STAILQ_FIRST(&p->iofhd); assert(aior != NULL); STAILQ_REMOVE_HEAD(&p->iofhd, io_list); @@ -358,7 +366,10 @@ breq->br_iov[i].iov_len = prdt->dbc + 1; prdt++; } - err = blockif_read(p->bctx, breq); + if (readop) + err = blockif_read(p->bctx, breq); + else + err = blockif_write(p->bctx, breq); assert(err == 0); } @@ -488,7 +499,8 @@ ahci_generate_intr(sc); break; case ATA_READ_DMA: - read_dma(p, slot, cfis); + case ATA_WRITE_DMA: + handle_dma(p, slot, cfis); break; default: break; @@ -599,10 +611,17 @@ */ if (p->ioqsz - p->iofree <= 2 && (p->cmd & AHCI_P_CMD_ST)) { int i; - for (i = 0; (i < 32) && p->unhandled; i++) { - if (p->unhandled & (1 << i)) + uint32_t unhandled = p->unhandled_read | p->unhandled_write; + for (i = 0; (i < 32) && unhandled; i++) { + if (!p->iofree) + break; + if (unhandled & (1 << i)) { handle_slot(p, i); + unhandled &= ~(1 << i); + } } + p->unhandled_read &= unhandled; + p->unhandled_write &= unhandled; } pthread_mutex_unlock(&sc->mtx);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201309071605.r87G5wIG076231>