diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/sdio.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/sdio.c | 192 |
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; |
824 | done: | 825 | done: |
@@ -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, | |||
1406 | tx_curr_single: | 1409 | tx_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 | ||
1738 | static struct mwifiex_if_ops sdio_ops = { | 1742 | static struct mwifiex_if_ops sdio_ops = { |