Module Name:    src
Committed By:   macallan
Date:           Fri Jul 15 21:11:12 UTC 2016

Modified Files:
        src/sys/arch/macppc/dev: wdc_obio.c

Log Message:
- only unmap / free dbdma stuff when we actually mapped / allocated it
- use dbdma_free
now wdc_obio_detach() actually works without crashing


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/arch/macppc/dev/wdc_obio.c

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/macppc/dev/wdc_obio.c
diff -u src/sys/arch/macppc/dev/wdc_obio.c:1.58 src/sys/arch/macppc/dev/wdc_obio.c:1.59
--- src/sys/arch/macppc/dev/wdc_obio.c:1.58	Tue Jul 31 15:50:33 2012
+++ src/sys/arch/macppc/dev/wdc_obio.c	Fri Jul 15 21:11:12 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: wdc_obio.c,v 1.58 2012/07/31 15:50:33 bouyer Exp $	*/
+/*	$NetBSD: wdc_obio.c,v 1.59 2016/07/15 21:11:12 macallan Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003 The NetBSD Foundation, Inc.
@@ -30,12 +30,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wdc_obio.c,v 1.58 2012/07/31 15:50:33 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wdc_obio.c,v 1.59 2016/07/15 21:11:12 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/device.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -72,7 +72,7 @@ struct wdc_obio_softc {
 	dbdma_regmap_t *sc_dmareg;
 	dbdma_command_t	*sc_dmacmd;
 	u_int sc_dmaconf[2];	/* per target value of CONFIG_REG */
-	void *sc_ih;
+	void *sc_ih, *sc_dma;
 };
 
 static int wdc_obio_match(device_t, cfdata_t, void *);
@@ -182,7 +182,8 @@ wdc_obio_attach(device_t parent, device_
 	sc->sc_ih = intr_establish(intr, type, IPL_BIO, wdcintr, chp);
 
 	if (use_dma) {
-		sc->sc_dmacmd = dbdma_alloc(sizeof(dbdma_command_t) * 20);
+		sc->sc_dmacmd = dbdma_alloc(sizeof(dbdma_command_t) * 20,
+		    &sc->sc_dma);
 		/*
 		 * XXX
 		 * we don't use ca->ca_reg[3] for size here because at least
@@ -223,10 +224,11 @@ wdc_obio_attach(device_t parent, device_
 	} else {
 		/* all non-DMA controllers can use adjust_timing */
 		sc->sc_wdcdev.sc_atac.atac_set_modes = adjust_timing;
+		sc->sc_dmacmd = NULL;
 	}
 
 	sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
-	sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16;
+	sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 /*| ATAC_CAP_DATA32*/;
 	sc->sc_chanptr = chp;
 	sc->sc_wdcdev.sc_atac.atac_channels = &sc->sc_chanptr;
 	sc->sc_wdcdev.sc_atac.atac_nchannels = 1;
@@ -453,9 +455,12 @@ wdc_obio_detach(device_t self, int flags
 			sc->sc_wdcdev.regs->cmd_baseioh, WDC_REG_NPORTS << 4);
 
 	/* Unmap DMA registers. */
-	bus_space_unmap(sc->sc_wdcdev.regs->cmd_iot, sc->sc_dmaregh, 0x100);
-	free(sc->sc_dmacmd, M_DEVBUF);
+	if (sc->sc_dmacmd != NULL) {
 
+		bus_space_unmap(sc->sc_wdcdev.regs->cmd_iot,
+		    sc->sc_dmaregh, 0x100);
+		dbdma_free(sc->sc_dma, sizeof(dbdma_command_t) * 20);
+	}
 	return 0;
 }
 

Reply via email to