aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2013-05-17 20:54:51 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-05-22 15:09:12 -0400
commitc23b7c8f719317983c59b01873b51394fde26907 (patch)
treee06afaa7ec792f97c0ed49a9b539cc03282e7e54
parentdc468e3d420d9042d18f240196dc72ba0306ee89 (diff)
mwifiex: code rearrangement in multiport aggregation path
There are some macros defined for multiport aggregation calculations. As we may need to add some more code to accomodate new chipsets, we will change them to inline functions. Also, use dynamic allocation for Rx buffer array. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c17
-rw-r--r--drivers/net/wireless/mwifiex/sdio.h83
2 files changed, 64 insertions, 36 deletions
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 1892e889d41e..4b196dc97463 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -1084,10 +1084,10 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1084 if (f_aggr_cur) { 1084 if (f_aggr_cur) {
1085 dev_dbg(adapter->dev, "info: current packet aggregation\n"); 1085 dev_dbg(adapter->dev, "info: current packet aggregation\n");
1086 /* Curr pkt can be aggregated */ 1086 /* Curr pkt can be aggregated */
1087 MP_RX_AGGR_SETUP(card, skb, port); 1087 mp_rx_aggr_setup(card, skb, port);
1088 1088
1089 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) || 1089 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) ||
1090 MP_RX_AGGR_PORT_LIMIT_REACHED(card)) { 1090 mp_rx_aggr_port_limit_reached(card)) {
1091 dev_dbg(adapter->dev, "info: %s: aggregated packet " 1091 dev_dbg(adapter->dev, "info: %s: aggregated packet "
1092 "limit reached\n", __func__); 1092 "limit reached\n", __func__);
1093 /* No more pkts allowed in Aggr buf, rx it */ 1093 /* No more pkts allowed in Aggr buf, rx it */
@@ -1358,7 +1358,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1358 __func__); 1358 __func__);
1359 1359
1360 if (MP_TX_AGGR_IN_PROGRESS(card)) { 1360 if (MP_TX_AGGR_IN_PROGRESS(card)) {
1361 if (!MP_TX_AGGR_PORT_LIMIT_REACHED(card) && 1361 if (!mp_tx_aggr_port_limit_reached(card) &&
1362 MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len)) { 1362 MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len)) {
1363 f_precopy_cur_buf = 1; 1363 f_precopy_cur_buf = 1;
1364 1364
@@ -1371,7 +1371,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1371 /* No room in Aggr buf, send it */ 1371 /* No room in Aggr buf, send it */
1372 f_send_aggr_buf = 1; 1372 f_send_aggr_buf = 1;
1373 1373
1374 if (MP_TX_AGGR_PORT_LIMIT_REACHED(card) || 1374 if (mp_tx_aggr_port_limit_reached(card) ||
1375 !(card->mp_wr_bitmap & 1375 !(card->mp_wr_bitmap &
1376 (1 << card->curr_wr_port))) 1376 (1 << card->curr_wr_port)))
1377 f_send_cur_buf = 1; 1377 f_send_cur_buf = 1;
@@ -1410,7 +1410,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1410 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port); 1410 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port);
1411 1411
1412 if (MP_TX_AGGR_PKT_LIMIT_REACHED(card) || 1412 if (MP_TX_AGGR_PKT_LIMIT_REACHED(card) ||
1413 MP_TX_AGGR_PORT_LIMIT_REACHED(card)) 1413 mp_tx_aggr_port_limit_reached(card))
1414 /* No more pkts allowed in Aggr buf, send it */ 1414 /* No more pkts allowed in Aggr buf, send it */
1415 f_send_aggr_buf = 1; 1415 f_send_aggr_buf = 1;
1416 } 1416 }
@@ -1687,6 +1687,11 @@ static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
1687 if (!card->mp_regs) 1687 if (!card->mp_regs)
1688 return -ENOMEM; 1688 return -ENOMEM;
1689 1689
1690 /* Allocate skb pointer buffers */
1691 card->mpa_rx.skb_arr = kzalloc((sizeof(void *)) *
1692 card->mp_agg_pkt_limit, GFP_KERNEL);
1693 card->mpa_rx.len_arr = kzalloc(sizeof(*card->mpa_rx.len_arr) *
1694 card->mp_agg_pkt_limit, GFP_KERNEL);
1690 ret = mwifiex_alloc_sdio_mpa_buffers(adapter, 1695 ret = mwifiex_alloc_sdio_mpa_buffers(adapter,
1691 SDIO_MP_TX_AGGR_DEF_BUF_SIZE, 1696 SDIO_MP_TX_AGGR_DEF_BUF_SIZE,
1692 SDIO_MP_RX_AGGR_DEF_BUF_SIZE); 1697 SDIO_MP_RX_AGGR_DEF_BUF_SIZE);
@@ -1723,6 +1728,8 @@ static void mwifiex_cleanup_sdio(struct mwifiex_adapter *adapter)
1723 struct sdio_mmc_card *card = adapter->card; 1728 struct sdio_mmc_card *card = adapter->card;
1724 1729
1725 kfree(card->mp_regs); 1730 kfree(card->mp_regs);
1731 kfree(card->mpa_rx.skb_arr);
1732 kfree(card->mpa_rx.len_arr);
1726 kfree(card->mpa_tx.buf); 1733 kfree(card->mpa_tx.buf);
1727 kfree(card->mpa_rx.buf); 1734 kfree(card->mpa_rx.buf);
1728} 1735}
diff --git a/drivers/net/wireless/mwifiex/sdio.h b/drivers/net/wireless/mwifiex/sdio.h
index 339608ba6171..597db37a45f9 100644
--- a/drivers/net/wireless/mwifiex/sdio.h
+++ b/drivers/net/wireless/mwifiex/sdio.h
@@ -46,8 +46,6 @@
46#define CTRL_PORT 0 46#define CTRL_PORT 0
47#define CTRL_PORT_MASK 0x0001 47#define CTRL_PORT_MASK 0x0001
48 48
49#define SDIO_MP_AGGR_DEF_PKT_LIMIT 8
50
51#define SDIO_MP_TX_AGGR_DEF_BUF_SIZE (8192) /* 8K */ 49#define SDIO_MP_TX_AGGR_DEF_BUF_SIZE (8192) /* 8K */
52 50
53/* Multi port RX aggregation buffer size */ 51/* Multi port RX aggregation buffer size */
@@ -126,12 +124,6 @@
126#define MP_TX_AGGR_PKT_LIMIT_REACHED(a) \ 124#define MP_TX_AGGR_PKT_LIMIT_REACHED(a) \
127 (a->mpa_tx.pkt_cnt == a->mpa_tx.pkt_aggr_limit) 125 (a->mpa_tx.pkt_cnt == a->mpa_tx.pkt_aggr_limit)
128 126
129/* SDIO Tx aggregation port limit ? */
130#define MP_TX_AGGR_PORT_LIMIT_REACHED(a) ((a->curr_wr_port < \
131 a->mpa_tx.start_port) && (((a->max_ports -\
132 a->mpa_tx.start_port) + a->curr_wr_port) >= \
133 a->mp_agg_pkt_limit))
134
135/* Reset SDIO Tx aggregation buffer parameters */ 127/* Reset SDIO Tx aggregation buffer parameters */
136#define MP_TX_AGGR_BUF_RESET(a) do { \ 128#define MP_TX_AGGR_BUF_RESET(a) do { \
137 a->mpa_tx.pkt_cnt = 0; \ 129 a->mpa_tx.pkt_cnt = 0; \
@@ -144,12 +136,6 @@
144#define MP_RX_AGGR_PKT_LIMIT_REACHED(a) \ 136#define MP_RX_AGGR_PKT_LIMIT_REACHED(a) \
145 (a->mpa_rx.pkt_cnt == a->mpa_rx.pkt_aggr_limit) 137 (a->mpa_rx.pkt_cnt == a->mpa_rx.pkt_aggr_limit)
146 138
147/* SDIO Tx aggregation port limit ? */
148#define MP_RX_AGGR_PORT_LIMIT_REACHED(a) ((a->curr_rd_port < \
149 a->mpa_rx.start_port) && (((a->max_ports -\
150 a->mpa_rx.start_port) + a->curr_rd_port) >= \
151 a->mp_agg_pkt_limit))
152
153/* SDIO Rx aggregation in progress ? */ 139/* SDIO Rx aggregation in progress ? */
154#define MP_RX_AGGR_IN_PROGRESS(a) (a->mpa_rx.pkt_cnt > 0) 140#define MP_RX_AGGR_IN_PROGRESS(a) (a->mpa_rx.pkt_cnt > 0)
155 141
@@ -157,20 +143,6 @@
157#define MP_RX_AGGR_BUF_HAS_ROOM(a, rx_len) \ 143#define MP_RX_AGGR_BUF_HAS_ROOM(a, rx_len) \
158 ((a->mpa_rx.buf_len+rx_len) <= a->mpa_rx.buf_size) 144 ((a->mpa_rx.buf_len+rx_len) <= a->mpa_rx.buf_size)
159 145
160/* Prepare to copy current packet from card to SDIO Rx aggregation buffer */
161#define MP_RX_AGGR_SETUP(a, skb, port) do { \
162 a->mpa_rx.buf_len += skb->len; \
163 if (!a->mpa_rx.pkt_cnt) \
164 a->mpa_rx.start_port = port; \
165 if (a->mpa_rx.start_port <= port) \
166 a->mpa_rx.ports |= (1<<(a->mpa_rx.pkt_cnt)); \
167 else \
168 a->mpa_rx.ports |= (1<<(a->mpa_rx.pkt_cnt+1)); \
169 a->mpa_rx.skb_arr[a->mpa_rx.pkt_cnt] = skb; \
170 a->mpa_rx.len_arr[a->mpa_rx.pkt_cnt] = skb->len; \
171 a->mpa_rx.pkt_cnt++; \
172} while (0)
173
174/* Reset SDIO Rx aggregation buffer parameters */ 146/* Reset SDIO Rx aggregation buffer parameters */
175#define MP_RX_AGGR_BUF_RESET(a) do { \ 147#define MP_RX_AGGR_BUF_RESET(a) do { \
176 a->mpa_rx.pkt_cnt = 0; \ 148 a->mpa_rx.pkt_cnt = 0; \
@@ -179,7 +151,6 @@
179 a->mpa_rx.start_port = 0; \ 151 a->mpa_rx.start_port = 0; \
180} while (0) 152} while (0)
181 153
182
183/* data structure for SDIO MPA TX */ 154/* data structure for SDIO MPA TX */
184struct mwifiex_sdio_mpa_tx { 155struct mwifiex_sdio_mpa_tx {
185 /* multiport tx aggregation buffer pointer */ 156 /* multiport tx aggregation buffer pointer */
@@ -200,8 +171,8 @@ struct mwifiex_sdio_mpa_rx {
200 u32 ports; 171 u32 ports;
201 u16 start_port; 172 u16 start_port;
202 173
203 struct sk_buff *skb_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT]; 174 struct sk_buff **skb_arr;
204 u32 len_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT]; 175 u32 *len_arr;
205 176
206 u8 enabled; 177 u8 enabled;
207 u32 buf_size; 178 u32 buf_size;
@@ -325,4 +296,54 @@ static inline int mwifiex_sdio_event_complete(struct mwifiex_adapter *adapter,
325 return 0; 296 return 0;
326} 297}
327 298
299static inline bool
300mp_rx_aggr_port_limit_reached(struct sdio_mmc_card *card)
301{
302 u8 tmp;
303
304 if (card->curr_rd_port < card->mpa_rx.start_port) {
305 tmp = card->mp_agg_pkt_limit;
306
307 if (((card->max_ports - card->mpa_rx.start_port) +
308 card->curr_rd_port) >= tmp)
309 return true;
310 }
311
312 return false;
313}
314
315static inline bool
316mp_tx_aggr_port_limit_reached(struct sdio_mmc_card *card)
317{
318 u16 tmp;
319
320 if (card->curr_wr_port < card->mpa_tx.start_port) {
321 tmp = card->mp_agg_pkt_limit;
322
323 if (((card->max_ports - card->mpa_tx.start_port) +
324 card->curr_wr_port) >= tmp)
325 return true;
326 }
327
328 return false;
329}
330
331/* Prepare to copy current packet from card to SDIO Rx aggregation buffer */
332static inline void mp_rx_aggr_setup(struct sdio_mmc_card *card,
333 struct sk_buff *skb, u8 port)
334{
335 card->mpa_rx.buf_len += skb->len;
336
337 if (!card->mpa_rx.pkt_cnt)
338 card->mpa_rx.start_port = port;
339
340 if (card->mpa_rx.start_port <= port)
341 card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt);
342 else
343 card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt + 1);
344
345 card->mpa_rx.skb_arr[card->mpa_rx.pkt_cnt] = skb;
346 card->mpa_rx.len_arr[card->mpa_rx.pkt_cnt] = skb->len;
347 card->mpa_rx.pkt_cnt++;
348}
328#endif /* _MWIFIEX_SDIO_H */ 349#endif /* _MWIFIEX_SDIO_H */