aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/sdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex/sdio.c')
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c192
1 files changed, 98 insertions, 94 deletions
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 835902750231..f8012e2b7f7c 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -67,7 +67,7 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
67 struct sdio_mmc_card *card = NULL; 67 struct sdio_mmc_card *card = NULL;
68 68
69 pr_debug("info: vendor=0x%4.04X device=0x%4.04X class=%d function=%d\n", 69 pr_debug("info: vendor=0x%4.04X device=0x%4.04X class=%d function=%d\n",
70 func->vendor, func->device, func->class, func->num); 70 func->vendor, func->device, func->class, func->num);
71 71
72 card = kzalloc(sizeof(struct sdio_mmc_card), GFP_KERNEL); 72 card = kzalloc(sizeof(struct sdio_mmc_card), GFP_KERNEL);
73 if (!card) 73 if (!card)
@@ -110,6 +110,7 @@ mwifiex_sdio_remove(struct sdio_func *func)
110{ 110{
111 struct sdio_mmc_card *card; 111 struct sdio_mmc_card *card;
112 struct mwifiex_adapter *adapter; 112 struct mwifiex_adapter *adapter;
113 struct mwifiex_private *priv;
113 int i; 114 int i;
114 115
115 pr_debug("info: SDIO func num=%d\n", func->num); 116 pr_debug("info: SDIO func num=%d\n", func->num);
@@ -129,15 +130,12 @@ mwifiex_sdio_remove(struct sdio_func *func)
129 for (i = 0; i < adapter->priv_num; i++) 130 for (i = 0; i < adapter->priv_num; i++)
130 if ((GET_BSS_ROLE(adapter->priv[i]) == 131 if ((GET_BSS_ROLE(adapter->priv[i]) ==
131 MWIFIEX_BSS_ROLE_STA) && 132 MWIFIEX_BSS_ROLE_STA) &&
132 adapter->priv[i]->media_connected) 133 adapter->priv[i]->media_connected)
133 mwifiex_deauthenticate(adapter->priv[i], NULL); 134 mwifiex_deauthenticate(adapter->priv[i], NULL);
134 135
135 mwifiex_disable_auto_ds(mwifiex_get_priv(adapter, 136 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
136 MWIFIEX_BSS_ROLE_ANY)); 137 mwifiex_disable_auto_ds(priv);
137 138 mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
138 mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
139 MWIFIEX_BSS_ROLE_ANY),
140 MWIFIEX_FUNC_SHUTDOWN);
141 } 139 }
142 140
143 mwifiex_remove_card(card->adapter, &add_remove_card_sem); 141 mwifiex_remove_card(card->adapter, &add_remove_card_sem);
@@ -167,7 +165,7 @@ static int mwifiex_sdio_suspend(struct device *dev)
167 if (func) { 165 if (func) {
168 pm_flag = sdio_get_host_pm_caps(func); 166 pm_flag = sdio_get_host_pm_caps(func);
169 pr_debug("cmd: %s: suspend: PM flag = 0x%x\n", 167 pr_debug("cmd: %s: suspend: PM flag = 0x%x\n",
170 sdio_func_id(func), pm_flag); 168 sdio_func_id(func), pm_flag);
171 if (!(pm_flag & MMC_PM_KEEP_POWER)) { 169 if (!(pm_flag & MMC_PM_KEEP_POWER)) {
172 pr_err("%s: cannot remain alive while host is" 170 pr_err("%s: cannot remain alive while host is"
173 " suspended\n", sdio_func_id(func)); 171 " suspended\n", sdio_func_id(func));
@@ -361,12 +359,11 @@ static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *buffer,
361{ 359{
362 struct sdio_mmc_card *card = adapter->card; 360 struct sdio_mmc_card *card = adapter->card;
363 int ret = -1; 361 int ret = -1;
364 u8 blk_mode = 362 u8 blk_mode = (port & MWIFIEX_SDIO_BYTE_MODE_MASK) ? BYTE_MODE
365 (port & MWIFIEX_SDIO_BYTE_MODE_MASK) ? BYTE_MODE : BLOCK_MODE; 363 : BLOCK_MODE;
366 u32 blk_size = (blk_mode == BLOCK_MODE) ? MWIFIEX_SDIO_BLOCK_SIZE : 1; 364 u32 blk_size = (blk_mode == BLOCK_MODE) ? MWIFIEX_SDIO_BLOCK_SIZE : 1;
367 u32 blk_cnt = 365 u32 blk_cnt = (blk_mode == BLOCK_MODE) ? (len / MWIFIEX_SDIO_BLOCK_SIZE)
368 (blk_mode == 366 : len;
369 BLOCK_MODE) ? (len / MWIFIEX_SDIO_BLOCK_SIZE) : len;
370 u32 ioport = (port & MWIFIEX_SDIO_IO_PORT_MASK); 367 u32 ioport = (port & MWIFIEX_SDIO_IO_PORT_MASK);
371 368
372 if (claim) 369 if (claim)
@@ -470,8 +467,7 @@ static int mwifiex_write_data_to_card(struct mwifiex_adapter *adapter,
470 i++; 467 i++;
471 dev_err(adapter->dev, "host_to_card, write iomem" 468 dev_err(adapter->dev, "host_to_card, write iomem"
472 " (%d) failed: %d\n", i, ret); 469 " (%d) failed: %d\n", i, ret);
473 if (mwifiex_write_reg(adapter, 470 if (mwifiex_write_reg(adapter, CONFIGURATION_REG, 0x04))
474 CONFIGURATION_REG, 0x04))
475 dev_err(adapter->dev, "write CFG reg failed\n"); 471 dev_err(adapter->dev, "write CFG reg failed\n");
476 472
477 ret = -1; 473 ret = -1;
@@ -505,11 +501,11 @@ static int mwifiex_get_rd_port(struct mwifiex_adapter *adapter, u8 *port)
505 card->mp_rd_bitmap &= (u16) (~CTRL_PORT_MASK); 501 card->mp_rd_bitmap &= (u16) (~CTRL_PORT_MASK);
506 *port = CTRL_PORT; 502 *port = CTRL_PORT;
507 dev_dbg(adapter->dev, "data: port=%d mp_rd_bitmap=0x%04x\n", 503 dev_dbg(adapter->dev, "data: port=%d mp_rd_bitmap=0x%04x\n",
508 *port, card->mp_rd_bitmap); 504 *port, card->mp_rd_bitmap);
509 } else { 505 } else {
510 if (card->mp_rd_bitmap & (1 << card->curr_rd_port)) { 506 if (card->mp_rd_bitmap & (1 << card->curr_rd_port)) {
511 card->mp_rd_bitmap &= 507 card->mp_rd_bitmap &= (u16)
512 (u16) (~(1 << card->curr_rd_port)); 508 (~(1 << card->curr_rd_port));
513 *port = card->curr_rd_port; 509 *port = card->curr_rd_port;
514 510
515 if (++card->curr_rd_port == MAX_PORT) 511 if (++card->curr_rd_port == MAX_PORT)
@@ -520,7 +516,7 @@ static int mwifiex_get_rd_port(struct mwifiex_adapter *adapter, u8 *port)
520 516
521 dev_dbg(adapter->dev, 517 dev_dbg(adapter->dev,
522 "data: port=%d mp_rd_bitmap=0x%04x -> 0x%04x\n", 518 "data: port=%d mp_rd_bitmap=0x%04x -> 0x%04x\n",
523 *port, rd_bitmap, card->mp_rd_bitmap); 519 *port, rd_bitmap, card->mp_rd_bitmap);
524 } 520 }
525 return 0; 521 return 0;
526} 522}
@@ -554,14 +550,14 @@ static int mwifiex_get_wr_port_data(struct mwifiex_adapter *adapter, u8 *port)
554 550
555 if (*port == CTRL_PORT) { 551 if (*port == CTRL_PORT) {
556 dev_err(adapter->dev, "invalid data port=%d cur port=%d" 552 dev_err(adapter->dev, "invalid data port=%d cur port=%d"
557 " mp_wr_bitmap=0x%04x -> 0x%04x\n", 553 " mp_wr_bitmap=0x%04x -> 0x%04x\n",
558 *port, card->curr_wr_port, wr_bitmap, 554 *port, card->curr_wr_port, wr_bitmap,
559 card->mp_wr_bitmap); 555 card->mp_wr_bitmap);
560 return -1; 556 return -1;
561 } 557 }
562 558
563 dev_dbg(adapter->dev, "data: port=%d mp_wr_bitmap=0x%04x -> 0x%04x\n", 559 dev_dbg(adapter->dev, "data: port=%d mp_wr_bitmap=0x%04x -> 0x%04x\n",
564 *port, wr_bitmap, card->mp_wr_bitmap); 560 *port, wr_bitmap, card->mp_wr_bitmap);
565 561
566 return 0; 562 return 0;
567} 563}
@@ -581,11 +577,11 @@ mwifiex_sdio_poll_card_status(struct mwifiex_adapter *adapter, u8 bits)
581 else if ((cs & bits) == bits) 577 else if ((cs & bits) == bits)
582 return 0; 578 return 0;
583 579
584 udelay(10); 580 usleep_range(10, 20);
585 } 581 }
586 582
587 dev_err(adapter->dev, "poll card status failed, tries = %d\n", 583 dev_err(adapter->dev, "poll card status failed, tries = %d\n", tries);
588 tries); 584
589 return -1; 585 return -1;
590} 586}
591 587
@@ -668,14 +664,14 @@ static int mwifiex_sdio_card_to_host(struct mwifiex_adapter *adapter,
668 664
669 if (ret) { 665 if (ret) {
670 dev_err(adapter->dev, "%s: read iomem failed: %d\n", __func__, 666 dev_err(adapter->dev, "%s: read iomem failed: %d\n", __func__,
671 ret); 667 ret);
672 return -1; 668 return -1;
673 } 669 }
674 670
675 nb = le16_to_cpu(*(__le16 *) (buffer)); 671 nb = le16_to_cpu(*(__le16 *) (buffer));
676 if (nb > npayload) { 672 if (nb > npayload) {
677 dev_err(adapter->dev, "%s: invalid packet, nb=%d, npayload=%d\n", 673 dev_err(adapter->dev, "%s: invalid packet, nb=%d npayload=%d\n",
678 __func__, nb, npayload); 674 __func__, nb, npayload);
679 return -1; 675 return -1;
680 } 676 }
681 677
@@ -705,19 +701,19 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
705 u32 i = 0; 701 u32 i = 0;
706 702
707 if (!firmware_len) { 703 if (!firmware_len) {
708 dev_err(adapter->dev, "firmware image not found!" 704 dev_err(adapter->dev,
709 " Terminating download\n"); 705 "firmware image not found! Terminating download\n");
710 return -1; 706 return -1;
711 } 707 }
712 708
713 dev_dbg(adapter->dev, "info: downloading FW image (%d bytes)\n", 709 dev_dbg(adapter->dev, "info: downloading FW image (%d bytes)\n",
714 firmware_len); 710 firmware_len);
715 711
716 /* Assume that the allocated buffer is 8-byte aligned */ 712 /* Assume that the allocated buffer is 8-byte aligned */
717 fwbuf = kzalloc(MWIFIEX_UPLD_SIZE, GFP_KERNEL); 713 fwbuf = kzalloc(MWIFIEX_UPLD_SIZE, GFP_KERNEL);
718 if (!fwbuf) { 714 if (!fwbuf) {
719 dev_err(adapter->dev, "unable to alloc buffer for firmware." 715 dev_err(adapter->dev,
720 " Terminating download\n"); 716 "unable to alloc buffer for FW. Terminating dnld\n");
721 return -ENOMEM; 717 return -ENOMEM;
722 } 718 }
723 719
@@ -729,7 +725,7 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
729 DN_LD_CARD_RDY); 725 DN_LD_CARD_RDY);
730 if (ret) { 726 if (ret) {
731 dev_err(adapter->dev, "FW download with helper:" 727 dev_err(adapter->dev, "FW download with helper:"
732 " poll status timeout @ %d\n", offset); 728 " poll status timeout @ %d\n", offset);
733 goto done; 729 goto done;
734 } 730 }
735 731
@@ -741,17 +737,19 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
741 ret = mwifiex_read_reg(adapter, HOST_F1_RD_BASE_0, 737 ret = mwifiex_read_reg(adapter, HOST_F1_RD_BASE_0,
742 &base0); 738 &base0);
743 if (ret) { 739 if (ret) {
744 dev_err(adapter->dev, "dev BASE0 register read" 740 dev_err(adapter->dev,
745 " failed: base0=0x%04X(%d). Terminating " 741 "dev BASE0 register read failed: "
746 "download\n", base0, base0); 742 "base0=%#04X(%d). Terminating dnld\n",
743 base0, base0);
747 goto done; 744 goto done;
748 } 745 }
749 ret = mwifiex_read_reg(adapter, HOST_F1_RD_BASE_1, 746 ret = mwifiex_read_reg(adapter, HOST_F1_RD_BASE_1,
750 &base1); 747 &base1);
751 if (ret) { 748 if (ret) {
752 dev_err(adapter->dev, "dev BASE1 register read" 749 dev_err(adapter->dev,
753 " failed: base1=0x%04X(%d). Terminating " 750 "dev BASE1 register read failed: "
754 "download\n", base1, base1); 751 "base1=%#04X(%d). Terminating dnld\n",
752 base1, base1);
755 goto done; 753 goto done;
756 } 754 }
757 len = (u16) (((base1 & 0xff) << 8) | (base0 & 0xff)); 755 len = (u16) (((base1 & 0xff) << 8) | (base0 & 0xff));
@@ -759,14 +757,15 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
759 if (len) 757 if (len)
760 break; 758 break;
761 759
762 udelay(10); 760 usleep_range(10, 20);
763 } 761 }
764 762
765 if (!len) { 763 if (!len) {
766 break; 764 break;
767 } else if (len > MWIFIEX_UPLD_SIZE) { 765 } else if (len > MWIFIEX_UPLD_SIZE) {
768 dev_err(adapter->dev, "FW download failed @ %d," 766 dev_err(adapter->dev,
769 " invalid length %d\n", offset, len); 767 "FW dnld failed @ %d, invalid length %d\n",
768 offset, len);
770 ret = -1; 769 ret = -1;
771 goto done; 770 goto done;
772 } 771 }
@@ -776,13 +775,14 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
776 if (len & BIT(0)) { 775 if (len & BIT(0)) {
777 i++; 776 i++;
778 if (i > MAX_WRITE_IOMEM_RETRY) { 777 if (i > MAX_WRITE_IOMEM_RETRY) {
779 dev_err(adapter->dev, "FW download failed @" 778 dev_err(adapter->dev,
780 " %d, over max retry count\n", offset); 779 "FW dnld failed @ %d, over max retry\n",
780 offset);
781 ret = -1; 781 ret = -1;
782 goto done; 782 goto done;
783 } 783 }
784 dev_err(adapter->dev, "CRC indicated by the helper:" 784 dev_err(adapter->dev, "CRC indicated by the helper:"
785 " len = 0x%04X, txlen = %d\n", len, txlen); 785 " len = 0x%04X, txlen = %d\n", len, txlen);
786 len &= ~BIT(0); 786 len &= ~BIT(0);
787 /* Setting this to 0 to resend from same offset */ 787 /* Setting this to 0 to resend from same offset */
788 txlen = 0; 788 txlen = 0;
@@ -794,8 +794,8 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
794 if (firmware_len - offset < txlen) 794 if (firmware_len - offset < txlen)
795 txlen = firmware_len - offset; 795 txlen = firmware_len - offset;
796 796
797 tx_blocks = (txlen + MWIFIEX_SDIO_BLOCK_SIZE - 797 tx_blocks = (txlen + MWIFIEX_SDIO_BLOCK_SIZE - 1)
798 1) / MWIFIEX_SDIO_BLOCK_SIZE; 798 / MWIFIEX_SDIO_BLOCK_SIZE;
799 799
800 /* Copy payload to buffer */ 800 /* Copy payload to buffer */
801 memmove(fwbuf, &firmware[offset], txlen); 801 memmove(fwbuf, &firmware[offset], txlen);
@@ -805,8 +805,9 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
805 MWIFIEX_SDIO_BLOCK_SIZE, 805 MWIFIEX_SDIO_BLOCK_SIZE,
806 adapter->ioport); 806 adapter->ioport);
807 if (ret) { 807 if (ret) {
808 dev_err(adapter->dev, "FW download, write iomem (%d)" 808 dev_err(adapter->dev,
809 " failed @ %d\n", i, offset); 809 "FW download, write iomem (%d) failed @ %d\n",
810 i, offset);
810 if (mwifiex_write_reg(adapter, CONFIGURATION_REG, 0x04)) 811 if (mwifiex_write_reg(adapter, CONFIGURATION_REG, 0x04))
811 dev_err(adapter->dev, "write CFG reg failed\n"); 812 dev_err(adapter->dev, "write CFG reg failed\n");
812 813
@@ -818,7 +819,7 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
818 } while (true); 819 } while (true);
819 820
820 dev_dbg(adapter->dev, "info: FW download over, size %d bytes\n", 821 dev_dbg(adapter->dev, "info: FW download over, size %d bytes\n",
821 offset); 822 offset);
822 823
823 ret = 0; 824 ret = 0;
824done: 825done:
@@ -910,7 +911,7 @@ mwifiex_sdio_interrupt(struct sdio_func *func)
910 card = sdio_get_drvdata(func); 911 card = sdio_get_drvdata(func);
911 if (!card || !card->adapter) { 912 if (!card || !card->adapter) {
912 pr_debug("int: func=%p card=%p adapter=%p\n", 913 pr_debug("int: func=%p card=%p adapter=%p\n",
913 func, card, card ? card->adapter : NULL); 914 func, card, card ? card->adapter : NULL);
914 return; 915 return;
915 } 916 }
916 adapter = card->adapter; 917 adapter = card->adapter;
@@ -953,10 +954,12 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
953 954
954 if (adapter->ps_state == PS_STATE_SLEEP_CFM) 955 if (adapter->ps_state == PS_STATE_SLEEP_CFM)
955 mwifiex_process_sleep_confirm_resp(adapter, 956 mwifiex_process_sleep_confirm_resp(adapter,
956 skb->data, skb->len); 957 skb->data,
958 skb->len);
957 959
958 memcpy(cmd_buf, skb->data, min_t(u32, 960 memcpy(cmd_buf, skb->data,
959 MWIFIEX_SIZE_OF_CMD_BUFFER, skb->len)); 961 min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER,
962 skb->len));
960 963
961 dev_kfree_skb_any(skb); 964 dev_kfree_skb_any(skb);
962 } else { 965 } else {
@@ -1014,7 +1017,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1014 if (port == CTRL_PORT) { 1017 if (port == CTRL_PORT) {
1015 /* Read the command Resp without aggr */ 1018 /* Read the command Resp without aggr */
1016 dev_dbg(adapter->dev, "info: %s: no aggregation for cmd " 1019 dev_dbg(adapter->dev, "info: %s: no aggregation for cmd "
1017 "response\n", __func__); 1020 "response\n", __func__);
1018 1021
1019 f_do_rx_cur = 1; 1022 f_do_rx_cur = 1;
1020 goto rx_curr_single; 1023 goto rx_curr_single;
@@ -1022,7 +1025,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1022 1025
1023 if (!card->mpa_rx.enabled) { 1026 if (!card->mpa_rx.enabled) {
1024 dev_dbg(adapter->dev, "info: %s: rx aggregation disabled\n", 1027 dev_dbg(adapter->dev, "info: %s: rx aggregation disabled\n",
1025 __func__); 1028 __func__);
1026 1029
1027 f_do_rx_cur = 1; 1030 f_do_rx_cur = 1;
1028 goto rx_curr_single; 1031 goto rx_curr_single;
@@ -1069,7 +1072,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1069 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) || 1072 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) ||
1070 MP_RX_AGGR_PORT_LIMIT_REACHED(card)) { 1073 MP_RX_AGGR_PORT_LIMIT_REACHED(card)) {
1071 dev_dbg(adapter->dev, "info: %s: aggregated packet " 1074 dev_dbg(adapter->dev, "info: %s: aggregated packet "
1072 "limit reached\n", __func__); 1075 "limit reached\n", __func__);
1073 /* No more pkts allowed in Aggr buf, rx it */ 1076 /* No more pkts allowed in Aggr buf, rx it */
1074 f_do_rx_aggr = 1; 1077 f_do_rx_aggr = 1;
1075 } 1078 }
@@ -1078,7 +1081,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1078 if (f_do_rx_aggr) { 1081 if (f_do_rx_aggr) {
1079 /* do aggr RX now */ 1082 /* do aggr RX now */
1080 dev_dbg(adapter->dev, "info: do_rx_aggr: num of packets: %d\n", 1083 dev_dbg(adapter->dev, "info: do_rx_aggr: num of packets: %d\n",
1081 card->mpa_rx.pkt_cnt); 1084 card->mpa_rx.pkt_cnt);
1082 1085
1083 if (mwifiex_read_data_sync(adapter, card->mpa_rx.buf, 1086 if (mwifiex_read_data_sync(adapter, card->mpa_rx.buf,
1084 card->mpa_rx.buf_len, 1087 card->mpa_rx.buf_len,
@@ -1192,7 +1195,7 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1192 card->mp_wr_bitmap = ((u16) card->mp_regs[WR_BITMAP_U]) << 8; 1195 card->mp_wr_bitmap = ((u16) card->mp_regs[WR_BITMAP_U]) << 8;
1193 card->mp_wr_bitmap |= (u16) card->mp_regs[WR_BITMAP_L]; 1196 card->mp_wr_bitmap |= (u16) card->mp_regs[WR_BITMAP_L];
1194 dev_dbg(adapter->dev, "int: DNLD: wr_bitmap=0x%04x\n", 1197 dev_dbg(adapter->dev, "int: DNLD: wr_bitmap=0x%04x\n",
1195 card->mp_wr_bitmap); 1198 card->mp_wr_bitmap);
1196 if (adapter->data_sent && 1199 if (adapter->data_sent &&
1197 (card->mp_wr_bitmap & card->mp_data_port_mask)) { 1200 (card->mp_wr_bitmap & card->mp_data_port_mask)) {
1198 dev_dbg(adapter->dev, 1201 dev_dbg(adapter->dev,
@@ -1214,12 +1217,12 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1214 } 1217 }
1215 1218
1216 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n", 1219 dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
1217 adapter->cmd_sent, adapter->data_sent); 1220 adapter->cmd_sent, adapter->data_sent);
1218 if (sdio_ireg & UP_LD_HOST_INT_STATUS) { 1221 if (sdio_ireg & UP_LD_HOST_INT_STATUS) {
1219 card->mp_rd_bitmap = ((u16) card->mp_regs[RD_BITMAP_U]) << 8; 1222 card->mp_rd_bitmap = ((u16) card->mp_regs[RD_BITMAP_U]) << 8;
1220 card->mp_rd_bitmap |= (u16) card->mp_regs[RD_BITMAP_L]; 1223 card->mp_rd_bitmap |= (u16) card->mp_regs[RD_BITMAP_L];
1221 dev_dbg(adapter->dev, "int: UPLD: rd_bitmap=0x%04x\n", 1224 dev_dbg(adapter->dev, "int: UPLD: rd_bitmap=0x%04x\n",
1222 card->mp_rd_bitmap); 1225 card->mp_rd_bitmap);
1223 1226
1224 while (true) { 1227 while (true) {
1225 ret = mwifiex_get_rd_port(adapter, &port); 1228 ret = mwifiex_get_rd_port(adapter, &port);
@@ -1233,15 +1236,15 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1233 rx_len = ((u16) card->mp_regs[len_reg_u]) << 8; 1236 rx_len = ((u16) card->mp_regs[len_reg_u]) << 8;
1234 rx_len |= (u16) card->mp_regs[len_reg_l]; 1237 rx_len |= (u16) card->mp_regs[len_reg_l];
1235 dev_dbg(adapter->dev, "info: RX: port=%d rx_len=%u\n", 1238 dev_dbg(adapter->dev, "info: RX: port=%d rx_len=%u\n",
1236 port, rx_len); 1239 port, rx_len);
1237 rx_blocks = 1240 rx_blocks =
1238 (rx_len + MWIFIEX_SDIO_BLOCK_SIZE - 1241 (rx_len + MWIFIEX_SDIO_BLOCK_SIZE -
1239 1) / MWIFIEX_SDIO_BLOCK_SIZE; 1242 1) / MWIFIEX_SDIO_BLOCK_SIZE;
1240 if (rx_len <= INTF_HEADER_LEN 1243 if (rx_len <= INTF_HEADER_LEN ||
1241 || (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) > 1244 (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) >
1242 MWIFIEX_RX_DATA_BUF_SIZE) { 1245 MWIFIEX_RX_DATA_BUF_SIZE) {
1243 dev_err(adapter->dev, "invalid rx_len=%d\n", 1246 dev_err(adapter->dev, "invalid rx_len=%d\n",
1244 rx_len); 1247 rx_len);
1245 return -1; 1248 return -1;
1246 } 1249 }
1247 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE); 1250 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
@@ -1250,42 +1253,42 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1250 1253
1251 if (!skb) { 1254 if (!skb) {
1252 dev_err(adapter->dev, "%s: failed to alloc skb", 1255 dev_err(adapter->dev, "%s: failed to alloc skb",
1253 __func__); 1256 __func__);
1254 return -1; 1257 return -1;
1255 } 1258 }
1256 1259
1257 skb_put(skb, rx_len); 1260 skb_put(skb, rx_len);
1258 1261
1259 dev_dbg(adapter->dev, "info: rx_len = %d skb->len = %d\n", 1262 dev_dbg(adapter->dev, "info: rx_len = %d skb->len = %d\n",
1260 rx_len, skb->len); 1263 rx_len, skb->len);
1261 1264
1262 if (mwifiex_sdio_card_to_host_mp_aggr(adapter, skb, 1265 if (mwifiex_sdio_card_to_host_mp_aggr(adapter, skb,
1263 port)) { 1266 port)) {
1264 u32 cr = 0; 1267 u32 cr = 0;
1265 1268
1266 dev_err(adapter->dev, "card_to_host_mpa failed:" 1269 dev_err(adapter->dev, "card_to_host_mpa failed:"
1267 " int status=%#x\n", sdio_ireg); 1270 " int status=%#x\n", sdio_ireg);
1268 if (mwifiex_read_reg(adapter, 1271 if (mwifiex_read_reg(adapter,
1269 CONFIGURATION_REG, &cr)) 1272 CONFIGURATION_REG, &cr))
1270 dev_err(adapter->dev, 1273 dev_err(adapter->dev,
1271 "read CFG reg failed\n"); 1274 "read CFG reg failed\n");
1272 1275
1273 dev_dbg(adapter->dev, 1276 dev_dbg(adapter->dev,
1274 "info: CFG reg val = %d\n", cr); 1277 "info: CFG reg val = %d\n", cr);
1275 if (mwifiex_write_reg(adapter, 1278 if (mwifiex_write_reg(adapter,
1276 CONFIGURATION_REG, 1279 CONFIGURATION_REG,
1277 (cr | 0x04))) 1280 (cr | 0x04)))
1278 dev_err(adapter->dev, 1281 dev_err(adapter->dev,
1279 "write CFG reg failed\n"); 1282 "write CFG reg failed\n");
1280 1283
1281 dev_dbg(adapter->dev, "info: write success\n"); 1284 dev_dbg(adapter->dev, "info: write success\n");
1282 if (mwifiex_read_reg(adapter, 1285 if (mwifiex_read_reg(adapter,
1283 CONFIGURATION_REG, &cr)) 1286 CONFIGURATION_REG, &cr))
1284 dev_err(adapter->dev, 1287 dev_err(adapter->dev,
1285 "read CFG reg failed\n"); 1288 "read CFG reg failed\n");
1286 1289
1287 dev_dbg(adapter->dev, 1290 dev_dbg(adapter->dev,
1288 "info: CFG reg val =%x\n", cr); 1291 "info: CFG reg val =%x\n", cr);
1289 return -1; 1292 return -1;
1290 } 1293 }
1291 } 1294 }
@@ -1321,7 +1324,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1321 1324
1322 if ((!card->mpa_tx.enabled) || (port == CTRL_PORT)) { 1325 if ((!card->mpa_tx.enabled) || (port == CTRL_PORT)) {
1323 dev_dbg(adapter->dev, "info: %s: tx aggregation disabled\n", 1326 dev_dbg(adapter->dev, "info: %s: tx aggregation disabled\n",
1324 __func__); 1327 __func__);
1325 1328
1326 f_send_cur_buf = 1; 1329 f_send_cur_buf = 1;
1327 goto tx_curr_single; 1330 goto tx_curr_single;
@@ -1330,7 +1333,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1330 if (next_pkt_len) { 1333 if (next_pkt_len) {
1331 /* More pkt in TX queue */ 1334 /* More pkt in TX queue */
1332 dev_dbg(adapter->dev, "info: %s: more packets in queue.\n", 1335 dev_dbg(adapter->dev, "info: %s: more packets in queue.\n",
1333 __func__); 1336 __func__);
1334 1337
1335 if (MP_TX_AGGR_IN_PROGRESS(card)) { 1338 if (MP_TX_AGGR_IN_PROGRESS(card)) {
1336 if (!MP_TX_AGGR_PORT_LIMIT_REACHED(card) && 1339 if (!MP_TX_AGGR_PORT_LIMIT_REACHED(card) &&
@@ -1338,9 +1341,9 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1338 f_precopy_cur_buf = 1; 1341 f_precopy_cur_buf = 1;
1339 1342
1340 if (!(card->mp_wr_bitmap & 1343 if (!(card->mp_wr_bitmap &
1341 (1 << card->curr_wr_port)) 1344 (1 << card->curr_wr_port)) ||
1342 || !MP_TX_AGGR_BUF_HAS_ROOM( 1345 !MP_TX_AGGR_BUF_HAS_ROOM(
1343 card, pkt_len + next_pkt_len)) 1346 card, pkt_len + next_pkt_len))
1344 f_send_aggr_buf = 1; 1347 f_send_aggr_buf = 1;
1345 } else { 1348 } else {
1346 /* No room in Aggr buf, send it */ 1349 /* No room in Aggr buf, send it */
@@ -1354,8 +1357,8 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1354 f_postcopy_cur_buf = 1; 1357 f_postcopy_cur_buf = 1;
1355 } 1358 }
1356 } else { 1359 } else {
1357 if (MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len) 1360 if (MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len) &&
1358 && (card->mp_wr_bitmap & (1 << card->curr_wr_port))) 1361 (card->mp_wr_bitmap & (1 << card->curr_wr_port)))
1359 f_precopy_cur_buf = 1; 1362 f_precopy_cur_buf = 1;
1360 else 1363 else
1361 f_send_cur_buf = 1; 1364 f_send_cur_buf = 1;
@@ -1363,7 +1366,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1363 } else { 1366 } else {
1364 /* Last pkt in TX queue */ 1367 /* Last pkt in TX queue */
1365 dev_dbg(adapter->dev, "info: %s: Last packet in Tx Queue.\n", 1368 dev_dbg(adapter->dev, "info: %s: Last packet in Tx Queue.\n",
1366 __func__); 1369 __func__);
1367 1370
1368 if (MP_TX_AGGR_IN_PROGRESS(card)) { 1371 if (MP_TX_AGGR_IN_PROGRESS(card)) {
1369 /* some packs in Aggr buf already */ 1372 /* some packs in Aggr buf already */
@@ -1381,7 +1384,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1381 1384
1382 if (f_precopy_cur_buf) { 1385 if (f_precopy_cur_buf) {
1383 dev_dbg(adapter->dev, "data: %s: precopy current buffer\n", 1386 dev_dbg(adapter->dev, "data: %s: precopy current buffer\n",
1384 __func__); 1387 __func__);
1385 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port); 1388 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port);
1386 1389
1387 if (MP_TX_AGGR_PKT_LIMIT_REACHED(card) || 1390 if (MP_TX_AGGR_PKT_LIMIT_REACHED(card) ||
@@ -1392,7 +1395,7 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1392 1395
1393 if (f_send_aggr_buf) { 1396 if (f_send_aggr_buf) {
1394 dev_dbg(adapter->dev, "data: %s: send aggr buffer: %d %d\n", 1397 dev_dbg(adapter->dev, "data: %s: send aggr buffer: %d %d\n",
1395 __func__, 1398 __func__,
1396 card->mpa_tx.start_port, card->mpa_tx.ports); 1399 card->mpa_tx.start_port, card->mpa_tx.ports);
1397 ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf, 1400 ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf,
1398 card->mpa_tx.buf_len, 1401 card->mpa_tx.buf_len,
@@ -1406,14 +1409,14 @@ static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
1406tx_curr_single: 1409tx_curr_single:
1407 if (f_send_cur_buf) { 1410 if (f_send_cur_buf) {
1408 dev_dbg(adapter->dev, "data: %s: send current buffer %d\n", 1411 dev_dbg(adapter->dev, "data: %s: send current buffer %d\n",
1409 __func__, port); 1412 __func__, port);
1410 ret = mwifiex_write_data_to_card(adapter, payload, pkt_len, 1413 ret = mwifiex_write_data_to_card(adapter, payload, pkt_len,
1411 adapter->ioport + port); 1414 adapter->ioport + port);
1412 } 1415 }
1413 1416
1414 if (f_postcopy_cur_buf) { 1417 if (f_postcopy_cur_buf) {
1415 dev_dbg(adapter->dev, "data: %s: postcopy current buffer\n", 1418 dev_dbg(adapter->dev, "data: %s: postcopy current buffer\n",
1416 __func__); 1419 __func__);
1417 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port); 1420 MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port);
1418 } 1421 }
1419 1422
@@ -1458,7 +1461,7 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
1458 ret = mwifiex_get_wr_port_data(adapter, &port); 1461 ret = mwifiex_get_wr_port_data(adapter, &port);
1459 if (ret) { 1462 if (ret) {
1460 dev_err(adapter->dev, "%s: no wr_port available\n", 1463 dev_err(adapter->dev, "%s: no wr_port available\n",
1461 __func__); 1464 __func__);
1462 return ret; 1465 return ret;
1463 } 1466 }
1464 } else { 1467 } else {
@@ -1468,7 +1471,7 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
1468 if (pkt_len <= INTF_HEADER_LEN || 1471 if (pkt_len <= INTF_HEADER_LEN ||
1469 pkt_len > MWIFIEX_UPLD_SIZE) 1472 pkt_len > MWIFIEX_UPLD_SIZE)
1470 dev_err(adapter->dev, "%s: payload=%p, nb=%d\n", 1473 dev_err(adapter->dev, "%s: payload=%p, nb=%d\n",
1471 __func__, payload, pkt_len); 1474 __func__, payload, pkt_len);
1472 } 1475 }
1473 1476
1474 /* Transfer data to card */ 1477 /* Transfer data to card */
@@ -1476,10 +1479,11 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
1476 1479
1477 if (tx_param) 1480 if (tx_param)
1478 ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len, 1481 ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len,
1479 port, tx_param->next_pkt_len); 1482 port, tx_param->next_pkt_len
1483 );
1480 else 1484 else
1481 ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len, 1485 ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len,
1482 port, 0); 1486 port, 0);
1483 1487
1484 if (ret) { 1488 if (ret) {
1485 if (type == MWIFIEX_TYPE_CMD) 1489 if (type == MWIFIEX_TYPE_CMD)
@@ -1732,7 +1736,7 @@ mwifiex_update_mp_end_port(struct mwifiex_adapter *adapter, u16 port)
1732 card->curr_wr_port = 1; 1736 card->curr_wr_port = 1;
1733 1737
1734 dev_dbg(adapter->dev, "cmd: mp_end_port %d, data port mask 0x%x\n", 1738 dev_dbg(adapter->dev, "cmd: mp_end_port %d, data port mask 0x%x\n",
1735 port, card->mp_data_port_mask); 1739 port, card->mp_data_port_mask);
1736} 1740}
1737 1741
1738static struct mwifiex_if_ops sdio_ops = { 1742static struct mwifiex_if_ops sdio_ops = {