diff -r 3d85f589531a sys/src/9/pc/ether8169.c --- a/sys/src/9/pc/ether8169.c Sat Nov 21 16:26:46 2020 +0100 +++ b/sys/src/9/pc/ether8169.c Sat Nov 21 19:10:15 2020 +0100 @@ -814,6 +814,10 @@ error(Enomem); } ctlr->init = 1; + + pcisetbme(ctlr->pcidev); + intrenable(edev->irq, rtl8169interrupt, edev, edev->tbdf, edev->name); + kproc("rtl8169", rtl8169reseter, edev); /* rtl8169reseter() does qunlock(&ctlr->alock) when complete */ @@ -988,6 +992,15 @@ } static void +rtl8169shutdown(Ether *edev) +{ + Ctlr *ctlr = edev->ctlr; + + ctlr->imr = 0; + rtl8169halt(ctlr); +} + +static void rtl8169restart(Ctlr *ctlr) { ctlr->imr = 0; @@ -1144,8 +1157,6 @@ rtl8169mii(ctlr); - pcisetbme(p); - if(rtl8169ctlrhead != nil) rtl8169ctlrtail->next = ctlr; else @@ -1208,6 +1219,7 @@ edev->attach = rtl8169attach; edev->transmit = rtl8169transmit; edev->ifstat = rtl8169ifstat; + edev->shutdown = rtl8169shutdown; edev->arg = edev; edev->promiscuous = rtl8169promiscuous; @@ -1215,8 +1227,6 @@ rtl8169link(edev); - intrenable(edev->irq, rtl8169interrupt, edev, edev->tbdf, edev->name); - return 0; }