2 * Copyright (C) 2012 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #include <linux/delay.h>
16 #include <linux/module.h>
17 #include <linux/moduleparam.h>
18 #include <linux/interrupt.h>
19 #include <linux/clk.h>
20 #include <linux/platform_device.h>
21 #include <linux/list.h>
22 #include <linux/wakelock.h>
23 #include <linux/semaphore.h>
24 #include <linux/wait.h>
25 #include <linux/sched.h>
26 #include <linux/kthread.h>
27 #include <linux/slab.h>
30 //#include <mach/modem_interface.h>
31 #include <linux/sprdmux.h>
32 #include <linux/mmc/sdio_channel.h>
33 #include <linux/kfifo.h>
35 #define MUX_IPC_READ_DISABLE 0x01
36 #define MUX_IPC_WRITE_DISABLE 0x02
40 //#define SDIO_READ_DEBUG
41 //#define SDIO_LOOPBACK_TEST
42 //#define SDIO_DEBUG_ENABLE
44 //#define SDIO_LOOP_TEST
45 #define SDIO_VARIABLE_DL_LEN
46 //#define SC9620_JTAG_DL_MOD
47 #define HEADER_TAG 0x7e7f
48 #define HEADER_TYPE 0xaa00
50 #define IPC_DRIVER_NAME "IPC_SDIO"
52 #define MAX_SDIO_TX_WAIT_TIMEOUT 100
54 #define MAX_SDIO_CP_AWAKE_TIMEOUT 500
55 #define MAX_SDIO_SLEEP_TIMEOUT 50
56 #define MAX_SDIO_CP_ACK_TIMEOUT 1000
57 #define MAX_SDIO_TX_WATERMARK 4
58 #define MAX_SDIO_RX_RETRY 3
59 #define MAX_SDIO_TX_RETRY 3
61 #define SDIO_GPIO_RES_FREE 0
62 #define SDIO_GPIO_RES_USING 1
65 #define MAX_MIPC_RX_FRAME_SIZE (64*1024)
66 #define MAX_MIPC_TX_FRAME_SIZE (32*1024)
68 #define MIN_MIPC_TX_FRAME_SIZE (4 * 1024)
70 #define MAX_MIPC_RX_CACHE_SIZE MAX_MIPC_RX_FRAME_SIZE*4
72 //#define MAX_MIPC_TX_FIFO_SIZE (1 << 7) // 128
73 #define MAX_MIPC_TX_FIFO_SIZE (1 << 3) // 16
76 #define MAX_MIPC_TX_FRAME_NUM (MAX_MIPC_TX_FIFO_SIZE - 1)
78 #ifdef SDIO_VARIABLE_DL_LEN
79 #define DEFAULT_RX_FRAME_SIZE (4*1024)
81 #define DEFAULT_RX_FRAME_SIZE MAX_MIPC_RX_FRAME_SIZE
84 #define NEXT_TX_FIFO_IDX(idx) (((idx) + 1) & (MAX_MIPC_TX_FIFO_SIZE - 1))
86 #define MIPC_TX_REQ_FLAG ((s_mipc_tx_ctrl.fifo_wr != s_mipc_tx_ctrl.fifo_rd) && s_tx_flow_info)
90 //#define IPC_DBG(f, x...) pr_debug(IPC_DRIVER_NAME " [%s()]: " f, __func__,## x)
91 #define IPC_DBG printk
94 #define IPC_SDIO_INFO(fmt...) pr_debug("IPC_SDIO: " fmt)
95 #define IPC_SDIO_DEBUG(fmt...) pr_debug("IPC_SDIO: " fmt)
96 #define IPC_SDIO_WARN(fmt...) pr_warn("IPC_SDIO: " fmt)
97 #define IPC_SDIO_ERR(fmt...) pr_err("IPC_SDIO: Error: " fmt)
101 struct packet_header {
114 typedef struct MIPC_TRANSF_FRAME_Tag {
119 struct list_head link;
120 } MIPC_TRANSF_FRAME_T;
122 typedef struct MIPC_FRAME_LIST_Tag {
123 struct list_head frame_list_head;
124 struct mutex list_mutex;
128 typedef struct MIPC_TRANSFER_Tag {
129 struct mutex transfer_mutex;
130 struct list_head frame_fifo;
131 wait_queue_head_t frame_free_wq;
132 MIPC_TRANSF_FRAME_T* cur_frame_ptr;
137 typedef struct CP_AWAKE_STATUS_Tag {
141 wait_queue_head_t wait;
144 typedef struct MIPC_TX_CTRL_Tag {
145 MIPC_TRANSF_FRAME_T* fifo[MAX_MIPC_TX_FIFO_SIZE];
146 volatile u32 fifo_rd;
147 volatile u32 fifo_wr;
152 static struct kfifo s_mipc_rx_cache_kfifo;
154 u8* s_mipc_rx_buf = NULL;
155 u32 s_mipc_next_rx_len = DEFAULT_RX_FRAME_SIZE;
158 MIPC_TRANSF_FRAME_T s_tx_transfer_frame[MAX_MIPC_TX_FRAME_NUM];
160 static struct wake_lock s_ipc_sdio_wake_lock;
161 static struct wake_lock s_cp_req_wake_lock;
164 static struct mutex ipc_mutex;
165 wait_queue_head_t s_mux_read_rts;
166 wait_queue_head_t s_rx_fifo_avail;
167 wait_queue_head_t s_modem_ready;
168 wait_queue_head_t s_sdio_gpio_res_free;
171 u32 s_mux_ipc_event_flags = 0;
173 static struct task_struct *s_mux_ipc_rx_thread;
174 static struct task_struct *s_mux_ipc_tx_thread;
175 static struct task_struct *s_mux_ipc_sdio_thread;
178 static int sdio_tx_wait_time = 1;
179 MIPC_FRAME_LIST_T s_mipc_tx_free_frame_list;
180 MIPC_TRANSFER_T s_mipc_tx_tansfer;
182 static u32 s_mux_ipc_enable = 0;
183 static u32 s_sdio_gpio_res_status = SDIO_GPIO_RES_FREE;
185 static wait_queue_head_t s_mux_ipc_tx_wq;
186 static wait_queue_head_t s_mux_ipc_rx_wq;
190 static u32 s_mux_ipc_module_inited = 0;
192 static int sdio_transfer_crc_check_enable = 0;
193 static int sdio_transfer_frame_check_enable = 0;
195 u32 s_mipc_rx_event_flags = 0;
197 static wait_queue_head_t s_mux_ipc_sdio_wq;
198 static u32 s_mipc_rx_req_flag = 0;
199 static u32 s_mipc_enable_change_flag = 0;
201 static CP_AWAKE_STATUS_T s_cp_awake_status;
202 //static u32 s_mipc_tx_above_watermark = 0;
203 static u32 s_tx_flow_info = 0xFF;
204 static u32 s_acked_tx_frame = 0;
205 static u32 s_last_tx_frame = 0;
206 static u32 s_tx_frame_counter; //tx frame number start from 1
208 static MIPC_TX_CTRL_T s_mipc_tx_ctrl;
210 //static atomic_t s_mipc_read_pending;
214 static DEFINE_MUTEX(sdio_tx_lock);
215 static int mux_ipc_xmit_buf(const char *buf, ssize_t len);
216 static int mux_ipc_sdio_write( const char *buf, size_t count);
217 static int mux_ipc_sdio_read( char *buf, size_t count);
218 static u32 _FreeAllTxTransferFrame(void);
219 static void _FreeFrame(MIPC_TRANSF_FRAME_T* frame_ptr, MIPC_FRAME_LIST_T* frame_list_ptr);
220 static u32 _FlushTxTransfer(void);
221 static void _WaitTxTransferFree(void);
222 static void _WakeTxTransfer(void);
226 #include<mach/hardware.h>
228 /* use this method we can get time everytime */
229 #define TIMER_REG(off) (SPRD_TIMER_BASE + (off))
230 #define SYSCNT_REG(off) (SPRD_SYSCNT_BASE + (off))
231 #define SYSCNT_COUNT SYSCNT_REG(0x0004)
233 /* no need double-reading */
234 #define SYSCNT_SHADOW_COUNT SYSCNT_REG(0x000c)
237 static u32 inline get_sys_cnt(void)
239 #if defined(CONFIG_ARCH_SC7710)
240 return __raw_readl(SYSCNT_SHADOW_COUNT);
243 val1 = __raw_readl(SYSCNT_COUNT);
244 val2 = __raw_readl(SYSCNT_COUNT);
245 while(val2 != val1) {
247 val2 = __raw_readl(SYSCNT_COUNT);
254 static u32 _is_mux_ipc_enable(void)
256 #ifdef SC9620_JTAG_DL_MOD
259 return s_mux_ipc_enable;
264 void wait_cp_bootup(void)
266 wait_event(s_modem_ready, _is_mux_ipc_enable());
269 void init_cp_awake_status(void)
271 s_cp_awake_status.ack_time = 0;
272 s_cp_awake_status.awake = false;
273 spin_lock_init(&s_cp_awake_status.lock);
274 init_waitqueue_head(&s_cp_awake_status.wait);
277 void set_cp_awake(bool awake)
282 spin_lock_irqsave(&s_cp_awake_status.lock, flags);
283 last_status = s_cp_awake_status.awake;
284 s_cp_awake_status.awake = awake;
285 if(s_cp_awake_status.awake) {
286 s_cp_awake_status.ack_time = jiffies;
288 spin_unlock_irqrestore(&s_cp_awake_status.lock, flags);
290 if(!last_status && awake) {
291 wake_up(&s_cp_awake_status.wait);
295 bool get_cp_awake(void)
300 spin_lock_irqsave(&s_cp_awake_status.lock, flags);
301 if(s_cp_awake_status.awake) {
302 unsigned long diff = (long)jiffies - (long)s_cp_awake_status.ack_time;
304 if(jiffies_to_msecs(diff) > MAX_SDIO_CP_AWAKE_TIMEOUT) {
305 s_cp_awake_status.awake = false;
308 ret = s_cp_awake_status.awake;
309 spin_unlock_irqrestore(&s_cp_awake_status.lock, flags);
314 bool wait_cp_awake(unsigned long timeout)
319 if(!wait_event_timeout(s_cp_awake_status.wait, s_cp_awake_status.awake,
321 IPC_SDIO_ERR("[MIPC] SDIO wait cp awake for a long time!\r\n");
324 return s_cp_awake_status.awake;
328 void init_mipc_tx_ctrl(void)
330 memset(s_mipc_tx_ctrl.fifo, 0, sizeof(MIPC_TRANSF_FRAME_T*) * MAX_MIPC_TX_FIFO_SIZE);
331 s_mipc_tx_ctrl.fifo_rd = 0;
332 s_mipc_tx_ctrl.fifo_wr = 0;
333 s_mipc_tx_ctrl.fifo_ack = 0;
334 s_mipc_tx_ctrl.last_ack_frame = 0;
335 s_tx_frame_counter = 1; //tx frame number start from 1
338 void put_to_sdio_tx_fifo(MIPC_TRANSF_FRAME_T* frame)
340 s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_wr] = frame;
342 s_mipc_tx_ctrl.fifo_wr = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_wr);
344 wake_up(&s_mux_ipc_sdio_wq);
347 MIPC_TRANSF_FRAME_T* get_from_sdio_tx_fifo(void)
349 MIPC_TRANSF_FRAME_T* ret = NULL;
351 if(s_mipc_tx_ctrl.fifo_rd != s_mipc_tx_ctrl.fifo_wr) {
353 ret = s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_rd];
355 s_mipc_tx_ctrl.fifo_rd = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_rd);
361 void ack_tx_frame_num(u32 frame_num)
363 struct packet_header * pkt = NULL;
365 while(s_mipc_tx_ctrl.fifo_ack != s_mipc_tx_ctrl.fifo_rd) {
367 if(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack]) {
368 pkt = (struct packet_header *)s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack]->buf_ptr;
370 if((long)(frame_num) - (long)(pkt->frame_num) >= 0) {
372 ipc_info_sdio_write_payload(pkt->length);
373 _FreeFrame(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack], &s_mipc_tx_free_frame_list);
376 s_mipc_tx_ctrl.fifo_ack = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_ack);
381 IPC_SDIO_ERR("[MIPC] ERROR s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack] == 0!\r\n");
385 s_mipc_tx_ctrl.last_ack_frame = frame_num;
389 void nack_tx_frame_num(void)
394 ack = s_mipc_tx_ctrl.fifo_ack;
395 rd = s_mipc_tx_ctrl.fifo_rd;
397 ipc_info_error_status(IPC_TX_CHANNEL, IPC_STATUS_INVALID_PACKET);
398 ack = NEXT_TX_FIFO_IDX(ack);
402 IPC_SDIO_INFO("[mipc]before nack_tx_frame_num fifo_rd:%ld\n", s_mipc_tx_ctrl.fifo_rd);
403 s_mipc_tx_ctrl.fifo_rd = s_mipc_tx_ctrl.fifo_ack;
404 IPC_SDIO_INFO("[mipc]nack_tx_frame_num fifo_rd:%d\n", s_mipc_tx_ctrl.fifo_rd);
409 bool implicit_ack_tx_frame(void)
411 if(s_mipc_tx_ctrl.fifo_ack != s_mipc_tx_ctrl.fifo_rd) {
412 if(!s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack]) {
413 IPC_SDIO_ERR("[MIPC] ERROR implicit_ack_tx_frame fifo[fifo_ack] == 0!\r\n");
416 struct packet_header * pkt;
417 pkt = (struct packet_header *)s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack]->buf_ptr;
418 ipc_info_sdio_write_payload(pkt->length);
420 _FreeFrame(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack], &s_mipc_tx_free_frame_list);
421 s_mipc_tx_ctrl.fifo_ack = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_ack);
425 IPC_SDIO_ERR("[MIPC] ERROR implicit_ack_tx_frame fifo_ack == fifo_rd!\r\n");
430 void free_all_tx_frame_in_fifo(void)
433 while(s_mipc_tx_ctrl.fifo_ack != s_mipc_tx_ctrl.fifo_rd) {
434 if(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack]) {
435 _FreeFrame(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_ack], &s_mipc_tx_free_frame_list);
436 s_mipc_tx_ctrl.fifo_ack = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_ack);
440 //free un-written items
441 while(s_mipc_tx_ctrl.fifo_rd != s_mipc_tx_ctrl.fifo_wr) {
442 if(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_rd]) {
443 _FreeFrame(s_mipc_tx_ctrl.fifo[s_mipc_tx_ctrl.fifo_rd], &s_mipc_tx_free_frame_list);
444 s_mipc_tx_ctrl.fifo_rd = NEXT_TX_FIFO_IDX(s_mipc_tx_ctrl.fifo_rd);
448 s_mipc_tx_ctrl.fifo_ack = 0;
449 s_mipc_tx_ctrl.fifo_rd = 0;
450 s_mipc_tx_ctrl.fifo_wr = 0;
453 #define MUX_IPC_DISABLE 0
454 #define MUX_IPC_ENABLE 1
455 void sdio_ipc_enable(u8 is_enable)
457 if(!s_mux_ipc_module_inited) {
458 IPC_SDIO_ERR("Error: mux ipc module is not initialized!\r\n");
465 kfifo_reset(&s_mipc_rx_cache_kfifo);
467 _FreeAllTxTransferFrame();
468 s_tx_flow_info = 0xFF;
469 s_acked_tx_frame = 0;
471 s_tx_frame_counter = 1; //tx frame number start from 1
472 s_mipc_next_rx_len = DEFAULT_RX_FRAME_SIZE;
473 //sdhci_resetconnect(MUX_IPC_DISABLE);
474 mutex_lock(&ipc_mutex);
475 s_mux_ipc_event_flags = 0;
476 mutex_unlock(&ipc_mutex);
477 s_mipc_enable_change_flag = 0;
478 s_mux_ipc_enable = MUX_IPC_ENABLE;
479 wake_up(&s_modem_ready);
481 s_mux_ipc_enable = MUX_IPC_DISABLE;
482 //wakeup sdio thread to release sdio_gpio_res
483 s_mipc_enable_change_flag = 1;
484 wake_up(&s_mux_ipc_sdio_wq);
485 //wait all resources freed
486 wait_event(s_sdio_gpio_res_free,
487 (s_sdio_gpio_res_status == SDIO_GPIO_RES_FREE));
490 IPC_SDIO_WARN("[mipc]mux ipc enable:0x%x, status:0x%x\r\n", is_enable, s_mux_ipc_enable);
493 int mux_ipc_sdio_stop(int mode)
495 mutex_lock(&ipc_mutex);
496 if(mode & SPRDMUX_READ) {
497 s_mux_ipc_event_flags |= MUX_IPC_READ_DISABLE;
500 if(mode & SPRDMUX_WRITE) {
501 s_mux_ipc_event_flags |= MUX_IPC_WRITE_DISABLE;
503 mutex_unlock(&ipc_mutex);
504 wake_up(&s_mux_read_rts);
509 static char s_dbg_buf[MAX_MIPC_TX_FRAME_SIZE];
511 #ifdef SDIO_LOOP_TEST
513 unsigned char s_dbg_tx_seed_v0 = 0;
514 unsigned char s_dbg_tx_seed_v1 = 0;
517 void set_tx_buf_dbg_data(unsigned char* payload, unsigned long length)
520 unsigned char v0 = s_dbg_tx_seed_v0;
521 unsigned char v1 = s_dbg_tx_seed_v1;
524 for(i = 0; i < length; i++) {
532 s_dbg_tx_seed_v0 = v0;
533 s_dbg_tx_seed_v1 = v1;
536 unsigned char s_dbg_tx_chk_seed_v0 = 0;
537 unsigned char s_dbg_tx_chk_seed_v1 = 0;
538 unsigned long s_dbg_rx_data_cnt = 0;
542 void chk_tx_buf_dbg_data(unsigned char* payload, unsigned long length)
545 unsigned char v0 = s_dbg_tx_chk_seed_v0;
546 unsigned char v1 = s_dbg_tx_chk_seed_v1;
549 for(i = 0; i < length; i++) {
551 /*if(s_dbg_rx_data_cnt == ((64 * 1024 - 32) * 8)) {
552 s_dbg_tx_chk_seed_v0 = 0;
553 s_dbg_tx_chk_seed_v1 = 0;
554 v0 = s_dbg_tx_chk_seed_v0;
555 v1 = s_dbg_tx_chk_seed_v1;
556 s_dbg_rx_data_cnt = 0;
562 if(payload[i] != val) {
564 IPC_SDIO_ERR("[mipc]chk_tx_buf_dbg_data error, rx_cnt:%d!\r\n", s_dbg_rx_data_cnt);
570 s_dbg_tx_chk_seed_v0 = v0;
571 s_dbg_tx_chk_seed_v1 = v1;
574 int mux_ipc_sdio_write_test(const char *buf, size_t count)
576 static int first = 1;
577 IPC_SDIO_INFO("[mipc]mux_ipc_sdio_write write len:%d\r\n", count);
583 set_tx_buf_dbg_data(s_dbg_buf, MAX_MIPC_TX_FRAME_SIZE - sizeof(struct packet_header));
584 mux_ipc_xmit_buf(s_dbg_buf, MAX_MIPC_TX_FRAME_SIZE - sizeof(struct packet_header));
587 if(cnt == MAX_MIPC_TX_FRAME_SIZE)
598 //return mux_ipc_xmit_buf(buf, count);
602 #ifndef SDIO_LOOP_TEST
604 int mux_ipc_sdio_write(const char *buf, size_t count)
606 if(s_mux_ipc_event_flags & MUX_IPC_WRITE_DISABLE) {
607 IPC_SDIO_ERR("[mipc]mux_ipc_sdio_write write disabled!\r\n");
611 IPC_SDIO_INFO("[mipc]mux_ipc_sdio_write write len:%d\r\n", count);
612 return mux_ipc_xmit_buf(buf, count);
617 int mux_ipc_sdio_write(const char *buf, size_t count)
620 IPC_SDIO_INFO("[mipc]mux_ipc_sdio_write write len:%d\r\n", count);
625 #ifdef SDIO_LOOP_TEST
627 int do_mux_ipc_sdio_read(char *buf, size_t count)
631 wait_event(s_mux_read_rts, !kfifo_is_empty(&s_mipc_rx_cache_kfifo) || s_mux_ipc_event_flags);
633 if(s_mux_ipc_event_flags & MUX_IPC_READ_DISABLE) {
634 IPC_SDIO_ERR("[mipc] mux ipc read disable!\r\n");
638 ret = kfifo_out(&s_mipc_rx_cache_kfifo,buf,count);
639 IPC_SDIO_INFO("[mipc]mux_ipc_sdio_read read len:%d\r\n", ret);
641 ipc_info_mux_read(ret);
643 ipc_info_sdio_read_saved_count(kfifo_len(&s_mipc_rx_cache_kfifo));
646 wake_up(&s_rx_fifo_avail);
650 #define DBG_RX_BUF_LEN (16 * 1024)
652 unsigned char s_dbg_rx_buf[DBG_RX_BUF_LEN];
654 int mux_ipc_sdio_test_read(char *buf, size_t c)
660 ret = do_mux_ipc_sdio_read(s_dbg_rx_buf, DBG_RX_BUF_LEN);
662 chk_tx_buf_dbg_data(s_dbg_rx_buf, ret);
664 //printk("[mipc]mux_ipc_sdio_test_read sleep 10ms\r\n");
674 #ifdef SDIO_LOOP_TEST
675 int mux_ipc_sdio_read(char *buf, size_t count)
684 int mux_ipc_sdio_read(char *buf, size_t count)
689 //atomic_inc(&s_mipc_read_pending);
691 wait_event(s_mux_read_rts, !kfifo_is_empty(&s_mipc_rx_cache_kfifo) || s_mux_ipc_event_flags);
694 //atomic_dec(&s_mipc_read_pending);
695 if(s_mux_ipc_event_flags & MUX_IPC_READ_DISABLE) {
696 IPC_SDIO_ERR("[mipc] mux ipc read disable!\r\n");
697 //if(atomic_read(&s_mipc_read_pending) == 0) {
698 mutex_lock(&ipc_mutex);
699 s_mux_ipc_event_flags = 0;
700 mutex_unlock(&ipc_mutex);
706 ret = kfifo_out(&s_mipc_rx_cache_kfifo,buf,count);
708 IPC_SDIO_INFO("[mipc]mux_ipc_sdio_read read len:%d\r\n", ret);
710 ipc_info_mux_read(ret);
712 ipc_info_sdio_read_saved_count(kfifo_len(&s_mipc_rx_cache_kfifo));
715 wake_up(&s_rx_fifo_avail);
721 static void _FrameList_Init(MIPC_FRAME_LIST_T* frame_list_ptr)
723 if(!frame_list_ptr) {
724 panic("_Init_Frame_List: frame_list_ptr=NULL!\r\n");
728 INIT_LIST_HEAD(&frame_list_ptr->frame_list_head);
729 mutex_init(&frame_list_ptr->list_mutex);
730 frame_list_ptr->counter = 0;
733 static void _TxFreeFrameList_Init(MIPC_FRAME_LIST_T* frame_list_ptr)
736 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
738 _FrameList_Init(frame_list_ptr);
740 for(t = 0; t < MAX_MIPC_TX_FRAME_NUM; t++) {
741 frame_ptr = &s_tx_transfer_frame[t];
742 frame_ptr->buf_size = MAX_MIPC_TX_FRAME_SIZE;
743 frame_ptr->buf_ptr = (u8*)kmalloc(frame_ptr->buf_size , GFP_KERNEL);
746 list_add_tail(&frame_ptr->link, &frame_list_ptr->frame_list_head);
747 frame_list_ptr->counter++;
752 static void _TransferInit(MIPC_TRANSFER_T* transfer_ptr)
755 panic("_Init_Frame_List: frame_list_ptr=NULL!\r\n");
759 INIT_LIST_HEAD(&transfer_ptr->frame_fifo);
760 mutex_init(&transfer_ptr->transfer_mutex);
761 transfer_ptr->counter = 0;
762 transfer_ptr->cur_frame_ptr = NULL;
763 transfer_ptr->frame_count = 0;
764 init_waitqueue_head(&transfer_ptr->frame_free_wq);
767 static void _transfer_frame_init(void)
769 s_mipc_rx_buf = (u8*) __get_free_pages(GFP_KERNEL, get_order(MAX_MIPC_RX_FRAME_SIZE));
771 WARN_ON(NULL == s_mipc_rx_buf);
773 if(kfifo_alloc(&s_mipc_rx_cache_kfifo,MAX_MIPC_RX_CACHE_SIZE, GFP_KERNEL)) {
774 IPC_SDIO_ERR("_transfer_frame_init: kfifo rx cache no memory!\r\n");
775 panic("%s[%d]kfifo rx cache no memory", __FILE__, __LINE__);
777 _TxFreeFrameList_Init(&s_mipc_tx_free_frame_list);
778 _TransferInit(&s_mipc_tx_tansfer);
782 MIPC_TRANSF_FRAME_T* _AllocFrame(MIPC_FRAME_LIST_T* frame_list_ptr)
784 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
786 if(!frame_list_ptr) {
787 panic("%s[%d] frame_list_ptr = NULL!\r\n", __FILE__, __LINE__);
790 mutex_lock(&frame_list_ptr->list_mutex);/*get lock */
791 if(!list_empty(&frame_list_ptr->frame_list_head)) {
792 frame_ptr = list_entry(frame_list_ptr->frame_list_head.next, MIPC_TRANSF_FRAME_T, link);
793 list_del(&frame_ptr->link);
794 frame_ptr->pos = sizeof(struct packet_header);
796 frame_list_ptr->counter--;
798 mutex_unlock(&frame_list_ptr->list_mutex);/*set lock */
799 IPC_SDIO_DEBUG("_AllocFrame:0x%X\r\n", (u32)frame_ptr);
803 static void _FreeFrame(MIPC_TRANSF_FRAME_T* frame_ptr, MIPC_FRAME_LIST_T* frame_list_ptr)
805 if(!frame_list_ptr || !frame_ptr) {
806 panic("%s[%d] frame_list_ptr = NULL!\r\n", __FILE__, __LINE__);
808 IPC_SDIO_DEBUG("_FreeFrame:0x%x\r\n", (u32)frame_ptr);
809 mutex_lock(&frame_list_ptr->list_mutex);/*get lock */
812 list_add_tail(&frame_ptr->link, &frame_list_ptr->frame_list_head);
813 frame_list_ptr->counter++;
814 mutex_unlock(&frame_list_ptr->list_mutex);/*set lock */
818 static void _AddFrameToTxTransferFifo(MIPC_TRANSF_FRAME_T* frame_ptr, MIPC_TRANSFER_T* transfer_ptr)
820 struct packet_header* header_ptr = ( struct packet_header* )frame_ptr->buf_ptr;
821 header_ptr->tag = 0x7e7f;
822 header_ptr->flag = 0xaa55;
823 header_ptr->length = frame_ptr->pos - sizeof(struct packet_header);
824 header_ptr->frame_num = s_tx_frame_counter++; //sending_cnt;
825 header_ptr->u.emergency_cmd = 0xabcdef00;
826 header_ptr->next_length = 0xFFFFEEEE;
827 header_ptr->reserved[0] = 0x11112222;
828 header_ptr->reserved[1] = 0x33334444;
829 header_ptr->reserved[2] = 0x55556666;
830 list_add_tail(&frame_ptr->link, &transfer_ptr->frame_fifo);
831 transfer_ptr->frame_count++;
834 static u32 _GetFrameFromTxTransfer(MIPC_TRANSF_FRAME_T* * out_frame_ptr)
836 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
837 MIPC_TRANSFER_T* transfer_ptr = &s_mipc_tx_tansfer;
838 mutex_lock(&transfer_ptr->transfer_mutex);/*get lock */
839 if(!list_empty(&transfer_ptr->frame_fifo)) {
840 frame_ptr = list_entry(transfer_ptr->frame_fifo.next, MIPC_TRANSF_FRAME_T, link);
841 list_del(&frame_ptr->link);
842 transfer_ptr->frame_count--;
844 mutex_unlock(&transfer_ptr->transfer_mutex);/*set lock */
850 *out_frame_ptr = frame_ptr;
854 static u32 _IsTransferFifoEmpty(MIPC_TRANSFER_T* transfer_ptr)
857 mutex_lock(&transfer_ptr->transfer_mutex);/*get lock */
858 ret = list_empty(&transfer_ptr->frame_fifo);
859 mutex_unlock(&transfer_ptr->transfer_mutex);/*set lock */
863 u32 s_need_wake_up_tx_thread = 0;
865 static u32 _AddDataToTxTransfer(u8* data_ptr, u32 len)
868 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
869 MIPC_TRANSF_FRAME_T* new_frame_ptr = NULL;
870 MIPC_TRANSFER_T* transfer_ptr = &s_mipc_tx_tansfer;
871 mutex_lock(&transfer_ptr->transfer_mutex);/*get lock */
873 if(0 == transfer_ptr->counter) {
874 s_need_wake_up_tx_thread = 1;
877 frame_ptr = transfer_ptr->cur_frame_ptr;
879 frame_ptr = _AllocFrame(&s_mipc_tx_free_frame_list);
882 // printk("%s[%d]_AddDataToFrame No Empty Frame!\r\n", __FILE__, __LINE__);
886 if(len > (frame_ptr->buf_size - sizeof( struct packet_header))) {
887 IPC_SDIO_ERR("[mipc] _AddDataToFrame data too long!\r\n");
891 if((len + frame_ptr->pos) > frame_ptr->buf_size) {
892 new_frame_ptr = _AllocFrame(&s_mipc_tx_free_frame_list);
894 // printk("%s[%d]_AddDataToFrame No Empty Frame : pos:%d, data len:%d\r\n", "ipc_sdio.c", __LINE__, frame_ptr->pos, len);
898 _AddFrameToTxTransferFifo(frame_ptr, transfer_ptr);
899 frame_ptr = new_frame_ptr;
900 s_need_wake_up_tx_thread = 1;
902 memcpy(&frame_ptr->buf_ptr[frame_ptr->pos], data_ptr, len);
903 frame_ptr->pos += len;
904 transfer_ptr->counter += len;
905 transfer_ptr->cur_frame_ptr = frame_ptr;
909 mutex_unlock(&transfer_ptr->transfer_mutex);/*set lock */
914 static void _WaitTxTransferFree(void)
916 wait_event(s_mipc_tx_tansfer.frame_free_wq, (s_mipc_tx_free_frame_list.counter ||
917 (s_mux_ipc_event_flags & MUX_IPC_WRITE_DISABLE)));
920 static void _WakeTxTransfer(void)
922 wake_up(&s_mipc_tx_tansfer.frame_free_wq);
925 static u32 _DelDataFromTxTransfer(MIPC_TRANSF_FRAME_T* frame_ptr)
927 MIPC_TRANSFER_T* transfer_ptr = &s_mipc_tx_tansfer;
928 mutex_lock(&transfer_ptr->transfer_mutex);
929 transfer_ptr->counter -= frame_ptr->pos - sizeof(struct packet_header);
930 IPC_SDIO_DEBUG("[mipc] _DelDataFromTxTransfer transfer_ptr->counter = %d\n", transfer_ptr->counter);
931 mutex_unlock(&transfer_ptr->transfer_mutex);
932 //_FreeFrame(frame_ptr, &s_mipc_tx_free_frame_list); //sdio opt 1, do not free here
937 static u32 _FreeAllTxTransferFrame(void)
939 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
940 free_all_tx_frame_in_fifo();
941 while(!_GetFrameFromTxTransfer(&frame_ptr)) {
942 _DelDataFromTxTransfer(frame_ptr);
943 _FreeFrame(frame_ptr, &s_mipc_tx_free_frame_list);
949 static u32 _FlushTxTransfer(void)
952 MIPC_TRANSFER_T* transfer_ptr = &s_mipc_tx_tansfer;
953 mutex_lock(&transfer_ptr->transfer_mutex);/*get lock */
955 if((transfer_ptr->counter == 0) || !transfer_ptr->cur_frame_ptr ||
956 (transfer_ptr->cur_frame_ptr->pos == sizeof( struct packet_header))) {
960 _AddFrameToTxTransferFifo(transfer_ptr->cur_frame_ptr, transfer_ptr);
961 transfer_ptr->cur_frame_ptr = NULL;
963 mutex_unlock(&transfer_ptr->transfer_mutex);/*set lock */
967 u32 mux_ipc_GetTxTransferSavedCount(void)
970 MIPC_TRANSFER_T* transfer_ptr = &s_mipc_tx_tansfer;
971 mutex_lock(&transfer_ptr->transfer_mutex);
972 count = transfer_ptr->counter;
973 mutex_unlock(&transfer_ptr->transfer_mutex);
976 static size_t sdio_write_modem_data(const u8 * buf, u32 len)
979 u32 result = SDHCI_TRANSFER_OK;
980 u32 resend_count = 0;
982 wake_lock(&s_ipc_sdio_wake_lock);
985 IPC_SDIO_INFO("SDIO WRITE START\n");
987 ipc_info_change_status(IPC_TX_CHANNEL, IPC_STATUS_CONNECTED);
988 ret = sprd_sdio_channel_tx(buf, len, (resend_count & ((1 << 17) - 1)));
991 IPC_SDIO_INFO("SDIO WRITE SUCESS\n");
992 result = SDHCI_TRANSFER_OK;
995 ipc_info_error_status(IPC_TX_CHANNEL, IPC_STATUS_CRC_ERROR);
996 result = SDHCI_TRANSFER_ERROR;
997 IPC_SDIO_ERR("SDIO WRITE FAIL ret= %d\n", ret);
1002 ipc_info_change_status(IPC_TX_CHANNEL, IPC_STATUS_DISCONNECTED);
1004 if(!_is_mux_ipc_enable()) {
1005 IPC_SDIO_ERR("[mipc] Found mux ipc disabled in do_sdio_tx\r \n", ret);
1012 } while(result && (resend_count < MAX_SDIO_TX_RETRY));
1014 wake_unlock(&s_ipc_sdio_wake_lock);
1016 ipc_info_change_status(IPC_TX_CHANNEL, IPC_STATUS_IDLE);
1017 if(resend_count >= MAX_SDIO_TX_RETRY) {
1021 printk("sdio_write_modem_data write fail 3 times \n");
1024 IPC_SDIO_ERR("sdio_write_modem_data write fail 3 times \n");
1032 static int sdio_read_modem_data(u8 *buf, int len, int addr)
1035 IPC_SDIO_INFO("[mipc] sdio_read_modem_data entery:buf:0x%X, len:%x\r\n", (u32)buf, len);
1036 ret = sprd_sdio_channel_rx(buf, len, addr);
1040 extern __u8 mux_calc_crc(__u8 * data, __u32 length);
1042 unsigned long s_dbg_dl_frame_num = 0;
1043 static bool VerifyPacketHeader(struct packet_header *header, u32 *tx_flow_info,
1044 u32 *acked_tx_frame)
1046 if(0) { //(sdio_transfer_crc_check_enable)
1047 __u8* data_ptr = (__u8*)(header + 1);
1048 __u8 crc_value = mux_calc_crc(data_ptr, header->length );
1049 if ( (header->tag != HEADER_TAG) || ((header->flag & 0xFF00) != HEADER_TYPE)
1050 || (header->length > MAX_MIPC_RX_FRAME_SIZE)
1051 ||(header->frame_num != crc_value)) {
1052 IPC_SDIO_ERR("[mipc]:%s error, tag:0x%X, type:0x%X, len:0x%X, crc:0x%X, calc_crc:0x%X\r\n",
1053 __func__, header->tag , header->flag, header->length,header->frame_num, crc_value);
1057 if ( (header->tag != HEADER_TAG) || ((header->flag & 0xFF00) != HEADER_TYPE)
1058 || (header->length > MAX_MIPC_RX_FRAME_SIZE)) {
1059 IPC_SDIO_ERR("[mipc]:%s error, tag:0x%X, type:0x%X, len:0x%X, frame_num:0x%X\r\n",
1060 __func__, header->tag , header->flag, header->length,header->frame_num);
1063 *tx_flow_info = header->flag & 0xFF;
1064 *acked_tx_frame = header->u.ul_frame_num;
1065 if((s_dbg_dl_frame_num + 1) != header->frame_num) {
1066 IPC_SDIO_ERR("[mipc]:(s_dbg_dl_frame_num + 1) != header->frame_num!!\r\n");
1068 s_dbg_dl_frame_num = header->frame_num;
1069 IPC_SDIO_DEBUG("[mipc]:s_dbg_dl_frame_num:%d!\r\n", s_dbg_dl_frame_num);
1070 s_mipc_next_rx_len = header->next_length;
1077 static inline bool have_buffer_to_read(void)
1079 return (kfifo_avail(&s_mipc_rx_cache_kfifo) >= MAX_MIPC_RX_FRAME_SIZE);
1081 u32 process_modem_packet(unsigned long data)
1083 if(!have_buffer_to_read()) {
1084 IPC_SDIO_ERR("[MIPC] MIPC Rx Cache Full!\r\n");
1086 wait_event(s_rx_fifo_avail, have_buffer_to_read());
1088 //send sdio read request
1089 IPC_SDIO_DEBUG("[MIPC] MIPC Rx Cache Free!\r\n");
1090 s_mipc_rx_event_flags = 0;
1091 s_mipc_rx_req_flag = 1;
1092 wake_up(&s_mux_ipc_sdio_wq);
1097 #ifdef SDIO_GPIO_TEST
1099 unsigned long s_dbg_cp2ap_cnt = 0;
1100 int s_dbg_cp2ap_last_val;
1102 static int mux_test_cp2ap_rdy(void)
1107 IPC_SDIO_DEBUG("[mipc_test] cp2ap_req value after write data:%d\r\n", val);
1108 if(s_dbg_cp2ap_cnt > 10) {
1109 if(s_dbg_cp2ap_last_val == val) {
1111 IPC_SDIO_ERR("[mipc_test] s_dbg_cp2ap_last_val == val\r\n");
1117 s_dbg_cp2ap_last_val = val;
1124 #define TX_THRD_GATHER_COND (s_mipc_tx_tansfer.frame_count || ((s_mipc_tx_ctrl.fifo_wr == s_mipc_tx_ctrl.fifo_rd)&& s_tx_flow_info))
1125 static int mux_ipc_tx_thread(void *data)
1127 MIPC_TRANSF_FRAME_T* frame_ptr = NULL;
1128 struct sched_param param = {.sched_priority = 10};
1130 IPC_SDIO_INFO("mux_ipc_tx_thread");
1131 sched_setscheduler(current, SCHED_FIFO, ¶m);
1134 while (!kthread_should_stop()) {
1135 wait_event(s_mux_ipc_tx_wq, s_mipc_tx_tansfer.counter);
1137 if(!s_mipc_tx_tansfer.counter || (s_mipc_tx_tansfer.counter > MAX_MIPC_TX_FRAME_SIZE)) {
1138 IPC_SDIO_DEBUG("[mipc] s_mipc_tx_tansfer.counter:%d\r\n", s_mipc_tx_tansfer.counter);
1141 while(s_mipc_tx_tansfer.counter) {
1142 if(_IsTransferFifoEmpty(&s_mipc_tx_tansfer)) {
1143 //do not send right now, because now sdio is pending
1144 wait_event(s_mux_ipc_tx_wq, TX_THRD_GATHER_COND);
1145 IPC_SDIO_DEBUG("[mipc] tx thread wait TX_THRD_GATHER_COND OK!\r\n");
1149 if(_IsTransferFifoEmpty(&s_mipc_tx_tansfer)) {
1150 if(_FlushTxTransfer()) {
1151 IPC_SDIO_DEBUG("[mipc] s_mipc_tx_tansfer.counter: %d\n", s_mipc_tx_tansfer.counter);
1152 IPC_SDIO_DEBUG("[mipc] transfer_ptr->cur_frame_ptr: 0x%X\n", s_mipc_tx_tansfer.cur_frame_ptr);
1153 if(s_mipc_tx_tansfer.cur_frame_ptr) {
1154 IPC_SDIO_DEBUG("[mipc] cur_frame_ptr->pos: %d\n", s_mipc_tx_tansfer.cur_frame_ptr->pos);
1156 IPC_SDIO_WARN("[mipc] No Data To Send\n");
1161 if(_GetFrameFromTxTransfer(&frame_ptr)) {
1162 IPC_SDIO_ERR("[mipc] Error: Flush Empty Frame \n");
1166 _DelDataFromTxTransfer(frame_ptr);
1168 IPC_SDIO_DEBUG("[mipc] sending frame count: %d\n", (MAX_MIPC_TX_FRAME_NUM - s_mipc_tx_free_frame_list.counter));
1169 put_to_sdio_tx_fifo(frame_ptr);
1175 sprd_sdio_channel_close();
1176 sdhci_hal_gpio_exit();
1183 static int mux_ipc_xmit_buf(const char *buf, ssize_t len)
1187 mutex_lock(&sdio_tx_lock);
1189 ret = _AddDataToTxTransfer((u8*)buf, len);
1191 ipc_info_sdio_write_overflow(1);
1192 IPC_SDIO_WARN("[mipc] mux_ipc_xmit_buf begin _WaitTxTransferFree\n");
1193 _WaitTxTransferFree();
1194 IPC_SDIO_WARN("[mipc] mux_ipc_xmit_buf end _WaitTxTransferFree\n");
1195 if(s_mux_ipc_event_flags & MUX_IPC_WRITE_DISABLE) {
1201 ipc_info_mux_write(len);
1203 if(s_need_wake_up_tx_thread) {
1204 s_need_wake_up_tx_thread = 0;
1205 wake_up(&s_mux_ipc_tx_wq);
1207 mutex_unlock(&sdio_tx_lock);
1211 static int mux_ipc_create_tx_thread(void)
1213 IPC_SDIO_INFO("mux_ipc_create_tx_thread enter.\n");
1214 init_waitqueue_head(&s_mux_ipc_tx_wq);
1215 s_mux_ipc_tx_thread = kthread_create(mux_ipc_tx_thread, NULL, "mipc_tx_thread");
1217 if (IS_ERR(s_mux_ipc_tx_thread)) {
1218 IPC_SDIO_ERR("mux_ipc_tx_thread error!.\n");
1222 wake_up_process(s_mux_ipc_tx_thread);
1228 u32 wake_up_mipc_rx_thread(u32 even_flag)
1231 u32 ipc_status = _is_mux_ipc_enable();
1233 wake_lock_timeout(&s_cp_req_wake_lock, HZ / 2);
1234 if(ipc_status && even_flag) {
1235 s_mipc_rx_event_flags = even_flag;
1236 wake_up(&s_mux_ipc_rx_wq);
1239 IPC_SDIO_ERR("mux ipc rx invaild wakeup, ipc status:%u, flag:%d\r\n", ipc_status, even_flag);
1245 static int mux_ipc_rx_thread(void *data)
1247 struct sched_param param = {.sched_priority = 25};
1248 IPC_SDIO_INFO("mux_ipc_rx_thread enter\r\n");
1249 sched_setscheduler(current, SCHED_FIFO, ¶m);
1254 IPC_SDIO_INFO("mux_ipc_rx_thread start----\r\n");
1255 //check CP status when start up
1257 s_mipc_rx_event_flags = 1;
1260 while (!kthread_should_stop()) {
1261 wait_event(s_mux_ipc_rx_wq, s_mipc_rx_event_flags);
1262 process_modem_packet(0);
1268 static int mux_ipc_create_rx_thread(void)
1270 IPC_SDIO_INFO("mux_ipc_rx_create_thread enter.\n");
1271 init_waitqueue_head(&s_mux_ipc_rx_wq);
1272 s_mux_ipc_rx_thread = kthread_create(mux_ipc_rx_thread, NULL, "mipc_rx_thread");
1274 if (IS_ERR(s_mux_ipc_rx_thread)) {
1275 IPC_SDIO_ERR("ipc_sdio.c:mux_ipc_rx_thread error!.\n");
1279 wake_up_process(s_mux_ipc_rx_thread);
1284 static int do_sdio_rx(u32 *tx_flow_info, u32 *acked_tx_frame)
1288 int result = SDHCI_TRANSFER_OK;
1289 int resend_count = 0;
1290 struct packet_header *packet = NULL;
1293 rx_buf_len = s_mipc_next_rx_len;
1294 wake_lock(&s_ipc_sdio_wake_lock);
1296 IPC_SDIO_DEBUG(" sdio_read_modem_data xxxx................\r\n");
1298 ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_CONNECTED);
1300 memset(s_mipc_rx_buf, 0xaa, MAX_MIPC_RX_FRAME_SIZE);
1302 if(!have_buffer_to_read()) {
1303 panic("do_sdio_rx have no buffer to read!\r\n");
1306 #ifdef SDIO_VARIABLE_DL_LEN
1307 ret = sdio_read_modem_data(s_mipc_rx_buf, rx_buf_len, (resend_count != 0));
1309 ret = sdio_read_modem_data(s_mipc_rx_buf, MAX_MIPC_RX_FRAME_SIZE, (resend_count != 0));
1313 //calc phy read speed
1314 #ifdef SDIO_VARIABLE_DL_LEN
1315 ipc_info_sdio_read(rx_buf_len);
1317 ipc_info_sdio_read(MAX_MIPC_RX_FRAME_SIZE);
1322 packet=(struct packet_header *)s_mipc_rx_buf;
1323 if(VerifyPacketHeader(packet, tx_flow_info, acked_tx_frame)) {
1324 result = SDHCI_TRANSFER_OK;
1326 ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_PACKET_ERROR);
1327 result = SDHCI_TRANSFER_ERROR;
1328 IPC_SDIO_ERR("[mipc] Sdio Rx Packet check error tag:0x%X, len:%d, ul_frame_num:0x%x\n", packet->tag, packet->length, packet->u.ul_frame_num);
1330 #ifdef SDIO_VARIABLE_DL_LEN
1331 if (packet->length > rx_buf_len) {
1332 result = SDHCI_TRANSFER_ERROR;
1333 IPC_SDIO_ERR("[mipc]SDIO READ FAIL, packet->length(%d) > rx_buf_len(%d)\r \n", packet->length, rx_buf_len);
1334 rx_buf_len = MAX_MIPC_RX_FRAME_SIZE;
1338 ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_CRC_ERROR);
1339 result = SDHCI_TRANSFER_ERROR;
1340 IPC_SDIO_ERR("[mipc]SDIO READ FAIL, ret:%d\r \n", ret);
1344 ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_DISCONNECTED);
1346 if(!_is_mux_ipc_enable()) {
1347 IPC_SDIO_ERR("[mipc] Found mux ipc disabled in do_sdio_rx\r \n", ret);
1355 } while(result && (resend_count < MAX_SDIO_RX_RETRY));
1357 ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_IDLE);
1359 wake_unlock(&s_ipc_sdio_wake_lock);
1363 ipc_info_rate(IPC_RX_CHANNEL, packet->length*1000/MAX_MIPC_RX_FRAME_SIZE);
1364 ipc_info_sdio_read_payload(packet->length);
1365 receve_len = packet->length;
1367 IPC_SDIO_INFO("[mipc] read data len:%d\r\n", receve_len);
1369 if(sdio_transfer_frame_check_enable && sdio_frame_check(&s_mipc_rx_buf[sizeof(struct packet_header )], packet->length)) {
1370 IPC_SDIO_ERR("[mipc]:sdio receved data frame error!\r\n");
1373 if(packet->length) {
1374 kfifo_in(&s_mipc_rx_cache_kfifo,&s_mipc_rx_buf[sizeof(struct packet_header )], packet->length);
1376 wake_up(&s_mux_read_rts);
1378 ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_INVALID_PACKET);
1382 IPC_SDIO_ERR("[mipc] receive data fail! result:%d\r\n", result);
1388 static int do_sdio_tx(MIPC_TRANSF_FRAME_T* frame_ptr)
1391 struct packet_header* header_ptr = ( struct packet_header* )frame_ptr->buf_ptr;
1393 //write len shall multi - 512 bytes,and min len = 4096
1394 write_len = (frame_ptr->pos <= MIN_MIPC_TX_FRAME_SIZE) ?
1395 MIN_MIPC_TX_FRAME_SIZE : ((frame_ptr->pos + 0x1FF) & (~0x1FF));
1397 s_last_tx_frame = header_ptr->frame_num;
1398 IPC_SDIO_INFO("[mipc] write data ptr: 0x%x, len:%d\r\n", frame_ptr->buf_ptr, frame_ptr->pos);
1400 IPC_SDIO_DEBUG("[mipc] write data: 0x%x, 0x%x, 0x%x, 0x%x,\r\n", frame_ptr->buf_ptr[8],
1401 frame_ptr->buf_ptr[9],
1402 frame_ptr->buf_ptr[10],
1403 frame_ptr->buf_ptr[11]);
1404 write_len = sdio_write_modem_data(frame_ptr->buf_ptr, write_len);
1407 ipc_info_rate(IPC_TX_CHANNEL, (frame_ptr->pos - sizeof(struct packet_header))*1000/write_len);
1408 ipc_info_sdio_write(write_len);
1414 static void init_sdio_gpio_res()
1418 if(s_sdio_gpio_res_status != SDIO_GPIO_RES_USING) {
1419 sdhci_hal_gpio_init();
1421 rval = sprd_sdio_channel_open();
1422 IPC_SDIO_INFO("%s() sdio channel opened %d\n", __func__, rval);
1425 sdhci_hal_gpio_irq_init();
1426 s_sdio_gpio_res_status = SDIO_GPIO_RES_USING;
1431 static void free_sdio_gpio_res()
1433 if(s_sdio_gpio_res_status != SDIO_GPIO_RES_FREE) {
1434 sdhci_hal_gpio_exit();
1435 sprd_sdio_channel_close();
1436 s_sdio_gpio_res_status = SDIO_GPIO_RES_FREE;
1437 wake_up(&s_sdio_gpio_res_free);
1441 static int mux_ipc_sdio_thread(void *data)
1443 struct sched_param param = {.sched_priority = 35};
1444 u32 continue_tx_cnt = 0;
1445 IPC_SDIO_INFO("mux_ipc_sdio_thread enter\r\n");
1446 sched_setscheduler(current, SCHED_FIFO, ¶m);
1448 IPC_SDIO_INFO("mux_ipc_sdio_thread start----\r\n");
1449 while (!kthread_should_stop()) {
1450 bool force_tx = false;
1452 //check mux_ipc driver is enabled
1453 if(!_is_mux_ipc_enable()) {
1455 IPC_SDIO_WARN("[mipc] found s_mux_ipc_enable == false\r\n");
1457 free_sdio_gpio_res();
1459 IPC_SDIO_WARN("[mipc] start to wait bootup in mux_ipc_sdio_thread\r\n");
1463 IPC_SDIO_WARN("[mipc] wait bootup success in mux_ipc_sdio_thread\r\n");
1465 init_sdio_gpio_res();
1468 wait_event_timeout(s_mux_ipc_sdio_wq, (s_mipc_enable_change_flag || s_mipc_rx_req_flag || MIPC_TX_REQ_FLAG),
1469 msecs_to_jiffies(MAX_SDIO_SLEEP_TIMEOUT));
1470 if(s_mipc_enable_change_flag) {
1471 s_mipc_enable_change_flag = 0;
1475 IPC_SDIO_DEBUG("[mipc] wait_event_timeout rx_req tx_req\r\n");
1476 if(!(s_mipc_rx_req_flag || MIPC_TX_REQ_FLAG)) {
1477 //set ap inactive to let cp sleep
1478 ap2cp_req_disable();
1479 set_cp_awake(false);
1482 IPC_SDIO_INFO("[mipc] start wait_event rx_req tx_req forever\r\n");
1483 wait_event(s_mux_ipc_sdio_wq, (s_mipc_enable_change_flag || s_mipc_rx_req_flag || MIPC_TX_REQ_FLAG));
1484 if(s_mipc_enable_change_flag) {
1485 s_mipc_enable_change_flag = 0;
1490 //check modem status
1491 if(!_is_mux_ipc_enable()) {
1495 //set ap2cp active before transfer
1497 //make sure cp is awake
1498 if(!get_cp_awake()) {
1501 if(!wait_cp_awake(msecs_to_jiffies(MAX_SDIO_CP_ACK_TIMEOUT))) {
1502 IPC_SDIO_ERR("[MIPC] SDIO wait cp awake fail!\r\n");
1504 //cp no ack, just discard a request
1505 ap2cp_req_disable();
1512 if(MIPC_TX_REQ_FLAG) {
1518 if(MIPC_TX_REQ_FLAG) {
1520 MIPC_TRANSF_FRAME_T* frame = get_from_sdio_tx_fifo();
1529 //check modem status
1530 if(!_is_mux_ipc_enable()) {
1535 if(MIPC_TX_REQ_FLAG) {
1537 MIPC_TRANSF_FRAME_T* frame = get_from_sdio_tx_fifo();
1546 //check modem status
1547 if(!_is_mux_ipc_enable()) {
1552 if(s_mipc_rx_req_flag && !force_tx) {
1554 u32 last_tx_flow_info = s_tx_flow_info;
1556 result = do_sdio_rx(&s_tx_flow_info, &s_acked_tx_frame);
1557 s_mipc_rx_req_flag = 0;
1558 continue_tx_cnt = 0;
1560 if(SDHCI_TRANSFER_OK == result) {
1561 //out of flow ctrl, wake up tx thread
1562 if(!last_tx_flow_info && s_tx_flow_info) {
1563 wake_up(&s_mux_ipc_tx_wq);
1564 printk("[mipc] exit ul flow ctrl, s_tx_flow_info:%d\n", s_tx_flow_info);
1565 } else if(!s_tx_flow_info && last_tx_flow_info) {
1566 printk("[mipc] enter ul flow ctrl,s_tx_flow_info:%d\n", s_tx_flow_info);
1569 IPC_SDIO_DEBUG("[mipc] last_ack_frame:%d, s_acked_tx_frame:%d, s_last_tx_frame:%d\n",
1570 s_mipc_tx_ctrl.last_ack_frame,
1574 if(s_mipc_tx_ctrl.last_ack_frame != s_acked_tx_frame) {
1576 ack_tx_frame_num(s_acked_tx_frame);
1579 if(s_acked_tx_frame != s_last_tx_frame) {
1581 nack_tx_frame_num();
1584 if(s_tx_flow_info == 0) {
1585 ipc_info_error_status(IPC_TX_CHANNEL, IPC_STATUS_FLOW_STOP);
1591 //check modem status
1592 if(!_is_mux_ipc_enable()) {
1598 //check cp read request after one cmd53
1600 continue_tx_cnt = 0;
1601 if(have_buffer_to_read()) {
1602 s_mipc_rx_req_flag = 1;
1604 wake_up_mipc_rx_thread(1);
1608 if(continue_tx_cnt >= 2) {
1610 //implicit_ack_tx_frame();
1613 //check need to wake tx_thread, nothing to send, wake up tx thread
1614 if((s_mipc_tx_ctrl.fifo_wr == s_mipc_tx_ctrl.fifo_rd)
1616 && s_mipc_tx_tansfer.counter) {
1617 wake_up(&s_mux_ipc_tx_wq);
1625 static int mux_ipc_create_sdio_thread(void)
1627 IPC_SDIO_INFO("mux_ipc_create_sdio_thread enter.\n");
1628 init_waitqueue_head(&s_mux_ipc_sdio_wq);
1629 s_mux_ipc_sdio_thread = kthread_create(mux_ipc_sdio_thread, NULL, "mipc_sdio_thread");
1631 if (IS_ERR(s_mux_ipc_sdio_thread)) {
1632 IPC_SDIO_ERR("ipc_sdio.c:s_mux_ipc_sdio_thread error!.\n");
1636 wake_up_process(s_mux_ipc_sdio_thread);
1641 #ifdef SDIO_LOOP_TEST
1643 static struct task_struct *s_mux_ipc_test_rx_thread;
1644 static struct task_struct *s_mux_ipc_test_tx_thread;
1647 static int mux_ipc_test_rx_thread(void *data)
1649 struct sched_param param = {.sched_priority = 15};
1650 IPC_SDIO_INFO("mux_ipc_test_rx_thread enter\r\n");
1651 sched_setscheduler(current, SCHED_FIFO, ¶m);
1655 IPC_SDIO_INFO("mux_ipc_test_rx_thread start----\r\n");
1656 while (!kthread_should_stop()) {
1657 mux_ipc_sdio_test_read(NULL, 0);
1662 static int mux_ipc_test_tx_thread(void *data)
1664 struct sched_param param = {.sched_priority = 15};
1665 IPC_SDIO_INFO("mux_ipc_test_tx_thread enter\r\n");
1666 sched_setscheduler(current, SCHED_FIFO, ¶m);
1670 IPC_SDIO_INFO("mux_ipc_test_tx_thread start----\r\n");
1673 while (!kthread_should_stop()) {
1674 mux_ipc_sdio_write_test(NULL, 0);
1681 static int mux_ipc_create_test_tx_thread(void)
1683 IPC_SDIO_INFO("mux_ipc_create_test_tx_thread enter.\n");
1684 s_mux_ipc_test_tx_thread = kthread_create(mux_ipc_test_tx_thread, NULL, "mipc_test_tx_thrd");
1686 if (IS_ERR(s_mux_ipc_test_tx_thread)) {
1687 IPC_SDIO_ERR("ipc_sdio.c:s_mux_ipc_sdio_thread error!.\n");
1691 wake_up_process(s_mux_ipc_test_tx_thread);
1696 static int mux_ipc_create_test_rx_thread(void)
1698 IPC_SDIO_INFO("mux_ipc_create_test_rx_thread enter.\n");
1699 s_mux_ipc_test_rx_thread = kthread_create(mux_ipc_test_rx_thread, NULL, "mipc_test_rx_thrd");
1701 if (IS_ERR(s_mux_ipc_test_rx_thread)) {
1702 IPC_SDIO_ERR("ipc_sdio.c:s_mux_ipc_sdio_thread error!.\n");
1706 wake_up_process(s_mux_ipc_test_rx_thread);
1714 static int modem_sdio_probe(struct platform_device *pdev)
1718 IPC_SDIO_INFO("modem_sdio_probe\n");
1720 ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_FLOW_STOP);
1723 wake_lock_init(&s_ipc_sdio_wake_lock, WAKE_LOCK_SUSPEND, "ipc_sdio_lock");
1724 wake_lock_init(&s_cp_req_wake_lock, WAKE_LOCK_SUSPEND, "sdio_cp_req_lock");
1725 mutex_init(&ipc_mutex);
1726 //atomic_set(&s_mipc_read_pending, 0);
1727 init_cp_awake_status();
1728 init_mipc_tx_ctrl();
1729 mux_ipc_create_sdio_thread();
1730 mux_ipc_create_tx_thread();
1731 mux_ipc_create_rx_thread();
1733 #ifdef SDIO_LOOP_TEST
1734 mux_ipc_create_test_rx_thread();
1735 mux_ipc_create_test_tx_thread();
1740 static int modem_sdio_remove(struct platform_device *pdev)
1746 static struct platform_driver modem_sdio_driver = {
1747 .probe = modem_sdio_probe,
1748 .remove = modem_sdio_remove,
1754 static struct sprdmux sprd_iomux = {
1756 .io_read = mux_ipc_sdio_read,
1757 .io_write = mux_ipc_sdio_write,
1758 .io_stop = mux_ipc_sdio_stop,
1761 static int __init mux_ipc_sdio_init(void)
1765 IPC_SDIO_INFO("mux_ipc_sdio_init\n");
1767 _transfer_frame_init();
1768 init_waitqueue_head(&s_mux_read_rts);
1769 init_waitqueue_head(&s_rx_fifo_avail);
1770 init_waitqueue_head(&s_modem_ready);
1771 init_waitqueue_head(&s_sdio_gpio_res_free);
1772 sprdmux_register(&sprd_iomux);
1773 retval = platform_driver_register(&modem_sdio_driver);
1775 IPC_SDIO_ERR("[sdio]: register modem_sdio_driver error:%d\r\n", retval);
1778 s_mux_ipc_module_inited = 1;
1783 static void __exit mux_ipc_sdio_exit(void)
1785 platform_driver_unregister(&modem_sdio_driver);
1789 module_param_named(sdio_transfer_crc_check_enable, sdio_transfer_crc_check_enable, int, S_IRUGO | S_IWUSR);
1790 module_param_named(sdio_transfer_frame_check_enable, sdio_transfer_frame_check_enable, int, S_IRUGO | S_IWUSR);
1791 module_param_named(sdio_tx_wait_time, sdio_tx_wait_time, int, S_IRUGO | S_IWUSR);
1795 module_init(mux_ipc_sdio_init);
1796 module_exit(mux_ipc_sdio_exit);
1798 MODULE_LICENSE("GPL");
1799 MODULE_AUTHOR("Bin.Xu<bin.xu@spreadtrum.com>");
1800 MODULE_DESCRIPTION("MUX SDIO Driver");