[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