Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7c589653 authored by Dov Levenglick's avatar Dov Levenglick
Browse files

usb: gadget: MBIM: Add support for MBIM over DWC3 controller



MBIM is a USB tethering interface that is using HW accelerated
path via BAM2BAM.
This change adds the required support to enable the BAM2BAM
path for ECM also on DWC3 new USB controller.

Change-Id: If1acd120597d79a57057db5e22bdf0a09e60e98c
Signed-off-by: default avatarBar Weiner <bweiner@codeaurora.org>
Signed-off-by: default avatarDov Levenglick <dovl@codeaurora.org>
parent d68c7398
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -1323,6 +1323,16 @@ static int mbim_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
				pr_info("Set mbim port out_desc = 0x%p",
					mbim->bam_port.out->desc);

				if (mbim->xport == USB_GADGET_XPORT_BAM2BAM_IPA
					&& gadget_is_dwc3(cdev->gadget)) {
					if (msm_ep_config(mbim->bam_port.in) ||
					   msm_ep_config(mbim->bam_port.out)) {
						pr_err("%s: ep_config failed\n",
							__func__);
						goto fail;
					}
				}

				pr_debug("Activate mbim\n");
				mbim_bam_connect(mbim);

@@ -1369,6 +1379,7 @@ static int mbim_get_alt(struct usb_function *f, unsigned intf)
static void mbim_disable(struct usb_function *f)
{
	struct f_mbim	*mbim = func_to_mbim(f);
	struct usb_composite_dev *cdev = mbim->cdev;

	pr_info("SET DEVICE OFFLINE");
	atomic_set(&mbim->online, 0);
@@ -1378,6 +1389,12 @@ static void mbim_disable(struct usb_function *f)
	mbim_clear_queues(mbim);
	mbim_reset_function_queue(mbim);

	if (mbim->xport == USB_GADGET_XPORT_BAM2BAM_IPA &&
			gadget_is_dwc3(cdev->gadget)) {
		msm_ep_unconfig(mbim->bam_port.out);
		msm_ep_unconfig(mbim->bam_port.in);
	}

	mbim_bam_disconnect(mbim);

	if (mbim->not_port.notify->driver_data) {
+4 −10
Original line number Diff line number Diff line
@@ -264,9 +264,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
				__func__, ret);
			return;
		}
		if ((d->func_type == USB_FUNC_RNDIS ||
			d->func_type == USB_FUNC_ECM) &&
			gadget_is_dwc3(gadget)) {
		if (gadget_is_dwc3(gadget)) {
			u8 idx;
			struct usb_bam_data_connect_info bam_info;

@@ -304,9 +302,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
				__func__, ret);
			return;
		}
		if ((d->func_type == USB_FUNC_RNDIS ||
			d->func_type == USB_FUNC_ECM)
			&& gadget_is_dwc3(gadget)) {
		if (gadget_is_dwc3(gadget)) {
			u8 idx;
			struct usb_bam_data_connect_info bam_info;

@@ -409,8 +405,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
	d->rx_req->length = 0;
	d->rx_req->no_interrupt = 1;

	if ((d->func_type == USB_FUNC_RNDIS || d->func_type == USB_FUNC_ECM)
		&& gadget_is_dwc3(gadget)) {
	if (gadget_is_dwc3(gadget)) {
		sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | MSM_PRODUCER |
			d->src_pipe_idx;
		d->rx_req->length = 32*1024;
@@ -428,8 +423,7 @@ static void bam2bam_data_connect_work(struct work_struct *w)
	d->tx_req->length = 0;
	d->tx_req->no_interrupt = 1;

	if ((d->func_type == USB_FUNC_RNDIS || d->func_type == USB_FUNC_ECM)
		&& gadget_is_dwc3(gadget)) {
	if (gadget_is_dwc3(gadget)) {
		sps_params = MSM_SPS_MODE | MSM_DISABLE_WB | d->dst_pipe_idx;
		d->tx_req->length = 32*1024;
	} else