static int bam_data_peer_reset_cb(void *param) { struct bam_data_port *port = (struct bam_data_port *)param; struct bam_data_ch_info *d; int ret; d = &port->data_ch; pr_debug("%s: reset by peer\n", __func__); msm_hw_bam_disable(1); ret = usb_bam_a2_reset(0); if (ret) { pr_err("%s: BAM reset failed %d\n", __func__, ret); return ret; } msm_hw_bam_disable(0); usb_bam_register_peer_reset_cb(NULL, NULL); return 0; }
static int bam_data_peer_reset_cb(void *param) { struct bam_data_port *port = (struct bam_data_port *)param; struct bam_data_ch_info *d; int ret; bool reenable_eps = false; d = &port->data_ch; pr_debug("%s: reset by peer\n", __func__); /* Disable the relevant EPs if currently EPs are enabled */ if (port->port_usb && port->port_usb->in && port->port_usb->in->driver_data) { usb_ep_disable(port->port_usb->out); usb_ep_disable(port->port_usb->in); port->port_usb->in->driver_data = NULL; port->port_usb->out->driver_data = NULL; reenable_eps = true; } /* Disable BAM */ msm_hw_bam_disable(1); /* Reset BAM */ ret = usb_bam_reset(); if (ret) { pr_err("%s: BAM reset failed %d\n", __func__, ret); goto reenable_eps; } /* Enable BAM */ msm_hw_bam_disable(0); reenable_eps: /* Re-Enable the relevant EPs, if EPs were originally enabled */ if (reenable_eps) { ret = usb_ep_enable(port->port_usb->in); if (ret) { pr_err("%s: usb_ep_enable failed eptype:IN ep:%p", __func__, port->port_usb->in); return ret; } port->port_usb->in->driver_data = port; ret = usb_ep_enable(port->port_usb->out); if (ret) { pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p", __func__, port->port_usb->out); port->port_usb->in->driver_data = 0; return ret; } port->port_usb->out->driver_data = port; bam_data_start_endless_rx(port); bam_data_start_endless_tx(port); } /* Unregister the peer reset callback */ usb_bam_register_peer_reset_cb(d->connection_idx, NULL, NULL); return 0; }