From: David Vrabel <david.vrabel@csr.com>
To: Pierre Ossman <drzeus-list@drzeus.cx>
Cc: linux-kernel@vger.kernel.org
Subject: [patch 2/3] sdio: set the functions' block size
Date: Wed, 08 Aug 2007 14:23:48 +0100 [thread overview]
Message-ID: <46B9C3E4.6050104@csr.com> (raw)
In-Reply-To: <46B9C38C.1030708@csr.com>
[-- Attachment #1: Type: text/plain, Size: 152 bytes --]
--
David Vrabel, Software Engineer, Drivers group Tel: +44 (0)1223 692562
CSR plc, Churchill House, Cambridge Business Park, Cowley Road, CB4 0WZ
.
[-- Attachment #2: sdio-set-the-functions-block-size.patch --]
[-- Type: text/x-patch, Size: 4888 bytes --]
sdio: set the functions' block size
Before a driver is probed, set the function's block size to the default so the
driver is sure the block size is something sensible and it needn't explicitly
set it.
The default block size is the largest that's supported by both the card and
the host, with a maximum of 512 to ensure aribitrarily sized transfer use the
optimal (least) number of commands.
See http://lkml.org/lkml/2007/8/7/150 for reasons for the block size choice.
Signed-off-by: David Vrabel <david.vrabel@csr.com>
---
Index: mmc/drivers/mmc/core/sdio_cis.c
===================================================================
--- mmc.orig/drivers/mmc/core/sdio_cis.c 2007-08-08 13:29:56.000000000 +0100
+++ mmc/drivers/mmc/core/sdio_cis.c 2007-08-08 13:30:21.000000000 +0100
@@ -145,9 +145,9 @@
printk(KERN_DEBUG "%s: TPLFE_CSA_PROPERTY = 0x%02x\n",
sdio_func_id(func), val);
/* TPLFE_MAX_BLK_SIZE */
- func->blksize = buf[12] | (buf[13] << 8);
+ func->max_blksize = buf[12] | (buf[13] << 8);
printk(KERN_DEBUG "%s: TPLFE_MAX_BLK_SIZE = %u\n",
- sdio_func_id(func), (unsigned)func->blksize);
+ sdio_func_id(func), (unsigned)func->max_blksize);
/* TPLFE_OCR */
val = buf[14] | (buf[15] << 8) | (buf[16] << 16) | (buf[17] << 24);
printk(KERN_DEBUG "%s: TPLFE_OCR = 0x%08x\n",
Index: mmc/drivers/mmc/core/sdio_io.c
===================================================================
--- mmc.orig/drivers/mmc/core/sdio_io.c 2007-08-08 13:29:47.000000000 +0100
+++ mmc/drivers/mmc/core/sdio_io.c 2007-08-08 13:34:09.000000000 +0100
@@ -145,6 +145,55 @@
EXPORT_SYMBOL_GPL(sdio_disable_func);
/**
+ * sdio_set_block_size - set the block size of an SDIO function
+ * @func: SDIO function to change
+ * @blksz: new block size or 0 to use the default.
+ *
+ * The default block size is the largest supported by both the function
+ * and the host, with a maximum of 512 to ensure that arbitrarily sized
+ * data transfer use the optimal (least) number of commands.
+ *
+ * A driver may call this to override the default block size set by the
+ * core. This can be used to set a block size greater than the maximum
+ * that reported by the card; it is the driver's responsibility to ensure
+ * it uses a value that the card supports.
+ *
+ * Returns 0 on success, -EINVAL if the host does not support the
+ * requested block size, or -EIO (etc.) if one of the resultant FBR block
+ * size register writes failed.
+ *
+ */
+int sdio_set_block_size(struct sdio_func *func, unsigned blksz)
+{
+ int ret;
+
+ if (blksz > func->card->host->max_blk_size)
+ return -EINVAL;
+
+ if (blksz == 0) {
+ blksz = min(min(
+ func->max_blksize,
+ func->card->host->max_blk_size),
+ 512u);
+ }
+
+ ret = mmc_io_rw_direct(func->card, 1, 0,
+ SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE,
+ blksz & 0xff, NULL);
+ if (ret)
+ return ret;
+ ret = mmc_io_rw_direct(func->card, 1, 0,
+ SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE + 1,
+ (blksz >> 8) & 0xff, NULL);
+ if (ret)
+ return ret;
+ func->cur_blksize = blksz;
+ return 0;
+}
+
+EXPORT_SYMBOL_GPL(sdio_set_block_size);
+
+/**
* sdio_readb - read a single byte from a SDIO function
* @func: SDIO function to access
* @addr: address to read
Index: mmc/include/linux/mmc/sdio_func.h
===================================================================
--- mmc.orig/include/linux/mmc/sdio_func.h 2007-08-08 13:29:47.000000000 +0100
+++ mmc/include/linux/mmc/sdio_func.h 2007-08-08 13:30:21.000000000 +0100
@@ -43,7 +43,8 @@
unsigned short vendor; /* vendor id */
unsigned short device; /* device id */
- unsigned short blksize; /* maximum block size */
+ unsigned max_blksize; /* maximum block size */
+ unsigned cur_blksize; /* current block size */
unsigned int state; /* function state */
#define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */
@@ -109,6 +110,8 @@
extern int sdio_enable_func(struct sdio_func *func);
extern int sdio_disable_func(struct sdio_func *func);
+extern int sdio_set_block_size(struct sdio_func *func, unsigned blksz);
+
extern int sdio_claim_irq(struct sdio_func *func, sdio_irq_handler_t *handler);
extern int sdio_release_irq(struct sdio_func *func);
Index: mmc/drivers/mmc/core/sdio_bus.c
===================================================================
--- mmc.orig/drivers/mmc/core/sdio_bus.c 2007-08-08 13:29:47.000000000 +0100
+++ mmc/drivers/mmc/core/sdio_bus.c 2007-08-08 13:30:21.000000000 +0100
@@ -128,11 +128,18 @@
struct sdio_driver *drv = to_sdio_driver(dev->driver);
struct sdio_func *func = dev_to_sdio_func(dev);
const struct sdio_device_id *id;
+ int ret;
id = sdio_match_device(func, drv);
if (!id)
return -ENODEV;
+ /* Set the default block size so the driver is sure it's something
+ * sensible. */
+ ret = sdio_set_block_size(func, 0);
+ if (ret)
+ return ret;
+
return drv->probe(func, id);
}
next prev parent reply other threads:[~2007-08-08 13:25 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-31 15:36 sdio: enhance IO_RW_EXTENDED support David Vrabel
2007-07-31 15:36 ` sdio: parameterize SDIO FBR register defines David Vrabel
2007-08-04 13:26 ` Pierre Ossman
2007-08-06 10:14 ` David Vrabel
2007-08-06 14:58 ` Pierre Ossman
2007-07-31 15:36 ` sdio: set the functions' block size David Vrabel
2007-08-04 13:30 ` Pierre Ossman
2007-08-06 10:04 ` David Vrabel
2007-07-31 15:36 ` sdio: extend sdio_readsb() and friends to handle any length of buffer David Vrabel
2007-08-04 13:35 ` Pierre Ossman
2007-08-04 13:23 ` sdio: enhance IO_RW_EXTENDED support Pierre Ossman
2007-08-06 10:31 ` David Vrabel
2007-08-06 15:12 ` Pierre Ossman
2007-08-06 15:32 ` David Vrabel
2007-08-06 18:06 ` Pierre Ossman
2007-08-06 20:01 ` Pierre Ossman
2007-08-07 12:51 ` David Vrabel
2007-08-07 12:53 ` [patch 1/4] sdio: parameterize SDIO FBR register defines David Vrabel
2007-08-07 12:54 ` [patch 2/4] sdio: set the functions' block size David Vrabel
2007-08-07 13:38 ` Pierre Ossman
2007-08-07 17:20 ` David Vrabel
2007-08-07 17:54 ` Pierre Ossman
2007-08-08 9:46 ` David Vrabel
2007-08-08 10:06 ` Pierre Ossman
2007-08-08 10:19 ` David Vrabel
2007-08-07 12:55 ` [patch 3/4] sdio: extend sdio_readsb() and friends to handle any length of buffer David Vrabel
2007-08-07 13:42 ` Pierre Ossman
2007-08-07 20:17 ` Pierre Ossman
2007-08-08 10:19 ` David Vrabel
2007-08-08 10:37 ` Pierre Ossman
2007-08-08 13:22 ` David Vrabel
2007-08-08 13:23 ` [patch 1/3] sdio: add SDIO_FBR_BASE(f) macro David Vrabel
2007-08-08 13:23 ` David Vrabel [this message]
2007-08-08 13:24 ` [patch 3/3] sdio: extend sdio_readsb() and friends to handle any length of buffer David Vrabel
2007-08-08 16:55 ` [patch 3/4] " Pierre Ossman
2007-08-07 12:55 ` [patch 4/4] sdio: disable CD resistor David Vrabel
2007-08-07 13:43 ` Pierre Ossman
2007-08-07 14:46 ` David Vrabel
2007-08-07 15:08 ` Pierre Ossman
2007-08-07 13:33 ` sdio: enhance IO_RW_EXTENDED support Pierre Ossman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46B9C3E4.6050104@csr.com \
--to=david.vrabel@csr.com \
--cc=drzeus-list@drzeus.cx \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.