Пример #1
0
static void *handle_sdio_mux_command(struct sdio_mux_hdr *hdr,
				     struct sk_buff *skb_mux)
{
	void *rp;
	unsigned long flags;

	DBG("[lte] %s: [RIL][read][index %d] cmd %d ch %d\n",
			__func__, hdr->ch_id, hdr->cmd, hdr->ch_id);
	switch (hdr->cmd) {
	case SDIO_MUX_HDR_CMD_DATA:
		rp = handle_sdio_mux_data(hdr, skb_mux);
		break;
	case SDIO_MUX_HDR_CMD_OPEN:
		spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags);
		sdio_ch[hdr->ch_id].status |= SDIO_CH_REMOTE_OPEN;
		spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags);
		rp = hdr + 1;
		break;
	case SDIO_MUX_HDR_CMD_CLOSE:
		/* probably should drop pending write */
		spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags);
		sdio_ch[hdr->ch_id].status &= ~SDIO_CH_REMOTE_OPEN;
		spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags);
		rp = hdr + 1;
		break;
	default:
		rp = hdr + 1;
	}

	return rp;
}
static void *handle_sdio_mux_command(struct sdio_mux_hdr *hdr,
                                     struct sk_buff *skb_mux)
{
    void *rp;
    unsigned long flags;
    int send_open = 0;

    DBG("%s: cmd %d ch %d\n", __func__, hdr->cmd, hdr->ch_id);
    switch (hdr->cmd) {
    case SDIO_MUX_HDR_CMD_DATA:
        rp = handle_sdio_mux_data(hdr, skb_mux);
        break;
    case SDIO_MUX_HDR_CMD_OPEN:
        spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags);
        sdio_ch[hdr->ch_id].status |= SDIO_CH_REMOTE_OPEN;
        sdio_ch[hdr->ch_id].num_tx_pkts = 0;

        if (sdio_ch_is_in_reset(hdr->ch_id)) {
            DBG("%s: in reset - sending open cmd\n", __func__);
            sdio_ch[hdr->ch_id].status &= ~SDIO_CH_IN_RESET;
            send_open = 1;
        }

        /* notify client so it can update its status */
        if (sdio_ch[hdr->ch_id].receive_cb)
            sdio_ch[hdr->ch_id].receive_cb(
                sdio_ch[hdr->ch_id].priv, NULL);

        if (sdio_ch[hdr->ch_id].write_done)
            sdio_ch[hdr->ch_id].write_done(
                sdio_ch[hdr->ch_id].priv, NULL);
        spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags);
        rp = hdr + 1;
        if (send_open)
            sdio_mux_send_open_cmd(hdr->ch_id);

        break;
    case SDIO_MUX_HDR_CMD_CLOSE:
        /* probably should drop pending write */
        spin_lock_irqsave(&sdio_ch[hdr->ch_id].lock, flags);
        sdio_ch[hdr->ch_id].status &= ~SDIO_CH_REMOTE_OPEN;
        spin_unlock_irqrestore(&sdio_ch[hdr->ch_id].lock, flags);
        rp = hdr + 1;
        break;
    default:
        rp = hdr + 1;
    }

    return rp;
}