From 6fe50c058537ee12fae0071eeda53909bc1b2223 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 20 Sep 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-09-20 --- ip/ethermedium.c | 10 ++++++++-- pc/ether82557.c | 34 ++++++++++++++++++++++++++++++++-- pc/screen.c | 12 ------------ pc/sdata.c | 1 + pc/vga.c | 20 ++++++++++++++++++++ 5 files changed, 61 insertions(+), 16 deletions(-) diff --git a/ip/ethermedium.c b/ip/ethermedium.c index 3a2f284288fca2899e0a154355333bc7be79bf5d..b477b8b324c63fed6aa0316fca6d45719bec6f77 100644 --- a/ip/ethermedium.c +++ b/ip/ethermedium.c @@ -573,6 +573,7 @@ recvarp(Ipifc *ifc) Block *ebp, *rbp; Etherarp *e, *r; uchar ip[IPaddrlen]; + static uchar eprinted[4]; Etherrock *er = ifc->arg; ebp = devtab[er->achan->type]->bread(er->achan, ifc->maxmtu, 0); @@ -608,8 +609,13 @@ recvarp(Ipifc *ifc) /* check for machine using my ip or ether address */ v4tov6(ip, e->spa); if(iplocalonifc(ifc, ip) || ipproxyifc(er->f, ifc, ip)){ - if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0) - print("arpreq: 0x%E also has ip addr %V\n", e->sha, e->spa); + if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) != 0){ + if (memcmp(eprinted, e->spa, sizeof(e->spa))){ + /* print only once */ + print("arpreq: 0x%E also has ip addr %V\n", e->sha, e->spa); + memmove(eprinted, e->spa, sizeof(e->spa)); + } + } } else { if(memcmp(e->sha, ifc->mac, sizeof(e->sha)) == 0){ print("arpreq: %V also has ether addr %E\n", e->spa, e->sha); diff --git a/pc/ether82557.c b/pc/ether82557.c index 985d6e0ebea46aeed99b9819ebc9cc5d8ee37ec3..4767b558a4365b373cf606a22aa87c1849999432 100644 --- a/pc/ether82557.c +++ b/pc/ether82557.c @@ -261,11 +261,41 @@ static uchar configdata[24] = { #define csr16w(c, r, w) (outs((c)->port+(r), (ushort)(w))) #define csr32w(c, r, l) (outl((c)->port+(r), (ulong)(l))) +int +waitfordone(Ctlr *ctlr) +{ + int loops; + + /* fast wait, we usually get lucky */ + for(loops = 0; loops < 100; loops++){ + if(csr8r(ctlr, CommandR) == 0) + return 0; + } + + /* slow wait */ + for(loops = 0; loops < 1000; loops++){ + if(csr8r(ctlr, CommandR) == 0) + return 0; + microdelay(1); + } + return -1; +} + static void command(Ctlr* ctlr, int c, int v) { ilock(&ctlr->rlock); + /* + * on a 10 Mbs half-duplex connection, we seem to + * hang unless we do a nop before each command. + * This comes from a fix for a chip errata that jmk + * saw in a Linux driver. + */ + if(waitfordone(ctlr) < 0) + print("82557: lastcmd %x, cmd nop \n", ctlr->command); + csr8w(ctlr, CommandR, CUnop); + /* * Only back-to-back CUresume can be done * without waiting for any previous command to complete. @@ -279,8 +309,8 @@ command(Ctlr* ctlr, int c, int v) } */ - while(csr8r(ctlr, CommandR)) - ; + if(waitfordone(ctlr) < 0) + print("82557: lastcmd %x, cmd %x(%x) \n", ctlr->command, c, v); switch(c){ diff --git a/pc/screen.c b/pc/screen.c index 4bb32065b6a710a7e9d8533e3381fe532d21dac8..baa8f48494ffae134d307a23f434a45d9662e8e9 100644 --- a/pc/screen.c +++ b/pc/screen.c @@ -392,15 +392,3 @@ blankscreen(int blank) vgablank(scr, blank); } } - -void -screensignal(int x) -{ - VGAscr *scr; - - scr = &vgascreen[0]; - if(scr->aperture == 0) - return; - - memset(scr->aperture, x, 8*1024); -} diff --git a/pc/sdata.c b/pc/sdata.c index fb941eaea49216d5e34e7d17beb6a66c13316452..2254f95130b108fa3eec8598fd034ef45c1c7bef 100644 --- a/pc/sdata.c +++ b/pc/sdata.c @@ -1701,6 +1701,7 @@ atapnp(void) break; case (0x4D38<<16)|0x105A: /* Promise PDC20262 */ case (0x4D30<<16)|0x105A: /* Promise PDC202xx */ + case (0x0004<<16)|0x1103: /* HighPoint HPT-370 */ pi = 0x85; break; case (0x0640<<16)|0x1095: /* CMD 640B */ diff --git a/pc/vga.c b/pc/vga.c index f40b3ffa6f56c6b9b5f53cd5630436811f02d99f..9694acf6d5211faf99eb5f0641c719d98ae78d8b 100644 --- a/pc/vga.c +++ b/pc/vga.c @@ -232,3 +232,23 @@ addvgaseg(char *name, ulong pa, ulong size) addphysseg(&seg); } +void +cornerstring(char *s) +{ + int h, w; + VGAscr *scr; + Rectangle r; + Point p; + + scr = &vgascreen[0]; + if(scr->aperture == 0 || screenputs != vgascreenputs) + return; + p = memsubfontwidth(scr->memdefont, s); + w = p.x; + h = scr->memdefont->height; + + r = Rect(0, 0, w, h); + memimagedraw(scr->gscreen, r, back, back->r.min, nil, back->r.min); + memimagestring(scr->gscreen, r.min, conscol, ZP, scr->memdefont, s); +// flushmemscreen(r); +}