From 220edc8109c1055a27156971b0ae531efeff51f2 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 20 Sep 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-09-20 --- alphapc/sd53c8xx.c | 32 ++++++++++++------- pc/devpccard.c | 2 ++ pc/ether82543gc.c | 2 ++ pc/etherelnk3.c | 1 + pc/sd53c8xx.c | 80 ++++++++++++++++++++++++++-------------------- port/taslock.c | 2 ++ 6 files changed, 73 insertions(+), 46 deletions(-) diff --git a/alphapc/sd53c8xx.c b/alphapc/sd53c8xx.c index d2eab8ae8e3403b7879b9bb15349e3fd2cc7ce47..88d2d383e5967da276f5625103a0a78a9b3d0dc9 100644 --- a/alphapc/sd53c8xx.c +++ b/alphapc/sd53c8xx.c @@ -1103,7 +1103,7 @@ write_mismatch_recover(Controller *c, Ncr *n, Dsa *dsa) } static void -interrupt(Ureg *ur, void *a) +sd53c8xxinterrupt(Ureg *ur, void *a) { uchar istat; ushort sist; @@ -1581,7 +1581,7 @@ reset(Controller *c) } static int -symrio(SDreq* r) +sd53c8xxrio(SDreq* r) { Dsa *d; uchar *bp; @@ -1896,7 +1896,7 @@ na_fixup(Controller *c, ulong pa_reg, } static SDev* -sympnp(void) +sd53c8xxpnp(void) { char *cp; Pcidev *p; @@ -1985,6 +1985,14 @@ buggery: ctlr->v = v; ctlr->script = script; memmove(ctlr->script, na_script, sizeof(na_script)); + + /* + * Because we don't yet have an abstraction for the + * addresses as seen from the controller side (and on + * the 386 it doesn't matter), the follwong two lines + * are different between the 386 and alpha copies of + * this driver. + */ ctlr->scriptpa = p->mem[ba].bar & ~0x0F; if(!na_fixup(ctlr, p->mem[1].bar & ~0x0F, na_patches, NA_PATCHES, xfunc)){ print("script fixup failed\n"); @@ -2018,13 +2026,13 @@ buggery: } static SDev* -symid(SDev* sdev) +sd53c8xxid(SDev* sdev) { return scsiid(sdev, &sd53c8xxifc); } static int -symenable(SDev* sdev) +sd53c8xxenable(SDev* sdev) { Pcidev *pcidev; Controller *ctlr; @@ -2035,7 +2043,7 @@ symenable(SDev* sdev) pcisetbme(pcidev); snprint(name, sizeof(name), "%s (%s)", sdev->name, sdev->ifc->name); - intrenable(pcidev->intl, interrupt, ctlr, pcidev->tbdf, name); + intrenable(pcidev->intl, sd53c8xxinterrupt, ctlr, pcidev->tbdf, name); ilock(ctlr); synctabinit(ctlr); @@ -2049,18 +2057,20 @@ symenable(SDev* sdev) SDifc sd53c8xxifc = { "53c8xx", /* name */ - sympnp, /* pnp */ + sd53c8xxpnp, /* pnp */ nil, /* legacy */ - symid, /* id */ - symenable, /* enable */ + sd53c8xxid, /* id */ + sd53c8xxenable, /* enable */ nil, /* disable */ scsiverify, /* verify */ scsionline, /* online */ - symrio, /* rio */ + sd53c8xxrio, /* rio */ nil, /* rctl */ nil, /* wctl */ scsibio, /* bio */ + nil, /* probe */ + nil, /* clear */ + nil, /* stat */ }; - diff --git a/pc/devpccard.c b/pc/devpccard.c index 5cce16036c7a852f8408b54b29f148e43f3f5e22..1d109bace54f6b3f4528f77a2b0d1e6a7686aae4 100644 --- a/pc/devpccard.c +++ b/pc/devpccard.c @@ -14,6 +14,7 @@ enum { TI_vid = 0x104c, TI_1450_did = 0xAC1B, + TI_1251A_did = 0xAC1D, Ricoh_vid = 0x1180, Ricoh_476_did = 0x0476, @@ -36,6 +37,7 @@ typedef struct { static variant_t variant[] = { { Ricoh_vid, Ricoh_476_did, "Ricoh 476 PCI/Cardbus bridge", }, { TI_vid, TI_1450_did, "TI PCI-1450 Cardbus Controller", }, +{ TI_vid, TI_1251A_did, "TI PCI-1251A Cardbus Controller", }, }; /* Cardbus registers */ diff --git a/pc/ether82543gc.c b/pc/ether82543gc.c index a8dae02e2d0f7e12beb7d4bcc4d70997c0764df4..6261513d2d59f7db240a79ed258bc6933407d0a5 100644 --- a/pc/ether82543gc.c +++ b/pc/ether82543gc.c @@ -927,10 +927,12 @@ gc82543pci(void) ctlr->id = (p->did<<16)|p->vid; ctlr->nic = KADDR(ctlr->port); +print("status0 %8.8uX\n", csr32r(ctlr, Status)); if(gc82543reset(ctlr)){ free(ctlr); continue; } +print("status1 %8.8uX\n", csr32r(ctlr, Status)); if(ctlrhead != nil) ctlrtail->next = ctlr; diff --git a/pc/etherelnk3.c b/pc/etherelnk3.c index dec1d443dc7ee4ece0c89be3e7669089077d4034..c1947848663e6f025d5d4cbca6a252c5f3e736b0 100644 --- a/pc/etherelnk3.c +++ b/pc/etherelnk3.c @@ -1491,6 +1491,7 @@ tcm59Xpci(void) if(!(p->mem[0].bar & 0x01)) continue; port = p->mem[0].bar & ~0x01; + print("tcm59Xpci: Allocating port %X\n", port); if(ioalloc(port, p->mem[0].size, 0, "tcm59Xpci") < 0){ print("tcm59Xpci: port 0x%uX in use\n", port); continue; diff --git a/pc/sd53c8xx.c b/pc/sd53c8xx.c index 658d41e92d2c417edfbe2d7b015e3124e5fb1936..5b83ba3a8c87f1c817568c8bb0ef70d4655a2b76 100644 --- a/pc/sd53c8xx.c +++ b/pc/sd53c8xx.c @@ -2,6 +2,8 @@ * NCR/Symbios/LSI Logic 53c8xx driver for Plan 9 * Nigel Roles (nigel@9fs.org) * + * 13/3/01 Fixed microcode to support targets > 7 + * * 01/12/00 Removed previous comments. Fixed a small problem in * mismatch recovery for targets with synchronous offsets of >=16 * connected to >=875s. Thanks, Jean. @@ -60,13 +62,13 @@ extern SDifc sd53c8xxifc; /*******************************/ #ifndef DMASEG -#define DMASEG(x) PADDR(x) +#define DMASEG(x) PCIWADDR(x) #define legetl(x) (*(ulong*)(x)) #define lesetl(x,v) (*(ulong*)(x) = (v)) #define swabl(a,b,c) #else #endif /*DMASEG */ -#define DMASEG_TO_KADDR(x) KADDR(PADDR(x)) +#define DMASEG_TO_KADDR(x) KADDR((x)-PCIWINDOW) #define KPTR(x) ((x) == 0 ? 0 : DMASEG_TO_KADDR(x)) #define MEGA 1000000L @@ -198,20 +200,12 @@ typedef enum State { } State; typedef struct Dsa { - union { - uchar state[4]; - struct { - uchar stateb; - uchar result; - uchar dmablks; - uchar flag; /* setbyte(state,3,...) */ - }; - }; - - union { - ulong dmancr; /* For block transfer: NCR order (little-endian) */ - uchar dmaaddr[4]; - }; + uchar stateb; + uchar result; + uchar dmablks; + uchar flag; /* setbyte(state,3,...) */ + + uchar dmaaddr[4]; uchar target; /* Target */ uchar pad0[3]; @@ -313,6 +307,7 @@ typedef struct Controller { } Controller; #define SYNCOFFMASK(c) (((c)->v->maxsyncoff * 2) - 1) +#define SSIDMASK(c) (((c)->v->feature & Wide) ? 15 : 7) /* ISTAT */ enum { Abrt = 0x80, Srst = 0x40, Sigp = 0x20, Sem = 0x10, Con = 0x08, Intf = 0x04, Sip = 0x02, Dip = 0x01 }; @@ -394,7 +389,7 @@ dsaalloc(Controller *c, int target, int lun) if (DEBUG(1)) KPRINT(PRINTPREFIX "%d/%d: allocated new dsa %lux\n", target, lun, (ulong)d); lesetl(d->next, 0); - lesetl(d->state, A_STATE_ALLOCATED); + lesetl(&d->stateb, A_STATE_ALLOCATED); if (legetl(c->dsalist.head) == 0) lesetl(c->dsalist.head, DMASEG(d)); /* ATOMIC?!? */ else @@ -405,7 +400,7 @@ dsaalloc(Controller *c, int target, int lun) if (DEBUG(1)) KPRINT(PRINTPREFIX "%d/%d: reused dsa %lux\n", target, lun, (ulong)d); c->dsalist.freechain = d->freechain; - lesetl(d->state, A_STATE_ALLOCATED); + lesetl(&d->stateb, A_STATE_ALLOCATED); } iunlock(&c->dsalist); d->target = target; @@ -419,7 +414,7 @@ dsafree(Controller *c, Dsa *d) ilock(&c->dsalist); d->freechain = c->dsalist.freechain; c->dsalist.freechain = d; - lesetl(d->state, A_STATE_FREE); + lesetl(&d->stateb, A_STATE_FREE); iunlock(&c->dsalist); } @@ -1108,7 +1103,7 @@ write_mismatch_recover(Controller *c, Ncr *n, Dsa *dsa) } static void -interrupt(Ureg *ur, void *a) +sd53c8xxinterrupt(Ureg *ur, void *a) { uchar istat; ushort sist; @@ -1201,7 +1196,7 @@ interrupt(Ureg *ur, void *a) dsa->dmablks, legetl(dsa->dmaaddr), legetl(dsa->data_buf.pa), legetl(dsa->data_buf.dbc)); n->scratcha[2] = dsa->dmablks; - lesetl(n->scratchb, dsa->dmancr); + lesetl(n->scratchb, *(ulong*)dsa->dmaaddr); cont = E_data_block_mismatch_recover; } else if (sa == E_data_out_mismatch) { @@ -1228,7 +1223,7 @@ interrupt(Ureg *ur, void *a) dmablks * A_BSIZE - tbc + legetl(dsa->data_buf.dbc)); /* copy changes into scratch registers */ n->scratcha[2] = dsa->dmablks; - lesetl(n->scratchb, dsa->dmancr); + lesetl(n->scratchb, *(ulong*)dsa->dmaaddr); cont = E_data_block_mismatch_recover; } else if (sa == E_id_out_mismatch) { @@ -1338,8 +1333,8 @@ interrupt(Ureg *ur, void *a) break; case A_SIR_ERROR_NOT_MSG_IN_AFTER_RESELECT: IPRINT(PRINTPREFIX "%d: not msg_in after reselect (%s)", - n->ssid & 7, phase[n->sstat1 & 7]); - dsa = dsafind(c, n->ssid & 7, -1, A_STATE_DISCONNECTED); + n->ssid & SSIDMASK(c), phase[n->sstat1 & 7]); + dsa = dsafind(c, n->ssid & SSIDMASK(c), -1, A_STATE_DISCONNECTED); dumpncrregs(c, 1); wakeme = 1; break; @@ -1439,6 +1434,12 @@ interrupt(Ureg *ur, void *a) dsa->target, dsa->lun); cont = -2; break; + case A_error_reselected: /* dsa isn't valid here */ + print(PRINTPREFIX "reselection error\n"); + dumpncrregs(c, 1); + for (dsa = KPTR(legetl(c->dsalist.head)); dsa; dsa = KPTR(legetl(dsa->next))) + IPRINT(PRINTPREFIX "dsa target %d lun %d state %d\n", dsa->target, dsa->lun, dsa->stateb); + break; default: IPRINT(PRINTPREFIX "%d/%d: script error %ld\n", dsa->target, dsa->lun, legetl(n->dsps)); @@ -1580,7 +1581,7 @@ reset(Controller *c) } static int -symrio(SDreq* r) +sd53c8xxrio(SDreq* r) { Dsa *d; uchar *bp; @@ -1749,7 +1750,7 @@ docheck: * Clear out the microcode state * so the Dsa can be re-used. */ - lesetl(d->state, A_STATE_ALLOCATED); + lesetl(&d->stateb, A_STATE_ALLOCATED); goto docheck; } qunlock(&c->q[target]); @@ -1835,6 +1836,8 @@ xfunc(Controller *c, enum na_external x, unsigned long *v) *v = offsetof(Dsa, status_buf); return 1; case X_dsa_head: *v = DMASEG(&c->dsalist.head[0]); return 1; + case X_ssid_mask: + *v = SSIDMASK(c); return 1; default: print("xfunc: can't find external %d\n", x); return 0; @@ -1893,7 +1896,7 @@ na_fixup(Controller *c, ulong pa_reg, } static SDev* -sympnp(void) +sd53c8xxpnp(void) { char *cp; Pcidev *p; @@ -1982,6 +1985,14 @@ buggery: ctlr->v = v; ctlr->script = script; memmove(ctlr->script, na_script, sizeof(na_script)); + + /* + * Because we don't yet have an abstraction for the + * addresses as seen from the controller side (and on + * the 386 it doesn't matter), the follwong two lines + * are different between the 386 and alpha copies of + * this driver. + */ ctlr->scriptpa = scriptpa; if(!na_fixup(ctlr, regpa, na_patches, NA_PATCHES, xfunc)){ print("script fixup failed\n"); @@ -2015,13 +2026,13 @@ buggery: } static SDev* -symid(SDev* sdev) +sd53c8xxid(SDev* sdev) { return scsiid(sdev, &sd53c8xxifc); } static int -symenable(SDev* sdev) +sd53c8xxenable(SDev* sdev) { Pcidev *pcidev; Controller *ctlr; @@ -2032,7 +2043,7 @@ symenable(SDev* sdev) pcisetbme(pcidev); snprint(name, sizeof(name), "%s (%s)", sdev->name, sdev->ifc->name); - intrenable(pcidev->intl, interrupt, ctlr, pcidev->tbdf, name); + intrenable(pcidev->intl, sd53c8xxinterrupt, ctlr, pcidev->tbdf, name); ilock(ctlr); synctabinit(ctlr); @@ -2046,15 +2057,15 @@ symenable(SDev* sdev) SDifc sd53c8xxifc = { "53c8xx", /* name */ - sympnp, /* pnp */ + sd53c8xxpnp, /* pnp */ nil, /* legacy */ - symid, /* id */ - symenable, /* enable */ + sd53c8xxid, /* id */ + sd53c8xxenable, /* enable */ nil, /* disable */ scsiverify, /* verify */ scsionline, /* online */ - symrio, /* rio */ + sd53c8xxrio, /* rio */ nil, /* rctl */ nil, /* wctl */ @@ -2063,4 +2074,3 @@ SDifc sd53c8xxifc = { nil, /* clear */ nil, /* stat */ }; - diff --git a/port/taslock.c b/port/taslock.c index 99a492357f2f4a1626283589f4b54e61b147c6fa..591f3cf9987e03a88839229da9a3821318555840 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -30,6 +30,8 @@ lockloop(Lock *l, ulong pc) Proc *p; p = l->p; +print("lock loop %p\n", l); +delay(1000); print("lock 0x%lux loop key 0x%lux pc 0x%lux held by pc 0x%lux proc %lud\n", l, l->key, pc, l->pc, p ? p->pid : 0); dumpaproc(up);