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;
}