@@ -28,6 +28,7 @@ struct wilc_sdio {
2828 u32 block_size ;
2929 bool isinit ;
3030 int has_thrpt_enh3 ;
31+ u8 * cmd53_buf ;
3132};
3233
3334struct sdio_cmd52 {
@@ -47,6 +48,7 @@ struct sdio_cmd53 {
4748 u32 count : 9 ;
4849 u8 * buffer ;
4950 u32 block_size ;
51+ bool use_global_buf ;
5052};
5153
5254static const struct wilc_hif_func wilc_hif_sdio ;
@@ -91,6 +93,8 @@ static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
9193{
9294 struct sdio_func * func = container_of (wilc -> dev , struct sdio_func , dev );
9395 int size , ret ;
96+ struct wilc_sdio * sdio_priv = wilc -> bus_data ;
97+ u8 * buf = cmd -> buffer ;
9498
9599 sdio_claim_host (func );
96100
@@ -101,12 +105,23 @@ static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
101105 else
102106 size = cmd -> count ;
103107
108+ if (cmd -> use_global_buf ) {
109+ if (size > sizeof (u32 ))
110+ return - EINVAL ;
111+
112+ buf = sdio_priv -> cmd53_buf ;
113+ }
114+
104115 if (cmd -> read_write ) { /* write */
105- ret = sdio_memcpy_toio (func , cmd -> address ,
106- (void * )cmd -> buffer , size );
116+ if (cmd -> use_global_buf )
117+ memcpy (buf , cmd -> buffer , size );
118+
119+ ret = sdio_memcpy_toio (func , cmd -> address , buf , size );
107120 } else { /* read */
108- ret = sdio_memcpy_fromio (func , (void * )cmd -> buffer ,
109- cmd -> address , size );
121+ ret = sdio_memcpy_fromio (func , buf , cmd -> address , size );
122+
123+ if (cmd -> use_global_buf )
124+ memcpy (cmd -> buffer , buf , size );
110125 }
111126
112127 sdio_release_host (func );
@@ -128,6 +143,12 @@ static int wilc_sdio_probe(struct sdio_func *func,
128143 if (!sdio_priv )
129144 return - ENOMEM ;
130145
146+ sdio_priv -> cmd53_buf = kzalloc (sizeof (u32 ), GFP_KERNEL );
147+ if (!sdio_priv -> cmd53_buf ) {
148+ ret = - ENOMEM ;
149+ goto free ;
150+ }
151+
131152 ret = wilc_cfg80211_init (& wilc , & func -> dev , WILC_HIF_SDIO ,
132153 & wilc_hif_sdio );
133154 if (ret )
@@ -161,6 +182,7 @@ static int wilc_sdio_probe(struct sdio_func *func,
161182 irq_dispose_mapping (wilc -> dev_irq_num );
162183 wilc_netdev_cleanup (wilc );
163184free :
185+ kfree (sdio_priv -> cmd53_buf );
164186 kfree (sdio_priv );
165187 return ret ;
166188}
@@ -172,6 +194,7 @@ static void wilc_sdio_remove(struct sdio_func *func)
172194
173195 clk_disable_unprepare (wilc -> rtc_clk );
174196 wilc_netdev_cleanup (wilc );
197+ kfree (sdio_priv -> cmd53_buf );
175198 kfree (sdio_priv );
176199}
177200
@@ -375,8 +398,9 @@ static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
375398 cmd .address = WILC_SDIO_FBR_DATA_REG ;
376399 cmd .block_mode = 0 ;
377400 cmd .increment = 1 ;
378- cmd .count = 4 ;
401+ cmd .count = sizeof ( u32 ) ;
379402 cmd .buffer = (u8 * )& data ;
403+ cmd .use_global_buf = true;
380404 cmd .block_size = sdio_priv -> block_size ;
381405 ret = wilc_sdio_cmd53 (wilc , & cmd );
382406 if (ret )
@@ -414,6 +438,7 @@ static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
414438 nblk = size / block_size ;
415439 nleft = size % block_size ;
416440
441+ cmd .use_global_buf = false;
417442 if (nblk > 0 ) {
418443 cmd .block_mode = 1 ;
419444 cmd .increment = 1 ;
@@ -492,8 +517,9 @@ static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
492517 cmd .address = WILC_SDIO_FBR_DATA_REG ;
493518 cmd .block_mode = 0 ;
494519 cmd .increment = 1 ;
495- cmd .count = 4 ;
520+ cmd .count = sizeof ( u32 ) ;
496521 cmd .buffer = (u8 * )data ;
522+ cmd .use_global_buf = true;
497523
498524 cmd .block_size = sdio_priv -> block_size ;
499525 ret = wilc_sdio_cmd53 (wilc , & cmd );
@@ -535,6 +561,7 @@ static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
535561 nblk = size / block_size ;
536562 nleft = size % block_size ;
537563
564+ cmd .use_global_buf = false;
538565 if (nblk > 0 ) {
539566 cmd .block_mode = 1 ;
540567 cmd .increment = 1 ;
0 commit comments