summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/mmc/mmcsd.c48
1 files changed, 24 insertions, 24 deletions
diff --git a/sys/dev/mmc/mmcsd.c b/sys/dev/mmc/mmcsd.c
index 888b61b..63e0b54 100644
--- a/sys/dev/mmc/mmcsd.c
+++ b/sys/dev/mmc/mmcsd.c
@@ -163,19 +163,20 @@ mmcsd_attach(device_t dev)
d->d_unit = device_get_unit(dev);
d->d_flags = DISKFLAG_CANDELETE;
/*
- * Display in most natural units. There's no cards < 1MB.
- * The SD standard goes to 2GiB, but the data format supports
- * up to 4GiB and some card makers push it up to this limit.
- * The SDHC standard only goes to 32GiB (the data format in
- * SDHC is good to 2TiB however, which isn't too ugly at
- * 2048GiBm, so we note it in passing here and don't add the
- * code to print TiB).
+ * Display in most natural units. There's no cards < 1MB. The SD
+ * standard goes to 2GiB due to its reliance on FAT, but the data
+ * format supports up to 4GiB and some card makers push it up to this
+ * limit. The SDHC standard only goes to 32GiB due to FAT32, but the
+ * data format supports up to 2TiB however. 2048GB isn't too ugly, so
+ * we note it in passing here and don't add the code to print
+ * TB). Since these cards are sold in terms of MB and GB not MiB and
+ * GiB, report them like that.
*/
- mb = d->d_mediasize >> 20; /* 1MiB == 1 << 20 */
+ mb = d->d_mediasize / 1000000;
unit = 'M';
- if (mb >= 10240) { /* 1GiB = 1024 MiB */
+ if (mb >= 1000) {
unit = 'G';
- mb /= 1024;
+ mb /= 1000;
}
/*
* Report the clock speed of the underlying hardware, which might be
@@ -312,6 +313,7 @@ mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp)
struct mmc_data data;
device_t dev = sc->dev;
int sz = sc->disk->d_sectorsize;
+ device_t mmcbr = device_get_parent(dev);
block = bp->bio_pblkno;
end = bp->bio_pblkno + (bp->bio_bcount / sz);
@@ -355,8 +357,7 @@ mmcsd_rw(struct mmcsd_softc *sc, struct bio *bp)
stop.mrq = &req;
req.stop = &stop;
}
- MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev,
- &req);
+ MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req);
if (req.cmd->error != MMC_ERR_NONE) {
device_printf(dev, "Error indicated: %d %s\n",
req.cmd->error, mmcsd_errmsg(req.cmd->error));
@@ -376,6 +377,7 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp)
device_t dev = sc->dev;
int sz = sc->disk->d_sectorsize;
int erase_sector;
+ device_t mmcbr = device_get_parent(dev);
block = bp->bio_pblkno;
end = bp->bio_pblkno + (bp->bio_bcount / sz);
@@ -410,8 +412,7 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp)
if (!mmc_get_high_cap(dev))
cmd.arg <<= 9;
cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
- MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev,
- &req);
+ MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req);
if (req.cmd->error != MMC_ERR_NONE) {
printf("erase err1: %d\n", req.cmd->error);
return (block);
@@ -429,8 +430,7 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp)
cmd.arg <<= 9;
cmd.arg--;
cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
- MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev,
- &req);
+ MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req);
if (req.cmd->error != MMC_ERR_NONE) {
printf("erase err2: %d\n", req.cmd->error);
return (block);
@@ -442,8 +442,7 @@ mmcsd_delete(struct mmcsd_softc *sc, struct bio *bp)
cmd.opcode = MMC_ERASE;
cmd.arg = 0;
cmd.flags = MMC_RSP_R1B | MMC_CMD_AC;
- MMCBUS_WAIT_FOR_REQUEST(device_get_parent(dev), dev,
- &req);
+ MMCBUS_WAIT_FOR_REQUEST(mmcbr, dev, &req);
if (req.cmd->error != MMC_ERR_NONE) {
printf("erase err3 %d\n", req.cmd->error);
return (block);
@@ -468,6 +467,7 @@ mmcsd_dump(void *arg, void *virtual, vm_offset_t physical,
device_t dev = sc->dev;
struct bio bp;
daddr_t block, end;
+ device_t mmcbr = device_get_parent(dev);
/* length zero is special and really means flush buffers to media */
if (!length)
@@ -480,9 +480,9 @@ mmcsd_dump(void *arg, void *virtual, vm_offset_t physical,
bp.bio_data = virtual;
bp.bio_cmd = BIO_WRITE;
end = bp.bio_pblkno + bp.bio_bcount / sc->disk->d_sectorsize;
- MMCBUS_ACQUIRE_BUS(device_get_parent(dev), dev);
+ MMCBUS_ACQUIRE_BUS(mmcbr, dev);
block = mmcsd_rw(sc, &bp);
- MMCBUS_RELEASE_BUS(device_get_parent(dev), dev);
+ MMCBUS_RELEASE_BUS(mmcbr, dev);
return ((end < block) ? EIO : 0);
}
@@ -493,9 +493,9 @@ mmcsd_task(void *arg)
struct bio *bp;
int sz;
daddr_t block, end;
- device_t dev;
+ device_t dev = sc->dev;
+ device_t mmcbr = device_get_parent(sc->dev);
- dev = sc->dev;
while (1) {
MMCSD_LOCK(sc);
do {
@@ -513,7 +513,7 @@ mmcsd_task(void *arg)
biodone(bp);
continue;
}
- MMCBUS_ACQUIRE_BUS(device_get_parent(dev), dev);
+ MMCBUS_ACQUIRE_BUS(mmcbr, dev);
sz = sc->disk->d_sectorsize;
block = bp->bio_pblkno;
end = bp->bio_pblkno + (bp->bio_bcount / sz);
@@ -525,7 +525,7 @@ mmcsd_task(void *arg)
} else if (bp->bio_cmd == BIO_DELETE) {
block = mmcsd_delete(sc, bp);
}
- MMCBUS_RELEASE_BUS(device_get_parent(dev), dev);
+ MMCBUS_RELEASE_BUS(mmcbr, dev);
if (block < end) {
bp->bio_error = EIO;
bp->bio_resid = (end - block) * sz;
OpenPOWER on IntegriCloud