From e1400c2d5b429f3baa2a5f8227494e80367f7ee0 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 19 May 2011 17:00:58 +0000 Subject: ac97: fix probe code --- sys/src/9/pc/audioac97.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/sys/src/9/pc/audioac97.c b/sys/src/9/pc/audioac97.c index c62f349d7..e8e674489 100644 --- a/sys/src/9/pc/audioac97.c +++ b/sys/src/9/pc/audioac97.c @@ -70,6 +70,10 @@ struct Ctlr { int hardrate; int attachok; + + /* for probe */ + Pcidev *pcidev; + Ctlr *next; }; #define iorl(c, r) (inl((c)->port+(r))) @@ -483,20 +487,34 @@ sethwp(Ctlr *ctlr, long off, void *ptr) static int ac97reset(Audio *adev) { - static int ncards = 1; - int i, irq, tbdf; + static Ctlr *cards = nil; Pcidev *p; + int i, irq, tbdf; Ctlr *ctlr; ulong ctl, stat = 0; - p = nil; - for(i = 0; i < ncards; i++) - if((p = ac97match(p)) == nil) - return -1; - ncards++; + /* make a list of all ac97 cards if not already done */ + if(cards == nil){ + p = nil; + while(p = ac97match(p)){ + ctlr = xspanalloc(sizeof(Ctlr), 8, 0); + memset(ctlr, 0, sizeof(Ctlr)); + ctlr->pcidev = p; + ctlr->next = cards; + cards = ctlr; + } + } + + /* pick a card from the list */ + for(ctlr = cards; ctlr; ctlr = ctlr->next){ + if(p = ctlr->pcidev){ + ctlr->pcidev = nil; + goto Found; + } + } + return -1; - ctlr = xspanalloc(sizeof(Ctlr), 8, 0); - memset(ctlr, 0, sizeof(Ctlr)); +Found: adev->ctlr = ctlr; ctlr->targetrate = 44100; ctlr->hardrate = 44100; -- cgit v1.2.3