diff -r 252d9b812f7d sys/src/9/pc/etheriwl.c --- a/sys/src/9/pc/etheriwl.c Mon Mar 01 17:24:54 2021 +0100 +++ b/sys/src/9/pc/etheriwl.c Fri Mar 05 01:50:30 2021 +0100 @@ -694,6 +694,7 @@ #define csr32r(c, r) (*((c)->nic+((r)/4))) #define csr32w(c, r, v) (*((c)->nic+((r)/4)) = (v)) +#define csr8w(c, r, v) (((u8int*)(c)->nic)[r] = (v)) static uint get16(uchar *p){ @@ -1088,6 +1089,23 @@ nicunlock(ctlr); } + if(ctlr->pdev->did == 0x08b1 || ctlr->pdev->did == 0x08b2){ + print("host_interrupt_operation_mode work around!\n"); + if((err = niclock(ctlr)) != nil) + return err; + prphread(ctlr, 0xa04068); /* IWM_OSC */ + prphread(ctlr, 0xa04068); /* IWM_OSC */ + nicunlock(ctlr); + + /* iwm_set_bits_prph(sc, IWM_OSC_CLK, IWM_OSC_CLK_FORCE_CONTROL); */ + prphwrite(ctlr, 0xa04068, prphread(ctlr, 0xa04068) | 0x8); + if((err = niclock(ctlr)) != nil) + return err; + prphread(ctlr, 0xa04068); /* IWM_OSC */ + prphread(ctlr, 0xa04068); /* IWM_OSC */ + nicunlock(ctlr); + } + if(ctlr->family < 8000){ if((err = niclock(ctlr)) != nil) return err; @@ -1883,6 +1901,11 @@ FhRxConfigSingleFrame | (Nrxlog << FhRxConfigNrbdShift)); + /* IWM_CSR_INT_COALESCING */ + csr8w(ctlr, 0x004, 0x40); + if(ctlr->pdev->did == 0x08b1 || ctlr->pdev->did == 0x08b2) + csr32w(ctlr, 0x004, csr32r(ctlr, 0x004) | (1UL<<31)); + csr32w(ctlr, FhRxWptr, (Nrx-1) & ~7); }