Lines Matching refs:card
134 static void if_sdio_finish_power_on(struct if_sdio_card *card);
135 static int if_sdio_power_off(struct if_sdio_card *card);
147 static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err) in if_sdio_read_scratch() argument
152 scratch = sdio_readb(card->func, card->scratch_reg, &ret); in if_sdio_read_scratch()
154 scratch |= sdio_readb(card->func, card->scratch_reg + 1, in if_sdio_read_scratch()
166 static u8 if_sdio_read_rx_unit(struct if_sdio_card *card) in if_sdio_read_rx_unit() argument
171 rx_unit = sdio_readb(card->func, IF_SDIO_RX_UNIT, &ret); in if_sdio_read_rx_unit()
179 static u16 if_sdio_read_rx_len(struct if_sdio_card *card, int *err) in if_sdio_read_rx_len() argument
184 switch (card->model) { in if_sdio_read_rx_len()
187 rx_len = if_sdio_read_scratch(card, &ret); in if_sdio_read_rx_len()
191 rx_len = sdio_readb(card->func, IF_SDIO_RX_LEN, &ret); in if_sdio_read_rx_len()
193 rx_len <<= card->rx_unit; in if_sdio_read_rx_len()
206 static int if_sdio_handle_cmd(struct if_sdio_card *card, in if_sdio_handle_cmd() argument
209 struct lbs_private *priv = card->priv; in if_sdio_handle_cmd()
231 spin_unlock_irqrestore(&card->priv->driver_lock, flags); in if_sdio_handle_cmd()
240 static int if_sdio_handle_data(struct if_sdio_card *card, in if_sdio_handle_data() argument
268 lbs_process_rxed_packet(card->priv, skb); in if_sdio_handle_data()
278 static int if_sdio_handle_event(struct if_sdio_card *card, in if_sdio_handle_event() argument
286 if (card->model == MODEL_8385) { in if_sdio_handle_event()
287 event = sdio_readb(card->func, IF_SDIO_EVENT, &ret); in if_sdio_handle_event()
306 lbs_queue_event(card->priv, event & 0xFF); in if_sdio_handle_event()
315 static int if_sdio_wait_status(struct if_sdio_card *card, const u8 condition) in if_sdio_wait_status() argument
323 status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); in if_sdio_wait_status()
335 static int if_sdio_card_to_host(struct if_sdio_card *card) in if_sdio_card_to_host() argument
342 size = if_sdio_read_rx_len(card, &ret); in if_sdio_card_to_host()
353 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); in if_sdio_card_to_host()
362 chunk = sdio_align_size(card->func, size); in if_sdio_card_to_host()
364 ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk); in if_sdio_card_to_host()
368 chunk = card->buffer[0] | (card->buffer[1] << 8); in if_sdio_card_to_host()
369 type = card->buffer[2] | (card->buffer[3] << 8); in if_sdio_card_to_host()
388 ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
393 ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
398 ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4); in if_sdio_card_to_host()
420 struct if_sdio_card *card; in if_sdio_host_to_card_worker() local
427 card = container_of(work, struct if_sdio_card, packet_worker); in if_sdio_host_to_card_worker()
430 spin_lock_irqsave(&card->lock, flags); in if_sdio_host_to_card_worker()
431 packet = card->packets; in if_sdio_host_to_card_worker()
433 card->packets = packet->next; in if_sdio_host_to_card_worker()
434 spin_unlock_irqrestore(&card->lock, flags); in if_sdio_host_to_card_worker()
439 sdio_claim_host(card->func); in if_sdio_host_to_card_worker()
441 ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); in if_sdio_host_to_card_worker()
443 ret = sdio_writesb(card->func, card->ioport, in if_sdio_host_to_card_worker()
450 sdio_release_host(card->func); in if_sdio_host_to_card_worker()
464 static int if_sdio_prog_helper(struct if_sdio_card *card, in if_sdio_prog_helper() argument
482 sdio_claim_host(card->func); in if_sdio_prog_helper()
484 ret = sdio_set_block_size(card->func, 32); in if_sdio_prog_helper()
492 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); in if_sdio_prog_helper()
508 ret = sdio_writesb(card->func, card->ioport, in if_sdio_prog_helper()
519 ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64); in if_sdio_prog_helper()
530 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret); in if_sdio_prog_helper()
534 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8; in if_sdio_prog_helper()
552 sdio_release_host(card->func); in if_sdio_prog_helper()
563 static int if_sdio_prog_real(struct if_sdio_card *card, in if_sdio_prog_real() argument
581 sdio_claim_host(card->func); in if_sdio_prog_real()
583 ret = sdio_set_block_size(card->func, 32); in if_sdio_prog_real()
593 ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); in if_sdio_prog_real()
597 req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, in if_sdio_prog_real()
602 req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, in if_sdio_prog_real()
649 ret = sdio_writesb(card->func, card->ioport, in if_sdio_prog_real()
669 scratch = if_sdio_read_scratch(card, &ret); in if_sdio_prog_real()
687 sdio_release_host(card->func); in if_sdio_prog_real()
702 struct if_sdio_card *card = priv->card; in if_sdio_do_prog_firmware() local
709 ret = if_sdio_prog_helper(card, helper); in if_sdio_do_prog_firmware()
715 ret = if_sdio_prog_real(card, mainfw); in if_sdio_do_prog_firmware()
720 if_sdio_finish_power_on(card); in if_sdio_do_prog_firmware()
723 static int if_sdio_prog_firmware(struct if_sdio_card *card) in if_sdio_prog_firmware() argument
733 sdio_claim_host(card->func); in if_sdio_prog_firmware()
734 sdio_writeb(card->func, 0x00, IF_SDIO_H_INT_MASK, &ret); in if_sdio_prog_firmware()
735 sdio_release_host(card->func); in if_sdio_prog_firmware()
737 sdio_claim_host(card->func); in if_sdio_prog_firmware()
738 scratch = if_sdio_read_scratch(card, &ret); in if_sdio_prog_firmware()
739 sdio_release_host(card->func); in if_sdio_prog_firmware()
760 if_sdio_finish_power_on(card); in if_sdio_prog_firmware()
762 } else if ((card->model == MODEL_8686) && (scratch & 0x7fff)) { in if_sdio_prog_firmware()
764 if_sdio_finish_power_on(card); in if_sdio_prog_firmware()
768 ret = lbs_get_firmware_async(card->priv, &card->func->dev, card->model, in if_sdio_prog_firmware()
781 static void if_sdio_finish_power_on(struct if_sdio_card *card) in if_sdio_finish_power_on() argument
783 struct sdio_func *func = card->func; in if_sdio_finish_power_on()
784 struct lbs_private *priv = card->priv; in if_sdio_finish_power_on()
788 sdio_set_block_size(card->func, IF_SDIO_BLOCK_SIZE); in if_sdio_finish_power_on()
794 if ((card->model != MODEL_8385) in if_sdio_finish_power_on()
795 && (card->model != MODEL_8686)) in if_sdio_finish_power_on()
796 card->rx_unit = if_sdio_read_rx_unit(card); in if_sdio_finish_power_on()
798 card->rx_unit = 0; in if_sdio_finish_power_on()
832 if (card->model == MODEL_8688) { in if_sdio_finish_power_on()
843 wake_up(&card->pwron_waitq); in if_sdio_finish_power_on()
845 if (!card->started) { in if_sdio_finish_power_on()
847 if_sdio_power_off(card); in if_sdio_finish_power_on()
849 card->started = true; in if_sdio_finish_power_on()
864 static int if_sdio_power_on(struct if_sdio_card *card) in if_sdio_power_on() argument
866 struct sdio_func *func = card->func; in if_sdio_power_on()
867 struct mmc_host *host = func->card->host; in if_sdio_power_on()
879 if ((card->model == MODEL_8686) && in if_sdio_power_on()
884 func->card->quirks |= MMC_QUIRK_LENIENT_FN0; in if_sdio_power_on()
895 card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret); in if_sdio_power_on()
899 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8; in if_sdio_power_on()
903 card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16; in if_sdio_power_on()
908 ret = if_sdio_prog_firmware(card); in if_sdio_power_on()
923 static int if_sdio_power_off(struct if_sdio_card *card) in if_sdio_power_off() argument
925 struct sdio_func *func = card->func; in if_sdio_power_off()
926 struct lbs_private *priv = card->priv; in if_sdio_power_off()
946 struct if_sdio_card *card; in if_sdio_host_to_card() local
953 card = priv->card; in if_sdio_host_to_card()
965 size = sdio_align_size(card->func, nb + 4); in if_sdio_host_to_card()
987 spin_lock_irqsave(&card->lock, flags); in if_sdio_host_to_card()
989 if (!card->packets) in if_sdio_host_to_card()
990 card->packets = packet; in if_sdio_host_to_card()
992 cur = card->packets; in if_sdio_host_to_card()
1009 spin_unlock_irqrestore(&card->lock, flags); in if_sdio_host_to_card()
1011 queue_work(card->workqueue, &card->packet_worker); in if_sdio_host_to_card()
1040 struct if_sdio_card *card = priv->card; in if_sdio_exit_deep_sleep() local
1044 sdio_claim_host(card->func); in if_sdio_exit_deep_sleep()
1046 sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret); in if_sdio_exit_deep_sleep()
1050 sdio_release_host(card->func); in if_sdio_exit_deep_sleep()
1057 struct if_sdio_card *card = priv->card; in if_sdio_reset_deep_sleep_wakeup() local
1061 sdio_claim_host(card->func); in if_sdio_reset_deep_sleep_wakeup()
1063 sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret); in if_sdio_reset_deep_sleep_wakeup()
1067 sdio_release_host(card->func); in if_sdio_reset_deep_sleep_wakeup()
1095 struct if_sdio_card *card = priv->card; in if_sdio_reset_card() local
1100 reset_host = card->func->card->host; in if_sdio_reset_card()
1106 struct if_sdio_card *card = priv->card; in if_sdio_power_save() local
1109 flush_workqueue(card->workqueue); in if_sdio_power_save()
1111 ret = if_sdio_power_off(card); in if_sdio_power_save()
1114 pm_runtime_put_sync(&card->func->dev); in if_sdio_power_save()
1121 struct if_sdio_card *card = priv->card; in if_sdio_power_restore() local
1125 pm_runtime_get_sync(&card->func->dev); in if_sdio_power_restore()
1127 r = if_sdio_power_on(card); in if_sdio_power_restore()
1131 wait_event(card->pwron_waitq, priv->fw_ready); in if_sdio_power_restore()
1143 struct if_sdio_card *card; in if_sdio_interrupt() local
1148 card = sdio_get_drvdata(func); in if_sdio_interrupt()
1150 cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret); in if_sdio_interrupt()
1156 sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret); in if_sdio_interrupt()
1164 card->priv->is_activity_detected = 1; in if_sdio_interrupt()
1166 lbs_host_to_card_done(card->priv); in if_sdio_interrupt()
1170 ret = if_sdio_card_to_host(card); in if_sdio_interrupt()
1184 struct if_sdio_card *card; in if_sdio_probe() local
1192 for (i = 0;i < func->card->num_info;i++) { in if_sdio_probe()
1193 if (sscanf(func->card->info[i], in if_sdio_probe()
1196 if (sscanf(func->card->info[i], in if_sdio_probe()
1199 if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) { in if_sdio_probe()
1205 if (i == func->card->num_info) { in if_sdio_probe()
1210 card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL); in if_sdio_probe()
1211 if (!card) in if_sdio_probe()
1214 card->func = func; in if_sdio_probe()
1215 card->model = model; in if_sdio_probe()
1217 switch (card->model) { in if_sdio_probe()
1219 card->scratch_reg = IF_SDIO_SCRATCH_OLD; in if_sdio_probe()
1222 card->scratch_reg = IF_SDIO_SCRATCH; in if_sdio_probe()
1226 card->scratch_reg = IF_SDIO_FW_STATUS; in if_sdio_probe()
1230 spin_lock_init(&card->lock); in if_sdio_probe()
1231 card->workqueue = create_workqueue("libertas_sdio"); in if_sdio_probe()
1232 INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker); in if_sdio_probe()
1233 init_waitqueue_head(&card->pwron_waitq); in if_sdio_probe()
1237 if (card->model == fw_table[i].model) in if_sdio_probe()
1241 pr_err("unknown card model 0x%x\n", card->model); in if_sdio_probe()
1246 sdio_set_drvdata(func, card); in if_sdio_probe()
1251 model, (unsigned)card->ioport); in if_sdio_probe()
1254 priv = lbs_add_card(card, &func->dev); in if_sdio_probe()
1260 card->priv = priv; in if_sdio_probe()
1262 priv->card = card; in if_sdio_probe()
1271 ret = if_sdio_power_on(card); in if_sdio_probe()
1281 flush_workqueue(card->workqueue); in if_sdio_probe()
1284 destroy_workqueue(card->workqueue); in if_sdio_probe()
1285 while (card->packets) { in if_sdio_probe()
1286 packet = card->packets; in if_sdio_probe()
1287 card->packets = card->packets->next; in if_sdio_probe()
1291 kfree(card); in if_sdio_probe()
1298 struct if_sdio_card *card; in if_sdio_remove() local
1303 card = sdio_get_drvdata(func); in if_sdio_remove()
1308 if (user_rmmod && (card->model == MODEL_8688)) { in if_sdio_remove()
1318 if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN, in if_sdio_remove()
1326 lbs_stop_card(card->priv); in if_sdio_remove()
1327 lbs_remove_card(card->priv); in if_sdio_remove()
1329 flush_workqueue(card->workqueue); in if_sdio_remove()
1330 destroy_workqueue(card->workqueue); in if_sdio_remove()
1332 while (card->packets) { in if_sdio_remove()
1333 packet = card->packets; in if_sdio_remove()
1334 card->packets = card->packets->next; in if_sdio_remove()
1338 kfree(card); in if_sdio_remove()
1346 struct if_sdio_card *card = sdio_get_drvdata(func); in if_sdio_suspend() local
1352 if (!lbs_iface_active(card->priv)) in if_sdio_suspend()
1361 if (card->priv->wol_criteria == EHS_REMOVE_WAKEUP) { in if_sdio_suspend()
1376 ret = lbs_suspend(card->priv); in if_sdio_suspend()
1386 struct if_sdio_card *card = sdio_get_drvdata(func); in if_sdio_resume() local
1391 ret = lbs_resume(card->priv); in if_sdio_resume()