int msm_bam_dmux_open(uint32_t id, void *priv, void (*receive_cb)(void *, struct sk_buff *), void (*write_done)(void *, struct sk_buff *)) { struct bam_mux_hdr *hdr; unsigned long flags; int rc = 0; DBG("%s: opening ch %d\n", __func__, id); if (!bam_mux_initialized) return -ENODEV; if (id >= BAM_DMUX_NUM_CHANNELS) return -EINVAL; hdr = kmalloc(sizeof(struct bam_mux_hdr), GFP_KERNEL); if (hdr == NULL) { pr_err("%s: hdr kmalloc failed. ch: %d\n", __func__, id); return -ENOMEM; } spin_lock_irqsave(&bam_ch[id].lock, flags); if (bam_ch_is_open(id)) { DBG("%s: Already opened %d\n", __func__, id); spin_unlock_irqrestore(&bam_ch[id].lock, flags); kfree(hdr); goto open_done; } if (!bam_ch_is_remote_open(id)) { DBG("%s: Remote not open; ch: %d\n", __func__, id); spin_unlock_irqrestore(&bam_ch[id].lock, flags); kfree(hdr); rc = -ENODEV; goto open_done; } bam_ch[id].receive_cb = receive_cb; bam_ch[id].write_done = write_done; bam_ch[id].priv = priv; bam_ch[id].status |= BAM_CH_LOCAL_OPEN; spin_unlock_irqrestore(&bam_ch[id].lock, flags); hdr->magic_num = BAM_MUX_HDR_MAGIC_NO; hdr->cmd = BAM_MUX_HDR_CMD_OPEN; hdr->reserved = 0; hdr->ch_id = id; hdr->pkt_len = 0; hdr->pad_len = 0; rc = bam_mux_write_cmd((void *)hdr, sizeof(struct bam_mux_hdr)); open_done: DBG("%s: opened ch %d\n", __func__, id); return rc; }
static int debug_tbl(char *buf, int max) { int i = 0; int j; for (j = 0; j < BAM_DMUX_NUM_CHANNELS; ++j) { i += scnprintf(buf + i, max - i, "ch%02d local open=%s remote open=%s\n", j, bam_ch_is_local_open(j) ? "Y" : "N", bam_ch_is_remote_open(j) ? "Y" : "N"); } return i; }