diff options
author | 2020-09-13 14:26:56 +0000 | |
---|---|---|
committer | 2020-09-13 14:26:56 +0000 | |
commit | 3e16148d8fe176d83ff415f6c03a79618da4401e (patch) | |
tree | ad147973ad416853f933be13c4226bc26617a860 | |
parent | The SMC base address and i/o region size is now queried by acpi(4) and (diff) | |
download | wireguard-openbsd-3e16148d8fe176d83ff415f6c03a79618da4401e.tar.xz wireguard-openbsd-3e16148d8fe176d83ff415f6c03a79618da4401e.zip |
Always use READ(16)/WRITE(16) commands for disks large enough to require
READ(16)/WRITE(16) to access the last sectors
Fixes (at least) large 512E (a.k.a. emulated 512-byte sector) devices plugged
into overly helpful USB <-> ATA/ATAPI bridges. Which can tell you they are using
512-byte sector addresses but spontaneously/silently interpret
READ(10)/WRITE(10) commands as using 4K sector addresses/sizes.
Diagnosed and fix tested with James Cook. Thanks!
-rw-r--r-- | sys/scsi/sd.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c index f8667872a02..141f62fc250 100644 --- a/sys/scsi/sd.c +++ b/sys/scsi/sd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sd.c,v 1.326 2020/09/01 12:17:53 krw Exp $ */ +/* $OpenBSD: sd.c,v 1.327 2020/09/13 14:26:56 krw Exp $ */ /* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */ /*- @@ -695,14 +695,15 @@ sdstart(struct scsi_xfer *xs) ((secno & 0x1fffff) == secno) && ((nsecs & 0xff) == nsecs)) xs->cmdlen = sd_cmd_rw6(xs->cmd, read, secno, nsecs); - else if (((secno & 0xffffffff) == secno) && - ((nsecs & 0xffff) == nsecs)) + + else if (sc->params.disksize > UINT32_MAX) + xs->cmdlen = sd_cmd_rw16(xs->cmd, read, secno, nsecs); + + else if (nsecs <= UINT16_MAX) xs->cmdlen = sd_cmd_rw10(xs->cmd, read, secno, nsecs); - else if (((secno & 0xffffffff) == secno) && - ((nsecs & 0xffffffff) == nsecs)) - xs->cmdlen = sd_cmd_rw12(xs->cmd, read, secno, nsecs); + else - xs->cmdlen = sd_cmd_rw16(xs->cmd, read, secno, nsecs); + xs->cmdlen = sd_cmd_rw12(xs->cmd, read, secno, nsecs); disk_busy(&sc->sc_dk); if (!read) |