AROS_INTH1(card_level6, struct CardResource *, CardResource) { AROS_INTFUNC_INIT volatile struct GayleIO *gio = (struct GayleIO*)GAYLE_BASE; UBYTE intreq, intena; intreq = gio->intreq; if (!(intreq & GAYLE_IRQ_CCDET) ) return 0; /* not ours */ intena = gio->intena; gio->intreq = ~GAYLE_IRQ_CCDET; if (!(intena & GAYLE_IRQ_CCDET)) return 0; /* not ours either */ if (CardResource->disabled) { pcmcia_reset(CardResource); return 0; /* huh? shouldn't happen */ } CardResource->disabled = TRUE; pcmcia_reset(CardResource); Signal(CardResource->task, CardResource->signalmask); INTDEBUG(bug("PCMCIA Card Change Detect interrupt\n")); return 1; AROS_INTFUNC_EXIT }
AROS_INTH1(card_level2, struct CardResource *, CardResource) { AROS_INTFUNC_INIT struct CardHandle *cah = CardResource->ownedcard; volatile struct GayleIO *gio = (struct GayleIO*)GAYLE_BASE; UBYTE intreq, intena, status; BOOL poststatus = FALSE; intreq = gio->intreq & INTMASK; if (!intreq) return 0; /* not ours */ status = ((intreq ^ INTMASK) & INTMASK) | NOINTMASK | CardResource->resetberr; intena = gio->intena; INTDEBUG(bug("%02x %02x\n", intena, intreq)); if (!(intena & intreq)) { gio->intreq = status; return 0; /* not ours either */ } if (CardResource->disabled) { gio->intreq = status; pcmcia_reset(CardResource); return 0; /* huh? shouldn't happen */ } intreq &= intena; status = intreq; if (cah && !CardResource->removed && cah->cah_CardStatus) { if (cah->cah_CardFlags & CARDF_POSTSTATUS) poststatus = TRUE; INTDEBUG(bug("cah_CardStatus(%d,%x,%x)\n", intreq, cah->cah_CardStatus->is_Data, cah->cah_CardStatus->is_Code)); status = AROS_CARDC(cah->cah_CardStatus->is_Code, cah->cah_CardStatus->is_Data, status); INTDEBUG(bug("returned=%d\n", status)); } if (status) { status = (status ^ INTMASK) & INTMASK; gio->intreq = status | NOINTMASK | CardResource->resetberr; } if (poststatus) { INTDEBUG(bug("poststatus\n")); AROS_CARDC(cah->cah_CardStatus->is_Code, cah->cah_CardStatus->is_Data, 0); INTDEBUG(bug("returned\n")); } INTDEBUG(bug("exit\n")); return 1; AROS_INTFUNC_EXIT }
static void write_gayle_irq (uae_u8 val) { gayle_irq = (gayle_irq & val) | (val & (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR)); if ((gayle_irq & (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR)) == (GAYLE_IRQ_RESET | GAYLE_IRQ_BERR)) pcmcia_reset (); }