Lines Matching +full:no +full:- +full:sdio
2 * NXP Wireless LAN device driver: SDIO specific handling
4 * Copyright 2011-2020 NXP
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
12 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
14 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
29 #include "sdio.h"
494 * The device node is saved in card->plt_of_node.
500 if (!of_match_node(mwifiex_sdio_of_match_table, dev->of_node)) { in mwifiex_sdio_probe_of()
502 return -EINVAL; in mwifiex_sdio_probe_of()
509 * SDIO probe.
512 * the card structure, enables SDIO function number and initiates the
523 func->vendor, func->device, func->class, func->num); in mwifiex_sdio_probe()
525 card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL); in mwifiex_sdio_probe()
527 return -ENOMEM; in mwifiex_sdio_probe()
529 init_completion(&card->fw_done); in mwifiex_sdio_probe()
531 card->func = func; in mwifiex_sdio_probe()
533 func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; in mwifiex_sdio_probe()
535 if (id->driver_data) { in mwifiex_sdio_probe()
536 struct mwifiex_sdio_device *data = (void *)id->driver_data; in mwifiex_sdio_probe()
538 card->firmware = data->firmware; in mwifiex_sdio_probe()
539 card->reg = data->reg; in mwifiex_sdio_probe()
540 card->max_ports = data->max_ports; in mwifiex_sdio_probe()
541 card->mp_agg_pkt_limit = data->mp_agg_pkt_limit; in mwifiex_sdio_probe()
542 card->supports_sdio_new_mode = data->supports_sdio_new_mode; in mwifiex_sdio_probe()
543 card->has_control_mask = data->has_control_mask; in mwifiex_sdio_probe()
544 card->tx_buf_size = data->tx_buf_size; in mwifiex_sdio_probe()
545 card->mp_tx_agg_buf_size = data->mp_tx_agg_buf_size; in mwifiex_sdio_probe()
546 card->mp_rx_agg_buf_size = data->mp_rx_agg_buf_size; in mwifiex_sdio_probe()
547 card->can_dump_fw = data->can_dump_fw; in mwifiex_sdio_probe()
548 card->fw_dump_enh = data->fw_dump_enh; in mwifiex_sdio_probe()
549 card->can_auto_tdls = data->can_auto_tdls; in mwifiex_sdio_probe()
550 card->can_ext_scan = data->can_ext_scan; in mwifiex_sdio_probe()
551 INIT_WORK(&card->work, mwifiex_sdio_work); in mwifiex_sdio_probe()
559 dev_err(&func->dev, "failed to enable function\n"); in mwifiex_sdio_probe()
564 if (func->dev.of_node) { in mwifiex_sdio_probe()
565 ret = mwifiex_sdio_probe_of(&func->dev); in mwifiex_sdio_probe()
570 ret = mwifiex_add_card(card, &card->fw_done, &sdio_ops, in mwifiex_sdio_probe()
571 MWIFIEX_SDIO, &func->dev); in mwifiex_sdio_probe()
573 dev_err(&func->dev, "add card failed\n"); in mwifiex_sdio_probe()
588 * SDIO resume.
604 if (!card || !card->adapter) { in mwifiex_sdio_resume()
609 adapter = card->adapter; in mwifiex_sdio_resume()
611 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { in mwifiex_sdio_resume()
617 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); in mwifiex_sdio_resume()
628 /* Write data into SDIO card register. Caller claims SDIO device. */
632 int ret = -1; in mwifiex_write_reg_locked()
638 /* This function writes data into SDIO card register.
643 struct sdio_mmc_card *card = adapter->card; in mwifiex_write_reg()
646 sdio_claim_host(card->func); in mwifiex_write_reg()
647 ret = mwifiex_write_reg_locked(card->func, reg, data); in mwifiex_write_reg()
648 sdio_release_host(card->func); in mwifiex_write_reg()
653 /* This function reads data from SDIO card register.
658 struct sdio_mmc_card *card = adapter->card; in mwifiex_read_reg()
659 int ret = -1; in mwifiex_read_reg()
662 sdio_claim_host(card->func); in mwifiex_read_reg()
663 val = sdio_readb(card->func, reg, &ret); in mwifiex_read_reg()
664 sdio_release_host(card->func); in mwifiex_read_reg()
671 /* This function writes multiple data into SDIO card memory.
679 struct sdio_mmc_card *card = adapter->card; in mwifiex_write_data_sync()
690 if (test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { in mwifiex_write_data_sync()
693 return -1; in mwifiex_write_data_sync()
696 sdio_claim_host(card->func); in mwifiex_write_data_sync()
698 ret = sdio_writesb(card->func, ioport, buffer, blk_cnt * blk_size); in mwifiex_write_data_sync()
700 sdio_release_host(card->func); in mwifiex_write_data_sync()
705 /* This function reads multiple data from SDIO card memory.
710 struct sdio_mmc_card *card = adapter->card; in mwifiex_read_data_sync()
720 sdio_claim_host(card->func); in mwifiex_read_data_sync()
722 ret = sdio_readsb(card->func, buffer, ioport, blk_cnt * blk_size); in mwifiex_read_data_sync()
725 sdio_release_host(card->func); in mwifiex_read_data_sync()
735 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_read_fw_status()
736 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_sdio_read_fw_status()
739 if (mwifiex_read_reg(adapter, reg->status_reg_0, &fws0)) in mwifiex_sdio_read_fw_status()
740 return -1; in mwifiex_sdio_read_fw_status()
742 if (mwifiex_read_reg(adapter, reg->status_reg_1, &fws1)) in mwifiex_sdio_read_fw_status()
743 return -1; in mwifiex_sdio_read_fw_status()
768 ret = -1; in mwifiex_check_fw_status()
780 struct sdio_mmc_card *card = adapter->card; in mwifiex_check_winner_status()
782 if (mwifiex_read_reg(adapter, card->reg->status_reg_0, &winner)) in mwifiex_check_winner_status()
783 return -1; in mwifiex_check_winner_status()
786 adapter->winner = 0; in mwifiex_check_winner_status()
788 adapter->winner = 1; in mwifiex_check_winner_status()
794 * SDIO remove.
811 wait_for_completion(&card->fw_done); in mwifiex_sdio_remove()
813 adapter = card->adapter; in mwifiex_sdio_remove()
814 if (!adapter || !adapter->priv_num) in mwifiex_sdio_remove()
817 mwifiex_dbg(adapter, INFO, "info: SDIO func num=%d\n", func->num); in mwifiex_sdio_remove()
821 !adapter->mfg_mode) { in mwifiex_sdio_remove()
833 * SDIO suspend.
856 return -ENOSYS; in mwifiex_sdio_suspend()
866 wait_for_completion(&card->fw_done); in mwifiex_sdio_suspend()
868 adapter = card->adapter; in mwifiex_sdio_suspend()
874 if (!adapter->is_up) in mwifiex_sdio_suspend()
875 return -EBUSY; in mwifiex_sdio_suspend()
883 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); in mwifiex_sdio_suspend()
885 return -EFAULT; in mwifiex_sdio_suspend()
893 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); in mwifiex_sdio_suspend()
894 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); in mwifiex_sdio_suspend()
906 &card->work_flags)) in mwifiex_sdio_coredump()
907 schedule_work(&card->work); in mwifiex_sdio_coredump()
933 MODULE_DEVICE_TABLE(sdio, mwifiex_ids);
982 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_dnld_fw()
985 sdio_claim_host(card->func); in mwifiex_sdio_dnld_fw()
987 sdio_release_host(card->func); in mwifiex_sdio_dnld_fw()
994 * chipsets supporting SDIO new mode eg SD8897.
999 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio_new_mode()
1001 adapter->ioport = MEM_PORT; in mwifiex_init_sdio_new_mode()
1003 /* enable sdio new mode */ in mwifiex_init_sdio_new_mode()
1004 if (mwifiex_read_reg(adapter, card->reg->card_cfg_2_1_reg, ®)) in mwifiex_init_sdio_new_mode()
1005 return -1; in mwifiex_init_sdio_new_mode()
1006 if (mwifiex_write_reg(adapter, card->reg->card_cfg_2_1_reg, in mwifiex_init_sdio_new_mode()
1008 return -1; in mwifiex_init_sdio_new_mode()
1011 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_0, ®)) in mwifiex_init_sdio_new_mode()
1012 return -1; in mwifiex_init_sdio_new_mode()
1013 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_0, in mwifiex_init_sdio_new_mode()
1015 return -1; in mwifiex_init_sdio_new_mode()
1020 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_1, ®)) in mwifiex_init_sdio_new_mode()
1021 return -1; in mwifiex_init_sdio_new_mode()
1022 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_1, in mwifiex_init_sdio_new_mode()
1024 return -1; in mwifiex_init_sdio_new_mode()
1031 * The following operations are performed -
1032 * - Read the IO ports (0, 1 and 2)
1033 * - Set host interrupt Reset-To-Read to clear
1034 * - Set auto re-enable interrupt
1039 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio_ioport()
1041 adapter->ioport = 0; in mwifiex_init_sdio_ioport()
1043 if (card->supports_sdio_new_mode) { in mwifiex_init_sdio_ioport()
1045 return -1; in mwifiex_init_sdio_ioport()
1050 if (!mwifiex_read_reg(adapter, card->reg->io_port_0_reg, ®)) in mwifiex_init_sdio_ioport()
1051 adapter->ioport |= (reg & 0xff); in mwifiex_init_sdio_ioport()
1053 return -1; in mwifiex_init_sdio_ioport()
1055 if (!mwifiex_read_reg(adapter, card->reg->io_port_1_reg, ®)) in mwifiex_init_sdio_ioport()
1056 adapter->ioport |= ((reg & 0xff) << 8); in mwifiex_init_sdio_ioport()
1058 return -1; in mwifiex_init_sdio_ioport()
1060 if (!mwifiex_read_reg(adapter, card->reg->io_port_2_reg, ®)) in mwifiex_init_sdio_ioport()
1061 adapter->ioport |= ((reg & 0xff) << 16); in mwifiex_init_sdio_ioport()
1063 return -1; in mwifiex_init_sdio_ioport()
1066 "info: SDIO FUNC1 IO port: %#x\n", adapter->ioport); in mwifiex_init_sdio_ioport()
1069 if (!mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, ®)) in mwifiex_init_sdio_ioport()
1070 mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg, in mwifiex_init_sdio_ioport()
1071 reg | card->reg->sdio_int_mask); in mwifiex_init_sdio_ioport()
1073 return -1; in mwifiex_init_sdio_ioport()
1076 if (!mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, ®)) in mwifiex_init_sdio_ioport()
1077 mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg, in mwifiex_init_sdio_ioport()
1080 return -1; in mwifiex_init_sdio_ioport()
1105 ret = -1; in mwifiex_write_data_to_card()
1109 } while (ret == -1); in mwifiex_write_data_to_card()
1124 struct sdio_mmc_card *card = adapter->card; in mwifiex_get_rd_port()
1125 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_get_rd_port()
1126 u32 rd_bitmap = card->mp_rd_bitmap; in mwifiex_get_rd_port()
1131 if (card->supports_sdio_new_mode) { in mwifiex_get_rd_port()
1132 if (!(rd_bitmap & reg->data_port_mask)) in mwifiex_get_rd_port()
1133 return -1; in mwifiex_get_rd_port()
1135 if (!(rd_bitmap & (CTRL_PORT_MASK | reg->data_port_mask))) in mwifiex_get_rd_port()
1136 return -1; in mwifiex_get_rd_port()
1139 if ((card->has_control_mask) && in mwifiex_get_rd_port()
1140 (card->mp_rd_bitmap & CTRL_PORT_MASK)) { in mwifiex_get_rd_port()
1141 card->mp_rd_bitmap &= (u32) (~CTRL_PORT_MASK); in mwifiex_get_rd_port()
1145 *port, card->mp_rd_bitmap); in mwifiex_get_rd_port()
1149 if (!(card->mp_rd_bitmap & (1 << card->curr_rd_port))) in mwifiex_get_rd_port()
1150 return -1; in mwifiex_get_rd_port()
1152 /* We are now handling the SDIO data ports */ in mwifiex_get_rd_port()
1153 card->mp_rd_bitmap &= (u32)(~(1 << card->curr_rd_port)); in mwifiex_get_rd_port()
1154 *port = card->curr_rd_port; in mwifiex_get_rd_port()
1156 if (++card->curr_rd_port == card->max_ports) in mwifiex_get_rd_port()
1157 card->curr_rd_port = reg->start_rd_port; in mwifiex_get_rd_port()
1160 "data: port=%d mp_rd_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_rd_port()
1161 *port, rd_bitmap, card->mp_rd_bitmap); in mwifiex_get_rd_port()
1175 struct sdio_mmc_card *card = adapter->card; in mwifiex_get_wr_port_data()
1176 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_get_wr_port_data()
1177 u32 wr_bitmap = card->mp_wr_bitmap; in mwifiex_get_wr_port_data()
1182 if (!(wr_bitmap & card->mp_data_port_mask)) { in mwifiex_get_wr_port_data()
1183 adapter->data_sent = true; in mwifiex_get_wr_port_data()
1184 return -EBUSY; in mwifiex_get_wr_port_data()
1187 if (card->mp_wr_bitmap & (1 << card->curr_wr_port)) { in mwifiex_get_wr_port_data()
1188 card->mp_wr_bitmap &= (u32) (~(1 << card->curr_wr_port)); in mwifiex_get_wr_port_data()
1189 *port = card->curr_wr_port; in mwifiex_get_wr_port_data()
1190 if (++card->curr_wr_port == card->mp_end_port) in mwifiex_get_wr_port_data()
1191 card->curr_wr_port = reg->start_wr_port; in mwifiex_get_wr_port_data()
1193 adapter->data_sent = true; in mwifiex_get_wr_port_data()
1194 return -EBUSY; in mwifiex_get_wr_port_data()
1197 if ((card->has_control_mask) && (*port == CTRL_PORT)) { in mwifiex_get_wr_port_data()
1199 "invalid data port=%d cur port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_wr_port_data()
1200 *port, card->curr_wr_port, wr_bitmap, in mwifiex_get_wr_port_data()
1201 card->mp_wr_bitmap); in mwifiex_get_wr_port_data()
1202 return -1; in mwifiex_get_wr_port_data()
1206 "data: port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_wr_port_data()
1207 *port, wr_bitmap, card->mp_wr_bitmap); in mwifiex_get_wr_port_data()
1218 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_poll_card_status()
1223 if (mwifiex_read_reg(adapter, card->reg->poll_reg, &cs)) in mwifiex_sdio_poll_card_status()
1234 return -1; in mwifiex_sdio_poll_card_status()
1245 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_disable_host_int()
1246 struct sdio_func *func = card->func; in mwifiex_sdio_disable_host_int()
1249 mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, 0); in mwifiex_sdio_disable_host_int()
1259 struct sdio_mmc_card *card = adapter->card; in mwifiex_interrupt_status()
1263 if (mwifiex_read_data_sync(adapter, card->mp_regs, in mwifiex_interrupt_status()
1264 card->reg->max_mp_regs, in mwifiex_interrupt_status()
1270 sdio_ireg = card->mp_regs[card->reg->host_int_status_reg]; in mwifiex_interrupt_status()
1274 * For SDIO new mode CMD port interrupts in mwifiex_interrupt_status()
1281 spin_lock_irqsave(&adapter->int_lock, flags); in mwifiex_interrupt_status()
1282 adapter->int_status |= sdio_ireg; in mwifiex_interrupt_status()
1283 spin_unlock_irqrestore(&adapter->int_lock, flags); in mwifiex_interrupt_status()
1288 * SDIO interrupt handler.
1300 if (!card || !card->adapter) { in mwifiex_sdio_interrupt()
1302 func, card, card ? card->adapter : NULL); in mwifiex_sdio_interrupt()
1305 adapter = card->adapter; in mwifiex_sdio_interrupt()
1307 if (!adapter->pps_uapsd_mode && adapter->ps_state == PS_STATE_SLEEP) in mwifiex_sdio_interrupt()
1308 adapter->ps_state = PS_STATE_AWAKE; in mwifiex_sdio_interrupt()
1322 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_enable_host_int()
1323 struct sdio_func *func = card->func; in mwifiex_sdio_enable_host_int()
1328 /* Request the SDIO IRQ */ in mwifiex_sdio_enable_host_int()
1337 ret = mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, in mwifiex_sdio_enable_host_int()
1338 card->reg->host_int_enable); in mwifiex_sdio_enable_host_int()
1363 return -1; in mwifiex_sdio_card_to_host()
1372 return -1; in mwifiex_sdio_card_to_host()
1380 return -1; in mwifiex_sdio_card_to_host()
1398 struct sdio_mmc_card *card = adapter->card; in mwifiex_prog_fw_w_helper()
1399 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_prog_fw_w_helper()
1401 u8 *firmware = fw->fw_buf; in mwifiex_prog_fw_w_helper()
1402 u32 firmware_len = fw->fw_len; in mwifiex_prog_fw_w_helper()
1413 return -1; in mwifiex_prog_fw_w_helper()
1420 /* Assume that the allocated buffer is 8-byte aligned */ in mwifiex_prog_fw_w_helper()
1423 return -ENOMEM; in mwifiex_prog_fw_w_helper()
1425 sdio_claim_host(card->func); in mwifiex_prog_fw_w_helper()
1445 ret = mwifiex_read_reg(adapter, reg->base_0_reg, in mwifiex_prog_fw_w_helper()
1454 ret = mwifiex_read_reg(adapter, reg->base_1_reg, in mwifiex_prog_fw_w_helper()
1477 ret = -1; in mwifiex_prog_fw_w_helper()
1489 ret = -1; in mwifiex_prog_fw_w_helper()
1501 /* Set blocksize to transfer - checking for last in mwifiex_prog_fw_w_helper()
1503 if (firmware_len - offset < txlen) in mwifiex_prog_fw_w_helper()
1504 txlen = firmware_len - offset; in mwifiex_prog_fw_w_helper()
1506 tx_blocks = (txlen + MWIFIEX_SDIO_BLOCK_SIZE - 1) in mwifiex_prog_fw_w_helper()
1515 adapter->ioport); in mwifiex_prog_fw_w_helper()
1524 ret = -1; in mwifiex_prog_fw_w_helper()
1536 sdio_release_host(card->func); in mwifiex_prog_fw_w_helper()
1542 * This function decode sdio aggreation pkt.
1556 data = skb->data; in mwifiex_deaggr_sdio_pkt()
1557 total_pkt_len = skb->len; in mwifiex_deaggr_sdio_pkt()
1559 while (total_pkt_len >= (SDIO_HEADER_OFFSET + adapter->intf_hdr_len)) { in mwifiex_deaggr_sdio_pkt()
1560 if (total_pkt_len < adapter->sdio_rx_block_size) in mwifiex_deaggr_sdio_pkt()
1563 blk_size = adapter->sdio_rx_block_size * blk_num; in mwifiex_deaggr_sdio_pkt()
1585 memcpy(skb_deaggr->data, data + SDIO_HEADER_OFFSET, pkt_len); in mwifiex_deaggr_sdio_pkt()
1586 skb_pull(skb_deaggr, adapter->intf_hdr_len); in mwifiex_deaggr_sdio_pkt()
1590 total_pkt_len -= blk_size; in mwifiex_deaggr_sdio_pkt()
1608 pkt_len = get_unaligned_le16(skb->data); in mwifiex_decode_rx_packet()
1612 skb_pull(skb, adapter->intf_hdr_len); in mwifiex_decode_rx_packet()
1618 "info: --- Rx: Aggr Data packet ---\n"); in mwifiex_decode_rx_packet()
1620 rx_info->buf_type = MWIFIEX_TYPE_AGGR_DATA; in mwifiex_decode_rx_packet()
1621 if (adapter->rx_work_enabled) { in mwifiex_decode_rx_packet()
1622 skb_queue_tail(&adapter->rx_data_q, skb); in mwifiex_decode_rx_packet()
1623 atomic_inc(&adapter->rx_pending); in mwifiex_decode_rx_packet()
1624 adapter->data_received = true; in mwifiex_decode_rx_packet()
1633 "info: --- Rx: Data packet ---\n"); in mwifiex_decode_rx_packet()
1634 if (adapter->rx_work_enabled) { in mwifiex_decode_rx_packet()
1635 skb_queue_tail(&adapter->rx_data_q, skb); in mwifiex_decode_rx_packet()
1636 adapter->data_received = true; in mwifiex_decode_rx_packet()
1637 atomic_inc(&adapter->rx_pending); in mwifiex_decode_rx_packet()
1645 "info: --- Rx: Cmd Response ---\n"); in mwifiex_decode_rx_packet()
1647 if (!adapter->curr_cmd) { in mwifiex_decode_rx_packet()
1648 cmd_buf = adapter->upld_buf; in mwifiex_decode_rx_packet()
1650 if (adapter->ps_state == PS_STATE_SLEEP_CFM) in mwifiex_decode_rx_packet()
1652 skb->data, in mwifiex_decode_rx_packet()
1653 skb->len); in mwifiex_decode_rx_packet()
1655 memcpy(cmd_buf, skb->data, in mwifiex_decode_rx_packet()
1657 skb->len)); in mwifiex_decode_rx_packet()
1661 adapter->cmd_resp_received = true; in mwifiex_decode_rx_packet()
1662 adapter->curr_cmd->resp_skb = skb; in mwifiex_decode_rx_packet()
1668 "info: --- Rx: Event ---\n"); in mwifiex_decode_rx_packet()
1669 adapter->event_cause = get_unaligned_le32(skb->data); in mwifiex_decode_rx_packet()
1671 if ((skb->len > 0) && (skb->len < MAX_EVENT_SIZE)) in mwifiex_decode_rx_packet()
1672 memcpy(adapter->event_body, in mwifiex_decode_rx_packet()
1673 skb->data + MWIFIEX_EVENT_HEADER_LEN, in mwifiex_decode_rx_packet()
1674 skb->len); in mwifiex_decode_rx_packet()
1676 /* event cause has been saved to adapter->event_cause */ in mwifiex_decode_rx_packet()
1677 adapter->event_received = true; in mwifiex_decode_rx_packet()
1678 adapter->event_skb = skb; in mwifiex_decode_rx_packet()
1704 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_to_host_mp_aggr()
1714 if ((card->has_control_mask) && (port == CTRL_PORT)) { in mwifiex_sdio_card_to_host_mp_aggr()
1717 "info: %s: no aggregation for cmd\t" in mwifiex_sdio_card_to_host_mp_aggr()
1724 if (!card->mpa_rx.enabled) { in mwifiex_sdio_card_to_host_mp_aggr()
1733 if ((!card->has_control_mask && (card->mp_rd_bitmap & in mwifiex_sdio_card_to_host_mp_aggr()
1734 card->reg->data_port_mask)) || in mwifiex_sdio_card_to_host_mp_aggr()
1735 (card->has_control_mask && (card->mp_rd_bitmap & in mwifiex_sdio_card_to_host_mp_aggr()
1745 /* No room in Aggr buf, do rx aggr now */ in mwifiex_sdio_card_to_host_mp_aggr()
1755 /* No more data RX pending */ in mwifiex_sdio_card_to_host_mp_aggr()
1764 /* No room in Aggr buf, do rx aggr now */ in mwifiex_sdio_card_to_host_mp_aggr()
1782 /* No more pkts allowed in Aggr buf, rx it */ in mwifiex_sdio_card_to_host_mp_aggr()
1791 card->mpa_rx.pkt_cnt); in mwifiex_sdio_card_to_host_mp_aggr()
1793 if (card->supports_sdio_new_mode) { in mwifiex_sdio_card_to_host_mp_aggr()
1797 for (i = 0, port_count = 0; i < card->max_ports; i++) in mwifiex_sdio_card_to_host_mp_aggr()
1798 if (card->mpa_rx.ports & BIT(i)) in mwifiex_sdio_card_to_host_mp_aggr()
1802 * port_count -1", so decrease the count by 1 in mwifiex_sdio_card_to_host_mp_aggr()
1804 port_count--; in mwifiex_sdio_card_to_host_mp_aggr()
1805 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_sdio_card_to_host_mp_aggr()
1806 (port_count << 8)) + card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1808 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_sdio_card_to_host_mp_aggr()
1809 (card->mpa_rx.ports << 4)) + in mwifiex_sdio_card_to_host_mp_aggr()
1810 card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1813 if (card->mpa_rx.pkt_cnt == 1) in mwifiex_sdio_card_to_host_mp_aggr()
1814 mport = adapter->ioport + card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1816 if (mwifiex_read_data_sync(adapter, card->mpa_rx.buf, in mwifiex_sdio_card_to_host_mp_aggr()
1817 card->mpa_rx.buf_len, mport, 1)) in mwifiex_sdio_card_to_host_mp_aggr()
1820 curr_ptr = card->mpa_rx.buf; in mwifiex_sdio_card_to_host_mp_aggr()
1822 for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) { in mwifiex_sdio_card_to_host_mp_aggr()
1823 u32 *len_arr = card->mpa_rx.len_arr; in mwifiex_sdio_card_to_host_mp_aggr()
1844 adapter->sdio_rx_aggr_enable)) && in mwifiex_sdio_card_to_host_mp_aggr()
1847 memcpy(skb_deaggr->data, curr_ptr, pkt_len); in mwifiex_sdio_card_to_host_mp_aggr()
1851 /* Process de-aggr packet */ in mwifiex_sdio_card_to_host_mp_aggr()
1859 adapter->sdio_rx_aggr_enable, in mwifiex_sdio_card_to_host_mp_aggr()
1879 card->mpa_rx.buf, rx_len, in mwifiex_sdio_card_to_host_mp_aggr()
1880 adapter->ioport + port)) in mwifiex_sdio_card_to_host_mp_aggr()
1888 skb->data, skb->len, in mwifiex_sdio_card_to_host_mp_aggr()
1889 adapter->ioport + port)) in mwifiex_sdio_card_to_host_mp_aggr()
1891 if (!adapter->sdio_rx_aggr_enable && in mwifiex_sdio_card_to_host_mp_aggr()
1894 "current SDIO RX Aggr not enabled\n", in mwifiex_sdio_card_to_host_mp_aggr()
1918 return -1; in mwifiex_sdio_card_to_host_mp_aggr()
1924 * The following interrupts are checked and handled by this function -
1925 * - Data sent
1926 * - Command sent
1927 * - Packets received
1931 * should be done manually, and for every SDIO interrupt.
1938 struct sdio_mmc_card *card = adapter->card; in mwifiex_process_int_status()
1939 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_process_int_status()
1951 spin_lock_irqsave(&adapter->int_lock, flags); in mwifiex_process_int_status()
1952 sdio_ireg = adapter->int_status; in mwifiex_process_int_status()
1953 adapter->int_status = 0; in mwifiex_process_int_status()
1954 spin_unlock_irqrestore(&adapter->int_lock, flags); in mwifiex_process_int_status()
1959 /* Following interrupt is only for SDIO new mode */ in mwifiex_process_int_status()
1960 if (sdio_ireg & DN_LD_CMD_PORT_HOST_INT_STATUS && adapter->cmd_sent) in mwifiex_process_int_status()
1961 adapter->cmd_sent = false; in mwifiex_process_int_status()
1963 /* Following interrupt is only for SDIO new mode */ in mwifiex_process_int_status()
1968 rx_len = card->mp_regs[reg->cmd_rd_len_1] << 8; in mwifiex_process_int_status()
1969 rx_len |= (u16)card->mp_regs[reg->cmd_rd_len_0]; in mwifiex_process_int_status()
1971 if (rx_len <= adapter->intf_hdr_len || in mwifiex_process_int_status()
1974 return -1; in mwifiex_process_int_status()
1980 return -1; in mwifiex_process_int_status()
1984 if (mwifiex_sdio_card_to_host(adapter, &pkt_type, skb->data, in mwifiex_process_int_status()
1985 skb->len, adapter->ioport | in mwifiex_process_int_status()
2003 bitmap = (u32) card->mp_regs[reg->wr_bitmap_l]; in mwifiex_process_int_status()
2004 bitmap |= ((u32) card->mp_regs[reg->wr_bitmap_u]) << 8; in mwifiex_process_int_status()
2005 if (card->supports_sdio_new_mode) { in mwifiex_process_int_status()
2007 ((u32) card->mp_regs[reg->wr_bitmap_1l]) << 16; in mwifiex_process_int_status()
2009 ((u32) card->mp_regs[reg->wr_bitmap_1u]) << 24; in mwifiex_process_int_status()
2011 card->mp_wr_bitmap = bitmap; in mwifiex_process_int_status()
2015 card->mp_wr_bitmap); in mwifiex_process_int_status()
2016 if (adapter->data_sent && in mwifiex_process_int_status()
2017 (card->mp_wr_bitmap & card->mp_data_port_mask)) { in mwifiex_process_int_status()
2019 "info: <--- Tx DONE Interrupt --->\n"); in mwifiex_process_int_status()
2020 adapter->data_sent = false; in mwifiex_process_int_status()
2025 updated is command port only, cmd_sent should be done for any SDIO in mwifiex_process_int_status()
2027 if (card->has_control_mask && adapter->cmd_sent) { in mwifiex_process_int_status()
2030 card->mp_wr_bitmap |= in mwifiex_process_int_status()
2031 (u32) card->mp_regs[reg->wr_bitmap_l] & CTRL_PORT_MASK; in mwifiex_process_int_status()
2032 if (card->mp_wr_bitmap & CTRL_PORT_MASK) in mwifiex_process_int_status()
2033 adapter->cmd_sent = false; in mwifiex_process_int_status()
2037 adapter->cmd_sent, adapter->data_sent); in mwifiex_process_int_status()
2039 bitmap = (u32) card->mp_regs[reg->rd_bitmap_l]; in mwifiex_process_int_status()
2040 bitmap |= ((u32) card->mp_regs[reg->rd_bitmap_u]) << 8; in mwifiex_process_int_status()
2041 if (card->supports_sdio_new_mode) { in mwifiex_process_int_status()
2043 ((u32) card->mp_regs[reg->rd_bitmap_1l]) << 16; in mwifiex_process_int_status()
2045 ((u32) card->mp_regs[reg->rd_bitmap_1u]) << 24; in mwifiex_process_int_status()
2047 card->mp_rd_bitmap = bitmap; in mwifiex_process_int_status()
2050 card->mp_rd_bitmap); in mwifiex_process_int_status()
2056 "info: no more rd_port available\n"); in mwifiex_process_int_status()
2059 len_reg_l = reg->rd_len_p0_l + (port << 1); in mwifiex_process_int_status()
2060 len_reg_u = reg->rd_len_p0_u + (port << 1); in mwifiex_process_int_status()
2061 rx_len = ((u16) card->mp_regs[len_reg_u]) << 8; in mwifiex_process_int_status()
2062 rx_len |= (u16) card->mp_regs[len_reg_l]; in mwifiex_process_int_status()
2067 (rx_len + MWIFIEX_SDIO_BLOCK_SIZE - in mwifiex_process_int_status()
2069 if (rx_len <= adapter->intf_hdr_len || in mwifiex_process_int_status()
2070 (card->mpa_rx.enabled && in mwifiex_process_int_status()
2072 card->mpa_rx.buf_size))) { in mwifiex_process_int_status()
2076 return -1; in mwifiex_process_int_status()
2116 return -1; in mwifiex_process_int_status()
2125 * aggregation buffer are pre-copied first before new packets are added.
2137 struct sdio_mmc_card *card = adapter->card; in mwifiex_host_to_card_mp_aggr()
2146 if (!card->mpa_tx.enabled || in mwifiex_host_to_card_mp_aggr()
2147 (card->has_control_mask && (port == CTRL_PORT)) || in mwifiex_host_to_card_mp_aggr()
2148 (card->supports_sdio_new_mode && (port == CMD_PORT_SLCT))) { in mwifiex_host_to_card_mp_aggr()
2167 if (!(card->mp_wr_bitmap & in mwifiex_host_to_card_mp_aggr()
2168 (1 << card->curr_wr_port)) || in mwifiex_host_to_card_mp_aggr()
2173 /* No room in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2176 if (!(card->mp_wr_bitmap & in mwifiex_host_to_card_mp_aggr()
2177 (1 << card->curr_wr_port))) in mwifiex_host_to_card_mp_aggr()
2184 (card->mp_wr_bitmap & (1 << card->curr_wr_port))) in mwifiex_host_to_card_mp_aggr()
2202 /* No room in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2217 /* No more pkts allowed in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2224 __func__, card->mpa_tx.start_port, in mwifiex_host_to_card_mp_aggr()
2225 card->mpa_tx.ports); in mwifiex_host_to_card_mp_aggr()
2226 if (card->supports_sdio_new_mode) { in mwifiex_host_to_card_mp_aggr()
2230 for (i = 0, port_count = 0; i < card->max_ports; i++) in mwifiex_host_to_card_mp_aggr()
2231 if (card->mpa_tx.ports & BIT(i)) in mwifiex_host_to_card_mp_aggr()
2235 * port_count -1", so decrease the count by 1 in mwifiex_host_to_card_mp_aggr()
2237 port_count--; in mwifiex_host_to_card_mp_aggr()
2238 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_host_to_card_mp_aggr()
2239 (port_count << 8)) + card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2241 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_host_to_card_mp_aggr()
2242 (card->mpa_tx.ports << 4)) + in mwifiex_host_to_card_mp_aggr()
2243 card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2246 if (card->mpa_tx.pkt_cnt == 1) in mwifiex_host_to_card_mp_aggr()
2247 mport = adapter->ioport + card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2249 ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf, in mwifiex_host_to_card_mp_aggr()
2250 card->mpa_tx.buf_len, mport); in mwifiex_host_to_card_mp_aggr()
2253 index = adapter->dbg.last_sdio_mp_index; in mwifiex_host_to_card_mp_aggr()
2255 adapter->dbg.last_sdio_mp_index = index; in mwifiex_host_to_card_mp_aggr()
2256 adapter->dbg.last_mp_wr_ports[index] = mport; in mwifiex_host_to_card_mp_aggr()
2257 adapter->dbg.last_mp_wr_bitmap[index] = card->mp_wr_bitmap; in mwifiex_host_to_card_mp_aggr()
2258 adapter->dbg.last_mp_wr_len[index] = card->mpa_tx.buf_len; in mwifiex_host_to_card_mp_aggr()
2259 adapter->dbg.last_mp_curr_wr_port[index] = card->curr_wr_port; in mwifiex_host_to_card_mp_aggr()
2270 adapter->ioport + port); in mwifiex_host_to_card_mp_aggr()
2289 * This function adds the SDIO specific header to the front of the buffer
2297 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_host_to_card()
2302 u8 *payload = (u8 *)skb->data; in mwifiex_sdio_host_to_card()
2303 u32 pkt_len = skb->len; in mwifiex_sdio_host_to_card()
2307 buf_block_len = (pkt_len + blk_size - 1) / blk_size; in mwifiex_sdio_host_to_card()
2313 * This is SDIO specific header in mwifiex_sdio_host_to_card()
2322 "%s: no wr_port available\n", in mwifiex_sdio_host_to_card()
2327 adapter->cmd_sent = true; in mwifiex_sdio_host_to_card()
2330 if (pkt_len <= adapter->intf_hdr_len || in mwifiex_sdio_host_to_card()
2336 if (card->supports_sdio_new_mode) in mwifiex_sdio_host_to_card()
2345 port, tx_param->next_pkt_len in mwifiex_sdio_host_to_card()
2353 adapter->cmd_sent = false; in mwifiex_sdio_host_to_card()
2355 adapter->data_sent = false; in mwifiex_sdio_host_to_card()
2357 card->curr_wr_port = port; in mwifiex_sdio_host_to_card()
2358 card->mp_wr_bitmap |= (u32)(1 << card->curr_wr_port); in mwifiex_sdio_host_to_card()
2362 if (!(card->mp_wr_bitmap & (1 << card->curr_wr_port))) in mwifiex_sdio_host_to_card()
2363 adapter->data_sent = true; in mwifiex_sdio_host_to_card()
2365 adapter->data_sent = false; in mwifiex_sdio_host_to_card()
2378 struct sdio_mmc_card *card = adapter->card; in mwifiex_alloc_sdio_mpa_buffers()
2382 card->mpa_tx.buf = kzalloc(mpa_tx_buf_size, GFP_KERNEL); in mwifiex_alloc_sdio_mpa_buffers()
2383 if (!card->mpa_tx.buf) { in mwifiex_alloc_sdio_mpa_buffers()
2384 ret = -1; in mwifiex_alloc_sdio_mpa_buffers()
2388 card->mpa_tx.buf_size = mpa_tx_buf_size; in mwifiex_alloc_sdio_mpa_buffers()
2392 card->mpa_rx.buf = kzalloc(rx_buf_size, GFP_KERNEL); in mwifiex_alloc_sdio_mpa_buffers()
2393 if (!card->mpa_rx.buf) { in mwifiex_alloc_sdio_mpa_buffers()
2394 ret = -1; in mwifiex_alloc_sdio_mpa_buffers()
2398 card->mpa_rx.buf_size = rx_buf_size; in mwifiex_alloc_sdio_mpa_buffers()
2402 kfree(card->mpa_tx.buf); in mwifiex_alloc_sdio_mpa_buffers()
2403 kfree(card->mpa_rx.buf); in mwifiex_alloc_sdio_mpa_buffers()
2404 card->mpa_tx.buf_size = 0; in mwifiex_alloc_sdio_mpa_buffers()
2405 card->mpa_rx.buf_size = 0; in mwifiex_alloc_sdio_mpa_buffers()
2406 card->mpa_tx.buf = NULL; in mwifiex_alloc_sdio_mpa_buffers()
2407 card->mpa_rx.buf = NULL; in mwifiex_alloc_sdio_mpa_buffers()
2414 * This function unregisters the SDIO device.
2416 * The SDIO IRQ is released, the function is disabled and driver
2422 struct sdio_mmc_card *card = adapter->card; in mwifiex_unregister_dev()
2424 if (adapter->card) { in mwifiex_unregister_dev()
2425 card->adapter = NULL; in mwifiex_unregister_dev()
2426 sdio_claim_host(card->func); in mwifiex_unregister_dev()
2427 sdio_disable_func(card->func); in mwifiex_unregister_dev()
2428 sdio_release_host(card->func); in mwifiex_unregister_dev()
2433 * This function registers the SDIO device.
2435 * SDIO IRQ is claimed, block size is set and driver data is initialized.
2440 struct sdio_mmc_card *card = adapter->card; in mwifiex_register_dev()
2441 struct sdio_func *func = card->func; in mwifiex_register_dev()
2444 card->adapter = adapter; in mwifiex_register_dev()
2445 adapter->tx_buf_size = card->tx_buf_size; in mwifiex_register_dev()
2450 ret = sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE); in mwifiex_register_dev()
2454 "cannot set SDIO block size\n"); in mwifiex_register_dev()
2458 strcpy(adapter->fw_name, card->firmware); in mwifiex_register_dev()
2459 if (card->fw_dump_enh) { in mwifiex_register_dev()
2460 adapter->mem_type_mapping_tbl = generic_mem_type_map; in mwifiex_register_dev()
2461 adapter->num_mem_types = 1; in mwifiex_register_dev()
2463 adapter->mem_type_mapping_tbl = mem_type_mapping_tbl; in mwifiex_register_dev()
2464 adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl); in mwifiex_register_dev()
2471 * This function initializes the SDIO driver.
2473 * The following initializations steps are followed -
2474 * - Read the Host interrupt status register to acknowledge
2476 * - Disable host interrupt mask register
2477 * - Get SDIO port
2478 * - Initialize SDIO variables in card
2479 * - Allocate MP registers
2480 * - Allocate MPA Tx and Rx buffers
2484 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio()
2485 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_init_sdio()
2489 sdio_set_drvdata(card->func, card); in mwifiex_init_sdio()
2496 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); in mwifiex_init_sdio()
2498 /* Get SDIO ioport */ in mwifiex_init_sdio()
2501 /* Initialize SDIO variables in card */ in mwifiex_init_sdio()
2502 card->mp_rd_bitmap = 0; in mwifiex_init_sdio()
2503 card->mp_wr_bitmap = 0; in mwifiex_init_sdio()
2504 card->curr_rd_port = reg->start_rd_port; in mwifiex_init_sdio()
2505 card->curr_wr_port = reg->start_wr_port; in mwifiex_init_sdio()
2507 card->mp_data_port_mask = reg->data_port_mask; in mwifiex_init_sdio()
2509 card->mpa_tx.buf_len = 0; in mwifiex_init_sdio()
2510 card->mpa_tx.pkt_cnt = 0; in mwifiex_init_sdio()
2511 card->mpa_tx.start_port = 0; in mwifiex_init_sdio()
2513 card->mpa_tx.enabled = 1; in mwifiex_init_sdio()
2514 card->mpa_tx.pkt_aggr_limit = card->mp_agg_pkt_limit; in mwifiex_init_sdio()
2516 card->mpa_rx.buf_len = 0; in mwifiex_init_sdio()
2517 card->mpa_rx.pkt_cnt = 0; in mwifiex_init_sdio()
2518 card->mpa_rx.start_port = 0; in mwifiex_init_sdio()
2520 card->mpa_rx.enabled = 1; in mwifiex_init_sdio()
2521 card->mpa_rx.pkt_aggr_limit = card->mp_agg_pkt_limit; in mwifiex_init_sdio()
2523 /* Allocate buffers for SDIO MP-A */ in mwifiex_init_sdio()
2524 card->mp_regs = kzalloc(reg->max_mp_regs, GFP_KERNEL); in mwifiex_init_sdio()
2525 if (!card->mp_regs) in mwifiex_init_sdio()
2526 return -ENOMEM; in mwifiex_init_sdio()
2529 card->mpa_rx.skb_arr = kcalloc(card->mp_agg_pkt_limit, sizeof(void *), in mwifiex_init_sdio()
2531 if (!card->mpa_rx.skb_arr) { in mwifiex_init_sdio()
2532 kfree(card->mp_regs); in mwifiex_init_sdio()
2533 return -ENOMEM; in mwifiex_init_sdio()
2536 card->mpa_rx.len_arr = kcalloc(card->mp_agg_pkt_limit, in mwifiex_init_sdio()
2537 sizeof(*card->mpa_rx.len_arr), in mwifiex_init_sdio()
2539 if (!card->mpa_rx.len_arr) { in mwifiex_init_sdio()
2540 kfree(card->mp_regs); in mwifiex_init_sdio()
2541 kfree(card->mpa_rx.skb_arr); in mwifiex_init_sdio()
2542 return -ENOMEM; in mwifiex_init_sdio()
2546 card->mp_tx_agg_buf_size, in mwifiex_init_sdio()
2547 card->mp_rx_agg_buf_size); in mwifiex_init_sdio()
2550 if (ret && (card->mp_tx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX || in mwifiex_init_sdio()
2551 card->mp_rx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX)) { in mwifiex_init_sdio()
2553 adapter->host_disable_sdio_rx_aggr = true; in mwifiex_init_sdio()
2560 card->mpa_tx.enabled = 0; in mwifiex_init_sdio()
2561 card->mpa_rx.enabled = 0; in mwifiex_init_sdio()
2565 adapter->auto_tdls = card->can_auto_tdls; in mwifiex_init_sdio()
2566 adapter->ext_scan = card->can_ext_scan; in mwifiex_init_sdio()
2575 struct sdio_mmc_card *card = adapter->card; in mwifiex_cleanup_mpa_buf()
2584 * The following are freed by this function -
2585 * - MP registers
2586 * - MPA Tx buffer
2587 * - MPA Rx buffer
2591 struct sdio_mmc_card *card = adapter->card; in mwifiex_cleanup_sdio()
2593 cancel_work_sync(&card->work); in mwifiex_cleanup_sdio()
2595 kfree(card->mp_regs); in mwifiex_cleanup_sdio()
2596 kfree(card->mpa_rx.skb_arr); in mwifiex_cleanup_sdio()
2597 kfree(card->mpa_rx.len_arr); in mwifiex_cleanup_sdio()
2598 kfree(card->mpa_tx.buf); in mwifiex_cleanup_sdio()
2599 kfree(card->mpa_rx.buf); in mwifiex_cleanup_sdio()
2608 struct sdio_mmc_card *card = adapter->card; in mwifiex_update_mp_end_port()
2609 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_update_mp_end_port()
2612 card->mp_end_port = port; in mwifiex_update_mp_end_port()
2614 card->mp_data_port_mask = reg->data_port_mask; in mwifiex_update_mp_end_port()
2616 if (reg->start_wr_port) { in mwifiex_update_mp_end_port()
2617 for (i = 1; i <= card->max_ports - card->mp_end_port; i++) in mwifiex_update_mp_end_port()
2618 card->mp_data_port_mask &= in mwifiex_update_mp_end_port()
2619 ~(1 << (card->max_ports - i)); in mwifiex_update_mp_end_port()
2622 card->curr_wr_port = reg->start_wr_port; in mwifiex_update_mp_end_port()
2626 port, card->mp_data_port_mask); in mwifiex_update_mp_end_port()
2631 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_reset_work()
2632 struct sdio_func *func = card->func; in mwifiex_sdio_card_reset_work()
2637 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags); in mwifiex_sdio_card_reset_work()
2638 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags); in mwifiex_sdio_card_reset_work()
2640 /* Run a HW reset of the SDIO interface. */ in mwifiex_sdio_card_reset_work()
2642 ret = mmc_hw_reset(func->card->host); in mwifiex_sdio_card_reset_work()
2647 dev_dbg(&func->dev, "SDIO HW reset asynchronous\n"); in mwifiex_sdio_card_reset_work()
2648 complete_all(adapter->fw_done); in mwifiex_sdio_card_reset_work()
2653 dev_err(&func->dev, "reinit failed: %d\n", ret); in mwifiex_sdio_card_reset_work()
2656 dev_err(&func->dev, "SDIO HW reset failed: %d\n", ret); in mwifiex_sdio_card_reset_work()
2666 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_rdwr_firmware()
2670 sdio_writeb(card->func, card->reg->fw_dump_host_ready, in mwifiex_sdio_rdwr_firmware()
2671 card->reg->fw_dump_ctrl, &ret); in mwifiex_sdio_rdwr_firmware()
2673 mwifiex_dbg(adapter, ERROR, "SDIO Write ERR\n"); in mwifiex_sdio_rdwr_firmware()
2677 ctrl_data = sdio_readb(card->func, card->reg->fw_dump_ctrl, in mwifiex_sdio_rdwr_firmware()
2680 mwifiex_dbg(adapter, ERROR, "SDIO read err\n"); in mwifiex_sdio_rdwr_firmware()
2687 if (ctrl_data != card->reg->fw_dump_host_ready) { in mwifiex_sdio_rdwr_firmware()
2689 "The ctrl reg was changed, re-try again\n"); in mwifiex_sdio_rdwr_firmware()
2690 sdio_writeb(card->func, card->reg->fw_dump_host_ready, in mwifiex_sdio_rdwr_firmware()
2691 card->reg->fw_dump_ctrl, &ret); in mwifiex_sdio_rdwr_firmware()
2693 mwifiex_dbg(adapter, ERROR, "SDIO write err\n"); in mwifiex_sdio_rdwr_firmware()
2699 if (ctrl_data == card->reg->fw_dump_host_ready) { in mwifiex_sdio_rdwr_firmware()
2711 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_fw_dump()
2718 if (!card->can_dump_fw) in mwifiex_sdio_fw_dump()
2724 if (entry->mem_ptr) { in mwifiex_sdio_fw_dump()
2725 vfree(entry->mem_ptr); in mwifiex_sdio_fw_dump()
2726 entry->mem_ptr = NULL; in mwifiex_sdio_fw_dump()
2728 entry->mem_size = 0; in mwifiex_sdio_fw_dump()
2732 sdio_claim_host(card->func); in mwifiex_sdio_fw_dump()
2740 reg = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2742 dump_num = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2744 mwifiex_dbg(adapter, ERROR, "SDIO read memory length err\n"); in mwifiex_sdio_fw_dump()
2757 reg = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2759 read_reg = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2761 mwifiex_dbg(adapter, ERROR, "SDIO read err\n"); in mwifiex_sdio_fw_dump()
2771 card->reg->fw_dump_ctrl, in mwifiex_sdio_fw_dump()
2774 mwifiex_dbg(adapter, ERROR, "SDIO write err\n"); in mwifiex_sdio_fw_dump()
2781 "%s_SIZE=0x%x\n", entry->mem_name, memory_size); in mwifiex_sdio_fw_dump()
2782 entry->mem_ptr = vmalloc(memory_size + 1); in mwifiex_sdio_fw_dump()
2783 entry->mem_size = memory_size; in mwifiex_sdio_fw_dump()
2784 if (!entry->mem_ptr) { in mwifiex_sdio_fw_dump()
2786 entry->mem_name); in mwifiex_sdio_fw_dump()
2789 dbg_ptr = entry->mem_ptr; in mwifiex_sdio_fw_dump()
2792 doneflag = entry->done_flag; in mwifiex_sdio_fw_dump()
2795 entry->mem_name); in mwifiex_sdio_fw_dump()
2802 reg_start = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2803 reg_end = card->reg->fw_dump_end; in mwifiex_sdio_fw_dump()
2805 *dbg_ptr = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2808 "SDIO read err\n"); in mwifiex_sdio_fw_dump()
2822 entry->mem_name, dbg_ptr - entry->mem_ptr); in mwifiex_sdio_fw_dump()
2829 sdio_release_host(card->func); in mwifiex_sdio_fw_dump()
2834 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_generic_fw_dump()
2840 int ret = -1, tries; in mwifiex_sdio_generic_fw_dump()
2842 if (!card->fw_dump_enh) in mwifiex_sdio_generic_fw_dump()
2845 if (entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2846 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2847 entry->mem_ptr = NULL; in mwifiex_sdio_generic_fw_dump()
2849 entry->mem_size = 0; in mwifiex_sdio_generic_fw_dump()
2852 sdio_claim_host(card->func); in mwifiex_sdio_generic_fw_dump()
2860 reg_start = card->reg->fw_dump_start; in mwifiex_sdio_generic_fw_dump()
2861 reg_end = card->reg->fw_dump_end; in mwifiex_sdio_generic_fw_dump()
2864 start_flag = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_generic_fw_dump()
2867 "SDIO read err\n"); in mwifiex_sdio_generic_fw_dump()
2875 ret = -1; in mwifiex_sdio_generic_fw_dump()
2882 entry->mem_ptr = vmalloc(0xf0000 + 1); in mwifiex_sdio_generic_fw_dump()
2883 if (!entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2884 ret = -1; in mwifiex_sdio_generic_fw_dump()
2887 dbg_ptr = entry->mem_ptr; in mwifiex_sdio_generic_fw_dump()
2888 entry->mem_size = 0xf0000; in mwifiex_sdio_generic_fw_dump()
2889 end_ptr = dbg_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2891 done_flag = entry->done_flag; in mwifiex_sdio_generic_fw_dump()
2893 "Start %s output, please wait...\n", entry->mem_name); in mwifiex_sdio_generic_fw_dump()
2900 *dbg_ptr = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_generic_fw_dump()
2903 "SDIO read err\n"); in mwifiex_sdio_generic_fw_dump()
2910 tmp_ptr = vmalloc(entry->mem_size + 0x4000 + 1); in mwifiex_sdio_generic_fw_dump()
2914 memcpy(tmp_ptr, entry->mem_ptr, in mwifiex_sdio_generic_fw_dump()
2915 entry->mem_size); in mwifiex_sdio_generic_fw_dump()
2916 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2917 entry->mem_ptr = tmp_ptr; in mwifiex_sdio_generic_fw_dump()
2919 dbg_ptr = entry->mem_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2920 entry->mem_size += 0x4000; in mwifiex_sdio_generic_fw_dump()
2921 end_ptr = entry->mem_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2925 entry->mem_size = dbg_ptr - entry->mem_ptr; in mwifiex_sdio_generic_fw_dump()
2927 entry->mem_name, entry->mem_size); in mwifiex_sdio_generic_fw_dump()
2937 if (entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2938 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2939 entry->mem_ptr = NULL; in mwifiex_sdio_generic_fw_dump()
2941 entry->mem_size = 0; in mwifiex_sdio_generic_fw_dump()
2943 sdio_release_host(card->func); in mwifiex_sdio_generic_fw_dump()
2948 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_device_dump_work()
2950 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE); in mwifiex_sdio_device_dump_work()
2951 if (!adapter->devdump_data) { in mwifiex_sdio_device_dump_work()
2958 if (card->fw_dump_enh) in mwifiex_sdio_device_dump_work()
2972 &card->work_flags)) in mwifiex_sdio_work()
2973 mwifiex_sdio_device_dump_work(card->adapter); in mwifiex_sdio_work()
2975 &card->work_flags)) in mwifiex_sdio_work()
2976 mwifiex_sdio_card_reset_work(card->adapter); in mwifiex_sdio_work()
2982 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_reset()
2984 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags)) in mwifiex_sdio_card_reset()
2985 schedule_work(&card->work); in mwifiex_sdio_card_reset()
2991 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_device_dump()
2994 &card->work_flags)) in mwifiex_sdio_device_dump()
2995 schedule_work(&card->work); in mwifiex_sdio_device_dump()
2998 /* Function to dump SDIO function registers and SDIO scratch registers in case
3005 struct sdio_mmc_card *cardp = adapter->card; in mwifiex_sdio_reg_dump()
3014 mwifiex_dbg(adapter, MSG, "SDIO register dump start\n"); in mwifiex_sdio_reg_dump()
3018 sdio_claim_host(cardp->func); in mwifiex_sdio_reg_dump()
3026 /* Read the registers of SDIO function0 */ in mwifiex_sdio_reg_dump()
3032 /* Read the registers of SDIO function1 */ in mwifiex_sdio_reg_dump()
3034 reg_start = cardp->reg->func1_dump_reg_start; in mwifiex_sdio_reg_dump()
3035 reg_end = cardp->reg->func1_dump_reg_end; in mwifiex_sdio_reg_dump()
3040 reg_start = cardp->reg->func1_spec_reg_table[index++]; in mwifiex_sdio_reg_dump()
3041 size = cardp->reg->func1_spec_reg_num; in mwifiex_sdio_reg_dump()
3042 reg_end = cardp->reg->func1_spec_reg_table[size-1]; in mwifiex_sdio_reg_dump()
3045 /* Read the scratch registers of SDIO function1 */ in mwifiex_sdio_reg_dump()
3049 reg_start = cardp->reg->func1_scratch_reg; in mwifiex_sdio_reg_dump()
3054 ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ", in mwifiex_sdio_reg_dump()
3057 ptr += sprintf(ptr, "SDIO Func%d: ", func); in mwifiex_sdio_reg_dump()
3061 data = sdio_f0_readb(cardp->func, reg, &ret); in mwifiex_sdio_reg_dump()
3063 data = sdio_readb(cardp->func, reg, &ret); in mwifiex_sdio_reg_dump()
3075 reg = cardp->reg->func1_spec_reg_table[index++]; in mwifiex_sdio_reg_dump()
3084 sdio_release_host(cardp->func); in mwifiex_sdio_reg_dump()
3086 mwifiex_dbg(adapter, MSG, "SDIO register dump end\n"); in mwifiex_sdio_reg_dump()
3088 return p - drv_buf; in mwifiex_sdio_reg_dump()
3091 /* sdio device/function initialization, code is extracted
3096 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_up_dev()
3099 sdio_claim_host(card->func); in mwifiex_sdio_up_dev()
3100 sdio_enable_func(card->func); in mwifiex_sdio_up_dev()
3101 sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE); in mwifiex_sdio_up_dev()
3102 sdio_release_host(card->func); in mwifiex_sdio_up_dev()
3107 adapter->tx_buf_size = card->tx_buf_size; in mwifiex_sdio_up_dev()
3113 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); in mwifiex_sdio_up_dev()
3133 /* SDIO specific */
3149 MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);