ref: 5de941cbcf8547896e617cc9f8c0e2d8332f2d08
parent: f62e54b13dc36753e09645de993946f878e68533
author: adventuresin9 <adventuresin9@gmail.com>
date: Mon Jan 1 23:54:30 EST 2024
mt7688/uarti8250.c; fixed interrupts
--- a/sys/src/9/mt7688/uarti8250.c
+++ b/sys/src/9/mt7688/uarti8250.c
@@ -20,8 +20,7 @@
Lsr = 5, /* Line Status */
Msr = 6, /* Modem Status */
Scr = 7, /* Scratch Pad */
-// Mdr = 8, /* Mode Def'n (omap rw) missing on mt7688*/
-// Usr = 31, /* Uart Status Register; missing in omap? */
+// Mdr = 8, /* Mode Def'n (missing on mt7688)*/
Dll = 0, /* Divisor Latch LSB */
Dlm = 1, /* Divisor Latch MSB */
};
@@ -52,7 +51,7 @@
FIFOena = 0x01, /* FIFO enable */
FIFOrclr = 0x02, /* clear Rx FIFO */
FIFOtclr = 0x04, /* clear Tx FIFO */
-// FIFOdma = 0x08,
+ FIFOdma = 0x08,
FIFO1 = 0x00, /* Rx FIFO trigger level 1 byte */
FIFO4 = 0x40, /* 4 bytes */
FIFO8 = 0x80, /* 8 bytes */
@@ -76,8 +75,8 @@
enum { /* Mcr */
Dtr = 0x01, /* Data Terminal Ready */
Rts = 0x02, /* Ready To Send */
- Out1 = 0x04, /* no longer in use */
-// Ie = 0x08, /* IRQ Enable (cd_sts_ch on omap) */
+ Out1 = 0x04, /* no longer in use */
+ Out2 = 0x08,
Dm = 0x10, /* Diagnostic Mode loopback */
};
@@ -439,14 +438,7 @@
int i;
Ctlr *ctlr;
- /* nothing more to send? then disable xmit intr */
ctlr = uart->regs;
- if (uart->op >= uart->oe && qlen(uart->oq) == 0 &&
- csr8r(ctlr, Lsr) & Temt) {
- ctlr->sticky[Ier] &= ~Ethre;
- csr8w(ctlr, Ier, 0);
- return;
- }
/*
* 128 here is an arbitrary limit to make sure
@@ -460,8 +452,6 @@
if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
break;
csr8o(ctlr, Thr, *uart->op++); /* start tx */
- ctlr->sticky[Ier] |= Ethre;
- csr8w(ctlr, Ier, 0); /* intr when done */
}
}
@@ -602,8 +592,7 @@
intrenable(ctlr->irq, i8250interrupt, uart, 0, uart->name);
ctlr->iena = 1;
}
- ctlr->sticky[Ier] = Erda;
-// ctlr->sticky[Mcr] |= Ie; /* not on omap */
+ ctlr->sticky[Ier] = Ethre|Erda;
ctlr->sticky[Mcr] = 0;
}
else{
@@ -610,7 +599,7 @@
ctlr->sticky[Ier] = 0;
ctlr->sticky[Mcr] = 0;
}
- csr8w(ctlr, Ier, 0);
+ csr8w(ctlr, Ier, ctlr->sticky[Ier]);
csr8w(ctlr, Mcr, 0);
(*uart->phys->dtr)(uart, 1);