Port-atari archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Current kernel with http://gnats.netbsd.org/39965 and pmap patches
tjamaloo%gmail.com@localhost wrote:
> > By the way, which interrupt (level and vector) is used
> > for the IDE interface on Falcon?
>
> I don't know :/ Maybe we can find more information from some Atari documents.
According to Linux sources, it uses the same interrupt
with FDC/ASCI DMA (71), so I guess that's the reason why
current wdc_mb.c uses dma hooks to handle it.
On the other hand, it seems atari/intr.c:intr_establish()
can handle multiple interrupt handlers in the same vector.
How about this patch?
(though I'm not sure if we should also handle the MFP->mf_iprb register)
---
Index: dev/wdc_mb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/dev/wdc_mb.c,v
retrieving revision 1.32
diff -u -r1.32 wdc_mb.c
--- dev/wdc_mb.c 28 Apr 2008 20:23:15 -0000 1.32
+++ dev/wdc_mb.c 21 Dec 2008 19:19:16 -0000
@@ -52,6 +52,7 @@
#include <atari/dev/ym2149reg.h>
#include <atari/atari/device.h>
+#include <atari/atari/intr.h>
/* Falcon IDE register locations (base and offsets). */
#define FALCON_WD_BASE 0xfff00000
@@ -61,8 +62,7 @@
/*
* XXX This code currently doesn't even try to allow 32-bit data port use.
*/
-static int claim_hw (struct ata_channel *, int);
-static void free_hw (struct ata_channel *);
+static int wdc_mb_intr(void *, int);
static void read_multi_2_swap (bus_space_tag_t, bus_space_handle_t,
bus_size_t, u_int16_t *, bus_size_t);
static void write_multi_2_swap (bus_space_tag_t, bus_space_handle_t,
@@ -199,8 +199,6 @@
sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 |
ATAC_CAP_ATA_NOSTREAM;
sc->sc_wdcdev.sc_atac.atac_pio_cap = 0;
- sc->sc_wdcdev.sc_atac.atac_claim_hw = &claim_hw;
- sc->sc_wdcdev.sc_atac.atac_free_hw = &free_hw;
sc->sc_chanlist[0] = &sc->sc_channel;
sc->sc_wdcdev.sc_atac.atac_channels = sc->sc_chanlist;
sc->sc_wdcdev.sc_atac.atac_nchannels = 1;
@@ -210,6 +208,13 @@
sc->sc_channel.ch_ndrive = 2;
wdc_init_shadow_regs(&sc->sc_channel);
+ sc->sc_ih =
+ intr_establish(7, USER_VEC, 0, wdc_mb_intr, &sc->sc_channel);
+ if (sc->sc_ih == NULL) {
+ aprint_error_dev(self, "can't establish interrupt\n");
+ return;
+ }
+
/*
* Setup & enable disk related interrupts.
*/
@@ -220,45 +225,11 @@
wdcattach(&sc->sc_channel);
}
-/*
- * Hardware locking
- */
-static int wd_lock;
-
static int
-claim_hw(chp, maysleep)
-struct ata_channel *chp;
-int maysleep;
-{
- if (wd_lock != DMA_LOCK_GRANT) {
- if (wd_lock == DMA_LOCK_REQ) {
- /*
- * ST_DMA access is being claimed.
- */
- return 0;
- }
- if (!st_dmagrab((dma_farg)wdcintr,
- (dma_farg)(maysleep ? NULL : wdcrestart), chp,
- &wd_lock, 1))
- return 0;
- }
- return 1;
-}
-
-static void
-free_hw(chp)
-struct ata_channel *chp;
+wdc_mb_intr(void *arg, int sr)
{
- /*
- * Flush pending interrupts before giving-up lock
- */
- MFP->mf_iprb = (u_int8_t)~IB_DINT;
- /*
- * Only free the lock on a Falcon. On the Hades, keep it.
- */
-/* if (machineid & ATARI_FALCON) */
- st_dmafree(chp, &wd_lock);
+ return wdcintr(arg);
}
/*
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index