Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/ic Even if the hardware can handle concurrent transf...
details: https://anonhg.NetBSD.org/src/rev/38d9967a2998
branches: trunk
changeset: 768348:38d9967a2998
user: jakllsch <jakllsch%NetBSD.org@localhost>
date: Mon Aug 15 01:04:04 2011 +0000
description:
Even if the hardware can handle concurrent transfers, ata(4) can't.
Also, completely rework mvsata_bio_ready().
Seems to make mvsata(4) usable on 5182.
diffstat:
sys/dev/ic/mvsata.c | 30 +++++++++++++++++++-----------
1 files changed, 19 insertions(+), 11 deletions(-)
diffs (116 lines):
diff -r 6cd09072eddf -r 38d9967a2998 sys/dev/ic/mvsata.c
--- a/sys/dev/ic/mvsata.c Mon Aug 15 00:30:25 2011 +0000
+++ b/sys/dev/ic/mvsata.c Mon Aug 15 01:04:04 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: mvsata.c,v 1.9 2011/08/14 16:50:49 jakllsch Exp $ */
+/* $NetBSD: mvsata.c,v 1.10 2011/08/15 01:04:04 jakllsch Exp $ */
/*
* Copyright (c) 2008 KIYOHARA Takashi
* All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.9 2011/08/14 16:50:49 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.10 2011/08/15 01:04:04 jakllsch Exp $");
#include "opt_mvsata.h"
@@ -87,7 +87,7 @@
#ifdef MVSATA_DEBUG
#define DPRINTF(x) if (mvsata_debug) printf x
#define DPRINTFN(n,x) if (mvsata_debug >= (n)) printf x
-int mvsata_debug = 3;
+int mvsata_debug = 2;
#else
#define DPRINTF(x)
#define DPRINTFN(n,x)
@@ -1216,10 +1216,6 @@
/* Wait for IRQ (either real or polled) */
if ((ata_bio->flags & ATA_POLL) == 0) {
chp->ch_flags |= ATACH_IRQ_WAIT;
-
-#if 1 /* XXXXX: Marvell SATA and mvsata(4) can accept next xfer. */
- chp->ch_queue->active_xfer = NULL;
-#endif
} else {
/* Wait for at last 400ns for status bit to be valid */
delay(1);
@@ -1254,6 +1250,8 @@
DPRINTFN(2, ("%s:%d: mvsata_bio_intr: drive=%d\n",
device_xname(atac->atac_dev), chp->ch_channel, xfer->c_drive));
+ chp->ch_flags &= ~(ATACH_IRQ_WAIT|ATACH_DMA_WAIT);
+
/* Is it not a transfer, but a control operation? */
if (!(xfer->c_flags & C_DMA) && drvp->state < READY) {
aprint_error_dev(atac->atac_dev,
@@ -1263,7 +1261,7 @@
}
/*
- * if we missed an interrupt transfer, reset and restart.
+ * If we missed an interrupt transfer, reset and restart.
* Don't try to continue transfer, we may have missed cycles.
*/
if (xfer->c_flags & C_TIMEOU) {
@@ -1394,6 +1392,7 @@
ata_bio->bcount = xfer->c_bcount;
/* mark controller inactive and free xfer */
+ KASSERT(chp->ch_queue->active_xfer != NULL);
chp->ch_queue->active_xfer = NULL;
ata_free_xfer(chp, xfer);
@@ -1411,6 +1410,7 @@
mvsata_bio_ready(struct mvsata_port *mvport, struct ata_bio *ata_bio, int drive,
int flags)
{
+#if 0
struct ata_channel *chp = &mvport->port_ata_channel;
struct atac_softc *atac = chp->ch_atac;
struct ata_drive_datas *drvp = &chp->ch_drive[drive];
@@ -1510,6 +1510,9 @@
drvp->state = 0;
MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT);
return -1;
+#endif
+ mvport->port_ata_channel.ch_drive[drive].state = READY;
+ return 0;
}
static void
@@ -2353,6 +2356,8 @@
if (rv != 0)
return rv;
+ KASSERT(mvport->port_reqtbl[quetag].xfer == NULL);
+ KASSERT(chp->ch_queue->active_xfer != NULL);
mvport->port_reqtbl[quetag].xfer = chp->ch_queue->active_xfer;
/* setup EDMA Physical Region Descriptors (ePRD) Table Data */
@@ -2466,11 +2471,12 @@
#endif
crpb = mvport->port_crpb + erpqop;
quetag = CRPB_CHOSTQUETAG(le16toh(crpb->id));
- xfer = chp->ch_queue->active_xfer =
- mvport->port_reqtbl[quetag].xfer;
+ KASSERT(chp->ch_queue->active_xfer != NULL);
+ xfer = chp->ch_queue->active_xfer;
+ KASSERT(xfer == mvport->port_reqtbl[quetag].xfer);
#ifdef DIAGNOSTIC
if (xfer == NULL)
- panic("unknwon response received: %s:%d:%d: tag 0x%x\n",
+ panic("unknown response received: %s:%d:%d: tag 0x%x\n",
device_xname(MVSATA_DEV2(mvport)),
mvport->port_hc->hc, mvport->port, quetag);
#endif
@@ -2654,6 +2660,8 @@
if (rv != 0)
return rv;
+ KASSERT(chp->ch_queue->active_xfer != NULL);
+ KASSERT(mvport->port_reqtbl[quetag].xfer == NULL);
mvport->port_reqtbl[quetag].xfer = chp->ch_queue->active_xfer;
/* setup EDMA Physical Region Descriptors (ePRD) Table Data */
Home |
Main Index |
Thread Index |
Old Index