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

Commit f8d858cd authored by Ido Shayevitz's avatar Ido Shayevitz
Browse files

usb: gadget: Fix f_rmnet enumeration with destroyed gbam_wq and ports



Commit '5a8d1e95' 'usb: gadget: Fix race condition in enable\disable
Rmnet device' introduce a bug in which we destroy the gbam ports and
gbam workqueue while these are allocated only once on first and only
bind config.

CRs-Fixed: 544296
Change-Id: Id0ca37119fef107ca632bfd9154449793c7bca66
Signed-off-by: default avatarIdo Shayevitz <idos@codeaurora.org>
parent 66d0b021
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -595,12 +595,8 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev)
static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f)
{
	struct f_rmnet *dev = func_to_rmnet(f);
	enum transport_type	dxport = rmnet_ports[dev->port_num].data_xport;

	pr_debug("%s: portno:%d\n", __func__, dev->port_num);
	if ((dxport == USB_GADGET_XPORT_BAM2BAM ||
		 dxport == USB_GADGET_XPORT_BAM2BAM_IPA))
			gbam_destroy(dev->port_num);
	if (gadget_is_superspeed(c->cdev->gadget))
		usb_free_descriptors(f->ss_descriptors);
	if (gadget_is_dualspeed(c->cdev->gadget))
+0 −15
Original line number Diff line number Diff line
@@ -1428,17 +1428,6 @@ int gbam_connect(struct grmnet *gr, u8 port_num,
	return 0;
}

int gbam_destroy(unsigned int no_bam2bam_port)
{
	pr_debug("bam_destroy: Freeing ports\n");
	gbam2bam_port_free(no_bam2bam_port);
	if (gbam_wq)
		destroy_workqueue(gbam_wq);
	gbam_wq = NULL;

	return 0;
}

int gbam_setup(unsigned int no_bam_port, unsigned int no_bam2bam_port)
{
	int	i;
@@ -1453,10 +1442,6 @@ int gbam_setup(unsigned int no_bam_port, unsigned int no_bam2bam_port)
				__func__, no_bam_port, no_bam2bam_port);
		return -EINVAL;
	}
	if (gbam_wq) {
		pr_debug("bam is already setup");
		return 0;
	}

	gbam_wq = alloc_workqueue("k_gbam", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
	if (!gbam_wq) {
+0 −1
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num,
	enum transport_type trans);
void gbam_suspend(struct grmnet *gr, u8 port_num, enum transport_type trans);
void gbam_resume(struct grmnet *gr, u8 port_num, enum transport_type trans);
int gbam_destroy(unsigned int no_bam2bam_port);
int gsmd_ctrl_connect(struct grmnet *gr, int port_num);
void gsmd_ctrl_disconnect(struct grmnet *gr, u8 port_num);
int gsmd_ctrl_setup(enum ctrl_client client_num, unsigned int count,