plan 9 kernel history: overview | file list | diff list

1995/1208/pc/devata.c (diff list | history)

1995/1206/sys/src/9/pc/devata.c:76,821995/1208/sys/src/9/pc/devata.c:76,82 (short | long | prev | next)
1995/1206    
	Npart=		20+2,		/* 8 sub partitions, disk, and partition */ 
1995/0213    
	Nrepl=		64,		/* maximum replacement blocks */ 
1995/0818    
 
1995/1206    
	Hardtimeout=	30000,		/* disk access timeout (ms) */ 
1995/1208    
	Hardtimeout=	6000,		/* disk access timeout (ms) */ 
1995/1206    
 
	NCtlr=		4, 
	NDrive=		NCtlr*2, 
1995/1206/sys/src/9/pc/devata.c:339,3461995/1208/sys/src/9/pc/devata.c:339,348
1995/1206    
	if(driveno & 0x01) 
		drive->dh |= DHslave; 
	drive->vers = 1; 
	if(atapi) 
1995/1208    
	if(atapi){ 
		sprint(drive->vol, "atapi%d", drive->driveno); 
1995/1206    
		drive->atapi = 1; 
1995/1208    
	} 
1995/1206    
 
	atadrive[driveno] = drive; 
} 
1995/1206/sys/src/9/pc/devata.c:384,3901995/1208/sys/src/9/pc/devata.c:386,392
1995/1206    
	 * will be left on the interrupt call chain even if there are no 
	 * drives found. 
	 * At least one controller/ATAPI-drive combination doesn't respond 
	 * to the Edd (Micronics M54Li + Sanyo CDR-XXX) so let's check for the 
1995/1208    
	 * to the Cedd (Micronics M54Li + Sanyo CRD-254P) so let's check for the 
1995/1206    
	 * ATAPI signature straight off. If we find it there will be no probe 
	 * done for a slave. Tough. 
	 */ 
1995/1206/sys/src/9/pc/devata.c:401,4061995/1208/sys/src/9/pc/devata.c:403,410
1995/1206    
		goto skipedd; 
	} 
	if(atactlrwait(ctlr, DHmagic, 0, MS2TK(1)) || waserror()){ 
1995/1208    
		DPRINT("ata%d: Cedd status %ux/%ux/%ux\n", 
			ctlrno, inb(port+Pstatus), inb(port+Pcylmsb), inb(port+Pcyllsb)); 
1995/1206    
		xfree(ctlr); 
		return -1; 
	} 
1995/1206/sys/src/9/pc/devata.c:1069,10861995/1208/sys/src/9/pc/devata.c:1073,1079
1995/0213    
		nexterror(); 
	} 
 
1995/1206    
	if(dp->atapi || isatapi(dp)) 
		cmd = Cidentd; 
	else{ 
		cmd = Cident; 
		if(cmdreadywait(dp)){ 
			dp->atapi = 1; 
			if(isatapi(dp) == 0) 
				error(Eio); 
			cmd = Cidentd; 
		} 
	} 
1995/0213    
                 
1995/1208    
	cmd = Cident; 
1995/1206    
retryatapi: 
	ILOCK(&cp->reglock); 
1995/0213    
	cp->nsecs = 1; 
1995/1206/sys/src/9/pc/devata.c:1092,11031995/1208/sys/src/9/pc/devata.c:1085,1096
1995/1206    
	outb(cp->pbase+Pcmd, cmd); 
	IUNLOCK(&cp->reglock); 
1995/0213    
 
1995/1208    
	DPRINT("%s: ident command %ux sent\n", dp->vol, cmd); 
1995/0818    
	atasleep(cp); 
 
1995/0213    
	if(cp->status & Serr){ 
1995/1206    
		DPRINT("%s: bad disk ident status\n", dp->vol); 
		if(dp->atapi == 0 && (cp->error & Eabort)){ 
			dp->atapi = 1; 
1995/1208    
		if(cp->error & Eabort){ 
1995/1206    
			if(isatapi(dp)){ 
				cmd = Cidentd; 
				goto retryatapi; 
1995/1206/sys/src/9/pc/devata.c:1134,11401995/1208/sys/src/9/pc/devata.c:1127,1133
1995/1206    
	dp->cyl = ip->cyls; 
	dp->heads = ip->heads; 
	dp->sectors = ip->s2t; 
	DPRINT("%s: %s %d/%d/%d CHS %d bytes\n", 
1995/1208    
	XPRINT("%s: %s %d/%d/%d CHS %d bytes\n", 
1995/1206    
		dp->vol, id, dp->cyl, dp->heads, dp->sectors, dp->cap); 
 
	if(ip->cvalid&(1<<0)){ 
1995/1206/sys/src/9/pc/devata.c:1142,11481995/1208/sys/src/9/pc/devata.c:1135,1141
1995/1206    
		dp->cyl = ip->ccyls; 
		dp->heads = ip->cheads; 
		dp->sectors = ip->cs2t; 
		DPRINT("%s: changed to %d cyl %d head %d sec\n", 
1995/1208    
		XPRINT("%s: changed to %d cyl %d head %d sec\n", 
1995/1206    
			dp->vol, dp->cyl, dp->heads, dp->sectors); 
	} 
 
1995/1206/sys/src/9/pc/devata.c:1151,11571995/1208/sys/src/9/pc/devata.c:1144,1150
1995/0213    
		dp->lba = 1; 
1995/1206    
		dp->lbasecs = lbasecs; 
		dp->cap = dp->bytes * dp->lbasecs; 
		DPRINT("%s: LBA: %s %d sectors %d bytes\n", 
1995/1208    
		XPRINT("%s: LBA: %s %d sectors %d bytes\n", 
1995/1206    
			dp->vol, id, dp->lbasecs, dp->cap); 
1995/0213    
	} else { 
		dp->lba = 0; 
1995/1206/sys/src/9/pc/devata.c:1534,15481995/1208/sys/src/9/pc/devata.c:1527,1544
1995/1206    
			print("%s: intr %d %d\n", dp->vol, cp->sofar, cp->nsecs); 
1995/0213    
		if(cp->sofar >= cp->nsecs){ 
			cp->lastcmd = cp->cmd; 
1995/1208    
#ifdef notdef 
1995/1206    
			if(cp->cmd == Cidentd) 
1995/0213    
				cp->cmd = Cident2; 
1995/1206    
			else if(cp->cmd == Cident && (cp->status & Sready) == 0) 
				cp->cmd = Cident2; 
1995/1208    
#else 
			if(cp->cmd != Cread && (cp->status & (Sbusy|Sready)) != Sready) 
				cp->cmd = Cident2; 
#endif /* notdef */ 
1995/1206    
			else 
				cp->cmd = 0; 
			inb(cp->pbase+Pstatus); 
			DPRINT("status %uX, alt %uX\n", 
				inb(cp->pbase+Pstatus), inb(cp->pbase+0x206)); 
1995/0213    
			wakeup(&cp->r); 
		} 
		break; 
1995/1206/sys/src/9/pc/devata.c:1614,16221995/1208/sys/src/9/pc/devata.c:1610,1619
1995/1206    
	cp = dp->cp; 
	outb(cp->pbase+Pdh, dp->dh); 
	DPRINT("%s: isatapi %d\n", dp->vol, dp->atapi); 
	if(dp->atapi){ 
		outb(cp->pbase+Pcmd, 0x08); 
		delay(20); 
1995/1208    
	outb(cp->pbase+Pcmd, 0x08); 
	if(atactlrwait(dp->cp, DHmagic, 0, MS2TK(100))){ 
		DPRINT("%s: isatapi ctlrwait status %ux\n", dp->vol, inb(cp->pbase+Pstatus)); 
		return 0; 
1995/1206    
	} 
	dp->atapi = 0; 
	dp->bytes = 512; 
1995/1206/sys/src/9/pc/devata.c:1688,16941995/1208/sys/src/9/pc/devata.c:1685,1691
1995/1206    
		nexterror(); 
 
	if(cp->status & Serr){ 
		DPRINT("%s: Bad packet command %ux\n", dp->vol, cp->error); 
1995/1208    
		DPRINT("%s: Bad packet command %ux, error %ux\n", dp->vol, cp->cmdblk[0], cp->error); 
1995/1206    
		error(Eio); 
	} 
} 
1995/1206/sys/src/9/pc/devata.c:1705,17111995/1208/sys/src/9/pc/devata.c:1702,1708
1995/1206    
 
	buf = smalloc(Maxxfer); 
	qlock(cp->ctlrlock); 
	retrycount = 1; 
1995/1208    
	retrycount = 2; 
1995/1206    
retry: 
	if(waserror()){ 
		dp->partok = 0; 
1995/1206/sys/src/9/pc/devata.c:1804,18101995/1208/sys/src/9/pc/devata.c:1801,1807
1995/1206    
 
	buf = smalloc(Maxxfer); 
	qlock(cp->ctlrlock); 
	retrycount = 1; 
1995/1208    
	retrycount = 2; 
1995/1206    
retry: 
	if(waserror()){ 
		if((cp->status & Serr) && (cp->error & 0xF0) == 0x60){ 
1995/1206/sys/src/9/pc/devata.c:1817,18231995/1208/sys/src/9/pc/devata.c:1814,1820
1995/1206    
		cp->dp = 0; 
		free(buf); 
		if((cp->status & Serr) && (cp->error & 0xF0) == 0x20) 
			err = cp->error; 
1995/1208    
			err = cp->error & 0xF0; 
1995/1206    
		else 
			err = 0; 
		qunlock(cp->ctlrlock); 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)