> in diffing bls' version and sources, i see some significant
> differences, but it's not clear which one is more up-to-date.

Brian Stuart's version is more up-to-date.

Brian Stuart based his changes on the latest changes from Richard Miller,
available in /n/sources/contrib/miller/9/bcm.

term% ape/diff -Nru /n/sources/plan9/sys/src/9/bcm/emmc.c 
/n/sources/contrib/miller/9/bcm/emmc.c
--- /n/sources/plan9/sys/src/9/bcm/emmc.c       Tue Jan 29 22:07:37 2013
+++ /n/sources/contrib/miller/9/bcm/emmc.c      Wed Mar 11 12:23:33 2015
@@ -178,7 +178,11 @@
 static int
 datadone(void*)
 {
-       return emmc.datadone;
+       int i;
+
+       u32int *r = (u32int*)EMMCREGS;
+       i = r[Interrupt];
+       return i & (Datadone|Err);
 }
 
 static int
@@ -310,9 +314,9 @@
        if((c & Respmask) == Resp48busy){
                WR(Irpten, Datadone|Err);
                tsleep(&emmc.r, datadone, 0, 3000);
-               i = emmc.datadone;
-               emmc.datadone = 0;
                WR(Irpten, 0);
+               emmc.datadone = 0;
+               i = r[Interrupt];
                if((i & Datadone) == 0)
                        print("emmcio: no Datadone after CMD%d\n", cmd);
                if(i & Err)
@@ -380,11 +384,13 @@
                        &r[Data], buf, len);
        if(dmawait(DmaChanEmmc) < 0)
                error(Eio);
+       if(!write)
+               cachedinvse(buf, len);
        WR(Irpten, Datadone|Err);
        tsleep(&emmc.r, datadone, 0, 3000);
-       i = emmc.datadone;
-       emmc.datadone = 0;
        WR(Irpten, 0);
+       emmc.datadone = 0;
+       i = r[Interrupt];
        if((i & Datadone) == 0){
                print("emmcio: %d timeout intr %ux stat %ux\n",
                        write, i, r[Status]);
@@ -407,13 +413,11 @@
 mmcinterrupt(Ureg*, void*)
 {      
        u32int *r;
-       int i;
-
        r = (u32int*)EMMCREGS;
-       i = r[Interrupt];
-       r[Interrupt] = i & (Datadone|Err);
-       emmc.datadone = i;
-       wakeup(&emmc.r);
+       if(r[Interrupt]&(Datadone|Err)){
+               WR(Irpten, 0);
+               wakeup(&emmc.r);
+       }
 }
 
 SDio sdio = {

-- 
David du Colombier

Reply via email to