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; }
int msm_bam_dmux_close(uint32_t id) { struct bam_mux_hdr *hdr; unsigned long flags; int rc; if (id >= BAM_DMUX_NUM_CHANNELS) return -EINVAL; DBG("%s: closing ch %d\n", __func__, id); if (!bam_mux_initialized) return -ENODEV; spin_lock_irqsave(&bam_ch[id].lock, flags); bam_ch[id].write_done = NULL; bam_ch[id].receive_cb = NULL; bam_ch[id].priv = NULL; bam_ch[id].status &= ~BAM_CH_LOCAL_OPEN; spin_unlock_irqrestore(&bam_ch[id].lock, flags); 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; } hdr->magic_num = BAM_MUX_HDR_MAGIC_NO; hdr->cmd = BAM_MUX_HDR_CMD_CLOSE; 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)); DBG("%s: closed ch %d\n", __func__, id); return rc; }