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; }