git: 9front

Download patch

ref: 6e4fdfeb26f8e906296edf46882379dda7db215a
parent: 1cb466d417a9911484a6e097b78c53633e07076a
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Wed Dec 26 12:58:15 EST 2012

sdide: packet io byte count.

instead of setting the packet io byte count to some bullshit
value, use the dlen from the scsi request. limit transfer
byte count to 32k for atapi.

--- a/sys/src/9/pc/sdide.c
+++ b/sys/src/9/pc/sdide.c
@@ -1066,7 +1066,7 @@
 atapktio0(Drive *drive, SDreq *r)
 {
 	uchar *cmd;
-	int as, cmdport, ctlport, len, rv;
+	int as, cmdport, ctlport, rv;
 	Ctlr *ctlr;
 
 	rv = SDok;
@@ -1074,6 +1074,8 @@
 	drive->command = Cpkt;
 	memmove(drive->pktcmd, cmd, r->clen);
 	memset(drive->pktcmd+r->clen, 0, drive->pkt-r->clen);
+	if(drive->dlen > 0x8000)
+		drive->dlen = 0x8000;
 	drive->limit = drive->data+drive->dlen;
 
 	ctlr = drive->ctlr;
@@ -1086,21 +1088,15 @@
 		return SDnostatus;
 
 	ilock(ctlr);
-	if(drive->dlen && drive->dmactl && !atadmasetup(drive, drive->dlen)){
+	if(drive->dlen && drive->dmactl && !atadmasetup(drive, drive->dlen))
 		drive->pktdma = Dma;
-		len = 0;		/* bytecount should be 0 for dma */
-	}else{
+	else
 		drive->pktdma = 0;
-		if(drive->secsize)
-			len = 16*drive->secsize;
-		else
-			len = 0x8000;
-	}
 	outb(cmdport+Features, drive->pktdma);
 	outb(cmdport+Count, 0);
 	outb(cmdport+Sector, 0);
-	outb(cmdport+Bytelo, len);
-	outb(cmdport+Bytehi, len>>8);
+	outb(cmdport+Bytelo, drive->dlen);
+	outb(cmdport+Bytehi, drive->dlen>>8);
 	outb(cmdport+Dh, drive->dev);
 	ctlr->done = 0;
 	ctlr->curdrive = drive;
@@ -1374,10 +1370,8 @@
 	SDunit *unit;
 
 	unit = r->unit;
-	if((ctlr = unit->dev->ctlr) == nil || ctlr->drive[unit->subno] == nil){
-		r->status = SDtimeout;
-		return SDtimeout;
-	}
+	if((ctlr = unit->dev->ctlr) == nil || ctlr->drive[unit->subno] == nil)
+		return r->status = SDtimeout;
 	drive = ctlr->drive[unit->subno];
 	qlock(drive);
 	for(;;){
--