M pc/devi82365.c => pc/devi82365.c +23 -18
@@ 559,6 559,19 @@ i82386probe(int x, int d, int dev)
return cp;
}
+static void
+i82365dump(Slot *pp)
+{
+ int i;
+
+ for(i = 0; i < 0x40; i++){
+ if((i&0x7) == 0)
+ print("\n%ux: ", i);
+ print("%ux ", rdreg(pp, i));
+ }
+ print("\n");
+}
+
/*
* set up for slot cards
*/
@@ 593,7 606,10 @@ i82365reset(void)
pp->memlen = 64*MB;
pp->base = (cp->dev<<7) | (j<<6);
pp->cp = cp;
+if(pp == slot)i82365dump(pp);
+/*
slotdis(pp);
+*/
/* interrupt on status change */
wrreg(pp, Rcscic, ((PCMCIAvec-Int0vec)<<4) | Fchangeena);
@@ 780,18 796,6 @@ i82365read(Chan *c, void *a, long n, ulong offset)
if(pp->busy)
cp += sprint(cp, "busy\n");
cp += sprint(cp, "battery lvl %d\n", pp->battery);
-{
- int i;
-
- cp += sprint(cp, "x %x d %x b %x\n", pp->cp->xreg, pp->cp->dreg, pp->base);
- for(i = 0; i < 0x40; i++){
- cp += sprint(cp, "%2.2ux ", rdreg(pp, i));
- if((i%8) == 7)
- cp += sprint(cp, "\n");
- }
- if(i%8)
- cp += sprint(cp, "\n");
-}
*cp = 0;
return readstr(offset, a, n, buf);
default:
@@ 934,21 938,21 @@ pcmio(int slotno, ISAConf *isa)
/* Reset adapter */
m = pcmmap(slotno, pp->caddr + Rconfig, 1, 1);
p = (uchar*)(KZERO|(m->isa + pp->caddr + Rconfig - m->ca));
+if(strstr(pp->verstr, "KeepInTouch") == 0){
*p = Creset;
delay(5);
*p = 0;
delay(5);
-
- /*
- * Set level sensitive (not pulsed) interrupts and
- * configuration number 1.
- * Setting the configuration number enables IO port access.
- */
+}
+
+ /* set configuration */
+if(strstr(pp->verstr, "KeepInTouch") == 0){
if(isa->irq > 7)
*p = Clevel | ct->index;
else
*p = ct->index;
delay(5);
+} else i82365dump(pp);
pcmunmap(slotno, m);
}
return 0;
@@ 1306,3 1310,4 @@ tvers1(Slot *pp, int ttype)
}
pp->verstr[i] = 0;
}
+
M pc/fns.h => pc/fns.h +5 -1
@@ 2,7 2,7 @@
void aamloop(int);
void addconf(char*, char*);
-void addscsicard(char*, Scsiio (*)(int, ISAConf*));
+void addscsilink(char*, Scsiio (*)(int, ISAConf*));
void bbinit(void);
void bigcursor(void);
void bootargs(ulong);
@@ 125,3 125,7 @@ ulong ifunroute(ulong);
void parseip(char*, char*);
#define dcflush(a, b)
+
+int scsibtissue(int, int, uchar*, int, uchar*, int);
+Scsiio scsibt24(int, int, ISAConf*);
+Scsiio scsibt32(int, int, ISAConf*);
M pc/scsi.c => pc/scsi.c +27 -14
@@ 25,28 25,38 @@ typedef struct {
static Ctlr *scsi[MaxScsi];
-static struct {
+typedef struct Link Link;
+typedef struct Link {
char *type;
Scsiio (*reset)(int, ISAConf*);
-} cards[MaxScsi+1];
+
+ Link* link;
+} Link;
+
+static Link *link;
+static int linkcount;
void
-addscsicard(char *t, Scsiio (*r)(int, ISAConf*))
+addscsilink(char *t, Scsiio (*r)(int, ISAConf*))
{
- static int ncard;
+ Link *lp;
+
+ if((lp = xalloc(sizeof(Link))) == 0)
+ return;
+ lp->type = t;
+ lp->reset = r;
- if(ncard == MaxScsi)
- panic("too many scsi cards\n");
- cards[ncard].type = t;
- cards[ncard].reset = r;
- ncard++;
+ lp->link = link;
+ link = lp;
+ linkcount++;
}
void
scsireset(void)
{
Ctlr *ctlr;
- int ctlrno, n, t;
+ int ctlrno, t;
+ Link *lp;
for(ctlr = 0, ctlrno = 0; ctlrno < MaxScsi; ctlrno++){
if(ctlr == 0)
@@ 54,15 64,18 @@ scsireset(void)
memset(ctlr, 0, sizeof(Ctlr));
if(isaconfig("scsi", ctlrno, ctlr) == 0)
continue;
- for(n = 0; cards[n].type; n++){
- if(strcmp(cards[n].type, ctlr->type))
+ for(lp = link; lp; lp = lp->link){
+ if(strcmp(lp->type, ctlr->type))
continue;
- if((ctlr->io = (*cards[n].reset)(ctlrno, ctlr)) == 0)
+ if((ctlr->io = (*lp->reset)(ctlrno, ctlr)) == 0)
break;
- print("scsi%d: %s: port %lux irq %d addr %lux size %d\n",
+ print("scsi%d: %s: port %lux irq %d",
ctlrno, ctlr->type, ctlr->port,
ctlr->irq, ctlr->mem, ctlr->size);
+ if(ctlr->mem)
+ print(" addr %lux size %d\n", ctlr->mem, ctlr->size);
+ print("\n");
for(t = 0; t < NTarget; t++){
ctlr->target[t].ctlrno = ctlrno;