Esempio n. 1
0
static int rk3190_mbox_startup(struct ipc_mbox *imb)
{
	struct rk3190_mbox *pmb = (struct rk3190_mbox *)imb;
	int i;

	rk3190_mbox_writel(pmb, MBOX_INTEN, 0);			// disable interrupts
	rk3190_mbox_writel(pmb, MBOX_INTSTAT, ~0x0);	// clear interrupts

	pmb->mboxd = create_workqueue("mboxd");
	if (!pmb->mboxd) {
		return -ENOMEM;
	}

	INIT_WORK(&pmb->work, rk3190_mbox_rx_work);

	for (i=0; i<ARRAY_SIZE(pmb->irq); i++) {
		if (pmb->irq[i] >= 0) {
			request_irq(pmb->irq[i], rk3190_mbox_interrupt, 0, "mbox", pmb);
		}
	}
	IPC_DBG(DEBUG_INFO,"=============%s=================",__func__);
	// enable mbox interrupt
	rk3190_mbox_writel(pmb, MBOX_INTEN, MBOX_CHAN_MASKBITS);

	return 0;
}
static int sdio_read_modem_data(u8 *buf, int len, int addr)
{
        int ret = 0;
        IPC_DBG(" sdio_read_modem_data entery:buf:0x%X, len:%x\r\n", (u32)buf, len);
        ret = sprd_sdio_channel_rx(buf, len, addr);
        return ret;
}
Esempio n. 3
0
static int hwreq_ipcmsg_handler(struct ipc_msg *pmsg, void *data)
{
    struct rk_baseband *bb;
    int cmd;
    int ret;

    bb = (struct rk_baseband *)data;

    cmd = pmsg->subcmd;
    IPC_DBG(DEBUG_INFO,"%s:cmd=%d",__func__,cmd);
    switch (cmd) {
    case IPC_HW_SIM_VCC_SELECT:
        ret = handle_sim_vccsel_req(bb, pmsg);
        break;

    case IPC_HW_GPIO_SET_OUTPUT ... IPC_HW_GPIO_SET_DEBOUNCE:
        ret = handle_gpio_req(bb, cmd, pmsg);
        break;

    case IPC_HW_BB_SYSTEM_HALT:
        ret = handle_bb_system_halt(bb, pmsg);
        break;
    default:
        break;
    }

    return 0;
}
int mux_ipc_sdio_write(const char *buf, size_t  count)
{
        static int first = 1;
        IPC_DBG("[mipc]mux_ipc_sdio_write write len:%d\r\n", count);
        if(first) {
                int cnt = 0;
                first = 0;
                wait_cp_bootup();
                while(1) {
                        set_tx_buf_dbg_data(s_dbg_buf, MAX_MIPC_TX_FRAME_SIZE  - sizeof(struct packet_header));
                        mux_ipc_xmit_buf(s_dbg_buf, MAX_MIPC_TX_FRAME_SIZE  - sizeof(struct packet_header));
                        //set_tx_buf_dbg_data(s_dbg_buf, 50);
                        //mux_ipc_xmit_buf(s_dbg_buf, 50);
                        cnt++;
                        if(cnt == MAX_MIPC_TX_FRAME_SIZE)
                                //if(cnt == 4)
                        {
                                msleep(100);
                                cnt = 0;
                        }
                }
        }

        return count;

        //return mux_ipc_xmit_buf(buf, count);
}
int mux_ipc_sdio_read(char *buf, size_t  count)
{
        int ret = 0;

        wait_event_interruptible(s_mux_read_rts, !kfifo_is_empty(&s_mipc_rx_cache_kfifo) || s_mux_ipc_event_flags);

        if(s_mux_ipc_event_flags & MUX_IPC_READ_DISABLE) {
                printk("[mipc] mux ipc  read disable!\r\n");
                return -1;
        }

        IPC_DBG("[mipc]mux_ipc_sdio_read read len:%d\r\n", count);
        ret = kfifo_out(&s_mipc_rx_cache_kfifo,buf,count);

        ipc_info_mux_read(ret);

        ipc_info_sdio_read_saved_count(kfifo_len(&s_mipc_rx_cache_kfifo));

        return ret;
}
int mux_ipc_sdio_write(const char *buf, size_t  count)
{
        wait_cp_bootup();
        IPC_DBG("[mipc]mux_ipc_sdio_write write len:%d\r\n", count);
        return mux_ipc_xmit_buf(buf, count);
}
static int do_sdio_rx(u32 *tx_flow_info, u32 *acked_tx_frame)
{
        u32 receve_len = 0;
        int ret = 0;
        int result = SDHCI_TRANSFER_OK;
        int resend_count = 0;
        struct packet_header *packet = NULL;

        wake_lock(&s_ipc_sdio_wake_lock);
        do {
                IPC_DBG(" sdio_read_modem_data xxxx................\r\n");

                ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_CONNECTED);

                memset(s_mipc_rx_buf, 0xaa, MAX_MIPC_RX_FRAME_SIZE);

                if(!have_buffer_to_read()) {
                        panic("do_sdio_rx have no buffer to read!\r\n");
                }

                ret = sdio_read_modem_data(s_mipc_rx_buf,  MAX_MIPC_RX_FRAME_SIZE, (resend_count != 0));
                set_cp_awake(true);
                if (!ret) {
                        //calc phy read speed
                        ipc_info_sdio_read(MAX_MIPC_RX_FRAME_SIZE);

                        packet=(struct packet_header *)s_mipc_rx_buf;
                        if(VerifyPacketHeader(packet, tx_flow_info, acked_tx_frame)) {
                                result = SDHCI_TRANSFER_OK;
                        } else {
                                ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_PACKET_ERROR);
                                result = SDHCI_TRANSFER_ERROR;
                                printk("[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);
                        }
                } else {
                        ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_CRC_ERROR);
                        result = SDHCI_TRANSFER_ERROR;
                        printk("[mipc]SDIO READ FAIL, ret:%d\r \n", ret);
                }


                ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_DISCONNECTED);

                if(result) {
                        resend_count++;
                        msleep(2);
                }

        } while(result && (resend_count < MAX_SDIO_RX_RETRY));

        ipc_info_change_status(IPC_RX_CHANNEL, IPC_STATUS_IDLE);

        wake_unlock(&s_ipc_sdio_wake_lock);

        if(!result) {
                u32  send_cnt = 0;

                ipc_info_rate(IPC_RX_CHANNEL, packet->length*1000/MAX_MIPC_RX_FRAME_SIZE);
                ipc_info_sdio_read_payload(packet->length);
                receve_len  = packet->length;

                printk("[mipc] read data len:%d\r\n", receve_len);

                if(sdio_transfer_frame_check_enable && sdio_frame_check(&s_mipc_rx_buf[sizeof(struct packet_header )], packet->length)) {
                        printk("[mipc]:sdio receved data frame error!\r\n");
                }

                if(packet->length) {
                        kfifo_in(&s_mipc_rx_cache_kfifo,&s_mipc_rx_buf[sizeof(struct packet_header )], packet->length);

                        wake_up_interruptible(&s_mux_read_rts);
                } else {
                        ipc_info_error_status(IPC_RX_CHANNEL, IPC_STATUS_INVALID_PACKET);
                }
        } else {
                receve_len  = 0;
                printk("[mipc] receive data fail! result:%d\r\n", result);
        }
        return result;
}
Esempio n. 8
0
static inline void switch_pipe_state(struct ipc_pipe *pipe, u8 state)
{
	pipe->state = state;
	IPC_DBG(DEBUG_INFO,"state=%d\n",state);
}