M bitsy/fns.h => bitsy/fns.h +2 -0
@@ 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);
M pc/ether79c970.c => pc/ether79c970.c +31 -56
@@ 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;
M pc/fns.h => pc/fns.h +2 -0
@@ 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*);
M pc/memory.c => pc/memory.c +8 -5
@@ 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;
}
M port/devdup.c => port/devdup.c +1 -1
@@ 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");
M port/lib.h => port/lib.h +0 -2
@@ 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);