ref: a0dc0a9b1b81655ba2e9fa87f74f07a4fcea825d
parent: 4c4c8364df3ff6bf0984139e4484509ee6f6cb8a
parent: e9d0be5a6420cec4c4e443b43ea9ebb125a82f0b
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Oct 18 14:23:59 EDT 2025
merge
--- a/sys/src/9/port/etheriwl.c
+++ b/sys/src/9/port/etheriwl.c
@@ -69,6 +69,8 @@
Prepare = 1<<27,
EnablePme = 1<<28,
+ Iclsc = 0x004, /* interrupt coalescing */
+ ClscDis = 1<<31,
Isr = 0x008, /* interrupt status */
Imr = 0x00c, /* interrupt mask */
Ialive = 1<<0,
@@ -280,6 +282,7 @@
RfhDmaNrbdShift = 20,
RfhDmaMinRbSizeShift = 24,
RfhDmaDropTooLarge = 1<<26,
+ RfhDmaSingleFrame = 1<<29,
RfhDmaEnable = 1<<31,
};
@@ -512,6 +515,7 @@
uint i;
int psz;
Block **b;
+ Bpool bp;
uchar *s;
uchar *p;
uchar *u;
@@ -658,8 +662,6 @@
Type6005 = 11, /* also Centrino Advanced-N 6030, 6235 */
Type2030 = 12,
Type2000 = 16,
-
- Type7260 = 20,
};
static struct ratetab {
@@ -721,6 +723,7 @@
#define csr32r(c, r) (*((c)->nic+((r)/4)))
#define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v))
+#define csr8w(c, r, v) (*(((uchar*)(c)->nic)+(r)) = (v))
static uint
get16(uchar *p){
@@ -1114,7 +1117,7 @@
}
/* Enable the oscillator to count wake up time for L1 exit. (weird W/A) */
- if(ctlr->type == Type7260){
+ if(ctlr->pdev->did >= 0x08b1 && ctlr->pdev->did <= 0x08b4){
if((err = niclock(ctlr)) != nil)
return err;
@@ -1683,10 +1686,9 @@
assert(i < Nrx);
- b = iallocb(Rbufsize*2);
+ b = iallocbp(&ctlr->rx.bp);
if(b == nil)
return -1;
- b->rp = b->wp = (uchar*)ROUND((uintptr)b->base, Rbufsize);
memset(b->rp, 0, Rbufsize);
dmaflush(1, b->rp, Rbufsize);
coherence();
@@ -1753,6 +1755,11 @@
if(rx->p == nil || rx->b == nil || rx->s == nil)
return "no memory for rx ring";
memset(rx->s, 0, Rstatsize);
+ if(rx->bp.size == 0){
+ rx->bp.size = Rbufsize;
+ rx->bp.align = 4096;
+ growbp(&rx->bp, 2*Nrx);
+ }
for(i=0; i<Nrx; i++){
if(rx->b[i] != nil){
freeb(rx->b[i]);
@@ -1906,6 +1913,7 @@
/* Enable RX DMA */
prphwrite(ctlr, RfhDmaCfg,
RfhDmaEnable |
+ RfhDmaSingleFrame |
RfhDmaDropTooLarge |
((Rbufsize/1024) << RfhDma1KSizeShift) |
(3 << RfhDmaMinRbSizeShift) |
@@ -1921,6 +1929,8 @@
prphwrite(ctlr, RfhRxqActive, (1 << 16) | 1);
delay(1);
+ csr8w(ctlr, Iclsc, 64); /* 64*32=2048 usec */
+
csr32w(ctlr, FhRxQ0Wptr, (Nrx-1) & ~7);
delay(1);
} else {
@@ -1935,6 +1945,11 @@
FhRxConfigSingleFrame |
(Nrxlog << FhRxConfigNrbdShift));
+ csr8w(ctlr, Iclsc, 64); /* 64*32=2048 usec */
+ /* hardware bug */
+ if(ctlr->pdev->did >= 0x08b1 && ctlr->pdev->did <= 0x08b4)
+ csr32w(ctlr, Iclsc, csr32r(ctlr, Iclsc) | ClscDis);
+
csr32w(ctlr, FhRxWptr, (Nrx-1) & ~7);
}
@@ -2806,17 +2821,21 @@
}
static char*
-setmacpowermode(Ctlr *ctlr)
+setmacpowermode(Ctlr *ctlr, Wnode *bss)
{
uchar c[4 + 2+2 + 4+4+4+4 + 1+1 + 2+2 + 1+1+1+1 + 1+1+1+1 + 1+1], *p;
+ int dtim;
p = c;
put32(p, ctlr->macid);
p += 4;
- put16(p, 0); // flags
+ put16(p, 1); // flags
p += 2;
- put16(p, 5); // keep alive seconds
+ /* a value below 25 seconds results in weird behavior */
+ dtim = bss ? 3*bss->dtimperiod*bss->ival : 0;
+ dtim = (dtim*1024 + 999999)/1000000;
+ put16(p, dtim > 25 ? dtim : 25); // keep alive seconds
p += 2;
put32(p, 0); // rx data timeout
@@ -3679,7 +3698,7 @@
}
static char*
-rxon7000(Ether *edev, Ctlr *ctlr)
+rxon7000(Ether *edev, Ctlr *ctlr, Wnode *bss)
{
char *err;
@@ -3699,7 +3718,7 @@
print("can't set mcast filter: %s\n", err);
return err;
}
- if((err = setmacpowermode(ctlr)) != nil){
+ if((err = setmacpowermode(ctlr, bss)) != nil){
print("can't set mac power: %s\n", err);
return err;
}
@@ -3801,7 +3820,7 @@
edev->ctlrno, ctlr->bssid, ctlr->aid, ctlr->channel, ctlr->rxfilter, ctlr->rxflags);
if(ctlr->family >= 7000)
- err = rxon7000(edev, ctlr);
+ err = rxon7000(edev, ctlr, bss);
else
err = rxon6000(edev, ctlr);
if(err != nil)
@@ -3933,7 +3952,10 @@
put32(p, ~0); /* lifetime */
p += 4;
- /* BUG: scratch ptr? not clear what this is for */
+ /*
+ * the device makes accesses to this page
+ * to prevent host RAM going into sleep
+ */
put32(p, PCIWADDR(ctlr->kwpage));
p += 5;
@@ -4416,7 +4438,7 @@
int family;
pdev = nil;
- while(pdev = pcimatch(pdev, Vintel, 0)) {
+ while(pdev = pcimatch(pdev, 0x8086, 0)) {
Ctlr *ctlr;
void *mem;
@@ -4462,6 +4484,7 @@
fwname = "iwm-7260-17";
break;
case 0x08b3: /* Wireless AC 3160 */
+ case 0x08b4: /* Wireless AC 3160 */
family = 7000;
fwname = "iwm-3160-17";
break;
--
⑨