Date: Wed, 13 Mar 2013 18:41:05 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 222836 for review Message-ID: <201303131841.r2DIf5xn027308@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@222836?ac=10 Change 222836 by brooks@brooks_zenith on 2013/03/13 18:40:14 Add support for partitioning CFI disks from FDT using geom_flashmap. In geom_flashmap, don't partition anything other that disks. With out this, the layering violation required to retrieve FDT entries caused not only the disk, but all non-flashmap partitions of the disk to have *s.<partition> entries created. Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_disk.c#4 edit .. //depot/projects/ctsrd/beribsd/src/sys/geom/geom_flashmap.c#3 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_disk.c#4 (text+ko) ==== @@ -44,6 +44,7 @@ #include <dev/cfi/cfi_var.h> +#include <geom/geom.h> #include <geom/geom_disk.h> struct cfi_disk_softc { @@ -64,9 +65,11 @@ static int cfi_disk_open(struct disk *); static int cfi_disk_close(struct disk *); static void cfi_io_proc(void *, int); +static int cfi_disk_getattr(struct bio *); static void cfi_disk_strategy(struct bio *); static int cfi_disk_ioctl(struct disk *, u_long, void *, int, struct thread *); + static int cfi_disk_probe(device_t dev) { @@ -95,6 +98,7 @@ sc->disk->d_strategy = cfi_disk_strategy; sc->disk->d_ioctl = cfi_disk_ioctl; sc->disk->d_dump = NULL; /* NB: no dumps */ + sc->disk->d_getattr = cfi_disk_getattr; sc->disk->d_sectorsize = CFI_DISK_SECSIZE; sc->disk->d_mediasize = sc->parent->sc_size; sc->disk->d_maxsize = CFI_DISK_MAXIOSIZE; @@ -275,6 +279,31 @@ } } +static int +cfi_disk_getattr(struct bio *bp) +{ + struct cfi_disk_softc *dsc; + struct cfi_softc *sc; + device_t dev; + + if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL) + return (ENXIO); + + dsc = bp->bio_disk->d_drv1; + sc = dsc->parent; + dev = sc->sc_dev; + + do { + if (g_handleattr(bp, "CFI::device", &dev, sizeof(device_t))) + break; + + return (ERESTART); + } while(0); + + return (EJUSTRETURN); +} + + static void cfi_disk_strategy(struct bio *bp) { ==== //depot/projects/ctsrd/beribsd/src/sys/geom/geom_flashmap.c#3 (text+ko) ==== @@ -174,7 +174,7 @@ g_topology_assert(); if (flags == G_TF_NORMAL && - !strcmp(pp->geom->class->name, FLASHMAP_CLASS_NAME)) + strcmp(pp->geom->class->name, "DISK") != 0) return (NULL); gp = g_slice_new(mp, FLASH_SLICES_MAX_NUM, pp, &cp, NULL, 0, @@ -186,8 +186,11 @@ do { size = sizeof(device_t); - if (g_io_getattr("NAND::device", cp, &size, &dev)) - break; + if (g_io_getattr("NAND::device", cp, &size, &dev)) { + size = sizeof(device_t); + if (g_io_getattr("CFI::device", cp, &size, &dev)) + break; + } nslices = g_flashmap_load(dev, &head); if (nslices == 0)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303131841.r2DIf5xn027308>