Lines Matching refs:card

131 static void if_sdio_finish_power_on(struct if_sdio_card *card);
132 static int if_sdio_power_off(struct if_sdio_card *card);
144 static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err) in if_sdio_read_scratch() argument
149 scratch = sdio_readb(card->func, card->scratch_reg, &ret); in if_sdio_read_scratch()
151 scratch |= sdio_readb(card->func, card->scratch_reg + 1, in if_sdio_read_scratch()
163 static u8 if_sdio_read_rx_unit(struct if_sdio_card *card) in if_sdio_read_rx_unit() argument
168 rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret); in if_sdio_read_rx_unit()
176 static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err) in if_sdio_read_rx_len() argument
181 switch (card->model) { in if_sdio_read_rx_len()
184 rx_len = if_sdio_read_scratch(card, &ret); in if_sdio_read_rx_len()
188 rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret); in if_sdio_read_rx_len()
190 rx_len <<= card->rx_unit; in if_sdio_read_rx_len()
203 static int if_sdio_handle_cmd(struct if_sdio_card *card, in if_sdio_handle_cmd() argument
206 struct lbs_private *priv = card->priv; in if_sdio_handle_cmd()
234 static int if_sdio_handle_data(struct if_sdio_card *card, in if_sdio_handle_data() argument
257 lbs_process_rxed_packet(card->priv, skb); in if_sdio_handle_data()
265 static int if_sdio_handle_event(struct if_sdio_card *card, in if_sdio_handle_event() argument
271 if (card->model == MODEL_8385) { in if_sdio_handle_event()
272 event = sdio_readb(card->func, IF_SDIO_EVENT, &ret); in if_sdio_handle_event()
291 lbs_queue_event(card->priv, event & 0xFF); in if_sdio_handle_event()
298 static int if_sdio_wait_status(struct if_sdio_card *card, const u8 condition) in if_sdio_wait_status() argument
306 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); in if_sdio_wait_status()
318 static int if_sdio_card_to_host(struct if_sdio_card *card) in if_sdio_card_to_host() argument
323 size = if_sdio_read_rx_len(card, &ret); in if_sdio_card_to_host()
334 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); in if_sdio_card_to_host()
343 chunk = sdio_align_size(card->func, size); in if_sdio_card_to_host()
345 ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk); in if_sdio_card_to_host()
349 chunk = card->buffer[0] | (card->buffer[1] << 8); in if_sdio_card_to_host()
350 type = card->buffer[2] | (card->buffer[3] << 8); in if_sdio_card_to_host()
369 ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
374 ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
379 ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
399 struct if_sdio_card *card; in if_sdio_host_to_card_worker() local
404 card = container_of(work, struct if_sdio_card, packet_worker); in if_sdio_host_to_card_worker()
407 spin_lock_irqsave(&card->lock, flags); in if_sdio_host_to_card_worker()
408 packet = list_first_entry_or_null(&card->packets, in if_sdio_host_to_card_worker()
412 spin_unlock_irqrestore(&card->lock, flags); in if_sdio_host_to_card_worker()
417 sdio_claim_host(card->func); in if_sdio_host_to_card_worker()
419 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); in if_sdio_host_to_card_worker()
421 ret = sdio_writesb(card->func, card->ioport, in if_sdio_host_to_card_worker()
428 sdio_release_host(card->func); in if_sdio_host_to_card_worker()
440 static int if_sdio_prog_helper(struct if_sdio_card *card, in if_sdio_prog_helper() argument
456 sdio_claim_host(card->func); in if_sdio_prog_helper()
458 ret = sdio_set_block_size(card->func, 32); in if_sdio_prog_helper()
466 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); in if_sdio_prog_helper()
482 ret = sdio_writesb(card->func, card->ioport, in if_sdio_prog_helper()
493 ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64); in if_sdio_prog_helper()
504 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret); in if_sdio_prog_helper()
508 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8; in if_sdio_prog_helper()
526 sdio_release_host(card->func); in if_sdio_prog_helper()
536 static int if_sdio_prog_real(struct if_sdio_card *card, in if_sdio_prog_real() argument
552 sdio_claim_host(card->func); in if_sdio_prog_real()
554 ret = sdio_set_block_size(card->func, 32); in if_sdio_prog_real()
564 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); in if_sdio_prog_real()
568 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, in if_sdio_prog_real()
573 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, in if_sdio_prog_real()
620 ret = sdio_writesb(card->func, card->ioport, in if_sdio_prog_real()
640 scratch = if_sdio_read_scratch(card, &ret); in if_sdio_prog_real()
658 sdio_release_host(card->func); in if_sdio_prog_real()
672 struct if_sdio_card *card = priv->card; in if_sdio_do_prog_firmware() local
679 ret = if_sdio_prog_helper(card, helper); in if_sdio_do_prog_firmware()
685 ret = if_sdio_prog_real(card, mainfw); in if_sdio_do_prog_firmware()
690 if_sdio_finish_power_on(card); in if_sdio_do_prog_firmware()
693 static int if_sdio_prog_firmware(struct if_sdio_card *card) in if_sdio_prog_firmware() argument
701 sdio_claim_host(card->func); in if_sdio_prog_firmware()
702 sdio_writeb(card->func, 0x00, IF_SDIO_H_INT_MASK, &ret); in if_sdio_prog_firmware()
703 sdio_release_host(card->func); in if_sdio_prog_firmware()
705 sdio_claim_host(card->func); in if_sdio_prog_firmware()
706 scratch = if_sdio_read_scratch(card, &ret); in if_sdio_prog_firmware()
707 sdio_release_host(card->func); in if_sdio_prog_firmware()
728 if_sdio_finish_power_on(card); in if_sdio_prog_firmware()
730 } else if ((card->model == MODEL_8686) && (scratch & 0x7fff)) { in if_sdio_prog_firmware()
732 if_sdio_finish_power_on(card); in if_sdio_prog_firmware()
736 ret = lbs_get_firmware_async(card->priv, &card->func->dev, card->model, in if_sdio_prog_firmware()
748 static void if_sdio_finish_power_on(struct if_sdio_card *card) in if_sdio_finish_power_on() argument
750 struct sdio_func *func = card->func; in if_sdio_finish_power_on()
751 struct lbs_private *priv = card->priv; in if_sdio_finish_power_on()
755 sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE); in if_sdio_finish_power_on()
761 if ((card->model != MODEL_8385) in if_sdio_finish_power_on()
762 && (card->model != MODEL_8686)) in if_sdio_finish_power_on()
763 card->rx_unit = if_sdio_read_rx_unit(card); in if_sdio_finish_power_on()
765 card->rx_unit = 0; in if_sdio_finish_power_on()
799 if (card->model == MODEL_8688) { in if_sdio_finish_power_on()
810 wake_up(&card->pwron_waitq); in if_sdio_finish_power_on()
812 if (!card->started) { in if_sdio_finish_power_on()
814 if_sdio_power_off(card); in if_sdio_finish_power_on()
816 card->started = true; in if_sdio_finish_power_on()
831 static int if_sdio_power_on(struct if_sdio_card *card) in if_sdio_power_on() argument
833 struct sdio_func *func = card->func; in if_sdio_power_on()
834 struct mmc_host *host = func->card->host; in if_sdio_power_on()
846 if ((card->model == MODEL_8686) && in if_sdio_power_on()
851 func->card->quirks |= MMC_QUIRK_LENIENT_FN0; in if_sdio_power_on()
862 card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret); in if_sdio_power_on()
866 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8; in if_sdio_power_on()
870 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16; in if_sdio_power_on()
875 ret = if_sdio_prog_firmware(card); in if_sdio_power_on()
890 static int if_sdio_power_off(struct if_sdio_card *card) in if_sdio_power_off() argument
892 struct sdio_func *func = card->func; in if_sdio_power_off()
893 struct lbs_private *priv = card->priv; in if_sdio_power_off()
913 struct if_sdio_card *card; in if_sdio_host_to_card() local
918 card = priv->card; in if_sdio_host_to_card()
930 size = sdio_align_size(card->func, nb + 4); in if_sdio_host_to_card()
951 spin_lock_irqsave(&card->lock, flags); in if_sdio_host_to_card()
953 list_add_tail(&packet->list, &card->packets); in if_sdio_host_to_card()
966 spin_unlock_irqrestore(&card->lock, flags); in if_sdio_host_to_card()
968 queue_work(card->workqueue, &card->packet_worker); in if_sdio_host_to_card()
995 struct if_sdio_card *card = priv->card; in if_sdio_exit_deep_sleep() local
998 sdio_claim_host(card->func); in if_sdio_exit_deep_sleep()
1000 sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret); in if_sdio_exit_deep_sleep()
1004 sdio_release_host(card->func); in if_sdio_exit_deep_sleep()
1011 struct if_sdio_card *card = priv->card; in if_sdio_reset_deep_sleep_wakeup() local
1014 sdio_claim_host(card->func); in if_sdio_reset_deep_sleep_wakeup()
1016 sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret); in if_sdio_reset_deep_sleep_wakeup()
1020 sdio_release_host(card->func); in if_sdio_reset_deep_sleep_wakeup()
1031 struct if_sdio_card *card; in if_sdio_reset_card_worker() local
1034 card = container_of(work, struct if_sdio_card, reset_worker); in if_sdio_reset_card_worker()
1035 reset_host = card->func->card->host; in if_sdio_reset_card_worker()
1036 name = card->priv->dev->name; in if_sdio_reset_card_worker()
1037 dev = &card->func->dev; in if_sdio_reset_card_worker()
1058 struct if_sdio_card *card = priv->card; in if_sdio_reset_card() local
1060 if (!work_pending(&card->reset_worker)) in if_sdio_reset_card()
1061 schedule_work(&card->reset_worker); in if_sdio_reset_card()
1066 struct if_sdio_card *card = priv->card; in if_sdio_power_save() local
1069 flush_workqueue(card->workqueue); in if_sdio_power_save()
1071 ret = if_sdio_power_off(card); in if_sdio_power_save()
1074 pm_runtime_put_sync(&card->func->dev); in if_sdio_power_save()
1081 struct if_sdio_card *card = priv->card; in if_sdio_power_restore() local
1085 pm_runtime_get_sync(&card->func->dev); in if_sdio_power_restore()
1087 r = if_sdio_power_on(card); in if_sdio_power_restore()
1091 wait_event(card->pwron_waitq, priv->fw_ready); in if_sdio_power_restore()
1103 struct if_sdio_card *card; in if_sdio_interrupt() local
1106 card = sdio_get_drvdata(func); in if_sdio_interrupt()
1108 cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); in if_sdio_interrupt()
1114 sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret); in if_sdio_interrupt()
1122 card->priv->is_activity_detected = 1; in if_sdio_interrupt()
1124 lbs_host_to_card_done(card->priv); in if_sdio_interrupt()
1128 ret = if_sdio_card_to_host(card); in if_sdio_interrupt()
1137 struct if_sdio_card *card; in if_sdio_probe() local
1143 for (i = 0;i < func->card->num_info;i++) { in if_sdio_probe()
1144 if (sscanf(func->card->info[i], in if_sdio_probe()
1147 if (sscanf(func->card->info[i], in if_sdio_probe()
1150 if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) { in if_sdio_probe()
1156 if (i == func->card->num_info) { in if_sdio_probe()
1161 card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL); in if_sdio_probe()
1162 if (!card) in if_sdio_probe()
1165 card->func = func; in if_sdio_probe()
1166 card->model = model; in if_sdio_probe()
1168 switch (card->model) { in if_sdio_probe()
1170 card->scratch_reg = IF_SDIO_SCRATCH_OLD; in if_sdio_probe()
1173 card->scratch_reg = IF_SDIO_SCRATCH; in if_sdio_probe()
1177 card->scratch_reg = IF_SDIO_FW_STATUS; in if_sdio_probe()
1181 spin_lock_init(&card->lock); in if_sdio_probe()
1182 INIT_LIST_HEAD(&card->packets); in if_sdio_probe()
1184 card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0); in if_sdio_probe()
1185 if (unlikely(!card->workqueue)) { in if_sdio_probe()
1190 INIT_WORK(&card->reset_worker, if_sdio_reset_card_worker); in if_sdio_probe()
1191 INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker); in if_sdio_probe()
1192 init_waitqueue_head(&card->pwron_waitq); in if_sdio_probe()
1196 if (card->model == fw_table[i].model) in if_sdio_probe()
1200 pr_err("unknown card model 0x%x\n", card->model); in if_sdio_probe()
1205 sdio_set_drvdata(func, card); in if_sdio_probe()
1210 model, (unsigned)card->ioport); in if_sdio_probe()
1213 priv = lbs_add_card(card, &func->dev); in if_sdio_probe()
1219 card->priv = priv; in if_sdio_probe()
1221 priv->card = card; in if_sdio_probe()
1229 priv->is_polling = !(func->card->host->caps & MMC_CAP_SDIO_IRQ); in if_sdio_probe()
1230 ret = if_sdio_power_on(card); in if_sdio_probe()
1238 flush_workqueue(card->workqueue); in if_sdio_probe()
1241 cancel_work_sync(&card->packet_worker); in if_sdio_probe()
1242 cancel_work_sync(&card->reset_worker); in if_sdio_probe()
1243 destroy_workqueue(card->workqueue); in if_sdio_probe()
1245 list_for_each_entry_safe(packet, tmp, &card->packets, list) in if_sdio_probe()
1248 kfree(card); in if_sdio_probe()
1255 struct if_sdio_card *card; in if_sdio_remove() local
1258 card = sdio_get_drvdata(func); in if_sdio_remove()
1263 if (user_rmmod && (card->model == MODEL_8688)) { in if_sdio_remove()
1273 if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN, in if_sdio_remove()
1281 lbs_stop_card(card->priv); in if_sdio_remove()
1282 lbs_remove_card(card->priv); in if_sdio_remove()
1284 cancel_work_sync(&card->packet_worker); in if_sdio_remove()
1285 cancel_work_sync(&card->reset_worker); in if_sdio_remove()
1286 destroy_workqueue(card->workqueue); in if_sdio_remove()
1288 list_for_each_entry_safe(packet, tmp, &card->packets, list) in if_sdio_remove()
1291 kfree(card); in if_sdio_remove()
1297 struct if_sdio_card *card = sdio_get_drvdata(func); in if_sdio_suspend() local
1298 struct lbs_private *priv = card->priv; in if_sdio_suspend()
1309 if_sdio_power_off(card); in if_sdio_suspend()
1329 if_sdio_power_off(card); in if_sdio_suspend()
1355 struct if_sdio_card *card = sdio_get_drvdata(func); in if_sdio_resume() local
1360 if (card->priv->power_up_on_resume) { in if_sdio_resume()
1361 if_sdio_power_on(card); in if_sdio_resume()
1362 wait_event(card->pwron_waitq, card->priv->fw_ready); in if_sdio_resume()
1365 ret = lbs_resume(card->priv); in if_sdio_resume()