diff options
author | mav <mav@FreeBSD.org> | 2013-06-12 12:51:43 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2013-06-12 12:51:43 +0000 |
commit | fe855c3b46ff660d64da383e281859d4d21bc434 (patch) | |
tree | c970f0c68e475aece32cf8fed5bfd40ed584d038 /sys/dev/nand | |
parent | f1ebf2df2f13be56f0b04cf5d1daa9775d861029 (diff) | |
download | FreeBSD-src-fe855c3b46ff660d64da383e281859d4d21bc434.zip FreeBSD-src-fe855c3b46ff660d64da383e281859d4d21bc434.tar.gz |
Use direct custom implementations instead of g_handleattr() for CFI and NAND
d_getattr(). Since these drivers use disk(9) KPI and not directly GEOM, use
of that function means KPI layering violation, causing extra g_io_deliver()
call for the request.
Diffstat (limited to 'sys/dev/nand')
-rw-r--r-- | sys/dev/nand/nand_geom.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/sys/dev/nand/nand_geom.c b/sys/dev/nand/nand_geom.c index a8bdba2..2c4915b 100644 --- a/sys/dev/nand/nand_geom.c +++ b/sys/dev/nand/nand_geom.c @@ -156,6 +156,7 @@ nand_getattr(struct bio *bp) struct nand_chip *chip; struct chip_geom *cg; device_t dev; + int val; if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL) return (ENXIO); @@ -166,22 +167,25 @@ nand_getattr(struct bio *bp) dev = device_get_parent(chip->dev); dev = device_get_parent(dev); - do { - if (g_handleattr_int(bp, "NAND::oobsize", cg->oob_size)) - break; - else if (g_handleattr_int(bp, "NAND::pagesize", cg->page_size)) - break; - else if (g_handleattr_int(bp, "NAND::blocksize", - cg->block_size)) - break; - else if (g_handleattr(bp, "NAND::device", &(dev), - sizeof(device_t))) - break; - - return (ERESTART); - } while (0); - - return (EJUSTRETURN); + if (strcmp(bp->bio_attribute, "NAND::device") == 0) { + if (bp->bio_length != sizeof(dev)) + return (EFAULT); + bcopy(&dev, bp->bio_data, sizeof(dev)); + } else { + if (strcmp(bp->bio_attribute, "NAND::oobsize") == 0) + val = cg->oob_size; + else if (strcmp(bp->bio_attribute, "NAND::pagesize") == 0) + val = cg->page_size; + else if (strcmp(bp->bio_attribute, "NAND::blocksize") == 0) + val = cg->block_size; + else + return (-1); + if (bp->bio_length != sizeof(val)) + return (EFAULT); + bcopy(&val, bp->bio_data, sizeof(val)); + } + bp->bio_completed = bp->bio_length; + return (0); } static int |