--- /sys/src/9/pc/sdata.c +++ /sys/src/9/pc/sdata.c @@ -1496,8 +1496,10 @@ atagenio(Drive* drive, uchar* cmd, int clen) { uchar *p; Ctlr *ctlr; - vlong lba, len; - int count, maxio; + int maxio; + ulong count; + vlong len; + uvlong lba; /* * Map SCSI commands into ATA commands for discs. @@ -1603,17 +1605,11 @@ atagenio(Drive* drive, uchar* cmd, int clen) } ctlr = drive->ctlr; - if(clen == 16){ + if(clen == 16) /* ata commands only go to 48-bit lba */ if(cmd[2] || cmd[3]) return atasetsense(drive, SDcheck, 3, 0xc, 2); - lba = (uvlong)cmd[4]<<40 | (uvlong)cmd[5]<<32; - lba |= cmd[6]<<24 | cmd[7]<<16 | cmd[8]<<8 | cmd[9]; - count = cmd[10]<<24 | cmd[11]<<16 | cmd[12]<<8 | cmd[13]; - }else{ - lba = cmd[2]<<24 | cmd[3]<<16 | cmd[4]<<8 | cmd[5]; - count = cmd[7]<<8 | cmd[8]; - } + scsilbacount(cmd, clen, &lba, &count); if(drive->data == nil) return SDok; if(drive->dlen < count*drive->secsize)