ref: e726712f6a1b3236297c3685b52ddca1094a99b5
parent: b0eedddc724d671b4482db4a7626f94f384f1a2e
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Nov 5 13:52:50 EST 2023
bcm, bcm64: handle disk activity led from sdmmc We don't want to blink the disk activity led for wifi, so handle the disk activity LED from sdmmc when it is actually used as a disk.
--- a/sys/src/9/bcm/emmc.c
+++ b/sys/src/9/bcm/emmc.c
@@ -409,11 +409,6 @@
int i;
assert((len&3) == 0);
- okay(1);
- if(waserror()){
- okay(0);
- nexterror();
- }
if(write)
dmastart(DmaChanEmmc, DmaDevEmmc, DmaM2D,
buf, &r[Data], len);
@@ -439,8 +434,6 @@
}
if(i)
WR(Interrupt, i);
- poperror();
- okay(0);
}
static void
@@ -457,6 +450,11 @@
WR(Irpten, r[Irpten] & ~i);
}
+static void
+emmcled(SDio*, int on)
+{
+ okay(on);
+}
static SDio sdio = {
"emmc",
@@ -467,6 +465,7 @@
emmciosetup,
emmcio,
emmcbus,
+ emmcled,
emmccardintr,
};
--- a/sys/src/9/bcm64/sdhc.c
+++ b/sys/src/9/bcm64/sdhc.c
@@ -452,7 +452,6 @@
else
cachedwbinvse(buf, len);
WR(Dmadesc, sdhc.busdram + (PADDR(sdhc.dma) - PHYSDRAM));
- okay(1);
}
static void
@@ -461,10 +460,6 @@
u32int *r = (u32int*)SDHCREGS;
int i;
- if(waserror()){
- okay(0);
- nexterror();
- }
WR(Irpten, r[Irpten] | Datadone|Err);
tsleep(&sdhc.r, datadone, 0, 3000);
WR(Irpten, r[Irpten] & ~(Datadone|Err));
@@ -478,8 +473,6 @@
WR(Interrupt, i);
if(!write)
cachedinvse(buf, len);
- poperror();
- okay(0);
}
static void
@@ -494,6 +487,12 @@
WR(Irpten, r[Irpten] & ~i);
}
+static void
+sdhcled(SDio*, int on)
+{
+ okay(on);
+}
+
void
sdhclink(void)
{
@@ -506,6 +505,7 @@
sdhciosetup,
sdhcio,
sdhcbus,
+ sdhcled,
};
addmmcio(&io);
}
--- a/sys/src/9/bcm64/sdhost.c
+++ b/sys/src/9/bcm64/sdhost.c
@@ -240,6 +240,12 @@
sdhosterror(i);
}
+static void
+sdhostled(SDio*, int on)
+{
+ okay(on);
+}
+
void
sdhostlink(void)
{
@@ -252,6 +258,7 @@
sdhostiosetup,
sdhostio,
sdhostbus,
+ sdhostled,
};
addmmcio(&io);
}
--- a/sys/src/9/port/sd.h
+++ b/sys/src/9/port/sd.h
@@ -197,6 +197,7 @@
void (*iosetup)(SDio*, int, void*, int, int);
void (*io)(SDio*, int, uchar*, int);
void (*bus)(SDio*, int, int);
+ void (*led)(SDio*, int);
int (*cardintr)(SDio*, int);
char nomultiwrite; /* quirk for usdhc */
void *aux;
--- a/sys/src/9/port/sdmmc.c
+++ b/sys/src/9/port/sdmmc.c
@@ -675,9 +675,13 @@
eqlock(card);
if(waserror()){
+ if(io->led != nil)
+ (*io->led)(io, 0);
qunlock(card);
nexterror();
}
+ if(io->led != nil)
+ (*io->led)(io, 1);
if(card->ismmc && unit->subno != (card->ext_csd[179]&7)){
b = (card->ext_csd[179] & ~7) | unit->subno;
@@ -714,7 +718,8 @@
buf += len;
}
}
-
+ if(io->led != nil)
+ (*io->led)(io, 0);
qunlock(card);
poperror();
--
⑨