summaryrefslogtreecommitdiffstats
path: root/sys/dev/nand
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2013-06-12 12:51:43 +0000
committermav <mav@FreeBSD.org>2013-06-12 12:51:43 +0000
commitfe855c3b46ff660d64da383e281859d4d21bc434 (patch)
treec970f0c68e475aece32cf8fed5bfd40ed584d038 /sys/dev/nand
parentf1ebf2df2f13be56f0b04cf5d1daa9775d861029 (diff)
downloadFreeBSD-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.c36
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
OpenPOWER on IntegriCloud