Loading drivers/usb/gadget/f_rmnet.c +12 −0 Original line number Original line Diff line number Diff line Loading @@ -713,6 +713,7 @@ static int frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) { { struct f_rmnet *dev = func_to_rmnet(f); struct f_rmnet *dev = func_to_rmnet(f); enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; struct usb_composite_dev *cdev = dev->cdev; struct usb_composite_dev *cdev = dev->cdev; int ret; int ret; struct list_head *cpkt; struct list_head *cpkt; Loading Loading @@ -750,6 +751,17 @@ frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ret = gport_rmnet_connect(dev); ret = gport_rmnet_connect(dev); } } if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA && gadget_is_dwc3(cdev->gadget)) { if (msm_ep_config(dev->port.in) || msm_ep_config(dev->port.out)) { pr_err("%s: msm_ep_config failed\n", __func__); return -EINVAL; } } else pr_debug("Rmnet is being used with non DWC3 core\n"); atomic_set(&dev->online, 1); atomic_set(&dev->online, 1); /* In case notifications were aborted, but there are pending control /* In case notifications were aborted, but there are pending control Loading drivers/usb/gadget/u_bam.c +80 −4 Original line number Original line Diff line number Diff line Loading @@ -145,6 +145,13 @@ static struct bam_portmaster { struct platform_driver pdrv; struct platform_driver pdrv; } bam_ports[BAM_N_PORTS]; } bam_ports[BAM_N_PORTS]; struct u_bam_data_connect_info { u32 usb_bam_pipe_idx; u32 peer_pipe_idx; u32 usb_bam_handle; struct sps_mem_buffer data_fifo; }; struct gbam_port *bam2bam_ports[BAM2BAM_N_PORTS]; struct gbam_port *bam2bam_ports[BAM2BAM_N_PORTS]; static void gbam_start_rx(struct gbam_port *port); static void gbam_start_rx(struct gbam_port *port); static void gbam_start_endless_rx(struct gbam_port *port); static void gbam_start_endless_rx(struct gbam_port *port); Loading Loading @@ -802,6 +809,8 @@ static void gbam_connect_work(struct work_struct *w) static void gbam2bam_connect_work(struct work_struct *w) static void gbam2bam_connect_work(struct work_struct *w) { { struct gbam_port *port = container_of(w, struct gbam_port, connect_w); struct gbam_port *port = container_of(w, struct gbam_port, connect_w); struct f_rmnet *dev = NULL; struct usb_gadget *gadget = NULL; struct teth_bridge_connect_params connect_params; struct teth_bridge_connect_params connect_params; struct bam_ch_info *d = &port->data_ch; struct bam_ch_info *d = &port->data_ch; u32 sps_params; u32 sps_params; Loading @@ -810,6 +819,12 @@ static void gbam2bam_connect_work(struct work_struct *w) int ret; int ret; unsigned long flags; unsigned long flags; if (port) dev = port_to_rmnet(port->gr); if (dev && dev->cdev) gadget = dev->cdev->gadget; if (d->trans == USB_GADGET_XPORT_BAM2BAM) { if (d->trans == USB_GADGET_XPORT_BAM2BAM) { usb_bam_reset_complete(); usb_bam_reset_complete(); ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx); ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx); Loading Loading @@ -841,6 +856,31 @@ static void gbam2bam_connect_work(struct work_struct *w) __func__, ret); __func__, ret); return; return; } } if (gadget && gadget_is_dwc3(gadget)) { u8 idx; struct u_bam_data_connect_info bam_info; idx = usb_bam_get_connection_idx(gadget->name, IPA_P_BAM, USB_TO_PEER_PERIPHERAL, 0); if (idx < 0) { pr_err("%s: get_connection_idx failed\n", __func__); return; } 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(port->port_usb->out, bam_info.data_fifo.phys_base, bam_info.data_fifo.size, bam_info.usb_bam_pipe_idx); } d->ipa_params.dir = PEER_PERIPHERAL_TO_USB; d->ipa_params.dir = PEER_PERIPHERAL_TO_USB; ret = usb_bam_connect_ipa(&d->ipa_params); ret = usb_bam_connect_ipa(&d->ipa_params); if (ret) { if (ret) { Loading @@ -849,6 +889,29 @@ static void gbam2bam_connect_work(struct work_struct *w) return; return; } } if (gadget && gadget_is_dwc3(gadget)) { u8 idx; struct u_bam_data_connect_info bam_info; idx = usb_bam_get_connection_idx(gadget->name, IPA_P_BAM, PEER_PERIPHERAL_TO_USB, 0); if (idx < 0) { pr_err("%s: get_connection_idx failed\n", __func__); return; } 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(port->port_usb->in, bam_info.data_fifo.phys_base, bam_info.data_fifo.size, bam_info.usb_bam_pipe_idx); } connect_params.ipa_usb_pipe_hdl = d->ipa_params.prod_clnt_hdl; connect_params.ipa_usb_pipe_hdl = d->ipa_params.prod_clnt_hdl; connect_params.usb_ipa_pipe_hdl = d->ipa_params.cons_clnt_hdl; connect_params.usb_ipa_pipe_hdl = d->ipa_params.cons_clnt_hdl; connect_params.tethering_mode = TETH_TETHERING_MODE_RMNET; connect_params.tethering_mode = TETH_TETHERING_MODE_RMNET; Loading Loading @@ -880,8 +943,15 @@ static void gbam2bam_connect_work(struct work_struct *w) d->rx_req->complete = gbam_endless_rx_complete; d->rx_req->complete = gbam_endless_rx_complete; d->rx_req->length = 0; d->rx_req->length = 0; d->rx_req->no_interrupt = 1; d->rx_req->no_interrupt = 1; if (gadget && gadget_is_dwc3(gadget)) { sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | MSM_PRODUCER | d->src_pipe_idx; d->rx_req->length = 32*1024; } else sps_params = (MSM_SPS_MODE | d->src_pipe_idx | sps_params = (MSM_SPS_MODE | d->src_pipe_idx | MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; d->rx_req->udc_priv = sps_params; d->rx_req->udc_priv = sps_params; d->tx_req = usb_ep_alloc_request(port->port_usb->in, GFP_ATOMIC); d->tx_req = usb_ep_alloc_request(port->port_usb->in, GFP_ATOMIC); Loading @@ -896,8 +966,14 @@ static void gbam2bam_connect_work(struct work_struct *w) d->tx_req->complete = gbam_endless_tx_complete; d->tx_req->complete = gbam_endless_tx_complete; d->tx_req->length = 0; d->tx_req->length = 0; d->tx_req->no_interrupt = 1; d->tx_req->no_interrupt = 1; if (gadget && gadget_is_dwc3(gadget)) { sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | d->dst_pipe_idx; d->tx_req->length = 32*1024; } else sps_params = (MSM_SPS_MODE | d->dst_pipe_idx | sps_params = (MSM_SPS_MODE | d->dst_pipe_idx | MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; d->tx_req->udc_priv = sps_params; d->tx_req->udc_priv = sps_params; /* queue in & out requests */ /* queue in & out requests */ Loading Loading
drivers/usb/gadget/f_rmnet.c +12 −0 Original line number Original line Diff line number Diff line Loading @@ -713,6 +713,7 @@ static int frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) { { struct f_rmnet *dev = func_to_rmnet(f); struct f_rmnet *dev = func_to_rmnet(f); enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; struct usb_composite_dev *cdev = dev->cdev; struct usb_composite_dev *cdev = dev->cdev; int ret; int ret; struct list_head *cpkt; struct list_head *cpkt; Loading Loading @@ -750,6 +751,17 @@ frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ret = gport_rmnet_connect(dev); ret = gport_rmnet_connect(dev); } } if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA && gadget_is_dwc3(cdev->gadget)) { if (msm_ep_config(dev->port.in) || msm_ep_config(dev->port.out)) { pr_err("%s: msm_ep_config failed\n", __func__); return -EINVAL; } } else pr_debug("Rmnet is being used with non DWC3 core\n"); atomic_set(&dev->online, 1); atomic_set(&dev->online, 1); /* In case notifications were aborted, but there are pending control /* In case notifications were aborted, but there are pending control Loading
drivers/usb/gadget/u_bam.c +80 −4 Original line number Original line Diff line number Diff line Loading @@ -145,6 +145,13 @@ static struct bam_portmaster { struct platform_driver pdrv; struct platform_driver pdrv; } bam_ports[BAM_N_PORTS]; } bam_ports[BAM_N_PORTS]; struct u_bam_data_connect_info { u32 usb_bam_pipe_idx; u32 peer_pipe_idx; u32 usb_bam_handle; struct sps_mem_buffer data_fifo; }; struct gbam_port *bam2bam_ports[BAM2BAM_N_PORTS]; struct gbam_port *bam2bam_ports[BAM2BAM_N_PORTS]; static void gbam_start_rx(struct gbam_port *port); static void gbam_start_rx(struct gbam_port *port); static void gbam_start_endless_rx(struct gbam_port *port); static void gbam_start_endless_rx(struct gbam_port *port); Loading Loading @@ -802,6 +809,8 @@ static void gbam_connect_work(struct work_struct *w) static void gbam2bam_connect_work(struct work_struct *w) static void gbam2bam_connect_work(struct work_struct *w) { { struct gbam_port *port = container_of(w, struct gbam_port, connect_w); struct gbam_port *port = container_of(w, struct gbam_port, connect_w); struct f_rmnet *dev = NULL; struct usb_gadget *gadget = NULL; struct teth_bridge_connect_params connect_params; struct teth_bridge_connect_params connect_params; struct bam_ch_info *d = &port->data_ch; struct bam_ch_info *d = &port->data_ch; u32 sps_params; u32 sps_params; Loading @@ -810,6 +819,12 @@ static void gbam2bam_connect_work(struct work_struct *w) int ret; int ret; unsigned long flags; unsigned long flags; if (port) dev = port_to_rmnet(port->gr); if (dev && dev->cdev) gadget = dev->cdev->gadget; if (d->trans == USB_GADGET_XPORT_BAM2BAM) { if (d->trans == USB_GADGET_XPORT_BAM2BAM) { usb_bam_reset_complete(); usb_bam_reset_complete(); ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx); ret = usb_bam_connect(d->src_connection_idx, &d->src_pipe_idx); Loading Loading @@ -841,6 +856,31 @@ static void gbam2bam_connect_work(struct work_struct *w) __func__, ret); __func__, ret); return; return; } } if (gadget && gadget_is_dwc3(gadget)) { u8 idx; struct u_bam_data_connect_info bam_info; idx = usb_bam_get_connection_idx(gadget->name, IPA_P_BAM, USB_TO_PEER_PERIPHERAL, 0); if (idx < 0) { pr_err("%s: get_connection_idx failed\n", __func__); return; } 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(port->port_usb->out, bam_info.data_fifo.phys_base, bam_info.data_fifo.size, bam_info.usb_bam_pipe_idx); } d->ipa_params.dir = PEER_PERIPHERAL_TO_USB; d->ipa_params.dir = PEER_PERIPHERAL_TO_USB; ret = usb_bam_connect_ipa(&d->ipa_params); ret = usb_bam_connect_ipa(&d->ipa_params); if (ret) { if (ret) { Loading @@ -849,6 +889,29 @@ static void gbam2bam_connect_work(struct work_struct *w) return; return; } } if (gadget && gadget_is_dwc3(gadget)) { u8 idx; struct u_bam_data_connect_info bam_info; idx = usb_bam_get_connection_idx(gadget->name, IPA_P_BAM, PEER_PERIPHERAL_TO_USB, 0); if (idx < 0) { pr_err("%s: get_connection_idx failed\n", __func__); return; } 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(port->port_usb->in, bam_info.data_fifo.phys_base, bam_info.data_fifo.size, bam_info.usb_bam_pipe_idx); } connect_params.ipa_usb_pipe_hdl = d->ipa_params.prod_clnt_hdl; connect_params.ipa_usb_pipe_hdl = d->ipa_params.prod_clnt_hdl; connect_params.usb_ipa_pipe_hdl = d->ipa_params.cons_clnt_hdl; connect_params.usb_ipa_pipe_hdl = d->ipa_params.cons_clnt_hdl; connect_params.tethering_mode = TETH_TETHERING_MODE_RMNET; connect_params.tethering_mode = TETH_TETHERING_MODE_RMNET; Loading Loading @@ -880,8 +943,15 @@ static void gbam2bam_connect_work(struct work_struct *w) d->rx_req->complete = gbam_endless_rx_complete; d->rx_req->complete = gbam_endless_rx_complete; d->rx_req->length = 0; d->rx_req->length = 0; d->rx_req->no_interrupt = 1; d->rx_req->no_interrupt = 1; if (gadget && gadget_is_dwc3(gadget)) { sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | MSM_PRODUCER | d->src_pipe_idx; d->rx_req->length = 32*1024; } else sps_params = (MSM_SPS_MODE | d->src_pipe_idx | sps_params = (MSM_SPS_MODE | d->src_pipe_idx | MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; d->rx_req->udc_priv = sps_params; d->rx_req->udc_priv = sps_params; d->tx_req = usb_ep_alloc_request(port->port_usb->in, GFP_ATOMIC); d->tx_req = usb_ep_alloc_request(port->port_usb->in, GFP_ATOMIC); Loading @@ -896,8 +966,14 @@ static void gbam2bam_connect_work(struct work_struct *w) d->tx_req->complete = gbam_endless_tx_complete; d->tx_req->complete = gbam_endless_tx_complete; d->tx_req->length = 0; d->tx_req->length = 0; d->tx_req->no_interrupt = 1; d->tx_req->no_interrupt = 1; if (gadget && gadget_is_dwc3(gadget)) { sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | d->dst_pipe_idx; d->tx_req->length = 32*1024; } else sps_params = (MSM_SPS_MODE | d->dst_pipe_idx | sps_params = (MSM_SPS_MODE | d->dst_pipe_idx | MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; MSM_VENDOR_ID) & ~MSM_IS_FINITE_TRANSFER; d->tx_req->udc_priv = sps_params; d->tx_req->udc_priv = sps_params; /* queue in & out requests */ /* queue in & out requests */ Loading