Lines Matching +full:no +full:- +full:sdio

1 // SPDX-License-Identifier: GPL-2.0-only
3 * NXP Wireless LAN device driver: SDIO specific handling
5 * Copyright 2011-2020 NXP
17 #include "sdio.h"
518 * The device node is saved in card->plt_of_node.
524 if (!of_match_node(mwifiex_sdio_of_match_table, dev->of_node)) { in mwifiex_sdio_probe_of()
526 return -EINVAL; in mwifiex_sdio_probe_of()
533 * SDIO probe.
536 * the card structure, enables SDIO function number and initiates the
547 func->vendor, func->device, func->class, func->num); in mwifiex_sdio_probe()
549 card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL); in mwifiex_sdio_probe()
551 return -ENOMEM; in mwifiex_sdio_probe()
553 init_completion(&card->fw_done); in mwifiex_sdio_probe()
555 card->func = func; in mwifiex_sdio_probe()
557 func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE; in mwifiex_sdio_probe()
559 if (id->driver_data) { in mwifiex_sdio_probe()
560 struct mwifiex_sdio_device *data = (void *)id->driver_data; in mwifiex_sdio_probe()
562 card->firmware = data->firmware; in mwifiex_sdio_probe()
563 card->firmware_sdiouart = data->firmware_sdiouart; in mwifiex_sdio_probe()
564 card->reg = data->reg; in mwifiex_sdio_probe()
565 card->max_ports = data->max_ports; in mwifiex_sdio_probe()
566 card->mp_agg_pkt_limit = data->mp_agg_pkt_limit; in mwifiex_sdio_probe()
567 card->supports_sdio_new_mode = data->supports_sdio_new_mode; in mwifiex_sdio_probe()
568 card->has_control_mask = data->has_control_mask; in mwifiex_sdio_probe()
569 card->tx_buf_size = data->tx_buf_size; in mwifiex_sdio_probe()
570 card->mp_tx_agg_buf_size = data->mp_tx_agg_buf_size; in mwifiex_sdio_probe()
571 card->mp_rx_agg_buf_size = data->mp_rx_agg_buf_size; in mwifiex_sdio_probe()
572 card->can_dump_fw = data->can_dump_fw; in mwifiex_sdio_probe()
573 card->fw_dump_enh = data->fw_dump_enh; in mwifiex_sdio_probe()
574 card->can_auto_tdls = data->can_auto_tdls; in mwifiex_sdio_probe()
575 card->can_ext_scan = data->can_ext_scan; in mwifiex_sdio_probe()
576 card->fw_ready_extra_delay = data->fw_ready_extra_delay; in mwifiex_sdio_probe()
577 INIT_WORK(&card->work, mwifiex_sdio_work); in mwifiex_sdio_probe()
585 dev_err(&func->dev, "failed to enable function\n"); in mwifiex_sdio_probe()
590 if (func->dev.of_node) { in mwifiex_sdio_probe()
591 ret = mwifiex_sdio_probe_of(&func->dev); in mwifiex_sdio_probe()
596 ret = mwifiex_add_card(card, &card->fw_done, &sdio_ops, in mwifiex_sdio_probe()
597 MWIFIEX_SDIO, &func->dev); in mwifiex_sdio_probe()
599 dev_err(&func->dev, "add card failed\n"); in mwifiex_sdio_probe()
614 * SDIO resume.
630 if (!card || !card->adapter) { in mwifiex_sdio_resume()
635 adapter = card->adapter; in mwifiex_sdio_resume()
637 if (!test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { in mwifiex_sdio_resume()
643 clear_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); in mwifiex_sdio_resume()
654 /* Write data into SDIO card register. Caller claims SDIO device. */
658 int ret = -1; in mwifiex_write_reg_locked()
664 /* This function writes data into SDIO card register.
669 struct sdio_mmc_card *card = adapter->card; in mwifiex_write_reg()
672 sdio_claim_host(card->func); in mwifiex_write_reg()
673 ret = mwifiex_write_reg_locked(card->func, reg, data); in mwifiex_write_reg()
674 sdio_release_host(card->func); in mwifiex_write_reg()
679 /* This function reads data from SDIO card register.
684 struct sdio_mmc_card *card = adapter->card; in mwifiex_read_reg()
685 int ret = -1; in mwifiex_read_reg()
688 sdio_claim_host(card->func); in mwifiex_read_reg()
689 val = sdio_readb(card->func, reg, &ret); in mwifiex_read_reg()
690 sdio_release_host(card->func); in mwifiex_read_reg()
697 /* This function writes multiple data into SDIO card memory.
705 struct sdio_mmc_card *card = adapter->card; in mwifiex_write_data_sync()
716 if (test_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags)) { in mwifiex_write_data_sync()
719 return -1; in mwifiex_write_data_sync()
722 sdio_claim_host(card->func); in mwifiex_write_data_sync()
724 ret = sdio_writesb(card->func, ioport, buffer, blk_cnt * blk_size); in mwifiex_write_data_sync()
726 sdio_release_host(card->func); in mwifiex_write_data_sync()
731 /* This function reads multiple data from SDIO card memory.
736 struct sdio_mmc_card *card = adapter->card; in mwifiex_read_data_sync()
746 sdio_claim_host(card->func); in mwifiex_read_data_sync()
748 ret = sdio_readsb(card->func, buffer, ioport, blk_cnt * blk_size); in mwifiex_read_data_sync()
751 sdio_release_host(card->func); in mwifiex_read_data_sync()
761 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_read_fw_status()
762 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_sdio_read_fw_status()
765 if (mwifiex_read_reg(adapter, reg->status_reg_0, &fws0)) in mwifiex_sdio_read_fw_status()
766 return -1; in mwifiex_sdio_read_fw_status()
768 if (mwifiex_read_reg(adapter, reg->status_reg_1, &fws1)) in mwifiex_sdio_read_fw_status()
769 return -1; in mwifiex_sdio_read_fw_status()
780 struct sdio_mmc_card *card = adapter->card; in mwifiex_check_fw_status()
795 ret = -1; in mwifiex_check_fw_status()
798 if (card->fw_ready_extra_delay && in mwifiex_check_fw_status()
814 struct sdio_mmc_card *card = adapter->card; in mwifiex_check_winner_status()
816 if (mwifiex_read_reg(adapter, card->reg->status_reg_0, &winner)) in mwifiex_check_winner_status()
817 return -1; in mwifiex_check_winner_status()
820 adapter->winner = 0; in mwifiex_check_winner_status()
822 adapter->winner = 1; in mwifiex_check_winner_status()
828 * SDIO remove.
845 wait_for_completion(&card->fw_done); in mwifiex_sdio_remove()
847 adapter = card->adapter; in mwifiex_sdio_remove()
848 if (!adapter || !adapter->priv_num) in mwifiex_sdio_remove()
851 mwifiex_dbg(adapter, INFO, "info: SDIO func num=%d\n", func->num); in mwifiex_sdio_remove()
855 !adapter->mfg_mode) { in mwifiex_sdio_remove()
867 * SDIO suspend.
890 return -ENOSYS; in mwifiex_sdio_suspend()
900 wait_for_completion(&card->fw_done); in mwifiex_sdio_suspend()
902 adapter = card->adapter; in mwifiex_sdio_suspend()
908 if (!adapter->is_up) in mwifiex_sdio_suspend()
909 return -EBUSY; in mwifiex_sdio_suspend()
917 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); in mwifiex_sdio_suspend()
919 return -EFAULT; in mwifiex_sdio_suspend()
927 set_bit(MWIFIEX_IS_SUSPENDED, &adapter->work_flags); in mwifiex_sdio_suspend()
928 clear_bit(MWIFIEX_IS_HS_ENABLING, &adapter->work_flags); in mwifiex_sdio_suspend()
940 &card->work_flags)) in mwifiex_sdio_coredump()
941 schedule_work(&card->work); in mwifiex_sdio_coredump()
969 MODULE_DEVICE_TABLE(sdio, mwifiex_ids);
1018 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_dnld_fw()
1021 sdio_claim_host(card->func); in mwifiex_sdio_dnld_fw()
1023 sdio_release_host(card->func); in mwifiex_sdio_dnld_fw()
1030 * chipsets supporting SDIO new mode eg SD8897.
1035 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio_new_mode()
1037 adapter->ioport = MEM_PORT; in mwifiex_init_sdio_new_mode()
1039 /* enable sdio new mode */ in mwifiex_init_sdio_new_mode()
1040 if (mwifiex_read_reg(adapter, card->reg->card_cfg_2_1_reg, &reg)) in mwifiex_init_sdio_new_mode()
1041 return -1; in mwifiex_init_sdio_new_mode()
1042 if (mwifiex_write_reg(adapter, card->reg->card_cfg_2_1_reg, in mwifiex_init_sdio_new_mode()
1044 return -1; in mwifiex_init_sdio_new_mode()
1047 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_0, &reg)) in mwifiex_init_sdio_new_mode()
1048 return -1; in mwifiex_init_sdio_new_mode()
1049 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_0, in mwifiex_init_sdio_new_mode()
1051 return -1; in mwifiex_init_sdio_new_mode()
1056 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_1, &reg)) in mwifiex_init_sdio_new_mode()
1057 return -1; in mwifiex_init_sdio_new_mode()
1058 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_1, in mwifiex_init_sdio_new_mode()
1060 return -1; in mwifiex_init_sdio_new_mode()
1067 * The following operations are performed -
1068 * - Read the IO ports (0, 1 and 2)
1069 * - Set host interrupt Reset-To-Read to clear
1070 * - Set auto re-enable interrupt
1075 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio_ioport()
1077 adapter->ioport = 0; in mwifiex_init_sdio_ioport()
1079 if (card->supports_sdio_new_mode) { in mwifiex_init_sdio_ioport()
1081 return -1; in mwifiex_init_sdio_ioport()
1086 if (!mwifiex_read_reg(adapter, card->reg->io_port_0_reg, &reg)) in mwifiex_init_sdio_ioport()
1087 adapter->ioport |= (reg & 0xff); in mwifiex_init_sdio_ioport()
1089 return -1; in mwifiex_init_sdio_ioport()
1091 if (!mwifiex_read_reg(adapter, card->reg->io_port_1_reg, &reg)) in mwifiex_init_sdio_ioport()
1092 adapter->ioport |= ((reg & 0xff) << 8); in mwifiex_init_sdio_ioport()
1094 return -1; in mwifiex_init_sdio_ioport()
1096 if (!mwifiex_read_reg(adapter, card->reg->io_port_2_reg, &reg)) in mwifiex_init_sdio_ioport()
1097 adapter->ioport |= ((reg & 0xff) << 16); in mwifiex_init_sdio_ioport()
1099 return -1; in mwifiex_init_sdio_ioport()
1102 "info: SDIO FUNC1 IO port: %#x\n", adapter->ioport); in mwifiex_init_sdio_ioport()
1105 if (mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, &reg)) in mwifiex_init_sdio_ioport()
1106 return -1; in mwifiex_init_sdio_ioport()
1107 if (mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg, in mwifiex_init_sdio_ioport()
1108 reg | card->reg->sdio_int_mask)) in mwifiex_init_sdio_ioport()
1109 return -1; in mwifiex_init_sdio_ioport()
1112 if (mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, &reg)) in mwifiex_init_sdio_ioport()
1113 return -1; in mwifiex_init_sdio_ioport()
1114 if (mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg, in mwifiex_init_sdio_ioport()
1116 return -1; in mwifiex_init_sdio_ioport()
1141 ret = -1; in mwifiex_write_data_to_card()
1145 } while (ret == -1); in mwifiex_write_data_to_card()
1160 struct sdio_mmc_card *card = adapter->card; in mwifiex_get_rd_port()
1161 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_get_rd_port()
1162 u32 rd_bitmap = card->mp_rd_bitmap; in mwifiex_get_rd_port()
1167 if (card->supports_sdio_new_mode) { in mwifiex_get_rd_port()
1168 if (!(rd_bitmap & reg->data_port_mask)) in mwifiex_get_rd_port()
1169 return -1; in mwifiex_get_rd_port()
1171 if (!(rd_bitmap & (CTRL_PORT_MASK | reg->data_port_mask))) in mwifiex_get_rd_port()
1172 return -1; in mwifiex_get_rd_port()
1175 if ((card->has_control_mask) && in mwifiex_get_rd_port()
1176 (card->mp_rd_bitmap & CTRL_PORT_MASK)) { in mwifiex_get_rd_port()
1177 card->mp_rd_bitmap &= (u32) (~CTRL_PORT_MASK); in mwifiex_get_rd_port()
1181 *port, card->mp_rd_bitmap); in mwifiex_get_rd_port()
1185 if (!(card->mp_rd_bitmap & (1 << card->curr_rd_port))) in mwifiex_get_rd_port()
1186 return -1; in mwifiex_get_rd_port()
1188 /* We are now handling the SDIO data ports */ in mwifiex_get_rd_port()
1189 card->mp_rd_bitmap &= (u32)(~(1 << card->curr_rd_port)); in mwifiex_get_rd_port()
1190 *port = card->curr_rd_port; in mwifiex_get_rd_port()
1192 if (++card->curr_rd_port == card->max_ports) in mwifiex_get_rd_port()
1193 card->curr_rd_port = reg->start_rd_port; in mwifiex_get_rd_port()
1196 "data: port=%d mp_rd_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_rd_port()
1197 *port, rd_bitmap, card->mp_rd_bitmap); in mwifiex_get_rd_port()
1211 struct sdio_mmc_card *card = adapter->card; in mwifiex_get_wr_port_data()
1212 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_get_wr_port_data()
1213 u32 wr_bitmap = card->mp_wr_bitmap; in mwifiex_get_wr_port_data()
1218 if (!(wr_bitmap & card->mp_data_port_mask)) { in mwifiex_get_wr_port_data()
1219 adapter->data_sent = true; in mwifiex_get_wr_port_data()
1220 return -EBUSY; in mwifiex_get_wr_port_data()
1223 if (card->mp_wr_bitmap & (1 << card->curr_wr_port)) { in mwifiex_get_wr_port_data()
1224 card->mp_wr_bitmap &= (u32) (~(1 << card->curr_wr_port)); in mwifiex_get_wr_port_data()
1225 *port = card->curr_wr_port; in mwifiex_get_wr_port_data()
1226 if (++card->curr_wr_port == card->mp_end_port) in mwifiex_get_wr_port_data()
1227 card->curr_wr_port = reg->start_wr_port; in mwifiex_get_wr_port_data()
1229 adapter->data_sent = true; in mwifiex_get_wr_port_data()
1230 return -EBUSY; in mwifiex_get_wr_port_data()
1233 if ((card->has_control_mask) && (*port == CTRL_PORT)) { in mwifiex_get_wr_port_data()
1235 "invalid data port=%d cur port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_wr_port_data()
1236 *port, card->curr_wr_port, wr_bitmap, in mwifiex_get_wr_port_data()
1237 card->mp_wr_bitmap); in mwifiex_get_wr_port_data()
1238 return -1; in mwifiex_get_wr_port_data()
1242 "data: port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n", in mwifiex_get_wr_port_data()
1243 *port, wr_bitmap, card->mp_wr_bitmap); in mwifiex_get_wr_port_data()
1254 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_poll_card_status()
1259 if (mwifiex_read_reg(adapter, card->reg->poll_reg, &cs)) in mwifiex_sdio_poll_card_status()
1270 return -1; in mwifiex_sdio_poll_card_status()
1281 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_disable_host_int()
1282 struct sdio_func *func = card->func; in mwifiex_sdio_disable_host_int()
1285 mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, 0); in mwifiex_sdio_disable_host_int()
1295 struct sdio_mmc_card *card = adapter->card; in mwifiex_interrupt_status()
1299 if (mwifiex_read_data_sync(adapter, card->mp_regs, in mwifiex_interrupt_status()
1300 card->reg->max_mp_regs, in mwifiex_interrupt_status()
1306 sdio_ireg = card->mp_regs[card->reg->host_int_status_reg]; in mwifiex_interrupt_status()
1310 * For SDIO new mode CMD port interrupts in mwifiex_interrupt_status()
1317 spin_lock_irqsave(&adapter->int_lock, flags); in mwifiex_interrupt_status()
1318 adapter->int_status |= sdio_ireg; in mwifiex_interrupt_status()
1319 spin_unlock_irqrestore(&adapter->int_lock, flags); in mwifiex_interrupt_status()
1324 * SDIO interrupt handler.
1336 if (!card || !card->adapter) { in mwifiex_sdio_interrupt()
1338 func, card, card ? card->adapter : NULL); in mwifiex_sdio_interrupt()
1341 adapter = card->adapter; in mwifiex_sdio_interrupt()
1343 if (!adapter->pps_uapsd_mode && adapter->ps_state == PS_STATE_SLEEP) in mwifiex_sdio_interrupt()
1344 adapter->ps_state = PS_STATE_AWAKE; in mwifiex_sdio_interrupt()
1358 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_enable_host_int()
1359 struct sdio_func *func = card->func; in mwifiex_sdio_enable_host_int()
1364 /* Request the SDIO IRQ */ in mwifiex_sdio_enable_host_int()
1373 ret = mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, in mwifiex_sdio_enable_host_int()
1374 card->reg->host_int_enable); in mwifiex_sdio_enable_host_int()
1399 return -1; in mwifiex_sdio_card_to_host()
1408 return -1; in mwifiex_sdio_card_to_host()
1416 return -1; in mwifiex_sdio_card_to_host()
1434 struct sdio_mmc_card *card = adapter->card; in mwifiex_prog_fw_w_helper()
1435 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_prog_fw_w_helper()
1437 u8 *firmware = fw->fw_buf; in mwifiex_prog_fw_w_helper()
1438 u32 firmware_len = fw->fw_len; in mwifiex_prog_fw_w_helper()
1449 return -1; in mwifiex_prog_fw_w_helper()
1456 /* Assume that the allocated buffer is 8-byte aligned */ in mwifiex_prog_fw_w_helper()
1459 return -ENOMEM; in mwifiex_prog_fw_w_helper()
1461 sdio_claim_host(card->func); in mwifiex_prog_fw_w_helper()
1481 ret = mwifiex_read_reg(adapter, reg->base_0_reg, in mwifiex_prog_fw_w_helper()
1490 ret = mwifiex_read_reg(adapter, reg->base_1_reg, in mwifiex_prog_fw_w_helper()
1513 ret = -1; in mwifiex_prog_fw_w_helper()
1525 ret = -1; in mwifiex_prog_fw_w_helper()
1537 /* Set blocksize to transfer - checking for last in mwifiex_prog_fw_w_helper()
1539 if (firmware_len - offset < txlen) in mwifiex_prog_fw_w_helper()
1540 txlen = firmware_len - offset; in mwifiex_prog_fw_w_helper()
1542 tx_blocks = (txlen + MWIFIEX_SDIO_BLOCK_SIZE - 1) in mwifiex_prog_fw_w_helper()
1551 adapter->ioport); in mwifiex_prog_fw_w_helper()
1560 ret = -1; in mwifiex_prog_fw_w_helper()
1572 sdio_release_host(card->func); in mwifiex_prog_fw_w_helper()
1578 * This function decodes sdio aggregation pkt.
1592 data = skb->data; in mwifiex_deaggr_sdio_pkt()
1593 total_pkt_len = skb->len; in mwifiex_deaggr_sdio_pkt()
1595 while (total_pkt_len >= (SDIO_HEADER_OFFSET + adapter->intf_hdr_len)) { in mwifiex_deaggr_sdio_pkt()
1596 if (total_pkt_len < adapter->sdio_rx_block_size) in mwifiex_deaggr_sdio_pkt()
1599 blk_size = adapter->sdio_rx_block_size * blk_num; in mwifiex_deaggr_sdio_pkt()
1621 memcpy(skb_deaggr->data, data + SDIO_HEADER_OFFSET, pkt_len); in mwifiex_deaggr_sdio_pkt()
1622 skb_pull(skb_deaggr, adapter->intf_hdr_len); in mwifiex_deaggr_sdio_pkt()
1626 total_pkt_len -= blk_size; in mwifiex_deaggr_sdio_pkt()
1644 pkt_len = get_unaligned_le16(skb->data); in mwifiex_decode_rx_packet()
1648 skb_pull(skb, adapter->intf_hdr_len); in mwifiex_decode_rx_packet()
1654 "info: --- Rx: Aggr Data packet ---\n"); in mwifiex_decode_rx_packet()
1656 rx_info->buf_type = MWIFIEX_TYPE_AGGR_DATA; in mwifiex_decode_rx_packet()
1657 if (adapter->rx_work_enabled) { in mwifiex_decode_rx_packet()
1658 skb_queue_tail(&adapter->rx_data_q, skb); in mwifiex_decode_rx_packet()
1659 atomic_inc(&adapter->rx_pending); in mwifiex_decode_rx_packet()
1660 adapter->data_received = true; in mwifiex_decode_rx_packet()
1669 "info: --- Rx: Data packet ---\n"); in mwifiex_decode_rx_packet()
1670 if (adapter->rx_work_enabled) { in mwifiex_decode_rx_packet()
1671 skb_queue_tail(&adapter->rx_data_q, skb); in mwifiex_decode_rx_packet()
1672 adapter->data_received = true; in mwifiex_decode_rx_packet()
1673 atomic_inc(&adapter->rx_pending); in mwifiex_decode_rx_packet()
1681 "info: --- Rx: Cmd Response ---\n"); in mwifiex_decode_rx_packet()
1683 if (!adapter->curr_cmd) { in mwifiex_decode_rx_packet()
1684 cmd_buf = adapter->upld_buf; in mwifiex_decode_rx_packet()
1686 if (adapter->ps_state == PS_STATE_SLEEP_CFM) in mwifiex_decode_rx_packet()
1688 skb->data, in mwifiex_decode_rx_packet()
1689 skb->len); in mwifiex_decode_rx_packet()
1691 memcpy(cmd_buf, skb->data, in mwifiex_decode_rx_packet()
1693 skb->len)); in mwifiex_decode_rx_packet()
1697 adapter->cmd_resp_received = true; in mwifiex_decode_rx_packet()
1698 adapter->curr_cmd->resp_skb = skb; in mwifiex_decode_rx_packet()
1704 "info: --- Rx: Event ---\n"); in mwifiex_decode_rx_packet()
1705 adapter->event_cause = get_unaligned_le32(skb->data); in mwifiex_decode_rx_packet()
1707 if ((skb->len > 0) && (skb->len < MAX_EVENT_SIZE)) in mwifiex_decode_rx_packet()
1708 memcpy(adapter->event_body, in mwifiex_decode_rx_packet()
1709 skb->data + MWIFIEX_EVENT_HEADER_LEN, in mwifiex_decode_rx_packet()
1710 skb->len); in mwifiex_decode_rx_packet()
1712 /* event cause has been saved to adapter->event_cause */ in mwifiex_decode_rx_packet()
1713 adapter->event_received = true; in mwifiex_decode_rx_packet()
1714 adapter->event_skb = skb; in mwifiex_decode_rx_packet()
1740 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_to_host_mp_aggr()
1750 if ((card->has_control_mask) && (port == CTRL_PORT)) { in mwifiex_sdio_card_to_host_mp_aggr()
1753 "info: %s: no aggregation for cmd\t" in mwifiex_sdio_card_to_host_mp_aggr()
1760 if (!card->mpa_rx.enabled) { in mwifiex_sdio_card_to_host_mp_aggr()
1769 if ((!card->has_control_mask && (card->mp_rd_bitmap & in mwifiex_sdio_card_to_host_mp_aggr()
1770 card->reg->data_port_mask)) || in mwifiex_sdio_card_to_host_mp_aggr()
1771 (card->has_control_mask && (card->mp_rd_bitmap & in mwifiex_sdio_card_to_host_mp_aggr()
1781 /* No room in Aggr buf, do rx aggr now */ in mwifiex_sdio_card_to_host_mp_aggr()
1791 /* No more data RX pending */ in mwifiex_sdio_card_to_host_mp_aggr()
1800 /* No room in Aggr buf, do rx aggr now */ in mwifiex_sdio_card_to_host_mp_aggr()
1818 /* No more pkts allowed in Aggr buf, rx it */ in mwifiex_sdio_card_to_host_mp_aggr()
1827 card->mpa_rx.pkt_cnt); in mwifiex_sdio_card_to_host_mp_aggr()
1829 if (card->supports_sdio_new_mode) { in mwifiex_sdio_card_to_host_mp_aggr()
1833 for (i = 0, port_count = 0; i < card->max_ports; i++) in mwifiex_sdio_card_to_host_mp_aggr()
1834 if (card->mpa_rx.ports & BIT(i)) in mwifiex_sdio_card_to_host_mp_aggr()
1838 * port_count -1", so decrease the count by 1 in mwifiex_sdio_card_to_host_mp_aggr()
1840 port_count--; in mwifiex_sdio_card_to_host_mp_aggr()
1841 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_sdio_card_to_host_mp_aggr()
1842 (port_count << 8)) + card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1844 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_sdio_card_to_host_mp_aggr()
1845 (card->mpa_rx.ports << 4)) + in mwifiex_sdio_card_to_host_mp_aggr()
1846 card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1849 if (card->mpa_rx.pkt_cnt == 1) in mwifiex_sdio_card_to_host_mp_aggr()
1850 mport = adapter->ioport + card->mpa_rx.start_port; in mwifiex_sdio_card_to_host_mp_aggr()
1852 if (mwifiex_read_data_sync(adapter, card->mpa_rx.buf, in mwifiex_sdio_card_to_host_mp_aggr()
1853 card->mpa_rx.buf_len, mport, 1)) in mwifiex_sdio_card_to_host_mp_aggr()
1856 curr_ptr = card->mpa_rx.buf; in mwifiex_sdio_card_to_host_mp_aggr()
1858 for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) { in mwifiex_sdio_card_to_host_mp_aggr()
1859 u32 *len_arr = card->mpa_rx.len_arr; in mwifiex_sdio_card_to_host_mp_aggr()
1880 adapter->sdio_rx_aggr_enable)) && in mwifiex_sdio_card_to_host_mp_aggr()
1883 memcpy(skb_deaggr->data, curr_ptr, pkt_len); in mwifiex_sdio_card_to_host_mp_aggr()
1887 /* Process de-aggr packet */ in mwifiex_sdio_card_to_host_mp_aggr()
1895 adapter->sdio_rx_aggr_enable, in mwifiex_sdio_card_to_host_mp_aggr()
1915 card->mpa_rx.buf, rx_len, in mwifiex_sdio_card_to_host_mp_aggr()
1916 adapter->ioport + port)) in mwifiex_sdio_card_to_host_mp_aggr()
1924 skb->data, skb->len, in mwifiex_sdio_card_to_host_mp_aggr()
1925 adapter->ioport + port)) in mwifiex_sdio_card_to_host_mp_aggr()
1927 if (!adapter->sdio_rx_aggr_enable && in mwifiex_sdio_card_to_host_mp_aggr()
1930 "current SDIO RX Aggr not enabled\n", in mwifiex_sdio_card_to_host_mp_aggr()
1954 return -1; in mwifiex_sdio_card_to_host_mp_aggr()
1960 * The following interrupts are checked and handled by this function -
1961 * - Data sent
1962 * - Command sent
1963 * - Packets received
1967 * should be done manually, and for every SDIO interrupt.
1974 struct sdio_mmc_card *card = adapter->card; in mwifiex_process_int_status()
1975 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_process_int_status()
1987 spin_lock_irqsave(&adapter->int_lock, flags); in mwifiex_process_int_status()
1988 sdio_ireg = adapter->int_status; in mwifiex_process_int_status()
1989 adapter->int_status = 0; in mwifiex_process_int_status()
1990 spin_unlock_irqrestore(&adapter->int_lock, flags); in mwifiex_process_int_status()
1995 /* Following interrupt is only for SDIO new mode */ in mwifiex_process_int_status()
1996 if (sdio_ireg & DN_LD_CMD_PORT_HOST_INT_STATUS && adapter->cmd_sent) in mwifiex_process_int_status()
1997 adapter->cmd_sent = false; in mwifiex_process_int_status()
1999 /* Following interrupt is only for SDIO new mode */ in mwifiex_process_int_status()
2004 rx_len = card->mp_regs[reg->cmd_rd_len_1] << 8; in mwifiex_process_int_status()
2005 rx_len |= (u16)card->mp_regs[reg->cmd_rd_len_0]; in mwifiex_process_int_status()
2007 if (rx_len <= adapter->intf_hdr_len || in mwifiex_process_int_status()
2010 return -1; in mwifiex_process_int_status()
2016 return -1; in mwifiex_process_int_status()
2020 if (mwifiex_sdio_card_to_host(adapter, &pkt_type, skb->data, in mwifiex_process_int_status()
2021 skb->len, adapter->ioport | in mwifiex_process_int_status()
2039 bitmap = (u32) card->mp_regs[reg->wr_bitmap_l]; in mwifiex_process_int_status()
2040 bitmap |= ((u32) card->mp_regs[reg->wr_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->wr_bitmap_1l]) << 16; in mwifiex_process_int_status()
2045 ((u32) card->mp_regs[reg->wr_bitmap_1u]) << 24; in mwifiex_process_int_status()
2047 card->mp_wr_bitmap = bitmap; in mwifiex_process_int_status()
2051 card->mp_wr_bitmap); in mwifiex_process_int_status()
2052 if (adapter->data_sent && in mwifiex_process_int_status()
2053 (card->mp_wr_bitmap & card->mp_data_port_mask)) { in mwifiex_process_int_status()
2055 "info: <--- Tx DONE Interrupt --->\n"); in mwifiex_process_int_status()
2056 adapter->data_sent = false; in mwifiex_process_int_status()
2061 updated is command port only, cmd_sent should be done for any SDIO in mwifiex_process_int_status()
2063 if (card->has_control_mask && adapter->cmd_sent) { in mwifiex_process_int_status()
2066 card->mp_wr_bitmap |= in mwifiex_process_int_status()
2067 (u32) card->mp_regs[reg->wr_bitmap_l] & CTRL_PORT_MASK; in mwifiex_process_int_status()
2068 if (card->mp_wr_bitmap & CTRL_PORT_MASK) in mwifiex_process_int_status()
2069 adapter->cmd_sent = false; in mwifiex_process_int_status()
2073 adapter->cmd_sent, adapter->data_sent); in mwifiex_process_int_status()
2075 bitmap = (u32) card->mp_regs[reg->rd_bitmap_l]; in mwifiex_process_int_status()
2076 bitmap |= ((u32) card->mp_regs[reg->rd_bitmap_u]) << 8; in mwifiex_process_int_status()
2077 if (card->supports_sdio_new_mode) { in mwifiex_process_int_status()
2079 ((u32) card->mp_regs[reg->rd_bitmap_1l]) << 16; in mwifiex_process_int_status()
2081 ((u32) card->mp_regs[reg->rd_bitmap_1u]) << 24; in mwifiex_process_int_status()
2083 card->mp_rd_bitmap = bitmap; in mwifiex_process_int_status()
2086 card->mp_rd_bitmap); in mwifiex_process_int_status()
2092 "info: no more rd_port available\n"); in mwifiex_process_int_status()
2095 len_reg_l = reg->rd_len_p0_l + (port << 1); in mwifiex_process_int_status()
2096 len_reg_u = reg->rd_len_p0_u + (port << 1); in mwifiex_process_int_status()
2097 rx_len = ((u16) card->mp_regs[len_reg_u]) << 8; in mwifiex_process_int_status()
2098 rx_len |= (u16) card->mp_regs[len_reg_l]; in mwifiex_process_int_status()
2103 (rx_len + MWIFIEX_SDIO_BLOCK_SIZE - in mwifiex_process_int_status()
2105 if (rx_len <= adapter->intf_hdr_len || in mwifiex_process_int_status()
2106 (card->mpa_rx.enabled && in mwifiex_process_int_status()
2108 card->mpa_rx.buf_size))) { in mwifiex_process_int_status()
2112 return -1; in mwifiex_process_int_status()
2152 return -1; in mwifiex_process_int_status()
2161 * aggregation buffer are pre-copied first before new packets are added.
2173 struct sdio_mmc_card *card = adapter->card; in mwifiex_host_to_card_mp_aggr()
2182 if (!card->mpa_tx.enabled || in mwifiex_host_to_card_mp_aggr()
2183 (card->has_control_mask && (port == CTRL_PORT)) || in mwifiex_host_to_card_mp_aggr()
2184 (card->supports_sdio_new_mode && (port == CMD_PORT_SLCT))) { in mwifiex_host_to_card_mp_aggr()
2203 if (!(card->mp_wr_bitmap & in mwifiex_host_to_card_mp_aggr()
2204 (1 << card->curr_wr_port)) || in mwifiex_host_to_card_mp_aggr()
2209 /* No room in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2212 if (!(card->mp_wr_bitmap & in mwifiex_host_to_card_mp_aggr()
2213 (1 << card->curr_wr_port))) in mwifiex_host_to_card_mp_aggr()
2220 (card->mp_wr_bitmap & (1 << card->curr_wr_port))) in mwifiex_host_to_card_mp_aggr()
2238 /* No room in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2253 /* No more pkts allowed in Aggr buf, send it */ in mwifiex_host_to_card_mp_aggr()
2260 __func__, card->mpa_tx.start_port, in mwifiex_host_to_card_mp_aggr()
2261 card->mpa_tx.ports); in mwifiex_host_to_card_mp_aggr()
2262 if (card->supports_sdio_new_mode) { in mwifiex_host_to_card_mp_aggr()
2266 for (i = 0, port_count = 0; i < card->max_ports; i++) in mwifiex_host_to_card_mp_aggr()
2267 if (card->mpa_tx.ports & BIT(i)) in mwifiex_host_to_card_mp_aggr()
2271 * port_count -1", so decrease the count by 1 in mwifiex_host_to_card_mp_aggr()
2273 port_count--; in mwifiex_host_to_card_mp_aggr()
2274 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_host_to_card_mp_aggr()
2275 (port_count << 8)) + card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2277 mport = (adapter->ioport | SDIO_MPA_ADDR_BASE | in mwifiex_host_to_card_mp_aggr()
2278 (card->mpa_tx.ports << 4)) + in mwifiex_host_to_card_mp_aggr()
2279 card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2282 if (card->mpa_tx.pkt_cnt == 1) in mwifiex_host_to_card_mp_aggr()
2283 mport = adapter->ioport + card->mpa_tx.start_port; in mwifiex_host_to_card_mp_aggr()
2285 ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf, in mwifiex_host_to_card_mp_aggr()
2286 card->mpa_tx.buf_len, mport); in mwifiex_host_to_card_mp_aggr()
2289 index = adapter->dbg.last_sdio_mp_index; in mwifiex_host_to_card_mp_aggr()
2291 adapter->dbg.last_sdio_mp_index = index; in mwifiex_host_to_card_mp_aggr()
2292 adapter->dbg.last_mp_wr_ports[index] = mport; in mwifiex_host_to_card_mp_aggr()
2293 adapter->dbg.last_mp_wr_bitmap[index] = card->mp_wr_bitmap; in mwifiex_host_to_card_mp_aggr()
2294 adapter->dbg.last_mp_wr_len[index] = card->mpa_tx.buf_len; in mwifiex_host_to_card_mp_aggr()
2295 adapter->dbg.last_mp_curr_wr_port[index] = card->curr_wr_port; in mwifiex_host_to_card_mp_aggr()
2306 adapter->ioport + port); in mwifiex_host_to_card_mp_aggr()
2325 * This function adds the SDIO specific header to the front of the buffer
2333 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_host_to_card()
2338 u8 *payload = (u8 *)skb->data; in mwifiex_sdio_host_to_card()
2339 u32 pkt_len = skb->len; in mwifiex_sdio_host_to_card()
2343 buf_block_len = (pkt_len + blk_size - 1) / blk_size; in mwifiex_sdio_host_to_card()
2349 * This is SDIO specific header in mwifiex_sdio_host_to_card()
2358 "%s: no wr_port available\n", in mwifiex_sdio_host_to_card()
2363 adapter->cmd_sent = true; in mwifiex_sdio_host_to_card()
2366 if (pkt_len <= adapter->intf_hdr_len || in mwifiex_sdio_host_to_card()
2372 if (card->supports_sdio_new_mode) in mwifiex_sdio_host_to_card()
2381 port, tx_param->next_pkt_len in mwifiex_sdio_host_to_card()
2389 adapter->cmd_sent = false; in mwifiex_sdio_host_to_card()
2391 adapter->data_sent = false; in mwifiex_sdio_host_to_card()
2393 card->curr_wr_port = port; in mwifiex_sdio_host_to_card()
2394 card->mp_wr_bitmap |= (u32)(1 << card->curr_wr_port); in mwifiex_sdio_host_to_card()
2398 if (!(card->mp_wr_bitmap & (1 << card->curr_wr_port))) in mwifiex_sdio_host_to_card()
2399 adapter->data_sent = true; in mwifiex_sdio_host_to_card()
2401 adapter->data_sent = false; in mwifiex_sdio_host_to_card()
2414 struct sdio_mmc_card *card = adapter->card; in mwifiex_alloc_sdio_mpa_buffers()
2418 card->mpa_tx.buf = kzalloc(mpa_tx_buf_size, GFP_KERNEL); in mwifiex_alloc_sdio_mpa_buffers()
2419 if (!card->mpa_tx.buf) { in mwifiex_alloc_sdio_mpa_buffers()
2420 ret = -1; in mwifiex_alloc_sdio_mpa_buffers()
2424 card->mpa_tx.buf_size = mpa_tx_buf_size; in mwifiex_alloc_sdio_mpa_buffers()
2428 card->mpa_rx.buf = kzalloc(rx_buf_size, GFP_KERNEL); in mwifiex_alloc_sdio_mpa_buffers()
2429 if (!card->mpa_rx.buf) { in mwifiex_alloc_sdio_mpa_buffers()
2430 ret = -1; in mwifiex_alloc_sdio_mpa_buffers()
2434 card->mpa_rx.buf_size = rx_buf_size; in mwifiex_alloc_sdio_mpa_buffers()
2438 kfree(card->mpa_tx.buf); in mwifiex_alloc_sdio_mpa_buffers()
2439 kfree(card->mpa_rx.buf); in mwifiex_alloc_sdio_mpa_buffers()
2440 card->mpa_tx.buf_size = 0; in mwifiex_alloc_sdio_mpa_buffers()
2441 card->mpa_rx.buf_size = 0; in mwifiex_alloc_sdio_mpa_buffers()
2442 card->mpa_tx.buf = NULL; in mwifiex_alloc_sdio_mpa_buffers()
2443 card->mpa_rx.buf = NULL; in mwifiex_alloc_sdio_mpa_buffers()
2450 * This function unregisters the SDIO device.
2452 * The SDIO IRQ is released, the function is disabled and driver
2458 struct sdio_mmc_card *card = adapter->card; in mwifiex_unregister_dev()
2460 if (adapter->card) { in mwifiex_unregister_dev()
2461 card->adapter = NULL; in mwifiex_unregister_dev()
2462 sdio_claim_host(card->func); in mwifiex_unregister_dev()
2463 sdio_disable_func(card->func); in mwifiex_unregister_dev()
2464 sdio_release_host(card->func); in mwifiex_unregister_dev()
2469 * This function registers the SDIO device.
2471 * SDIO IRQ is claimed, block size is set and driver data is initialized.
2476 struct sdio_mmc_card *card = adapter->card; in mwifiex_register_dev()
2477 struct sdio_func *func = card->func; in mwifiex_register_dev()
2478 const char *firmware = card->firmware; in mwifiex_register_dev()
2481 card->adapter = adapter; in mwifiex_register_dev()
2482 adapter->tx_buf_size = card->tx_buf_size; in mwifiex_register_dev()
2487 ret = sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE); in mwifiex_register_dev()
2491 "cannot set SDIO block size\n"); in mwifiex_register_dev()
2498 if (card->firmware_sdiouart) { in mwifiex_register_dev()
2501 mwifiex_read_reg(adapter, card->reg->host_strap_reg, &val); in mwifiex_register_dev()
2502 if ((val & card->reg->host_strap_mask) == card->reg->host_strap_value) in mwifiex_register_dev()
2503 firmware = card->firmware_sdiouart; in mwifiex_register_dev()
2505 strcpy(adapter->fw_name, firmware); in mwifiex_register_dev()
2507 if (card->fw_dump_enh) { in mwifiex_register_dev()
2508 adapter->mem_type_mapping_tbl = generic_mem_type_map; in mwifiex_register_dev()
2509 adapter->num_mem_types = 1; in mwifiex_register_dev()
2511 adapter->mem_type_mapping_tbl = mem_type_mapping_tbl; in mwifiex_register_dev()
2512 adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl); in mwifiex_register_dev()
2519 * This function initializes the SDIO driver.
2521 * The following initializations steps are followed -
2522 * - Read the Host interrupt status register to acknowledge
2524 * - Disable host interrupt mask register
2525 * - Get SDIO port
2526 * - Initialize SDIO variables in card
2527 * - Allocate MP registers
2528 * - Allocate MPA Tx and Rx buffers
2532 struct sdio_mmc_card *card = adapter->card; in mwifiex_init_sdio()
2533 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_init_sdio()
2537 sdio_set_drvdata(card->func, card); in mwifiex_init_sdio()
2544 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); in mwifiex_init_sdio()
2546 /* Get SDIO ioport */ in mwifiex_init_sdio()
2548 return -EIO; in mwifiex_init_sdio()
2550 /* Initialize SDIO variables in card */ in mwifiex_init_sdio()
2551 card->mp_rd_bitmap = 0; in mwifiex_init_sdio()
2552 card->mp_wr_bitmap = 0; in mwifiex_init_sdio()
2553 card->curr_rd_port = reg->start_rd_port; in mwifiex_init_sdio()
2554 card->curr_wr_port = reg->start_wr_port; in mwifiex_init_sdio()
2556 card->mp_data_port_mask = reg->data_port_mask; in mwifiex_init_sdio()
2558 card->mpa_tx.buf_len = 0; in mwifiex_init_sdio()
2559 card->mpa_tx.pkt_cnt = 0; in mwifiex_init_sdio()
2560 card->mpa_tx.start_port = 0; in mwifiex_init_sdio()
2562 card->mpa_tx.enabled = 1; in mwifiex_init_sdio()
2563 card->mpa_tx.pkt_aggr_limit = card->mp_agg_pkt_limit; in mwifiex_init_sdio()
2565 card->mpa_rx.buf_len = 0; in mwifiex_init_sdio()
2566 card->mpa_rx.pkt_cnt = 0; in mwifiex_init_sdio()
2567 card->mpa_rx.start_port = 0; in mwifiex_init_sdio()
2569 card->mpa_rx.enabled = 1; in mwifiex_init_sdio()
2570 card->mpa_rx.pkt_aggr_limit = card->mp_agg_pkt_limit; in mwifiex_init_sdio()
2572 /* Allocate buffers for SDIO MP-A */ in mwifiex_init_sdio()
2573 card->mp_regs = kzalloc(reg->max_mp_regs, GFP_KERNEL); in mwifiex_init_sdio()
2574 if (!card->mp_regs) in mwifiex_init_sdio()
2575 return -ENOMEM; in mwifiex_init_sdio()
2577 card->mpa_rx.len_arr = kcalloc(card->mp_agg_pkt_limit, in mwifiex_init_sdio()
2578 sizeof(*card->mpa_rx.len_arr), in mwifiex_init_sdio()
2580 if (!card->mpa_rx.len_arr) { in mwifiex_init_sdio()
2581 kfree(card->mp_regs); in mwifiex_init_sdio()
2582 return -ENOMEM; in mwifiex_init_sdio()
2586 card->mp_tx_agg_buf_size, in mwifiex_init_sdio()
2587 card->mp_rx_agg_buf_size); in mwifiex_init_sdio()
2590 if (ret && (card->mp_tx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX || in mwifiex_init_sdio()
2591 card->mp_rx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX)) { in mwifiex_init_sdio()
2593 adapter->host_disable_sdio_rx_aggr = true; in mwifiex_init_sdio()
2600 card->mpa_tx.enabled = 0; in mwifiex_init_sdio()
2601 card->mpa_rx.enabled = 0; in mwifiex_init_sdio()
2605 adapter->auto_tdls = card->can_auto_tdls; in mwifiex_init_sdio()
2606 adapter->ext_scan = card->can_ext_scan; in mwifiex_init_sdio()
2615 struct sdio_mmc_card *card = adapter->card; in mwifiex_cleanup_mpa_buf()
2624 * The following are freed by this function -
2625 * - MP registers
2626 * - MPA Tx buffer
2627 * - MPA Rx buffer
2631 struct sdio_mmc_card *card = adapter->card; in mwifiex_cleanup_sdio()
2633 cancel_work_sync(&card->work); in mwifiex_cleanup_sdio()
2635 kfree(card->mp_regs); in mwifiex_cleanup_sdio()
2636 kfree(card->mpa_rx.len_arr); in mwifiex_cleanup_sdio()
2637 kfree(card->mpa_tx.buf); in mwifiex_cleanup_sdio()
2638 kfree(card->mpa_rx.buf); in mwifiex_cleanup_sdio()
2647 struct sdio_mmc_card *card = adapter->card; in mwifiex_update_mp_end_port()
2648 const struct mwifiex_sdio_card_reg *reg = card->reg; in mwifiex_update_mp_end_port()
2651 card->mp_end_port = port; in mwifiex_update_mp_end_port()
2653 card->mp_data_port_mask = reg->data_port_mask; in mwifiex_update_mp_end_port()
2655 if (reg->start_wr_port) { in mwifiex_update_mp_end_port()
2656 for (i = 1; i <= card->max_ports - card->mp_end_port; i++) in mwifiex_update_mp_end_port()
2657 card->mp_data_port_mask &= in mwifiex_update_mp_end_port()
2658 ~(1 << (card->max_ports - i)); in mwifiex_update_mp_end_port()
2661 card->curr_wr_port = reg->start_wr_port; in mwifiex_update_mp_end_port()
2665 port, card->mp_data_port_mask); in mwifiex_update_mp_end_port()
2670 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_reset_work()
2671 struct sdio_func *func = card->func; in mwifiex_sdio_card_reset_work()
2676 clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags); in mwifiex_sdio_card_reset_work()
2677 clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags); in mwifiex_sdio_card_reset_work()
2679 /* Run a HW reset of the SDIO interface. */ in mwifiex_sdio_card_reset_work()
2681 ret = mmc_hw_reset(func->card); in mwifiex_sdio_card_reset_work()
2686 dev_dbg(&func->dev, "SDIO HW reset asynchronous\n"); in mwifiex_sdio_card_reset_work()
2687 complete_all(adapter->fw_done); in mwifiex_sdio_card_reset_work()
2692 dev_err(&func->dev, "reinit failed: %d\n", ret); in mwifiex_sdio_card_reset_work()
2695 dev_err(&func->dev, "SDIO HW reset failed: %d\n", ret); in mwifiex_sdio_card_reset_work()
2705 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_rdwr_firmware()
2709 sdio_writeb(card->func, card->reg->fw_dump_host_ready, in mwifiex_sdio_rdwr_firmware()
2710 card->reg->fw_dump_ctrl, &ret); in mwifiex_sdio_rdwr_firmware()
2712 mwifiex_dbg(adapter, ERROR, "SDIO Write ERR\n"); in mwifiex_sdio_rdwr_firmware()
2716 ctrl_data = sdio_readb(card->func, card->reg->fw_dump_ctrl, in mwifiex_sdio_rdwr_firmware()
2719 mwifiex_dbg(adapter, ERROR, "SDIO read err\n"); in mwifiex_sdio_rdwr_firmware()
2726 if (ctrl_data != card->reg->fw_dump_host_ready) { in mwifiex_sdio_rdwr_firmware()
2728 "The ctrl reg was changed, re-try again\n"); in mwifiex_sdio_rdwr_firmware()
2729 sdio_writeb(card->func, card->reg->fw_dump_host_ready, in mwifiex_sdio_rdwr_firmware()
2730 card->reg->fw_dump_ctrl, &ret); in mwifiex_sdio_rdwr_firmware()
2732 mwifiex_dbg(adapter, ERROR, "SDIO write err\n"); in mwifiex_sdio_rdwr_firmware()
2738 if (ctrl_data == card->reg->fw_dump_host_ready) { in mwifiex_sdio_rdwr_firmware()
2750 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_fw_dump()
2757 if (!card->can_dump_fw) in mwifiex_sdio_fw_dump()
2763 if (entry->mem_ptr) { in mwifiex_sdio_fw_dump()
2764 vfree(entry->mem_ptr); in mwifiex_sdio_fw_dump()
2765 entry->mem_ptr = NULL; in mwifiex_sdio_fw_dump()
2767 entry->mem_size = 0; in mwifiex_sdio_fw_dump()
2771 sdio_claim_host(card->func); in mwifiex_sdio_fw_dump()
2779 reg = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2781 dump_num = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2783 mwifiex_dbg(adapter, ERROR, "SDIO read memory length err\n"); in mwifiex_sdio_fw_dump()
2796 reg = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2798 read_reg = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2800 mwifiex_dbg(adapter, ERROR, "SDIO read err\n"); in mwifiex_sdio_fw_dump()
2810 card->reg->fw_dump_ctrl, in mwifiex_sdio_fw_dump()
2813 mwifiex_dbg(adapter, ERROR, "SDIO write err\n"); in mwifiex_sdio_fw_dump()
2820 "%s_SIZE=0x%x\n", entry->mem_name, memory_size); in mwifiex_sdio_fw_dump()
2821 entry->mem_ptr = vmalloc(memory_size + 1); in mwifiex_sdio_fw_dump()
2822 entry->mem_size = memory_size; in mwifiex_sdio_fw_dump()
2823 if (!entry->mem_ptr) { in mwifiex_sdio_fw_dump()
2825 entry->mem_name); in mwifiex_sdio_fw_dump()
2828 dbg_ptr = entry->mem_ptr; in mwifiex_sdio_fw_dump()
2831 doneflag = entry->done_flag; in mwifiex_sdio_fw_dump()
2834 entry->mem_name); in mwifiex_sdio_fw_dump()
2841 reg_start = card->reg->fw_dump_start; in mwifiex_sdio_fw_dump()
2842 reg_end = card->reg->fw_dump_end; in mwifiex_sdio_fw_dump()
2844 *dbg_ptr = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_fw_dump()
2847 "SDIO read err\n"); in mwifiex_sdio_fw_dump()
2861 entry->mem_name, dbg_ptr - entry->mem_ptr); in mwifiex_sdio_fw_dump()
2868 sdio_release_host(card->func); in mwifiex_sdio_fw_dump()
2873 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_generic_fw_dump()
2879 int ret = -1, tries; in mwifiex_sdio_generic_fw_dump()
2881 if (!card->fw_dump_enh) in mwifiex_sdio_generic_fw_dump()
2884 if (entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2885 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2886 entry->mem_ptr = NULL; in mwifiex_sdio_generic_fw_dump()
2888 entry->mem_size = 0; in mwifiex_sdio_generic_fw_dump()
2891 sdio_claim_host(card->func); in mwifiex_sdio_generic_fw_dump()
2899 reg_start = card->reg->fw_dump_start; in mwifiex_sdio_generic_fw_dump()
2900 reg_end = card->reg->fw_dump_end; in mwifiex_sdio_generic_fw_dump()
2903 start_flag = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_generic_fw_dump()
2906 "SDIO read err\n"); in mwifiex_sdio_generic_fw_dump()
2914 ret = -1; in mwifiex_sdio_generic_fw_dump()
2921 entry->mem_ptr = vmalloc(0xf0000 + 1); in mwifiex_sdio_generic_fw_dump()
2922 if (!entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2923 ret = -1; in mwifiex_sdio_generic_fw_dump()
2926 dbg_ptr = entry->mem_ptr; in mwifiex_sdio_generic_fw_dump()
2927 entry->mem_size = 0xf0000; in mwifiex_sdio_generic_fw_dump()
2928 end_ptr = dbg_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2930 done_flag = entry->done_flag; in mwifiex_sdio_generic_fw_dump()
2932 "Start %s output, please wait...\n", entry->mem_name); in mwifiex_sdio_generic_fw_dump()
2939 *dbg_ptr = sdio_readb(card->func, reg, &ret); in mwifiex_sdio_generic_fw_dump()
2942 "SDIO read err\n"); in mwifiex_sdio_generic_fw_dump()
2949 tmp_ptr = vmalloc(entry->mem_size + 0x4000 + 1); in mwifiex_sdio_generic_fw_dump()
2953 memcpy(tmp_ptr, entry->mem_ptr, in mwifiex_sdio_generic_fw_dump()
2954 entry->mem_size); in mwifiex_sdio_generic_fw_dump()
2955 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2956 entry->mem_ptr = tmp_ptr; in mwifiex_sdio_generic_fw_dump()
2958 dbg_ptr = entry->mem_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2959 entry->mem_size += 0x4000; in mwifiex_sdio_generic_fw_dump()
2960 end_ptr = entry->mem_ptr + entry->mem_size; in mwifiex_sdio_generic_fw_dump()
2964 entry->mem_size = dbg_ptr - entry->mem_ptr; in mwifiex_sdio_generic_fw_dump()
2966 entry->mem_name, entry->mem_size); in mwifiex_sdio_generic_fw_dump()
2976 if (entry->mem_ptr) { in mwifiex_sdio_generic_fw_dump()
2977 vfree(entry->mem_ptr); in mwifiex_sdio_generic_fw_dump()
2978 entry->mem_ptr = NULL; in mwifiex_sdio_generic_fw_dump()
2980 entry->mem_size = 0; in mwifiex_sdio_generic_fw_dump()
2982 sdio_release_host(card->func); in mwifiex_sdio_generic_fw_dump()
2987 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_device_dump_work()
2989 adapter->devdump_data = vzalloc(MWIFIEX_FW_DUMP_SIZE); in mwifiex_sdio_device_dump_work()
2990 if (!adapter->devdump_data) { in mwifiex_sdio_device_dump_work()
2997 if (card->fw_dump_enh) in mwifiex_sdio_device_dump_work()
3011 &card->work_flags)) in mwifiex_sdio_work()
3012 mwifiex_sdio_device_dump_work(card->adapter); in mwifiex_sdio_work()
3014 &card->work_flags)) in mwifiex_sdio_work()
3015 mwifiex_sdio_card_reset_work(card->adapter); in mwifiex_sdio_work()
3021 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_card_reset()
3023 if (!test_and_set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags)) in mwifiex_sdio_card_reset()
3024 schedule_work(&card->work); in mwifiex_sdio_card_reset()
3030 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_device_dump()
3033 &card->work_flags)) in mwifiex_sdio_device_dump()
3034 schedule_work(&card->work); in mwifiex_sdio_device_dump()
3037 /* Function to dump SDIO function registers and SDIO scratch registers in case
3044 struct sdio_mmc_card *cardp = adapter->card; in mwifiex_sdio_reg_dump()
3053 mwifiex_dbg(adapter, MSG, "SDIO register dump start\n"); in mwifiex_sdio_reg_dump()
3057 sdio_claim_host(cardp->func); in mwifiex_sdio_reg_dump()
3065 /* Read the registers of SDIO function0 */ in mwifiex_sdio_reg_dump()
3071 /* Read the registers of SDIO function1 */ in mwifiex_sdio_reg_dump()
3073 reg_start = cardp->reg->func1_dump_reg_start; in mwifiex_sdio_reg_dump()
3074 reg_end = cardp->reg->func1_dump_reg_end; in mwifiex_sdio_reg_dump()
3079 reg_start = cardp->reg->func1_spec_reg_table[index++]; in mwifiex_sdio_reg_dump()
3080 size = cardp->reg->func1_spec_reg_num; in mwifiex_sdio_reg_dump()
3081 reg_end = cardp->reg->func1_spec_reg_table[size-1]; in mwifiex_sdio_reg_dump()
3084 /* Read the scratch registers of SDIO function1 */ in mwifiex_sdio_reg_dump()
3088 reg_start = cardp->reg->func1_scratch_reg; in mwifiex_sdio_reg_dump()
3093 ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ", in mwifiex_sdio_reg_dump()
3096 ptr += sprintf(ptr, "SDIO Func%d: ", func); in mwifiex_sdio_reg_dump()
3100 data = sdio_f0_readb(cardp->func, reg, &ret); in mwifiex_sdio_reg_dump()
3102 data = sdio_readb(cardp->func, reg, &ret); in mwifiex_sdio_reg_dump()
3114 reg = cardp->reg->func1_spec_reg_table[index++]; in mwifiex_sdio_reg_dump()
3123 sdio_release_host(cardp->func); in mwifiex_sdio_reg_dump()
3125 mwifiex_dbg(adapter, MSG, "SDIO register dump end\n"); in mwifiex_sdio_reg_dump()
3127 return p - drv_buf; in mwifiex_sdio_reg_dump()
3130 /* sdio device/function initialization, code is extracted
3135 struct sdio_mmc_card *card = adapter->card; in mwifiex_sdio_up_dev()
3138 sdio_claim_host(card->func); in mwifiex_sdio_up_dev()
3139 sdio_enable_func(card->func); in mwifiex_sdio_up_dev()
3140 sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE); in mwifiex_sdio_up_dev()
3141 sdio_release_host(card->func); in mwifiex_sdio_up_dev()
3146 adapter->tx_buf_size = card->tx_buf_size; in mwifiex_sdio_up_dev()
3152 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg); in mwifiex_sdio_up_dev()
3155 dev_err(&card->func->dev, "error enabling SDIO port\n"); in mwifiex_sdio_up_dev()
3173 /* SDIO specific */
3189 MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);