1 #include <linux/moduleparam.h>
2 #include <linux/firmware.h>
3 #include <linux/netdevice.h>
4 #include <linux/delay.h>
5 #include <linux/mmc/card.h>
6 #include <linux/mmc/sdio_func.h>
7 #include <linux/mmc/sdio_ids.h>
8 #include <linux/sched.h>
10 #include "rda5890_defs.h"
11 #include "rda5890_dev.h"
12 #include "rda5890_if_sdio.h"
13 #include "rda5890_wid.h"
14 #include "rda5890_debugfs.h"
16 int rda5890_dbg_level = RDA5890_DL_CRIT;
17 int rda5890_dbg_area = RDA5890_DA_MAIN
26 void export_msdc_clk_always_on(void)
31 void export_msdc_clk_always_on_off(void)
36 extern void rk29_sdio_irq_enable(int enable);
37 void export_wifi_eirq_enable(void)
40 //rk29_sdio_irq_enable(1);
43 void export_wifi_eirq_disable(void)
46 //rk29_sdio_irq_enable(0);
49 /* Module parameters */
50 module_param_named(debug_level, rda5890_dbg_level, int, 0644);
51 module_param_named(debug_area, rda5890_dbg_area, int, 0644);
52 int sdio_test_flag = 0;
53 module_param_named(sdio_test, sdio_test_flag, int, 0644);
55 #define SDIO_VENDOR_ID_RDA5890 0x5449
56 #define SDIO_DEVICE_ID_RDA5890 0x0145
58 static const struct sdio_device_id if_sdio_ids[] = {
59 { SDIO_DEVICE(SDIO_VENDOR_ID_RDA5890, SDIO_DEVICE_ID_RDA5890) },
60 { /* end: all zeroes */ },
63 MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
65 struct if_sdio_packet {
66 struct if_sdio_packet *next;
67 unsigned char packet_type;
69 u8 buffer[0] __attribute__((aligned(4)));
72 int if_sdio_card_to_host(struct if_sdio_card *card)
75 struct rda5890_private *priv = card->priv;
76 u8 size_l = 0, size_h = 0;
79 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
80 "%s <<< \n", __func__);
82 size_l = sdio_readb(card->func, IF_SDIO_AHB2SDIO_PKTLEN_L, &ret);
84 RDA5890_ERRP("read PKTLEN_L reg fail\n");
88 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_NORM,"read PKTLEN_L reg size_l:%d \n", size_l);
90 size_h = sdio_readb(card->func, IF_SDIO_AHB2SDIO_PKTLEN_H, &ret);
92 RDA5890_ERRP("read PKTLEN_H reg fail\n");
96 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_NORM,"read PKTLEN_H reg size_h:%d\n",size_h);
98 size = (size_l | ((size_h & 0x7f) << 8)) * 4;
100 RDA5890_ERRP("invalid packet size (%d bytes) from firmware\n", size);
105 /* alignment is handled on firmside */
106 //chunk = sdio_align_size(card->func, size);
109 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_NORM,
110 "if_sdio_card_to_host, size = %d, aligned size = %d\n", size, chunk);
112 /* TODO: handle multiple packets here */
113 ret = sdio_readsb(card->func, card->buffer, IF_SDIO_FUN1_FIFO_RD, chunk);
115 RDA5890_ERRP("sdio_readsb fail, ret = %d\n", ret);
120 if(priv->version == 7)
122 sdio_writeb(card->func, 0x20 ,IF_SDIO_FUN1_INT_PEND, &ret);
124 RDA5890_ERRP("clear SDIO Tx Complete flag failed\n");
130 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_VERB,
131 "if_sdio_card_to_host, read done\n");
133 if (sdio_test_flag) {
134 rda5890_sdio_test_card_to_host(card->buffer, chunk);
138 /* TODO: this chunk size need to be handled here */
139 rda5890_card_to_host(priv, card->buffer, chunk);
142 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
143 "if_sdio_card_to_host >>>\n");
147 #ifdef WIFI_POWER_MANAGER
148 void if_sdio_sleep_worker(struct work_struct *work)
150 struct if_sdio_card *card = NULL;
152 struct rda5890_private *priv = NULL;
154 card = container_of(work, struct if_sdio_card,
165 RDA5890_DBGLAP(RDA5890_DA_PM, RDA5890_DL_CRIT, "Sleep\n");
167 /* clear IF_SDIO_FUN1_INT_PEND, this allow device to sleep */
168 sdio_claim_host(card->func);
169 sdio_writeb(card->func, IF_SDIO_HOST_TX_FLAG ,IF_SDIO_FUN1_INT_PEND, &ret);
170 sdio_release_host(card->func);
173 RDA5890_ERRP("clear IF_SDIO_HOST_TX_FLAG failed\n");
175 atomic_inc(&card->priv->sleep_flag);
179 atomic_set(&card->sleep_work_is_active, 0);
180 #ifdef WIFI_UNLOCK_SYSTEM
181 rda5990_wakeUnlock();
186 static int if_sdio_wakeup_card(struct if_sdio_card *card)
188 struct rda5890_private *priv = card->priv;
191 #ifdef WIFI_TEST_MODE
192 if(rda_5990_wifi_in_test_mode())
195 sdio_claim_host(card->func);
196 sdio_writeb(card->func, 1, IF_SDIO_FUN1_INT_TO_DEV, &ret);
197 sdio_release_host(card->func);
199 RDA5890_ERRP("write FUN1_INT_TO_DEV reg fail\n");
202 atomic_set(&priv->sleep_flag, 0);
204 RDA5890_DBGLAP(RDA5890_DA_PM, RDA5890_DL_CRIT, "wake up \n");
205 // wait 15ms, hardware need 13ms to wakeup
206 rda5890_shedule_timeout(8);
211 #endif //WIFI_POWER_MANAGER
213 static void if_sdio_host_to_card_worker(struct work_struct *work)
215 struct if_sdio_card *card = NULL;
216 struct rda5890_private *priv = NULL;
217 struct if_sdio_packet *packet = NULL;
222 u8 size_l, size_h, write_status = 0;
223 #define SDIO_HOST_WRITE_BATCH_SIZE 512
224 u16 bytes_left, offset, batch;
226 card = container_of(work, struct if_sdio_card, packet_worker);
230 #ifdef WIFI_POWER_MANAGER
231 if(is_sdio_init_complete())
233 if(atomic_read(&card->sleep_work_is_active))
235 cancel_delayed_work(&card->sleep_work);
236 #ifdef WIFI_UNLOCK_SYSTEM
237 rda5990_wakeUnlock();
239 atomic_set(&card->sleep_work_is_active, 0);
248 spin_lock_irqsave(&card->lock, flags);
249 packet = card->packets;
251 card->packets = packet->next;
252 spin_unlock_irqrestore(&card->lock, flags);
257 #ifdef WIFI_POWER_MANAGER
258 if (atomic_read(&priv->sleep_flag))
260 /* Deivce maybe sleep, wakeup it. */
261 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_NORM, "Wakeup\n");
262 ret = if_sdio_wakeup_card(card);
265 RDA5890_ERRP("wakeup card fail\n");
270 while(retries && is_sdio_patch_complete()) //check write flow ctrl
272 sdio_claim_host(card->func);
273 write_status = sdio_readb(card->func, IF_SDIO_FUN1_INT_PEND, &ret);
274 sdio_release_host(card->func);
277 RDA5890_ERRP("read IF_SDIO_FUN1_INT_PEND failed\n");
280 if((write_status & IF_SDIO_INT_RXCMPL) == 0)
282 //RDA5890_ERRP("**** sdio is busy retry next time \n ");
288 sdio_claim_host(card->func);
289 sdio_writeb(card->func, IF_SDIO_INT_RXCMPL, IF_SDIO_FUN1_INT_PEND, &ret);
290 sdio_release_host(card->func);
293 RDA5890_ERRP("write IF_SDIO_FUN1_INT_PEND failed\n");
300 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
301 "if_sdio_host_to_card_worker, send one packet, size = %d\n", packet->nb);
304 size_l = (u8)(size & 0xff);
305 size_h = (u8)((size >> 8) & 0x7f);
308 sdio_claim_host(card->func);
309 sdio_writeb(card->func, size_l, IF_SDIO_SDIO2AHB_PKTLEN_L, &ret);
310 sdio_release_host(card->func);
312 RDA5890_ERRP("write PKTLEN_L reg fail\n");
315 sdio_claim_host(card->func);
316 sdio_writeb(card->func, size_h, IF_SDIO_SDIO2AHB_PKTLEN_H, &ret);
317 sdio_release_host(card->func);
319 RDA5890_ERRP("write PKTLEN_H reg fail\n");
324 bytes_left = packet->nb;
328 batch = (bytes_left < SDIO_HOST_WRITE_BATCH_SIZE)?
329 bytes_left:SDIO_HOST_WRITE_BATCH_SIZE;
331 sdio_claim_host(card->func);
332 ret = sdio_writesb(card->func, IF_SDIO_FUN1_FIFO_WR,
333 packet->buffer + offset, batch);
334 sdio_release_host(card->func);
336 RDA5890_ERRP("sdio_writesb fail, ret = %d\n", ret);
340 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
341 "write batch %d, offset = %d\n", batch, offset);
347 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
348 "if_sdio_host_to_card_worker, send one packet done\n");
358 if(is_sdio_init_complete()) //init complete should start sleep_work
360 #ifdef WIFI_UNLOCK_SYSTEM
364 #ifdef WIFI_POWER_MANAGER
365 #ifdef WIFI_TEST_MODE
366 if(rda_5990_wifi_in_test_mode())
368 #endif //end WIFI_TEST_MODE
369 atomic_set(&card->sleep_work_is_active, 1);
370 queue_delayed_work(priv->work_thread, &card->sleep_work, HZ/5); // 100ms
371 #endif //end WIFI_POWER_MANAGER
375 /*******************************************************************/
376 /* RDA5890 callbacks */
377 /*******************************************************************/
379 static int if_sdio_host_to_card(struct rda5890_private *priv,
380 u8 *buf, u16 nb, unsigned char packet_type)
383 struct if_sdio_card *card;
384 struct if_sdio_packet *packet, *cur;
388 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
389 "%s >>>\n", __func__);
393 if (nb > (65536 - sizeof(struct if_sdio_packet))) {
398 //size = sdio_align_size(card->func, nb);
405 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_NORM,
406 "if_sdio_host_to_card, size = %d, aligned size = %d\n", nb, size);
408 packet = kzalloc(sizeof(struct if_sdio_packet) + size,
417 packet->packet_type = packet_type;
419 memcpy(packet->buffer, buf, nb);
421 spin_lock_irqsave(&card->lock, flags);
424 card->packets = packet;
432 spin_unlock_irqrestore(&card->lock, flags);
434 queue_work(card->work_thread, &card->packet_worker);
436 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
437 "%s <<<\n", __func__);
445 static void if_sdio_interrupt(struct sdio_func *func)
448 struct if_sdio_card *card;
449 struct rda5890_private *priv;
452 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
453 "%s >>>\n", __func__);
455 card = sdio_get_drvdata(func);
461 status = sdio_readb(card->func, IF_SDIO_FUN1_INT_STAT, &ret);
465 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_VERB,
466 "if_sdio_interrupt, status = 0x%02x\n", status);
468 if (status & IF_SDIO_INT_AHB2SDIO)
469 if_sdio_card_to_host(card);
471 if (status & IF_SDIO_INT_ERROR)
473 sdio_writeb(card->func, IF_SDIO_INT_ERROR, IF_SDIO_FUN1_INT_PEND, &ret);
476 RDA5890_ERRP("write FUN1_INT_STAT reg fail\n");
480 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_TRACE,
481 "%s, INT_ERROR\n", __func__);
485 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
486 "%s <<< ret=%d \n", __func__, ret);
491 static int if_sdio_probe(struct sdio_func *func,
492 const struct sdio_device_id *id)
494 struct if_sdio_card *card = NULL;
495 struct rda5890_private *priv = NULL;
496 struct if_sdio_packet *packet = NULL;
500 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
501 "%s >>>\n", __func__);
503 //SMC_MSG("[rda_debug] sunximmc_probe, set clk.\n");
505 //mmc_set_clock(mmc, 4000000);
508 if(id->vendor != 0x5449)
510 RDA5890_ERRP("rda5890 sdio not corrent vendor:%x \n", id->vendor);
514 card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL);
516 RDA5890_ERRP("kzalloc fail\n");
521 spin_lock_init(&card->lock);
522 atomic_set(&card->wid_complete_flag, 0);
523 INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
524 card->work_thread = create_singlethread_workqueue("rda5890_if_sdio_worker");
526 #ifdef WIFI_POWER_MANAGER
527 atomic_set(&card->sleep_work_is_active, 0);
528 INIT_DELAYED_WORK(&card->sleep_work, if_sdio_sleep_worker);
531 #ifdef WIFI_UNLOCK_SYSTEM
532 atomic_set(&wake_lock_counter, 0);
533 wake_lock_init(&sleep_worker_wake_lock, WAKE_LOCK_SUSPEND, "RDA_sleep_worker_wake_lock");
536 sdio_claim_host(func);
537 ret = sdio_enable_func(func);
539 RDA5890_ERRP("sdio_enable_func fail, ret = %d\n", ret);
543 ret = sdio_claim_irq(func, if_sdio_interrupt);
545 RDA5890_ERRP("sdio_claim_irq fail, ret = %d\n", ret);
549 sdio_release_host(func);
550 sdio_set_drvdata(func, card);
552 priv = rda5890_add_card(card);
554 RDA5890_ERRP("rda5890_add_card fail\n");
558 rda5890_debugfs_init_one(priv);
562 priv->hw_host_to_card = if_sdio_host_to_card;
565 * Enable interrupts now that everything is set up
567 sdio_claim_host(func);
568 sdio_writeb(func, 0x7, IF_SDIO_FUN1_INT_MASK, &ret);
569 sdio_release_host(func);
571 RDA5890_ERRP("enable func interrupt fail\n");
574 #ifdef WIFI_TEST_MODE
575 if(!rda_5990_wifi_in_test_mode())
578 ret = rda5890_sdio_init(priv);
582 ret=rda5890_disable_self_cts(priv);
586 ret=rda5890_disable_block_bt(priv);
590 ret = rda5890_set_scan_timeout(priv);
592 RDA5890_ERRP("rda5890_set_scan_timeout fail, ret = %d\n", ret);
596 ret= rda5890_set_listen_interval(priv, 0x06);
600 ret = rda5890_set_link_loss_threshold(priv, 0x06);
604 ret = rda5890_init_pm(priv);
608 #ifdef WIFI_TEST_MODE
612 ret = rda5890_set_test_mode(priv);
618 if (sdio_test_flag) {
619 unsigned char mac_addr[6];
620 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_TRACE,
621 "SDIO TESTING MODE\n");
624 ret = rda5890_get_mac_addr(priv, mac_addr);
625 printk(KERN_INFO "Test rda5890_get_mac_addr %x:%x:%x:%x:%x:%x", mac_addr[0],mac_addr[1],mac_addr[2],mac_addr[3],mac_addr[4],mac_addr[5]);
629 ret = rda5890_start_card(priv);
631 RDA5890_ERRP("rda5890_start_card fail, ret = %d\n", ret);
636 printk(KERN_INFO "RDA5890: SDIO card started\n");
639 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
640 "%s ret:%d <<<\n", __func__, ret);
644 sdio_claim_host(func);
645 sdio_release_irq(func);
647 sdio_disable_func(func);
649 sdio_release_host(func);
653 if (atomic_read(&card->wid_complete_flag) && priv)
655 complete(&priv->wid_done);
656 printk(KERN_INFO "*****RDA5890: probe send wid complete\n");
658 flush_work(&card->packet_worker);
659 cancel_work_sync(&card->packet_worker);
661 #ifdef WIFI_POWER_MANAGER
662 cancel_delayed_work(&card->sleep_work);
664 destroy_workqueue(card->work_thread);
667 rda5890_remove_card(priv);
669 while (card->packets) {
670 packet = card->packets;
671 card->packets = card->packets->next;
679 static void if_sdio_remove(struct sdio_func *func)
681 struct if_sdio_card *card;
682 struct if_sdio_packet *packet;
683 unsigned char count = 20;
685 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
686 "%s >>>\n", __func__);
688 printk(KERN_INFO "RDA5890: SDIO card detached\n");
690 card = sdio_get_drvdata(func);
693 while(card->priv->scan_running && count--)
695 rda5890_shedule_timeout(100);
696 printk("remove card wait scan complete \n");
699 #ifdef WIFI_POWER_MANAGER
700 cancel_delayed_work_sync(&card->sleep_work);
702 cancel_work_sync(&card->packet_worker);
704 if (atomic_read(&card->wid_complete_flag) && card->priv)
706 complete(&card->priv->wid_done);
707 printk(KERN_INFO "*****RDA5890: send wid complete\n");
710 netif_stop_queue(card->priv->dev);
711 netif_carrier_off(card->priv->dev);
712 rda5890_stop_card(card->priv);
713 rda5890_debugfs_remove_one(card->priv);
714 destroy_workqueue(card->work_thread);
715 rda5890_remove_card(card->priv);
717 while (card->packets) {
718 packet = card->packets;
719 card->packets = card->packets->next;
725 #ifdef WIFI_UNLOCK_SYSTEM
726 rda5990_wakeLock_destroy();
729 printk(KERN_INFO "RDA5890: SDIO card removed\n");
731 RDA5890_DBGLAP(RDA5890_DA_SDIO, RDA5890_DL_DEBUG,
732 "%s <<<\n", __func__);
736 static struct sdio_driver if_sdio_driver = {
737 .name = "rda5890_sdio",
738 .id_table = if_sdio_ids,
739 .probe = if_sdio_probe,
740 .remove = if_sdio_remove,
743 /*******************************************************************/
744 /* Module functions */
745 /*******************************************************************/
746 extern void mmc_rescan_slot(int id);
748 static int __init if_sdio_init_module(void)
752 printk(KERN_INFO "\nRDA5890 SDIO WIFI Driver for st_linux \n");
753 printk(KERN_INFO "Ver: %d.%d.%d\n\n",
754 RDA5890_SDIOWIFI_VER_MAJ,
755 RDA5890_SDIOWIFI_VER_MIN,
756 RDA5890_SDIOWIFI_VER_BLD);
758 printk("@@@@@@@@@@@@@@@22222 rda5990 start\n");
762 printk("@@@@@@@@@@@@@@ mmc_rescan_slot\n");
766 rda5890_debugfs_init();
767 ret = sdio_register_driver(&if_sdio_driver);
771 printk(KERN_INFO "\nif_sdio_init_module: register fail. \n");
772 //sunximmc_rescan_card(SDIOID,0);
775 printk(KERN_INFO "\n if_sdio_init_module: register successful. \n");
780 extern void mmc_remove(int id);
781 static void __exit if_sdio_exit_module(void)
783 printk(KERN_INFO "\n if_sdio_exit_module. \n");
785 rda5890_debugfs_remove();
786 sdio_unregister_driver(&if_sdio_driver);
790 module_init(if_sdio_init_module);
791 module_exit(if_sdio_exit_module);
793 MODULE_DESCRIPTION("RDA5890 SDIO WLAN Driver");
794 MODULE_AUTHOR("lwang");
795 MODULE_LICENSE("GPL");