ref: 1352d29f7a5d0787cbf264babd7f661cc0322e67
parent: dda857a4d67fa12ee4cb222e672f5e989d7f26de
author: mia soweli <mia@soweli.net>
date: Mon Aug 4 06:43:12 EDT 2025
etheri225: correctly mask interrupts the interrupt mask register is write 1 to set, writing 0 has no effect. the interrupt mask clear register should be used instead to ensure interrupts are masked before looking at the cause.
--- a/sys/src/9/pc/etheri225.c
+++ b/sys/src/9/pc/etheri225.c
@@ -211,7 +211,6 @@
enum {
/* interrupts */
Ilink = 1<<2, /* interrupt link */
- Iassert = 1<<31, /* interrupt asserted */
/* interrupts (extended) */
Irx0 = 1<<0, /* rx queue 0 */
@@ -614,8 +613,8 @@
* the correct process.
*/
ilock(c);
- im = csr32r(c, Rintrmask); csr32w(c, Rintrmask, 0);
- ime = csr32r(c, Rintremask); csr32w(c, Rintremask, 0); csr32f(c);
+ im = csr32r(c, Rintrmask); csr32w(c, Rintrmaskclr, ~0);
+ ime = csr32r(c, Rintremask); csr32w(c, Rintremaskclr, ~0); csr32f(c);
i = csr32r(c, Rintrcauseclr);
ie = csr32r(c, Rintrecauseclr); csr32f(c);
@@ -1121,10 +1120,8 @@
snprint(n, sizeof(n), "#l%ds", e->ctlrno); kproc(n, i225procstat, c);
/* unmask interrupts */
- csr32w(c, Rintrmask, Iassert|Ilink);
- csr32w(c, Rintrmaskauto, 0);
+ csr32w(c, Rintrmask, Ilink);
csr32w(c, Rintremask, Itx0|Irx0);
- csr32w(c, Rintremaskauto, 0);
csr32f(c);
/* configure interrupt vector allocation for all four queues */
@@ -1260,13 +1257,13 @@
}
/* mask interrupts */
- csr32w(c, Rintrmask, 0);
+ csr32w(c, Rintrmaskclr, ~0);
csr32w(c, Rintrmaskauto, 0);
csr32w(c, Rintrcauseclr, ~0);
csr32w(c, Rintrrate, 488);
/* mask extended interrupts */
- csr32w(c, Rintremask, 0);
+ csr32w(c, Rintremaskclr, ~0);
csr32w(c, Rintremaskauto, 0);
csr32w(c, Rintrecauseclr, ~0);
csr32w(c, Rintrerate, 200);
@@ -1306,13 +1303,13 @@
}
/* mask interrupts */
- csr32w(c, Rintrmask, 0);
+ csr32w(c, Rintrmaskclr, ~0);
csr32w(c, Rintrmaskauto, 0);
csr32w(c, Rintrcauseclr, ~0);
csr32w(c, Rintrrate, 488);
/* mask extended interrupts */
- csr32w(c, Rintremask, 0);
+ csr32w(c, Rintremaskclr, ~0);
csr32w(c, Rintremaskauto, 0);
csr32w(c, Rintrecauseclr, ~0);
csr32w(c, Rintrerate, 200);
--
⑨