M ip/ethermedium.c => ip/ethermedium.c +8 -2
@@ 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);
M pc/ether82557.c => pc/ether82557.c +32 -2
@@ 261,12 261,42 @@ 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.
* This should be the common case.
@@ 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){
M pc/screen.c => pc/screen.c +0 -12
@@ 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);
-}
M pc/sdata.c => pc/sdata.c +1 -0
@@ 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 */
M pc/vga.c => pc/vga.c +20 -0
@@ 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);
+}