int b1dma_detect(avmcard *card) { b1dmaoutmeml(card->mbase+AMCC_MCSR, 0); mdelay(10); b1dmaoutmeml(card->mbase+AMCC_MCSR, 0x0f000000); /* reset all */ mdelay(10); b1dmaoutmeml(card->mbase+AMCC_MCSR, 0); mdelay(42); b1dmaoutmeml(card->mbase+AMCC_RXLEN, 0); b1dmaoutmeml(card->mbase+AMCC_TXLEN, 0); card->csr = 0x0; b1dmaoutmeml(card->mbase+AMCC_INTCSR, card->csr); if (b1dmainmeml(card->mbase+AMCC_MCSR) != 0x000000E6) return 1; b1dmaoutmeml(card->mbase+AMCC_RXPTR, 0xffffffff); b1dmaoutmeml(card->mbase+AMCC_TXPTR, 0xffffffff); if ( b1dmainmeml(card->mbase+AMCC_RXPTR) != 0xfffffffc || b1dmainmeml(card->mbase+AMCC_TXPTR) != 0xfffffffc) return 2; b1dmaoutmeml(card->mbase+AMCC_RXPTR, 0x0); b1dmaoutmeml(card->mbase+AMCC_TXPTR, 0x0); if ( b1dmainmeml(card->mbase+AMCC_RXPTR) != 0x0 || b1dmainmeml(card->mbase+AMCC_TXPTR) != 0x0) return 3; t1outp(card->port, 0x10, 0x00); t1outp(card->port, 0x07, 0x00); t1outp(card->port, 0x02, 0x02); t1outp(card->port, 0x03, 0x02); if ( (t1inp(card->port, 0x02) & 0xFE) != 0x02 || t1inp(card->port, 0x3) != 0x03) return 4; t1outp(card->port, 0x02, 0x00); t1outp(card->port, 0x03, 0x00); if ( (t1inp(card->port, 0x02) & 0xFE) != 0x00 || t1inp(card->port, 0x3) != 0x01) return 5; return 0; }
static int b1dma_detect(avmcard *card) { b1dma_writel(card, 0, AMCC_MCSR); mdelay(10); b1dma_writel(card, 0x0f000000, AMCC_MCSR); /* */ mdelay(10); b1dma_writel(card, 0, AMCC_MCSR); mdelay(42); b1dma_writel(card, 0, AMCC_RXLEN); b1dma_writel(card, 0, AMCC_TXLEN); card->csr = 0x0; b1dma_writel(card, card->csr, AMCC_INTCSR); if (b1dma_readl(card, AMCC_MCSR) != 0x000000E6) return 1; b1dma_writel(card, 0xffffffff, AMCC_RXPTR); b1dma_writel(card, 0xffffffff, AMCC_TXPTR); if (b1dma_readl(card, AMCC_RXPTR) != 0xfffffffc || b1dma_readl(card, AMCC_TXPTR) != 0xfffffffc) return 2; b1dma_writel(card, 0x0, AMCC_RXPTR); b1dma_writel(card, 0x0, AMCC_TXPTR); if (b1dma_readl(card, AMCC_RXPTR) != 0x0 || b1dma_readl(card, AMCC_TXPTR) != 0x0) return 3; t1outp(card->port, 0x10, 0x00); t1outp(card->port, 0x07, 0x00); t1outp(card->port, 0x02, 0x02); t1outp(card->port, 0x03, 0x02); if ((t1inp(card->port, 0x02) & 0xFE) != 0x02 || t1inp(card->port, 0x3) != 0x03) return 4; t1outp(card->port, 0x02, 0x00); t1outp(card->port, 0x03, 0x00); if ((t1inp(card->port, 0x02) & 0xFE) != 0x00 || t1inp(card->port, 0x3) != 0x01) return 5; return 0; }
static int b1dma_fromlink(avmcard *card, void *buf, unsigned int len) { unsigned long stop = jiffies + 1 * HZ; /* maximum wait time 1 sec */ unsigned char *s = (unsigned char *)buf; while (len--) { while ( !b1dma_rx_full(card->port) && time_before(jiffies, stop)); if (!b1dma_rx_full(card->port)) return -1; *s++ = t1inp(card->port, 0x00); } return 0; }