/** * configure_fifo() - Configure USB BAM Pipe's data FIFO * @idx: USB BAM Pipe index * @ep: USB endpoint * * This function configures USB BAM data fifo using fetched pipe configuraion * using provided index value. This function needs to used before starting * endless transfer. */ static void configure_fifo(u8 idx, struct usb_ep *ep) { struct u_bam_data_connect_info bam_info; struct sps_mem_buffer data_fifo = {0}; get_bam2bam_connection_info(idx, &bam_info.usb_bam_handle, &bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx, NULL, &data_fifo, NULL); msm_data_fifo_config(ep, data_fifo.phys_base, data_fifo.size, bam_info.usb_bam_pipe_idx); }
/* * This function configured data fifo based on index passed to get bam2bam * configuration. */ static void configure_usb_data_fifo(u8 idx, struct usb_ep *ep, enum usb_bam_pipe_type pipe_type) { struct u_bam_data_connect_info bam_info; struct sps_mem_buffer data_fifo = {0}; if (pipe_type == USB_BAM_PIPE_BAM2BAM) { get_bam2bam_connection_info(idx, &bam_info.usb_bam_handle, &bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx, NULL, &data_fifo); msm_data_fifo_config(ep, data_fifo.phys_base, data_fifo.size, bam_info.usb_bam_pipe_idx); } }
static int set_qdss_data_connection(struct usb_gadget *gadget, struct usb_ep *data_ep, u8 data_addr, int enable) { int res = 0; u8 idx; pr_debug("set_qdss_data_connection\n"); /* There is only one qdss pipe, so the pipe number can be set to 0 */ idx = usb_bam_get_connection_idx(gadget->name, QDSS_P_BAM, PEER_PERIPHERAL_TO_USB, 0); if (idx < 0) { pr_err("%s: usb_bam_get_connection_idx failed\n", __func__); return idx; } if (enable) { res = usb_bam_connect(idx, &(bam_info.usb_bam_pipe_idx)); bam_info.data_fifo = kzalloc(sizeof(struct sps_mem_buffer), GFP_KERNEL); if (!bam_info.data_fifo) { pr_err("qdss_data_connection: memory alloc failed\n"); return -ENOMEM; } usb_bam_set_qdss_core(gadget->name); get_bam2bam_connection_info(idx, &bam_info.usb_bam_handle, &bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx, NULL, bam_info.data_fifo); msm_data_fifo_config(data_ep, bam_info.data_fifo->phys_base, bam_info.data_fifo->size, bam_info.usb_bam_pipe_idx); } else { kfree(bam_info.data_fifo); res = usb_bam_disconnect_pipe(idx); if (res) { pr_err("usb_bam_disconnection error\n"); return res; } } return res; }
int set_qdss_data_connection(struct usb_ep *data_ep, u8 data_addr, int enable) { int res = 0; pr_debug("set_qdss_data_connection\n"); if (enable) { res = usb_bam_connect(BAM_CONNC_IDX, NULL, &(bam_info.usb_bam_pipe_idx)); if (res) { pr_err("usb_bam_connection error\n"); return res; } bam_info.data_fifo = kzalloc(sizeof(struct sps_mem_buffer *), GFP_KERNEL); if (!bam_info.data_fifo) { pr_err("qdss_data_connection: memory alloc failed\n"); return -ENOMEM; } get_bam2bam_connection_info(BAM_CONNC_IDX, PEER_PERIPHERAL_TO_USB, &bam_info.usb_bam_handle, &bam_info.usb_bam_pipe_idx, &bam_info.peer_pipe_idx, NULL, bam_info.data_fifo); msm_data_fifo_config(data_ep, bam_info.data_fifo->phys_base, bam_info.data_fifo->size, bam_info.usb_bam_pipe_idx); } else { kfree(bam_info.data_fifo); res = usb_bam_disconnect_pipe(BAM_CONNC_IDX); if (res) { pr_err("usb_bam_disconnection error\n"); return res; } } return res; }