[PATCH 05/99] cw1200: Set better block size for SDIO
Dmitry Tarnyagin
dmitry.tarnyagin at stericsson.com
Wed Feb 29 14:14:12 UTC 2012
From: "Ajitpal.Singh" <ajitpal.singh at stericsson.com>
Changing default SDIO block size used to 512.
Helps in less overhead on SDIO bus.
ST-Ericsson ID: 357764
ST-Ericsson FOSS-OUT ID: NA
Change-Id: I6cd1384ab5cff308f533b85b50d3396396cc4f3a
Signed-off-by: Ajitpal.Singh <ajitpal.singh at stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/32913
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski at tieto.com>
Tested-by: Bartosz MARKOWSKI <bartosz.markowski at tieto.com>
---
drivers/staging/cw1200/bh.c | 2 --
drivers/staging/cw1200/bh.h | 4 +---
drivers/staging/cw1200/cw1200_sdio.c | 12 ++++++------
drivers/staging/cw1200/main.c | 4 ++++
drivers/staging/cw1200/sbus.h | 1 +
5 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/cw1200/bh.c b/drivers/staging/cw1200/bh.c
index 978e975..ff6b85e 100644
--- a/drivers/staging/cw1200/bh.c
+++ b/drivers/staging/cw1200/bh.c
@@ -346,8 +346,6 @@ rx:
* to the NEXT Message length + 2 Bytes for SKB */
read_len = read_len + 2;
- BUG_ON(SDIO_BLOCK_SIZE & (SDIO_BLOCK_SIZE - 1));
-
#if defined(CONFIG_CW1200_NON_POWER_OF_TWO_BLOCKSIZES)
alloc_len = priv->sbus_ops->align_size(
priv->sbus_priv, read_len);
diff --git a/drivers/staging/cw1200/bh.h b/drivers/staging/cw1200/bh.h
index 6d4d27b..ea4598a 100644
--- a/drivers/staging/cw1200/bh.h
+++ b/drivers/staging/cw1200/bh.h
@@ -14,9 +14,7 @@
/* extern */ struct cw1200_common;
-/* TODO: 512, actually. Was increased to 1024
- * for compatibility with particular FW. */
-#define SDIO_BLOCK_SIZE (1024)
+#define SDIO_BLOCK_SIZE (512)
int cw1200_register_bh(struct cw1200_common *priv);
void cw1200_unregister_bh(struct cw1200_common *priv);
diff --git a/drivers/staging/cw1200/cw1200_sdio.c b/drivers/staging/cw1200/cw1200_sdio.c
index cd43265..dffa887 100644
--- a/drivers/staging/cw1200/cw1200_sdio.c
+++ b/drivers/staging/cw1200/cw1200_sdio.c
@@ -274,15 +274,14 @@ static int cw1200_sdio_reset(struct sbus_priv *self)
static size_t cw1200_sdio_align_size(struct sbus_priv *self, size_t size)
{
size_t aligned = sdio_align_size(self->func, size);
- /* HACK!!! Problems with DMA size on u8500 platform */
- if ((aligned & 0x1F) && (aligned & ~0x1F)) {
- aligned &= ~0x1F;
- aligned += 0x20;
- }
-
return aligned;
}
+int cw1200_sdio_set_block_size(struct sbus_priv *self, size_t size)
+{
+ return sdio_set_block_size(self->func, size);
+}
+
static int cw1200_sdio_pm(struct sbus_priv *self, bool suspend)
{
int ret;
@@ -312,6 +311,7 @@ static struct sbus_ops cw1200_sdio_sbus_ops = {
.reset = cw1200_sdio_reset,
.align_size = cw1200_sdio_align_size,
.power_mgmt = cw1200_sdio_pm,
+ .set_block_size = cw1200_sdio_set_block_size,
};
/* Probe Function to be called by SDIO stack when device is discovered */
diff --git a/drivers/staging/cw1200/main.c b/drivers/staging/cw1200/main.c
index ffc4359..e57519a 100644
--- a/drivers/staging/cw1200/main.c
+++ b/drivers/staging/cw1200/main.c
@@ -498,6 +498,10 @@ int cw1200_core_probe(const struct sbus_ops *sbus_ops,
err = cw1200_load_firmware(priv);
if (err)
goto err2;
+ priv->sbus_ops->lock(priv->sbus_priv);
+ WARN_ON(priv->sbus_ops->set_block_size(priv->sbus_priv,
+ SDIO_BLOCK_SIZE));
+ priv->sbus_ops->unlock(priv->sbus_priv);
if (wait_event_interruptible_timeout(priv->wsm_startup_done,
priv->wsm_caps.firmwareReady, 3*HZ) <= 0) {
diff --git a/drivers/staging/cw1200/sbus.h b/drivers/staging/cw1200/sbus.h
index a911ef1..49bd06d 100644
--- a/drivers/staging/cw1200/sbus.h
+++ b/drivers/staging/cw1200/sbus.h
@@ -33,6 +33,7 @@ struct sbus_ops {
int (*reset)(struct sbus_priv *self);
size_t (*align_size)(struct sbus_priv *self, size_t size);
int (*power_mgmt)(struct sbus_priv *self, bool suspend);
+ int (*set_block_size)(struct sbus_priv *self, size_t size);
};
#endif /* CW1200_SBUS_H */
--
1.7.8.3
More information about the kernel
mailing list