Module Name:    src
Committed By:   jdolecek
Date:           Wed Sep 27 19:11:35 UTC 2017

Modified Files:
        src/sys/arch/atari/dev [jdolecek-ncq]: atari5380.c dma.c fd.c wdc_mb.c
        src/sys/arch/atari/include [jdolecek-ncq]: dma.h

Log Message:
pass ata channel interlock to st_dmagrab() so that it can release
and reacquire it if it sleeps


To generate a diff of this commit:
cvs rdiff -u -r1.62 -r1.62.8.1 src/sys/arch/atari/dev/atari5380.c
cvs rdiff -u -r1.27 -r1.27.48.1 src/sys/arch/atari/dev/dma.c
cvs rdiff -u -r1.84 -r1.84.6.1 src/sys/arch/atari/dev/fd.c
cvs rdiff -u -r1.38.28.3 -r1.38.28.4 src/sys/arch/atari/dev/wdc_mb.c
cvs rdiff -u -r1.11 -r1.11.52.1 src/sys/arch/atari/include/dma.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/atari/dev/atari5380.c
diff -u src/sys/arch/atari/dev/atari5380.c:1.62 src/sys/arch/atari/dev/atari5380.c:1.62.8.1
--- src/sys/arch/atari/dev/atari5380.c:1.62	Sat Oct 18 08:33:25 2014
+++ src/sys/arch/atari/dev/atari5380.c	Wed Sep 27 19:11:35 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: atari5380.c,v 1.62 2014/10/18 08:33:25 snj Exp $	*/
+/*	$NetBSD: atari5380.c,v 1.62.8.1 2017/09/27 19:11:35 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: atari5380.c,v 1.62 2014/10/18 08:33:25 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atari5380.c,v 1.62.8.1 2017/09/27 19:11:35 jdolecek Exp $");
 
 #include "opt_atariscsi.h"
 
@@ -794,7 +794,7 @@ falcon_claimed_dma(void)
 			return 0;
 		}
 		if (st_dmagrab((dma_farg)ncr_ctrl_intr, (dma_farg)run_main,
-		    cur_softc, &falcon_lock, 1) == 0)
+		    cur_softc, &falcon_lock, 1, NULL) == 0)
 			return 0;
 	}
 	return 1;
@@ -819,7 +819,7 @@ falcon_reconsider_dma(void)
 		 * waiting in the issue queue.
 		 */
 		st_dmagrab((dma_farg)ncr_ctrl_intr, (dma_farg)run_main,
-		    cur_softc, &falcon_lock, 0);
+		    cur_softc, &falcon_lock, 0, NULL);
 	}
 }
 

Index: src/sys/arch/atari/dev/dma.c
diff -u src/sys/arch/atari/dev/dma.c:1.27 src/sys/arch/atari/dev/dma.c:1.27.48.1
--- src/sys/arch/atari/dev/dma.c:1.27	Mon Apr 12 12:43:39 2010
+++ src/sys/arch/atari/dev/dma.c	Wed Sep 27 19:11:35 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma.c,v 1.27 2010/04/12 12:43:39 tsutsui Exp $	*/
+/*	$NetBSD: dma.c,v 1.27.48.1 2017/09/27 19:11:35 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dma.c,v 1.27 2010/04/12 12:43:39 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dma.c,v 1.27.48.1 2017/09/27 19:11:35 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -103,7 +103,7 @@ st_dma_init(void)
 
 int
 st_dmagrab(dma_farg int_func, dma_farg call_func, void *softc, int *lock_stat,
-    int rcaller)
+    int rcaller, kmutex_t *interlock)
 {
 	int s;
 	DMA_ENTRY *req;
@@ -131,7 +131,8 @@ st_dmagrab(dma_farg int_func, dma_farg c
 	if (TAILQ_FIRST(&dma_active) != req) {
 		if (call_func == NULL) {
 			do {
-				tsleep(&dma_active, PRIBIO, "dmalck", 0);
+				mtsleep(&dma_active, PRIBIO, "dmalck", 0,
+				    interlock);
 			} while (*req->lock_stat != DMA_LOCK_GRANT);
 			splx(s);
 			return 1;

Index: src/sys/arch/atari/dev/fd.c
diff -u src/sys/arch/atari/dev/fd.c:1.84 src/sys/arch/atari/dev/fd.c:1.84.6.1
--- src/sys/arch/atari/dev/fd.c:1.84	Sun Apr 26 15:15:19 2015
+++ src/sys/arch/atari/dev/fd.c	Wed Sep 27 19:11:35 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.84 2015/04/26 15:15:19 mlelstv Exp $	*/
+/*	$NetBSD: fd.c,v 1.84.6.1 2017/09/27 19:11:35 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.84 2015/04/26 15:15:19 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.84.6.1 2017/09/27 19:11:35 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -334,7 +334,7 @@ fdcattach(device_t parent, device_t self
 		fdsoftc.unit  = i;
 		fdsoftc.flags = 0;
 		st_dmagrab((dma_farg)fdcint, (dma_farg)fdtestdrv, &fdsoftc,
-		    &lock_stat, 0);
+		    &lock_stat, 0, NULL);
 		st_dmafree(&fdsoftc, &lock_stat);
 
 		if ((fdsoftc.flags & FLPF_NOTRESP) == 0) {
@@ -532,7 +532,7 @@ fdopen(dev_t dev, int flags, int devtype
 		sc->flags |= FLPF_INOPEN|FLPF_GETSTAT;
 		s = splbio();
 		st_dmagrab((dma_farg)fdcint, (dma_farg)fdstatus, sc,
-		    &lock_stat, 0);
+		    &lock_stat, 0, NULL);
 		while ((sc->flags & FLPF_GETSTAT) != 0)
 			tsleep((void *)sc, PRIBIO, "fdopen", 0);
 		splx(s);
@@ -638,7 +638,7 @@ fdstrategy(struct buf *bp)
 			callout_stop(&sc->sc_motor_ch);
 		fd_state = FLP_IDLE;
 		st_dmagrab((dma_farg)fdcint, (dma_farg)fdstart, sc,
-		    &lock_stat, 0);
+		    &lock_stat, 0, NULL);
 	}
 	splx(s);
 
@@ -769,7 +769,8 @@ fddone(register struct fd_softc *sc)
 #ifdef FLP_DEBUG
 	printf("fddone: Staring job on unit %d\n", sc1->unit);
 #endif
-	st_dmagrab((dma_farg)fdcint, (dma_farg)fdstart, sc1, &lock_stat, 0);
+	st_dmagrab((dma_farg)fdcint, (dma_farg)fdstart, sc1, &lock_stat, 0,
+	    NULL);
 }
 
 static int
@@ -1187,7 +1188,7 @@ fdmotoroff(struct fd_softc *sc)
 			int tmp;
 
 			st_dmagrab((dma_farg)fdcint, (dma_farg)fdmoff, sc,
-			    &tmp, 0);
+			    &tmp, 0, NULL);
 		} else
 			fd_state = FLP_IDLE;
 		break;

Index: src/sys/arch/atari/dev/wdc_mb.c
diff -u src/sys/arch/atari/dev/wdc_mb.c:1.38.28.3 src/sys/arch/atari/dev/wdc_mb.c:1.38.28.4
--- src/sys/arch/atari/dev/wdc_mb.c:1.38.28.3	Wed Sep 27 19:04:05 2017
+++ src/sys/arch/atari/dev/wdc_mb.c	Wed Sep 27 19:11:35 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: wdc_mb.c,v 1.38.28.3 2017/09/27 19:04:05 jdolecek Exp $	*/
+/*	$NetBSD: wdc_mb.c,v 1.38.28.4 2017/09/27 19:11:35 jdolecek Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc_mb.c,v 1.38.28.3 2017/09/27 19:04:05 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc_mb.c,v 1.38.28.4 2017/09/27 19:11:35 jdolecek Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -220,6 +220,7 @@ static int	wd_lock;
 static int
 claim_hw(struct ata_channel *chp, int maysleep)
 {
+	ata_channel_lock_owned(chp);
 
 	if (wd_lock != DMA_LOCK_GRANT) {
 		if (wd_lock == DMA_LOCK_REQ) {
@@ -230,7 +231,7 @@ claim_hw(struct ata_channel *chp, int ma
 		}
 		if (!st_dmagrab((dma_farg)wdcintr,
 		    (dma_farg)(maysleep ? NULL : wdcrestart), chp,
-		    &wd_lock, 1))
+		    &wd_lock, 1, &chp->ch_lock))
 			return 0;
 	}
 	return 1;	
@@ -239,6 +240,7 @@ claim_hw(struct ata_channel *chp, int ma
 static void
 free_hw(struct ata_channel *chp)
 {
+	ata_channel_lock_owned(chp);
 
 	/*
 	 * Flush pending interrupts before giving-up lock

Index: src/sys/arch/atari/include/dma.h
diff -u src/sys/arch/atari/include/dma.h:1.11 src/sys/arch/atari/include/dma.h:1.11.52.1
--- src/sys/arch/atari/include/dma.h:1.11	Tue Oct 20 19:10:11 2009
+++ src/sys/arch/atari/include/dma.h	Wed Sep 27 19:11:35 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: dma.h,v 1.11 2009/10/20 19:10:11 snj Exp $	*/
+/*	$NetBSD: dma.h,v 1.11.52.1 2017/09/27 19:11:35 jdolecek Exp $	*/
 
 /*
  * Copyright (c) 1995 Leo Weppelman.
@@ -91,7 +91,7 @@ struct dma {
 #ifdef _KERNEL
 typedef void (*dma_farg)(void*);
 
-int	st_dmagrab(dma_farg, dma_farg, void *, int *, int);
+int	st_dmagrab(dma_farg, dma_farg, void *, int *, int, kmutex_t *);
 void	st_dmafree(void *, int *);
 int	st_dmawanted(void);
 void	st_dmaaddr_set(void *);

Reply via email to