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;
}
Ejemplo n.º 2
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;
}