From 0d941989b452d48363e8af021d1c89eebbbc8a97 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 1 Nov 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-11-01 --- pc/devlml.c | 15 ++++----- pc/devlml.h | 3 +- pc/ether2114x.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 11 deletions(-) diff --git a/pc/devlml.c b/pc/devlml.c index ab76569db16d64960e58655eafac41f9ef2089cf..bddbf1feb25df6ce72392416814fe0f716d32a68 100644 --- a/pc/devlml.c +++ b/pc/devlml.c @@ -17,7 +17,7 @@ static Pcidev * pcidev; #define DBGINTR 0x04 #define DBGINTS 0x08 -int debug = -1; +int debug = 0; // Lml 22 driver @@ -44,19 +44,19 @@ static FrameHeader jpgheader[NBUF] = { { MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, { 'L', 'M', 'L', '\0'}, - -1, 0, 0, 0, 0 + -1, 0, 0, 0 }, { MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, { 'L', 'M', 'L', '\0'}, - -1, 0, 0, 0, 0 + -1, 0, 0, 0 }, { MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, { 'L', 'M', 'L', '\0'}, - -1, 0, 0, 0, 0 + -1, 0, 0, 0 }, { MRK_SOI, MRK_APP3, (sizeof(FrameHeader)-4) << 8, { 'L', 'M', 'L', '\0'}, - -1, 0, 0, 0, 0 + -1, 0, 0, 0 } }; @@ -331,7 +331,6 @@ lmlintr(Ureg *, void *) { writel(0xff000000, pciBaseAddr + INTR_STAT); if(flags & INTR_JPEGREP) { - vlong thetime; if(debug&(DBGINTR)) print("MjpgDrv_intrHandler stat=0x%.8lux\n", flags); @@ -348,9 +347,7 @@ lmlintr(Ureg *, void *) { return; } } - thetime = todget(nil); - jpgheader[fno].sec = (ulong)(thetime / 1000000000LL); - jpgheader[fno].nsec = (ulong)(thetime % 1000000000LL); + jpgheader[fno].ftime = todget(nil); jpgheader[fno].frameSize = (codeData->statCom[fno] & 0x00ffffff) >> 1; jpgheader[fno].frameSeqNo = codeData->statCom[fno] >> 24; diff --git a/pc/devlml.h b/pc/devlml.h index 93068108a9552709968f1a28fb223fe1d4cf138f..e25d83fba58c383ace4c29be948dc42d866dc4e5 100644 --- a/pc/devlml.h +++ b/pc/devlml.h @@ -70,8 +70,7 @@ struct FrameHeader { // Don't modify this struct, used by h/w ushort lenAPP3; char nm[4]; ushort frameNo; - ulong sec; - ulong nsec; + vlong ftime; ulong frameSize; ulong frameSeqNo; }; diff --git a/pc/ether2114x.c b/pc/ether2114x.c index e138bd1e0381b9f32c28e494c700780381478562..06c835b2bfc2c1742263e53866fa472dc86a48f0 100644 --- a/pc/ether2114x.c +++ b/pc/ether2114x.c @@ -1018,6 +1018,83 @@ typesymmode(Ctlr *ctlr, uchar *block, int wait) return 0; } +static int +type2mode(Ctlr* ctlr, uchar* block, int) +{ + uchar *p; + int csr6, csr13, csr14, csr15, gpc, gpd; + + csr6 = Sc|Mbo|Ca|Sb|TrMODE; + debug("type2mode: medium 0x%2.2uX\n", block[2]); + + /* + * Don't attempt full-duplex + * unless explicitly requested. + */ + if((block[2] & 0x3F) == 0x04){ /* 10BASE-TFD */ + if(!ctlr->fd) + return -1; + csr6 |= Fd; + } + + /* + * Operating mode programming values from the datasheet + * unless media specific data is explicitly given. + */ + p = &block[3]; + if(block[2] & 0x40){ + csr13 = (block[4]<<8)|block[3]; + csr14 = (block[6]<<8)|block[5]; + csr15 = (block[8]<<8)|block[7]; + p += 6; + } + else switch(block[2] & 0x3F){ + default: + return -1; + case 0x00: /* 10BASE-T */ + csr13 = 0x00000001; + csr14 = 0x00007F3F; + csr15 = 0x00000008; + break; + case 0x01: /* 10BASE-2 */ + csr13 = 0x00000009; + csr14 = 0x00000705; + csr15 = 0x00000006; + break; + case 0x02: /* 10BASE-5 (AUI) */ + csr13 = 0x00000009; + csr14 = 0x00000705; + csr15 = 0x0000000E; + break; + case 0x04: /* 10BASE-TFD */ + csr13 = 0x00000001; + csr14 = 0x00007F3D; + csr15 = 0x00000008; + break; + } + gpc = *p++<<16; + gpc |= *p++<<24; + gpd = *p++<<16; + gpd |= *p<<24; + + csr32w(ctlr, 13, 0); + csr32w(ctlr, 14, csr14); + csr32w(ctlr, 15, gpc|csr15); + delay(10); + csr32w(ctlr, 15, gpd|csr15); + csr32w(ctlr, 13, csr13); + + ctlr->csr6 = csr6; + csr32w(ctlr, 6, ctlr->csr6); + + debug("type2mode: csr13 %8.8uX csr14 %8.8uX csr15 %8.8uX\n", + csr13, csr14, csr15); + debug("type2mode: gpc %8.8uX gpd %8.8uX csr6 %8.8uX\n", + gpc, gpd, csr6); + + return 0; +} + static int type0link(Ctlr* ctlr, uchar* block) { @@ -1109,11 +1186,23 @@ mediaxx(Ether* ether, int wait) if(typephymode(ctlr, block, wait)) return 0; break; + case 2: + debug("type2: medium %d block[2] %d\n", + ctlr->medium, block[2]); + if(ctlr->medium >= 0 && ((block[2] & 0x3F) != ctlr->medium)) + return 0; + if(type2mode(ctlr, block, wait)) + return 0; + break; case 3: if(typephymode(ctlr, block, wait)) return 0; break; case 4: + debug("type4: medium %d block[2] %d\n", + ctlr->medium, block[2]); + if(ctlr->medium >= 0 && ((block[2] & 0x3F) != ctlr->medium)) + return 0; if(typesymmode(ctlr, block, wait)) return 0; break;