svn commit: r331136 - head/sys/dev/flash
Ian Lepore
ian at FreeBSD.org
Sun Mar 18 17:25:24 UTC 2018
Author: ian
Date: Sun Mar 18 17:25:23 2018
New Revision: 331136
URL: https://svnweb.freebsd.org/changeset/base/331136
Log:
Add sc_parent to the softc and use it in place of device_get_parent() calls
all over the place. Also pass the softc as the arg to all the internal
functions instead of passing a device_t and calling device_get_softc() in
each function.
Modified:
head/sys/dev/flash/mx25l.c
Modified: head/sys/dev/flash/mx25l.c
==============================================================================
--- head/sys/dev/flash/mx25l.c Sun Mar 18 17:03:26 2018 (r331135)
+++ head/sys/dev/flash/mx25l.c Sun Mar 18 17:25:23 2018 (r331136)
@@ -81,6 +81,7 @@ struct mx25l_flash_ident
struct mx25l_softc
{
device_t sc_dev;
+ device_t sc_parent;
uint8_t sc_manufacturer_id;
uint16_t sc_device_id;
unsigned int sc_sectorsize;
@@ -150,7 +151,7 @@ struct mx25l_flash_ident flash_devices[] = {
};
static uint8_t
-mx25l_get_status(device_t dev)
+mx25l_get_status(struct mx25l_softc *sc)
{
uint8_t txBuf[2], rxBuf[2];
struct spi_command cmd;
@@ -165,21 +166,20 @@ mx25l_get_status(device_t dev)
cmd.rx_cmd = rxBuf;
cmd.rx_cmd_sz = 2;
cmd.tx_cmd_sz = 2;
- err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
return (rxBuf[1]);
}
static void
-mx25l_wait_for_device_ready(device_t dev)
+mx25l_wait_for_device_ready(struct mx25l_softc *sc)
{
- while ((mx25l_get_status(dev) & STATUS_WIP))
+ while ((mx25l_get_status(sc) & STATUS_WIP))
continue;
}
static struct mx25l_flash_ident*
mx25l_get_device_ident(struct mx25l_softc *sc)
{
- device_t dev = sc->sc_dev;
uint8_t txBuf[8], rxBuf[8];
struct spi_command cmd;
uint8_t manufacturer_id;
@@ -199,7 +199,7 @@ mx25l_get_device_ident(struct mx25l_softc *sc)
*/
cmd.tx_cmd_sz = 4;
cmd.rx_cmd_sz = 4;
- err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
if (err)
return (NULL);
@@ -213,13 +213,14 @@ mx25l_get_device_ident(struct mx25l_softc *sc)
return &flash_devices[i];
}
- printf("Unknown SPI flash device. Vendor: %02x, device id: %04x\n",
+ device_printf(sc->sc_dev,
+ "Unknown SPI flash device. Vendor: %02x, device id: %04x\n",
manufacturer_id, dev_id);
return (NULL);
}
static void
-mx25l_set_writable(device_t dev, int writable)
+mx25l_set_writable(struct mx25l_softc *sc, int writable)
{
uint8_t txBuf[1], rxBuf[1];
struct spi_command cmd;
@@ -234,21 +235,18 @@ mx25l_set_writable(device_t dev, int writable)
cmd.rx_cmd = rxBuf;
cmd.rx_cmd_sz = 1;
cmd.tx_cmd_sz = 1;
- err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
}
static void
-mx25l_erase_cmd(device_t dev, off_t sector, uint8_t ecmd)
+mx25l_erase_cmd(struct mx25l_softc *sc, off_t sector, uint8_t ecmd)
{
- struct mx25l_softc *sc;
uint8_t txBuf[5], rxBuf[5];
struct spi_command cmd;
int err;
- sc = device_get_softc(dev);
+ mx25l_set_writable(sc, 1);
- mx25l_set_writable(dev, 1);
-
memset(&cmd, 0, sizeof(cmd));
memset(txBuf, 0, sizeof(txBuf));
memset(rxBuf, 0, sizeof(rxBuf));
@@ -270,23 +268,18 @@ mx25l_erase_cmd(device_t dev, off_t sector, uint8_t ec
txBuf[2] = ((sector >> 8) & 0xff);
txBuf[3] = (sector & 0xff);
}
- err = SPIBUS_TRANSFER(device_get_parent(dev), dev, &cmd);
- mx25l_wait_for_device_ready(dev);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
+ mx25l_wait_for_device_ready(sc);
}
static int
-mx25l_write(device_t dev, off_t offset, caddr_t data, off_t count)
+mx25l_write(struct mx25l_softc *sc, off_t offset, caddr_t data, off_t count)
{
- struct mx25l_softc *sc;
uint8_t txBuf[8], rxBuf[8];
struct spi_command cmd;
off_t bytes_to_write;
- device_t pdev;
int err = 0;
- pdev = device_get_parent(dev);
- sc = device_get_softc(dev);
-
if (sc->sc_flags & FL_ENABLE_4B_ADDR) {
cmd.tx_cmd_sz = 5;
cmd.rx_cmd_sz = 5;
@@ -309,7 +302,7 @@ mx25l_write(device_t dev, off_t offset, caddr_t data,
while (count != 0) {
/* If we crossed a sector boundary, erase the next sector. */
if (((offset) % sc->sc_sectorsize) == 0)
- mx25l_erase_cmd(dev, offset, CMD_SECTOR_ERASE);
+ mx25l_erase_cmd(sc, offset, CMD_SECTOR_ERASE);
txBuf[0] = CMD_PAGE_PROGRAM;
if (sc->sc_flags & FL_ENABLE_4B_ADDR) {
@@ -335,11 +328,11 @@ mx25l_write(device_t dev, off_t offset, caddr_t data,
* Each completed write operation resets WEL (write enable
* latch) to disabled state, so we re-enable it here.
*/
- mx25l_wait_for_device_ready(dev);
- mx25l_set_writable(dev, 1);
+ mx25l_wait_for_device_ready(sc);
+ mx25l_set_writable(sc, 1);
- err = SPIBUS_TRANSFER(pdev, dev, &cmd);
- mx25l_wait_for_device_ready(dev);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
+ mx25l_wait_for_device_ready(sc);
if (err)
break;
@@ -352,17 +345,12 @@ mx25l_write(device_t dev, off_t offset, caddr_t data,
}
static int
-mx25l_read(device_t dev, off_t offset, caddr_t data, off_t count)
+mx25l_read(struct mx25l_softc *sc, off_t offset, caddr_t data, off_t count)
{
- struct mx25l_softc *sc;
uint8_t txBuf[8], rxBuf[8];
struct spi_command cmd;
- device_t pdev;
int err = 0;
- pdev = device_get_parent(dev);
- sc = device_get_softc(dev);
-
/*
* Enforce that reads are aligned to the disk sectorsize, not the
* erase sectorsize. In this way, smaller read IO is possible,
@@ -401,25 +389,22 @@ mx25l_read(device_t dev, off_t offset, caddr_t data, o
cmd.tx_data_sz = count;
cmd.rx_data_sz = count;
- err = SPIBUS_TRANSFER(pdev, dev, &cmd);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
return (err);
}
static int
-mx25l_set_4b_mode(device_t dev, uint8_t command)
+mx25l_set_4b_mode(struct mx25l_softc *sc, uint8_t command)
{
uint8_t txBuf[1], rxBuf[1];
struct spi_command cmd;
- device_t pdev;
int err;
memset(&cmd, 0, sizeof(cmd));
memset(txBuf, 0, sizeof(txBuf));
memset(rxBuf, 0, sizeof(rxBuf));
- pdev = device_get_parent(dev);
-
cmd.tx_cmd_sz = cmd.rx_cmd_sz = 1;
cmd.tx_cmd = txBuf;
@@ -427,9 +412,9 @@ mx25l_set_4b_mode(device_t dev, uint8_t command)
txBuf[0] = command;
- err = SPIBUS_TRANSFER(pdev, dev, &cmd);
+ err = SPIBUS_TRANSFER(sc->sc_parent, sc->sc_dev, &cmd);
- mx25l_wait_for_device_ready(dev);
+ mx25l_wait_for_device_ready(sc);
return (err);
}
@@ -479,13 +464,15 @@ mx25l_attach(device_t dev)
sc = device_get_softc(dev);
sc->sc_dev = dev;
+ sc->sc_parent = device_get_parent(sc->sc_dev);
+
M25PXX_LOCK_INIT(sc);
ident = mx25l_get_device_ident(sc);
if (ident == NULL)
return (ENXIO);
- mx25l_wait_for_device_ready(sc->sc_dev);
+ mx25l_wait_for_device_ready(sc);
sc->sc_disk = disk_alloc();
sc->sc_disk->d_open = mx25l_open;
@@ -505,10 +492,10 @@ mx25l_attach(device_t dev)
sc->sc_flags = ident->flags;
if (sc->sc_flags & FL_ENABLE_4B_ADDR)
- mx25l_set_4b_mode(dev, CMD_ENTER_4B_MODE);
+ mx25l_set_4b_mode(sc, CMD_ENTER_4B_MODE);
if (sc->sc_flags & FL_DISABLE_4B_ADDR)
- mx25l_set_4b_mode(dev, CMD_EXIT_4B_MODE);
+ mx25l_set_4b_mode(sc, CMD_EXIT_4B_MODE);
/* NB: use stripesize to hold the erase/region size for RedBoot */
sc->sc_disk->d_stripesize = ident->sectorsize;
@@ -542,7 +529,7 @@ mx25l_detach(device_t dev)
err = msleep(sc, &sc->sc_mtx, 0, "mx25dt", hz * 3);
if (err != 0) {
sc->sc_taskstate = TSTATE_RUNNING;
- device_printf(dev,
+ device_printf(sc->sc_dev,
"Failed to stop queue task\n");
}
}
@@ -637,11 +624,11 @@ mx25l_task(void *arg)
switch (bp->bio_cmd) {
case BIO_READ:
- bp->bio_error = mx25l_read(dev, bp->bio_offset,
+ bp->bio_error = mx25l_read(sc, bp->bio_offset,
bp->bio_data, bp->bio_bcount);
break;
case BIO_WRITE:
- bp->bio_error = mx25l_write(dev, bp->bio_offset,
+ bp->bio_error = mx25l_write(sc, bp->bio_offset,
bp->bio_data, bp->bio_bcount);
break;
default:
More information about the svn-src-head
mailing list