Module Name: src Committed By: jdolecek Date: Wed Apr 19 21:02:43 UTC 2017
Modified Files: src/sys/dev/ata [jdolecek-ncq]: TODO.ncq wd.c Log Message: up to 65536 sectors can be transferred for LBA48 commands; adjust wdminphys() and wdstart1() accordingly To generate a diff of this commit: cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/dev/ata/TODO.ncq cvs rdiff -u -r1.428.2.7 -r1.428.2.8 src/sys/dev/ata/wd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ata/TODO.ncq diff -u src/sys/dev/ata/TODO.ncq:1.1.2.1 src/sys/dev/ata/TODO.ncq:1.1.2.2 --- src/sys/dev/ata/TODO.ncq:1.1.2.1 Wed Apr 19 20:49:58 2017 +++ src/sys/dev/ata/TODO.ncq Wed Apr 19 21:02:43 2017 @@ -5,8 +5,6 @@ softc for wd? at umass* protect more of wddone() with mutex? -wdminphys() - LBA48 has maximum 65536 sectors - refactor mvsata to reuse (more of) ata_wdc.c? NCQ ICC - investigate and set/get the behaviour with timeouts Index: src/sys/dev/ata/wd.c diff -u src/sys/dev/ata/wd.c:1.428.2.7 src/sys/dev/ata/wd.c:1.428.2.8 --- src/sys/dev/ata/wd.c:1.428.2.7 Wed Apr 19 20:49:17 2017 +++ src/sys/dev/ata/wd.c Wed Apr 19 21:02:43 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: wd.c,v 1.428.2.7 2017/04/19 20:49:17 jdolecek Exp $ */ +/* $NetBSD: wd.c,v 1.428.2.8 2017/04/19 21:02:43 jdolecek Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved. @@ -54,7 +54,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.7 2017/04/19 20:49:17 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.428.2.8 2017/04/19 21:02:43 jdolecek Exp $"); #include "opt_ata.h" @@ -793,9 +793,10 @@ fail: else xfer->c_bio.flags = 0; if (wd->sc_flags & WDF_LBA48 && - (xfer->c_bio.blkno + + (((xfer->c_bio.blkno + xfer->c_bio.bcount / wd->sc_dk.dk_label->d_secsize) > - wd->sc_capacity28) + wd->sc_capacity28) || + ((xfer->c_bio.bcount / wd->sc_dk.dk_label->d_secsize) > 128))) xfer->c_bio.flags |= ATA_LBA48; /* If NCQ was negotiated, always use it */ @@ -977,10 +978,21 @@ wdminphys(struct buf *bp) { const struct wd_softc * const wd = device_lookup_private(&wd_cd, WDUNIT(bp->b_dev)); + uint32_t maxsectors; + + /* + * The limit is actually 65536 for LBA48 and 256 for non-LBA48, + * but that requires to pass set the count for the ATA command + * to 0, which is somewhat error prone, so better stay safe. + */ + if (wd->sc_flags & WDF_LBA48) + maxsectors = 65535; + else + maxsectors = 128; + + if (bp->b_bcount > (wd->sc_blksize * maxsectors)) + bp->b_bcount = (wd->sc_blksize * maxsectors); - if (bp->b_bcount > (wd->sc_blksize * 128)) { - bp->b_bcount = (wd->sc_blksize * 128); - } minphys(bp); }