svn commit: r218747 - head/sys/dev/flash
Adrian Chadd
adrian at FreeBSD.org
Wed Feb 16 20:07:45 UTC 2011
Author: adrian
Date: Wed Feb 16 20:07:44 2011
New Revision: 218747
URL: http://svn.freebsd.org/changeset/base/218747
Log:
Modify the spi flash driver to allow smaller read IO sizes, but enforce
the larger, aligned write+erase sizes the driver currently implements.
This preserves write behaviour but makes the flash driver usable for things
like a read-only FFS or a geom_uzip/geom_compress .
Note that since GEOM will now return the sector size as being smaller,
writes of sector size/alignment will now fail with an EIO. Code which
writes to the flash device will have to be (for now) manually taught
about the flash write blocksize.
Modified:
head/sys/dev/flash/mx25l.c
Modified: head/sys/dev/flash/mx25l.c
==============================================================================
--- head/sys/dev/flash/mx25l.c Wed Feb 16 19:30:29 2011 (r218746)
+++ head/sys/dev/flash/mx25l.c Wed Feb 16 20:07:44 2011 (r218747)
@@ -49,6 +49,13 @@ __FBSDID("$FreeBSD$");
#define FL_ERASE_4K 0x01
#define FL_ERASE_32K 0x02
+/*
+ * Define the sectorsize to be a smaller size rather than the flash
+ * sector size. Trying to run FFS off of a 64k flash sector size
+ * results in a completely un-usable system.
+ */
+#define MX25L_SECTORSIZE 512
+
struct mx25l_flash_ident
{
const char *name;
@@ -231,15 +238,11 @@ mx25l_write(device_t dev, off_t offset,
write_offset = offset;
/*
- * Sanity checks
+ * Use the erase sectorsize here since blocks are fully erased
+ * first before they're written to.
*/
- KASSERT(count % sc->sc_sectorsize == 0,
- ("count for BIO_WRITE is not sector size (%d bytes) aligned",
- sc->sc_sectorsize));
-
- KASSERT(offset % sc->sc_sectorsize == 0,
- ("offset for BIO_WRITE is not sector size (%d bytes) aligned",
- sc->sc_sectorsize));
+ if (count % sc->sc_sectorsize != 0 || offset % sc->sc_sectorsize != 0)
+ return (EIO);
/*
* Assume here that we write per-sector only
@@ -308,15 +311,13 @@ mx25l_read(device_t dev, off_t offset, c
sc = device_get_softc(dev);
/*
- * Sanity checks
+ * Enforce the disk read sectorsize not the erase sectorsize.
+ * In this way, smaller read IO is possible,dramatically
+ * speeding up filesystem/geom_compress access.
*/
- KASSERT(count % sc->sc_sectorsize == 0,
- ("count for BIO_READ is not sector size (%d bytes) aligned",
- sc->sc_sectorsize));
-
- KASSERT(offset % sc->sc_sectorsize == 0,
- ("offset for BIO_READ is not sector size (%d bytes) aligned",
- sc->sc_sectorsize));
+ if (count % sc->sc_disk->d_sectorsize != 0
+ || offset % sc->sc_disk->d_sectorsize != 0)
+ return (EIO);
txBuf[0] = CMD_FAST_READ;
cmd.tx_cmd_sz = 5;
@@ -371,7 +372,7 @@ mx25l_attach(device_t dev)
sc->sc_disk->d_name = "flash/spi";
sc->sc_disk->d_drv1 = sc;
sc->sc_disk->d_maxsize = DFLTPHYS;
- sc->sc_disk->d_sectorsize = ident->sectorsize;
+ sc->sc_disk->d_sectorsize = MX25L_SECTORSIZE;
sc->sc_disk->d_mediasize = ident->sectorsize * ident->sectorcount;
sc->sc_disk->d_unit = device_get_unit(sc->sc_dev);
sc->sc_disk->d_dump = NULL; /* NB: no dumps */
More information about the svn-src-head
mailing list