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

Commit e57bb0f0 authored by Amit Blay's avatar Amit Blay Committed by Stephen Boyd
Browse files

usb: gadget: Add remote wakeup support to f_qc_ecm



On USB suspend, f_qc_ecm will register for BAM wakeup notification.
Upon wakeup event from the BAM, the u_bam_data will trigger a USB
remote wakeup.

Change-Id: I8a12030a9b9e5aeb584617280341ab4a6170adcb
Signed-off-by: default avatarLena Salman <esalman@codeaurora.org>
Signed-off-by: default avatarAmit Blay <ablay@codeaurora.org>
parent eda002fc
Loading
Loading
Loading
Loading
+25 −9
Original line number Original line Diff line number Diff line
@@ -75,6 +75,7 @@ struct f_ecm_qc {
	struct usb_request		*notify_req;
	struct usb_request		*notify_req;
	u8				notify_state;
	u8				notify_state;
	bool				is_open;
	bool				is_open;
	struct data_port		bam_port;
};
};


static struct ecm_ipa_params ipa_params;
static struct ecm_ipa_params ipa_params;
@@ -111,8 +112,9 @@ static inline unsigned ecm_qc_bitrate(struct usb_gadget *g)
#define ECM_QC_LOG2_STATUS_INTERVAL_MSEC	5	/* 1 << 5 == 32 msec */
#define ECM_QC_LOG2_STATUS_INTERVAL_MSEC	5	/* 1 << 5 == 32 msec */
#define ECM_QC_STATUS_BYTECOUNT		16	/* 8 byte header + data */
#define ECM_QC_STATUS_BYTECOUNT		16	/* 8 byte header + data */


/* currently only one std ecm instance is supported */
/* Currently only one std ecm instance is supported - port index 0. */
#define ECM_QC_NO_PORTS						1
#define ECM_QC_NO_PORTS						1
#define ECM_QC_ACTIVE_PORT					0


/* interface descriptor: */
/* interface descriptor: */


@@ -296,8 +298,6 @@ static struct usb_gadget_strings *ecm_qc_strings[] = {
	NULL,
	NULL,
};
};


static struct data_port ecm_qc_bam_port;

static void ecm_qc_do_notify(struct f_ecm_qc *ecm)
static void ecm_qc_do_notify(struct f_ecm_qc *ecm)
{
{
	struct usb_request		*req = ecm->notify_req;
	struct usb_request		*req = ecm->notify_req;
@@ -388,10 +388,10 @@ static int ecm_qc_bam_connect(struct f_ecm_qc *dev)
	enum peer_bam peer_bam = (dev->xport == USB_GADGET_XPORT_BAM2BAM_IPA) ?
	enum peer_bam peer_bam = (dev->xport == USB_GADGET_XPORT_BAM2BAM_IPA) ?
		IPA_P_BAM : A2_P_BAM;
		IPA_P_BAM : A2_P_BAM;


	ecm_qc_bam_port.cdev = cdev;
	dev->bam_port.cdev = cdev;
	ecm_qc_bam_port.func = &dev->port.func;
	dev->bam_port.func = &dev->port.func;
	ecm_qc_bam_port.in = dev->port.in_ep;
	dev->bam_port.in = dev->port.in_ep;
	ecm_qc_bam_port.out = dev->port.out_ep;
	dev->bam_port.out = dev->port.out_ep;


	/* currently we use the first connection */
	/* currently we use the first connection */
	src_connection_idx = usb_bam_get_connection_idx(gadget->name, peer_bam,
	src_connection_idx = usb_bam_get_connection_idx(gadget->name, peer_bam,
@@ -402,7 +402,7 @@ static int ecm_qc_bam_connect(struct f_ecm_qc *dev)
		pr_err("%s: usb_bam_get_connection_idx failed\n", __func__);
		pr_err("%s: usb_bam_get_connection_idx failed\n", __func__);
		return ret;
		return ret;
	}
	}
	ret = bam_data_connect(&ecm_qc_bam_port, 0, dev->xport,
	ret = bam_data_connect(&dev->bam_port, 0, dev->xport,
		src_connection_idx, dst_connection_idx, USB_FUNC_ECM);
		src_connection_idx, dst_connection_idx, USB_FUNC_ECM);
	if (ret) {
	if (ret) {
		pr_err("bam_data_connect failed: err:%d\n", ret);
		pr_err("bam_data_connect failed: err:%d\n", ret);
@@ -421,7 +421,7 @@ static int ecm_qc_bam_disconnect(struct f_ecm_qc *dev)
{
{
	pr_debug("dev:%p. Disconnect BAM.\n", dev);
	pr_debug("dev:%p. Disconnect BAM.\n", dev);


	bam_data_disconnect(&ecm_qc_bam_port, 0);
	bam_data_disconnect(&dev->bam_port, 0);


	return 0;
	return 0;
}
}
@@ -656,6 +656,20 @@ static void ecm_qc_disable(struct usb_function *f)
	}
	}
}
}


static void ecm_qc_suspend(struct usb_function *f)
{
	pr_debug("ecm suspended\n");

	bam_data_suspend(ECM_QC_ACTIVE_PORT);
}

static void ecm_qc_resume(struct usb_function *f)
{
	pr_debug("ecm resumed\n");

	bam_data_resume(ECM_QC_ACTIVE_PORT);
}

/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/


/*
/*
@@ -939,6 +953,8 @@ ecm_qc_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
	ecm->port.func.get_alt = ecm_qc_get_alt;
	ecm->port.func.get_alt = ecm_qc_get_alt;
	ecm->port.func.setup = ecm_qc_setup;
	ecm->port.func.setup = ecm_qc_setup;
	ecm->port.func.disable = ecm_qc_disable;
	ecm->port.func.disable = ecm_qc_disable;
	ecm->port.func.suspend = ecm_qc_suspend;
	ecm->port.func.resume = ecm_qc_resume;


	status = usb_add_function(c, &ecm->port.func);
	status = usb_add_function(c, &ecm->port.func);
	if (status) {
	if (status) {