Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 14 Feb 2011 03:02:46 +0800
From:      Adrian Chadd <adrian.chadd@gmail.com>
To:        freebsd-embedded@freebsd.org
Cc:        freebsd-mips@freebsd.org
Subject:   patch to sys/dev/flash/ to allow smaller read IO sizes
Message-ID:  <AANLkTikRxgg0M4PLFOG%2BP1W8ixQpVJP4PsfzhFZvAgHx@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
I've been running a few of my ubiquiti boards out of flash recently
and the default sector size just makes it impossible.

This patch introduces a couple of important changes:

* the GEOM sector size is changed to 512 bytes;
* non-aligned size/offset for read/write is now an IO error, rather
than a KASSERT();

This means that read IO will work fine with smaller IO sizes and the
wrong-sized IO will simply return EIO rather than panicing the kernel.
Writing should still work for IO size+offset as a multiple of the
sector size.

Thanks,


Adrian

====

[root@pcbsd-1294 /data/1/adrian/head/src]# cat /tmp/flash_read_size.diff
Index: sys/dev/flash/mx25l.c
===================================================================
--- sys/dev/flash/mx25l.c       (revision 218440)
+++ sys/dev/flash/mx25l.c       (working copy)
@@ -49,6 +49,13 @@
 #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;
@@ -230,17 +237,10 @@
        bytes_writen = 0;
        write_offset = offset;

-       /*
-        * Sanity checks
-        */
-       KASSERT(count % sc->sc_sectorsize == 0,
-           ("count for BIO_WRITE is not sector size (%d bytes) aligned",
-               sc->sc_sectorsize));
+       /* Use the erase sectorsize here; since blocks are erased
first before writing */
+       if (count % sc->sc_sectorsize != 0 || offset % sc->sc_sectorsize != 0)
+               return (EIO);

-       KASSERT(offset % sc->sc_sectorsize == 0,
-           ("offset for BIO_WRITE is not sector size (%d bytes) aligned",
-               sc->sc_sectorsize));
-
        /*
         * Assume here that we write per-sector only
         * and sector size should be 256 bytes aligned
@@ -307,17 +307,10 @@
        pdev = device_get_parent(dev);
        sc = device_get_softc(dev);

-       /*
-        * Sanity checks
-        */
-       KASSERT(count % sc->sc_sectorsize == 0,
-           ("count for BIO_READ is not sector size (%d bytes) aligned",
-               sc->sc_sectorsize));
+       /* Enforce the disk read sectorsize; not the erase sectorsize */
+       if (count % sc->sc_disk->d_sectorsize != 0 || offset %
sc->sc_disk->d_sectorsize != 0)
+               return (EIO);

-       KASSERT(offset % sc->sc_sectorsize == 0,
-           ("offset for BIO_READ is not sector size (%d bytes) aligned",
-               sc->sc_sectorsize));
-
        txBuf[0] = CMD_FAST_READ;
        cmd.tx_cmd_sz = 5;
        cmd.rx_cmd_sz = 5;
@@ -371,7 +364,7 @@
        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 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTikRxgg0M4PLFOG%2BP1W8ixQpVJP4PsfzhFZvAgHx>