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

Commit f0331928 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "USB: gadget: add BAM-DMUX transport for DPL function"

parents 326aaa81 59ebcf71
Loading
Loading
Loading
Loading
+50 −3
Original line number Diff line number Diff line
@@ -24,11 +24,13 @@
#include "u_qdss.c"
#include "usb_gadget_xport.h"
#include "u_data_ipa.h"
#include "u_rmnet.h"

static unsigned int nr_qdss_ports;
static unsigned int no_data_bam_ports;
static unsigned int data_hsic_ports_no;
static unsigned int no_ipa_ports;
static unsigned int no_bam_dmux_ports;

static struct qdss_ports {
	enum transport_type		data_xport;
@@ -38,6 +40,7 @@ static struct qdss_ports {
	unsigned	char		port_num;
	struct f_qdss			*port;
	struct gadget_ipa_port		ipa_port;
	struct grmnet			bam_dmux_port;
} qdss_ports[NR_QDSS_PORTS];


@@ -539,6 +542,10 @@ static void usb_qdss_disconnect_work(struct work_struct *work)
		gp = &qdss_ports[qdss->port_num].ipa_port;
		ipa_data_disconnect(gp, qdss->port_num);
		break;
	case USB_GADGET_XPORT_BAM_DMUX:
		gbam_disconnect(&qdss_ports[qdss->port_num].bam_dmux_port,
				portno, USB_GADGET_XPORT_BAM);
		break;
	case USB_GADGET_XPORT_HSIC:
		pr_debug("usb_qdss_disconnect_work: HSIC transport\n");
		ghsic_data_disconnect(&qdss->port, portno);
@@ -582,6 +589,7 @@ static void qdss_disable(struct usb_function *f)
	qdss->usb_connected = 0;
	switch (dxport) {
	case USB_GADGET_XPORT_BAM2BAM_IPA:
	case USB_GADGET_XPORT_BAM_DMUX:
		spin_unlock_irqrestore(&qdss->lock, flags);
		usb_qdss_disconnect_work(&qdss->disconnect_w);
		return;
@@ -717,6 +725,16 @@ static void usb_qdss_connect_work(struct work_struct *work)
		}
		qdss->data_enabled = 1;
		break;
	case USB_GADGET_XPORT_BAM_DMUX:
		qdss_ports[qdss->port_num].bam_dmux_port.gadget =
						qdss->cdev->gadget;
		qdss_ports[qdss->port_num].bam_dmux_port.in =
						qdss->port.data;
		status = gbam_connect(&qdss_ports[qdss->port_num].bam_dmux_port,
				port_num, USB_GADGET_XPORT_BAM, 0, 0);
		if (status)
			pr_err("BAM_DMUX connect failed with %d\n", status);
		break;
	case USB_GADGET_XPORT_HSIC:
		pr_debug("usb_qdss_connect_work: HSIC transport\n");
		status = ghsic_data_connect(&qdss->port, port_num);
@@ -770,7 +788,8 @@ static int qdss_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
			goto fail;
		}

		if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA) {
		if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA ||
				dxport == USB_GADGET_XPORT_BAM_DMUX) {
			qdss->usb_connected = 1;
			usb_qdss_connect_work(&qdss->connect_w);
			return 0;
@@ -1163,6 +1182,9 @@ static int qdss_init_port(const char *ctrl_name, const char *data_name,
		return -EINVAL;
	}

	pr_debug("ctrl name = %s data_name %s port_name %s\n",
			ctrl_name, data_name, port_name);

	pr_debug("%s: port#:%d, data port: %s\n",
		__func__, nr_qdss_ports, data_name);

@@ -1211,6 +1233,11 @@ static int qdss_init_port(const char *ctrl_name, const char *data_name,
		qdss_port->data_xport_num = data_hsic_ports_no;
		data_hsic_ports_no++;
		break;
	case USB_GADGET_XPORT_BAM_DMUX:
		qdss_port->data_xport_num = no_bam_dmux_ports;
		no_bam_dmux_ports++;
		pr_debug("USB_GADGET_XPORT_BAM_DMUX %u\n", no_bam_dmux_ports);
		break;
	case USB_GADGET_XPORT_NONE:
		break;
	default:
@@ -1230,6 +1257,7 @@ fail_probe:
	no_data_bam_ports = 0;
	data_hsic_ports_no = 0;
	no_ipa_ports = 0;
	no_bam_dmux_ports = 0;
	return ret;
}

@@ -1238,9 +1266,9 @@ static int qdss_gport_setup(void)
	int	port_idx;
	int	i;

	pr_debug("%s: bam ports: %u data hsic ports: %u nr_qdss_ports: %u ipa_ports:%u\n",
	pr_debug("%s: bam ports: %u data hsic ports: %u ipa_ports:%u bam_dmux_port:%u nr_qdss_ports:%u\n",
			__func__, no_data_bam_ports, data_hsic_ports_no,
			nr_qdss_ports, no_ipa_ports);
			no_ipa_ports, no_bam_dmux_ports, nr_qdss_ports);

	if (data_hsic_ports_no) {
		pr_debug("%s: go to setup hsic data\n", __func__);
@@ -1279,5 +1307,24 @@ static int qdss_gport_setup(void)
		}
	}

	if (no_bam_dmux_ports) {
		port_idx = gbam_setup(no_bam_dmux_ports);
		if (port_idx < 0) {
			pr_err("%s(): gbam_setup failed with %d\n",
					__func__, port_idx);
			return port_idx;
		}

		for (i = 0; i < no_bam_dmux_ports; i++) {
			if (qdss_ports[i].data_xport ==
					USB_GADGET_XPORT_BAM_DMUX) {
				qdss_ports[i].data_xport_num = port_idx;
				pr_debug("%s: BAM-DMUX data_xport_num = %d\n",
					__func__, qdss_ports[i].data_xport_num);
				port_idx++;
			}
		}
	}

	return 0;
}
+33 −9
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ static unsigned int no_ctrl_smd_ports;
static unsigned int no_ctrl_qti_ports;
static unsigned int no_ctrl_hsic_ports;
static unsigned int no_ctrl_hsuart_ports;
static unsigned int no_data_bam_ports;
static unsigned int no_data_bam2bam_ports;
static unsigned int no_data_hsic_ports;
static unsigned int no_data_hsuart_ports;
@@ -310,16 +311,22 @@ static int rmnet_gport_setup(void)
	int	i;
	u8 base;

	pr_debug("%s: bam2bam ports: %u data hsic ports: %u data hsuart ports: %u"
	pr_debug("%s: bam ports: %u bam2bam ports: %u data hsic ports: %u data hsuart ports: %u"
		" smd ports: %u ctrl hsic ports: %u ctrl hsuart ports: %u"
		" nr_rmnet_ports: %u\n",
		__func__, no_data_bam2bam_ports, no_data_hsic_ports,
		no_data_hsuart_ports, no_ctrl_smd_ports, no_ctrl_hsic_ports,
		no_ctrl_hsuart_ports, nr_rmnet_ports);
		__func__, no_data_bam_ports, no_data_bam2bam_ports,
		no_data_hsic_ports, no_data_hsuart_ports, no_ctrl_smd_ports,
		no_ctrl_hsic_ports, no_ctrl_hsuart_ports, nr_rmnet_ports);

	if (no_data_bam_ports) {
		ret = gbam_setup(no_data_bam_ports);
		if (ret < 0)
			return ret;
	}

	if (no_data_bam2bam_ports) {
		ret = gbam_setup(no_data_bam2bam_ports);
		if (ret)
		ret = gbam2bam_setup(no_data_bam2bam_ports);
		if (ret < 0)
			return ret;
	}

@@ -429,6 +436,16 @@ static int gport_rmnet_connect(struct f_rmnet *dev, unsigned intf)
			gsmd_ctrl_disconnect(&dev->port, port_num);
			return -EINVAL;
		}
	case USB_GADGET_XPORT_BAM:
		ret = gbam_connect(&dev->port, port_num,
			dxport, src_connection_idx, dst_connection_idx);
		if (ret) {
			pr_err("%s: gbam_connect failed: err:%d\n",
				__func__, ret);
			gsmd_ctrl_disconnect(&dev->port, port_num);
			return ret;
		}
		break;
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		src_connection_idx = usb_bam_get_connection_idx(gadget->name,
			IPA_P_BAM, USB_TO_PEER_PERIPHERAL, USB_BAM_DEVICE,
@@ -482,7 +499,6 @@ static int gport_rmnet_connect(struct f_rmnet *dev, unsigned intf)
		break;
	case USB_GADGET_XPORT_NONE:
		 break;
	case USB_GADGET_XPORT_BAM:
	default:
		pr_err("%s: Un-supported transport: %s\n", __func__,
				xport_to_str(dxport));
@@ -523,6 +539,7 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev)

	port_num = rmnet_ports[dev->port_num].data_xport_num;
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		gbam_disconnect(&dev->port, port_num, dxport);
@@ -535,7 +552,6 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev)
		break;
	case USB_GADGET_XPORT_NONE:
		break;
	case USB_GADGET_XPORT_BAM:
	default:
		pr_err("%s: Un-supported transport: %s\n", __func__,
				xport_to_str(dxport));
@@ -601,6 +617,8 @@ static void frmnet_suspend(struct usb_function *f)

	port_num = rmnet_ports[dev->port_num].data_xport_num;
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
		break;
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		if (remote_wakeup_allowed) {
@@ -654,6 +672,8 @@ static void frmnet_resume(struct usb_function *f)

	port_num = rmnet_ports[dev->port_num].data_xport_num;
	switch (dxport) {
	case USB_GADGET_XPORT_BAM:
		break;
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		if (remote_wakeup_allowed) {
@@ -1327,6 +1347,7 @@ static void frmnet_cleanup(void)
	for (i = 0; i < nr_rmnet_ports; i++)
		kfree(rmnet_ports[i].port);

	gbam_cleanup();
	nr_rmnet_ports = 0;
	no_ctrl_smd_ports = 0;
	no_ctrl_qti_ports = 0;
@@ -1399,6 +1420,10 @@ static int frmnet_init_port(const char *ctrl_name, const char *data_name,
	}

	switch (rmnet_port->data_xport) {
	case USB_GADGET_XPORT_BAM:
		rmnet_port->data_xport_num = no_data_bam_ports;
		no_data_bam_ports++;
		break;
	case USB_GADGET_XPORT_BAM2BAM:
	case USB_GADGET_XPORT_BAM2BAM_IPA:
		rmnet_port->data_xport_num = no_data_bam2bam_ports;
@@ -1416,7 +1441,6 @@ static int frmnet_init_port(const char *ctrl_name, const char *data_name,
	case USB_GADGET_XPORT_ETHER:
	case USB_GADGET_XPORT_NONE:
		break;
	case USB_GADGET_XPORT_BAM:
	default:
		pr_err("%s: Un-supported transport: %u\n", __func__,
				rmnet_port->data_xport);
+878 −135

File changed.

Preview size limit exceeded, changes collapsed.

+8 −9
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
#include <linux/poll.h>
#include <linux/usb/usb_ctrl_qti.h>

#include <soc/qcom/bam_dmux.h>

#include "u_rmnet.h"
#include "usb_gadget_xport.h"
@@ -169,7 +170,6 @@ gqti_ctrl_notify_modem(void *gptr, u8 portno, int val)
	qti_ctrl_queue_notify(port);
}

#define BAM_DMUX_CHANNEL_ID 8
int gqti_ctrl_connect(void *gr, u8 port_num, unsigned intf,
			enum transport_type dxport, enum gadget_type gtype)
{
@@ -192,22 +192,21 @@ int gqti_ctrl_connect(void *gr, u8 port_num, unsigned intf,

	spin_lock_irqsave(&port->lock, flags);
	port->gtype = gtype;
	if (dxport == USB_GADGET_XPORT_BAM) {
	if (dxport == USB_GADGET_XPORT_BAM ||
			dxport == USB_GADGET_XPORT_BAM_DMUX) {
		/*
		 * BAM-DMUX data transport is used for RMNET
		 * BAM-DMUX data transport is used for RMNET and DPL
		 * on some targets where IPA is not available.
		 * Set endpoint type as BAM-DMUX and interface
		 * id as channel number. This information is
		 * sent to user space via EP_LOOKUP ioctl.
		 *
		 * The BAM data transport driver supports only
		 * 1 BAM channel and the number is fixed so far
		 * on all targets. This number needs to be same
		 * as the bam_ch_ids defined in u_bam.c.
		 *
		 */

		port->ep_type = DATA_EP_TYPE_BAM_DMUX;
		port->intf = BAM_DMUX_CHANNEL_ID;
		port->intf = (gtype == USB_GADGET_RMNET) ?
			BAM_DMUX_USB_RMNET_0 :
			BAM_DMUX_USB_DPL;
		port->ipa_prod_idx = 0;
		port->ipa_cons_idx = 0;
	} else {
+3 −1
Original line number Diff line number Diff line
@@ -58,7 +58,9 @@ enum ctrl_client {
	NR_CTRL_CLIENTS
};

int gbam_setup(unsigned int no_bam2bam_port);
int gbam_setup(unsigned int no_bam_port);
int gbam2bam_setup(unsigned int no_bam2bam_port);
void gbam_cleanup(void);
int gbam_connect(struct grmnet *gr, u8 port_num,
	enum transport_type trans, u8 src_connection_idx,
	u8 dst_connection_idx);
Loading