Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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 ();
}