From 53f6982eab3059cf494f8bd2f16f7ae87cf2dee9 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 12 Jul 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-07-12 --- bitsy/fns.h | 2 ++ pc/ether79c970.c | 87 +++++++++++++++++------------------------------- pc/fns.h | 2 ++ pc/memory.c | 13 +++++--- port/devdup.c | 2 +- port/lib.h | 2 -- 6 files changed, 44 insertions(+), 64 deletions(-) diff --git a/bitsy/fns.h b/bitsy/fns.h index 9c9bada25eec2b74cf0661c5b477f030734d59af..1cd4405be8b3095290c7df9c2ceac3f40ac5debc 100644 --- a/bitsy/fns.h +++ b/bitsy/fns.h @@ -28,7 +28,9 @@ char* getconf(char*); ulong getcpuid(void); ulong getfar(void); ulong getfsr(void); +void* getlink(void); #define getpgcolor(a) 0 +void* getsp(void); void gpiointrenable(ulong, int, void (*)(Ureg*, void*), void*, char*); void h3650uartsetup(void); void icacheinvalidate(void); diff --git a/pc/ether79c970.c b/pc/ether79c970.c index 083b35b51ef7a395e14c58b96b11382b56389e1e..9d08a9fbf06d37213acbaedc1748d6328ce8146c 100644 --- a/pc/ether79c970.c +++ b/pc/ether79c970.c @@ -107,9 +107,13 @@ enum { /* md2 */ TxBuff = 0x80000000, /* buffer error */ }; +typedef struct Ctlr Ctlr; typedef struct Ctlr { Lock; int port; + Pcidev* pcidev; + Ctlr* next; + int active; int init; /* initialisation in progress */ Iblock iblock; @@ -138,6 +142,9 @@ typedef struct Ctlr { ulong babl; } Ctlr; +static Ctlr* ctlrhead; +static Ctlr* ctlrtail; + #define csr32r(c, r) (inl((c)->port+(r))) #define csr32w(c, r, l) (outl((c)->port+(r), (ulong)(l))) @@ -419,38 +426,12 @@ intrloop: goto intrloop; } -typedef struct Adapter { - int port; - int irq; - int tbdf; -} Adapter; -static Block* adapter; - -static int -amd79c970adapter(Block** bpp, int port, int irq, int tbdf) -{ - Block *bp; - Adapter *ap; - - bp = allocb(sizeof(Adapter)); - if(bp == nil) - return -1; - ap = (Adapter*)bp->rp; - ap->port = port; - ap->irq = irq; - ap->tbdf = tbdf; - - bp->next = *bpp; - *bpp = bp; - - return 0; -} - static void amd79c970pci(void) { - Pcidev *p; int port; + Ctlr *ctlr; + Pcidev *p; p = nil; while(p = pcimatch(p, 0x1022, 0x2000)){ @@ -459,58 +440,53 @@ amd79c970pci(void) print("amd79c970: port 0x%uX in use\n", port); continue; } - if(amd79c970adapter(&adapter, port, p->intl, p->tbdf)){ - iofree(port); - continue; - } - pcisetbme(p); + ctlr = malloc(sizeof(Ctlr)); + ctlr->port = p->mem[0].bar & ~0x01; + ctlr->pcidev = p; + + if(ctlrhead != nil) + ctlrtail->next = ctlr; + else + ctlrhead = ctlr; + ctlrtail = ctlr; } } static int reset(Ether* ether) { - int port, x; - Block *bp, **bpp; - Adapter *ap; + int x; uchar ea[Eaddrlen]; Ctlr *ctlr; - static int scandone; - if(scandone == 0){ + if(ctlrhead == nil) amd79c970pci(); - scandone = 1; - } /* * Any adapter matches if no port is supplied, * otherwise the ports must match. */ - port = 0; - bpp = &adapter; - for(bp = *bpp; bp; bp = bp->next){ - ap = (Adapter*)bp->rp; - if(ether->port == 0 || ether->port == ap->port){ - port = ap->port; - ether->irq = ap->irq; - ether->tbdf = ap->tbdf; - *bpp = bp->next; - freeb(bp); + for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){ + if(ctlr->active) + continue; + if(ether->port == 0 || ether->port == ctlr->port){ + ctlr->active = 1; break; } - bpp = &bp->next; } - if(port == 0) + if(ctlr == nil) return -1; /* * Allocate a controller structure and start to initialise it. */ - ether->ctlr = malloc(sizeof(Ctlr)); - ctlr = ether->ctlr; + ether->ctlr = ctlr; + ether->port = ctlr->port; + ether->irq = ctlr->pcidev->intl; + ether->tbdf = ctlr->pcidev->tbdf; + pcisetbme(ctlr->pcidev); ilock(ctlr); ctlr->init = 1; - ctlr->port = port; /* * How to tell what mode the chip is in at this point - if it's in WORD @@ -592,7 +568,6 @@ reset(Ether* ether) /* * Linkage to the generic ethernet driver. */ - ether->port = port; ether->attach = attach; ether->transmit = transmit; ether->interrupt = interrupt; diff --git a/pc/fns.h b/pc/fns.h index 01409d6af862aea57b9f82e72971047744fbd663..b11bb3672fafc4c7e35de693b148bb0cb26775ab 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -38,9 +38,11 @@ ulong getcr3(void); ulong getcr4(void); char* getconf(char*); int havecycintr(void); +void halt(void); int i8042auxcmd(int); void i8042auxenable(void (*)(int, int)); void i8042reset(void); +void i8250console(void); void i8253init(int, int); void i8253enable(void); uvlong i8253read(uvlong*); diff --git a/pc/memory.c b/pc/memory.c index e48539460bdb09121eaa7994018724ce1c0b7ea7..92a066eb8e45ad4ae24171e045e072e1a1ca520e 100644 --- a/pc/memory.c +++ b/pc/memory.c @@ -225,11 +225,14 @@ umbscan(void) */ p = KADDR(0xC0000); while(p < (uchar*)KADDR(0xE0000)){ - if (p[0] == 0x55 && p[1] == 0xAA) { - /* Skip p[2] chunks of 512 bytes. Test for 0x55 AA before - poking obtrusively, or else the Thinkpad X20 dies when - setting up the cardbus (PB) */ - p += p[2] * 512; + /* + * Test for 0x55 0xAA before poking obtrusively, + * some machines (e.g. Thinkpad X20) seem to map + * something dynamic here (cardbus?) causing weird + * problems if it is changed. + */ + if(p[0] == 0x55 && p[1] == 0xAA){ + p += p[2]*512; continue; } diff --git a/port/devdup.c b/port/devdup.c index eca7ec6368278897f728512c140e5c78f4f0d74a..0deb36d3f9645ef4b4de0bfc71745b8a107fc44d 100644 --- a/port/devdup.c +++ b/port/devdup.c @@ -118,7 +118,7 @@ dupread(Chan *c, void *va, long n, vlong offset) } static long -dupwrite(Chan *c, void *va, long n, vlong) +dupwrite(Chan *c, void*, long, vlong) { if(c->qid.path & 1){ print("do ctl write\n"); diff --git a/port/lib.h b/port/lib.h index ddf6d32a68d35aa92ce4e19d547306bbecd83bda..c44877d3d65da91cbea7095fa5cd0c338d79babd 100644 --- a/port/lib.h +++ b/port/lib.h @@ -74,8 +74,6 @@ extern int print(char*, ...); */ extern char* cleanname(char*); extern ulong getcallerpc(void*); -extern void* getsp(void); -extern void* getlink(void); extern long strtol(char*, char**, int); extern ulong strtoul(char*, char**, int);