コード例 #1
0
static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
	struct f_gser		*gser = func_to_gser(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	int rc = 0;

	/* we know alt == 0, so this is an activation or a reset */

#ifdef CONFIG_MODEM_SUPPORT
	if (gser->notify->driver_data) {
		DBG(cdev, "reset generic ctl ttyGS%d\n", gser->port_num);
		usb_ep_disable(gser->notify);
	}

	if (!gser->notify->desc) {
		if (config_ep_by_speed(cdev->gadget, f, gser->notify)) {
			gser->notify->desc = NULL;
			return -EINVAL;
		}
	}
	rc = usb_ep_enable(gser->notify);

	if (rc) {
		ERROR(cdev, "can't enable %s, result %d\n",
					gser->notify->name, rc);
		return rc;
	}
	gser->notify->driver_data = gser;
#endif

	if (gser->port.in->driver_data) {
		DBG(cdev, "reset generic data ttyGS%d\n", gser->port_num);
		gport_disconnect(gser);
	}
	if (!gser->port.in->desc || !gser->port.out->desc) {
		DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
		if (config_ep_by_speed(cdev->gadget, f, gser->port.in) ||
		    config_ep_by_speed(cdev->gadget, f, gser->port.out)) {
			gser->port.in->desc = NULL;
			gser->port.out->desc = NULL;
			return -EINVAL;
		}
	}

#ifdef FEATURE_PANTECH_MODEM_REOPEN_DELAY
	schedule_delayed_work(&gser->connect_work, msecs_to_jiffies(50));
#else
	gport_connect(gser);
#endif
	gser->online = 1;
#ifdef CONFIG_ANDROID_PANTECH_USB_MANAGER
	usb_interface_enum_cb(ACM_TYPE_FLAG);
#endif
	return rc;
}
コード例 #2
0
ファイル: f_serial.c プロジェクト: sndnvaps/G718c_kernel
static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
	struct f_gser		*gser = func_to_gser(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	int rc = 0;

	/* we know alt == 0, so this is an activation or a reset */

#ifdef CONFIG_MODEM_SUPPORT
	if (gser->notify->driver_data) {
		DBG(cdev, "reset generic ctl ttyGS%d\n", gser->port_num);
		usb_ep_disable(gser->notify);
	}

	if (!gser->notify->desc) {
		if (config_ep_by_speed(cdev->gadget, f, gser->notify)) {
			gser->notify->desc = NULL;
			return -EINVAL;
		}
	}
	rc = usb_ep_enable(gser->notify);

	if (rc) {
		ERROR(cdev, "can't enable %s, result %d\n",
					gser->notify->name, rc);
		return rc;
	}
	gser->notify->driver_data = gser;
#endif

	if (gser->port.in->driver_data) {
		DBG(cdev, "reset generic data ttyGS%d\n", gser->port_num);
		gport_disconnect(gser);
	}
	if (!gser->port.in->desc || !gser->port.out->desc) {
		DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
		if (config_ep_by_speed(cdev->gadget, f, gser->port.in) ||
		    config_ep_by_speed(cdev->gadget, f, gser->port.out)) {
			gser->port.in->desc = NULL;
			gser->port.out->desc = NULL;
			return -EINVAL;
		}
	}

	gport_connect(gser);

	gser->online = 1;

#if defined(CONFIG_USB_AT)

	gserial_ports[gser->port_num].enable = gser->online;
#endif

	return rc;
}
コード例 #3
0
ファイル: f_hid.c プロジェクト: acuicultor/Radioactive-kernel
static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
    struct usb_composite_dev		*cdev = f->config->cdev;
    struct f_hidg				*hidg = func_to_hidg(f);
    int status = 0;

    VDBG(cdev, "hidg_set_alt intf:%d alt:%d\n", intf, alt);

    if (hidg->in_ep != NULL) {
        /* restart endpoint */
        if (hidg->in_ep->driver_data != NULL)
            usb_ep_disable(hidg->in_ep);

        status = config_ep_by_speed(f->config->cdev->gadget, f,
                                    hidg->in_ep);
        if (status) {
            ERROR(cdev, "config_ep_by_speed FAILED!\n");
            goto fail;
        }
        status = usb_ep_enable(hidg->in_ep);
        if (status < 0) {
            ERROR(cdev, "Enable endpoint FAILED!\n");
            goto fail;
        }
        hidg->in_ep->driver_data = hidg;
    }
fail:
    return status;
}
コード例 #4
0
ファイル: u_ether.c プロジェクト: jekapaty/SebastianFM-kernel
static int eth_stop(struct net_device *net)
{
    struct eth_dev	*dev = netdev_priv(net);
    unsigned long	flags;

    VDBG(dev, "%s\n", __func__);
    netif_stop_queue(net);

    DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n",
        dev->net->stats.rx_packets, dev->net->stats.tx_packets,
        dev->net->stats.rx_errors, dev->net->stats.tx_errors
       );


    spin_lock_irqsave(&dev->lock, flags);
    if (dev->port_usb) {
        struct gether	*link = dev->port_usb;
        const struct usb_endpoint_descriptor *in;
        const struct usb_endpoint_descriptor *out;

        if (link->close)
            link->close(link);

        in = link->in_ep->desc;
        out = link->out_ep->desc;
        usb_ep_disable(link->in_ep);
        usb_ep_disable(link->out_ep);
        if (netif_carrier_ok(net)) {
            if (config_ep_by_speed(dev->gadget, &link->func,
                                   link->in_ep) ||
                    config_ep_by_speed(dev->gadget, &link->func,
                                       link->out_ep)) {
                link->in_ep->desc = NULL;
                link->out_ep->desc = NULL;
                return -EINVAL;
            }
            DBG(dev, "host still using in/out endpoints\n");
            link->in_ep->desc = in;
            link->out_ep->desc = out;
            usb_ep_enable(link->in_ep);
            usb_ep_enable(link->out_ep);
        }
    }
    spin_unlock_irqrestore(&dev->lock, flags);

    return 0;
}
コード例 #5
0
static int acc_function_set_alt(struct usb_function *f,
		unsigned intf, unsigned alt)
{
	struct acc_dev	*dev = func_to_dev(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	int ret;

	DBG(cdev, "acc_function_set_alt intf: %d alt: %d\n", intf, alt);

	ret = config_ep_by_speed(cdev->gadget, f, dev->ep_in);
	if (ret) {
		dev->ep_in->desc = NULL;
		ERROR(cdev, "config_ep_by_speed failes for ep %s, result %d\n",
				dev->ep_in->name, ret);
			return ret;
	}
	ret = usb_ep_enable(dev->ep_in);
	if (ret) {
		ERROR(cdev, "failed to enable ep %s, result %d\n",
			dev->ep_in->name, ret);
		return ret;
	}

	ret = config_ep_by_speed(cdev->gadget, f, dev->ep_out);
	if (ret) {
		dev->ep_out->desc = NULL;
		ERROR(cdev, "config_ep_by_speed failes for ep %s, result %d\n",
			dev->ep_out->name, ret);
		usb_ep_disable(dev->ep_in);
		return ret;
	}
	ret = usb_ep_enable(dev->ep_out);
	if (ret) {
		ERROR(cdev, "failed to enable ep %s, result %d\n",
				dev->ep_out->name, ret);
		usb_ep_disable(dev->ep_in);
		return ret;
	}

	dev->online = 1;

	/* readers may be blocked waiting for us to go online */
	wake_up(&dev->read_wq);
	return 0;
}
コード例 #6
0
ファイル: f_acm.c プロジェクト: tinocyngn/sofia-kernel
static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
	struct f_acm		*acm = func_to_acm(f);
	struct usb_composite_dev *cdev = f->config->cdev;

	/* we know alt == 0, so this is an activation or a reset */

	if (intf == acm->ctrl_id) {
		if (acm->notify->driver_data) {
			VDBG(cdev, "reset acm control interface %d\n", intf);
			usb_ep_disable(acm->notify);
		}

		if (!acm->notify->desc)
			if (config_ep_by_speed(cdev->gadget, f, acm->notify))
				return -EINVAL;

		usb_ep_enable(acm->notify);
		acm->notify->driver_data = acm;

	} else if (intf == acm->data_id) {
		if (acm->port.in->driver_data) {
			DBG(cdev, "reset acm ttyGS%d\n", acm->port_num);
			gserial_disconnect(&acm->port);
		}
		if (!acm->port.in->desc || !acm->port.out->desc) {
			DBG(cdev, "activate acm ttyGS%d\n", acm->port_num);
			if (config_ep_by_speed(cdev->gadget, f,
					       acm->port.in) ||
			    config_ep_by_speed(cdev->gadget, f,
					       acm->port.out)) {
				acm->port.in->desc = NULL;
				acm->port.out->desc = NULL;
				return -EINVAL;
			}
		}
		gserial_connect(&acm->port, acm->port_num);

	} else
		return -EINVAL;

	return 0;
}
コード例 #7
0
static int dtf_function_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
	struct dtf_dev *dev = func_to_dtf(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	int ret;
	int set_alt_end = 0;
	int speed_check = 0;

	_dbgmsg("dtf_function_set_alt(intf=%d,alt=%d)\n", intf, alt);

	if( dev->pg.mCtrl_id == intf ) {
		_dbgmsg_gadget( "usb_ep_enable(%s)\n", dev->pg.ep_intr->name );
		ret = config_ep_by_speed(cdev->gadget, f, dev->pg.ep_intr);
		if (ret) {
			dev->pg.ep_intr->desc = NULL;
			_dbgmsg("config_ep_by_speed failes for ep %s, result %d\n",
					dev->pg.ep_intr->name, ret);
			return ret;
		}
		ret = usb_ep_enable(dev->pg.ep_intr);
		if( ret ) {
			_dbgmsg( "usb_ep_enable error pg1 ep_intr ret = %d\n", ret );
			return ret;
		}
        dev->mCtrl_ep_enbl = 1;
	} else if( dev->pg.mData_id == intf ) {
		_dbgmsg_gadget( "usb_ep_enable(%s)\n", dev->pg.ep_in->name );
		ret = config_ep_by_speed(cdev->gadget, f, dev->pg.ep_in);
		if (ret) {
			dev->pg.ep_in->desc = NULL;
			_dbgmsg("config_ep_by_speed failes for ep %s, result %d\n",
					dev->pg.ep_in->name, ret);
			return ret;
		}
		ret = usb_ep_enable(dev->pg.ep_intr);
		if( ret ) {
			_dbgmsg( "usb_ep_enable error pg1 ep_in ret = %d\n", ret );
			return ret;
		}
		_dbgmsg_gadget( "usb_ep_enable(%s)\n", dev->pg.ep_out->name );
		ret = config_ep_by_speed(cdev->gadget, f, dev->pg.ep_out);
		if (ret) {
			dev->pg.ep_out->desc = NULL;
			_dbgmsg("config_ep_by_speed failes for ep %s, result %d\n",
					dev->pg.ep_intr->name, ret);
			return ret;
		}
		ret = usb_ep_enable(dev->pg.ep_out);
		if( ret ) {
			_dbgmsg( "usb_ep_enable error pg1 ep_out ret = %d\n", ret );
			usb_ep_disable(dev->pg.ep_in);
			return ret;
		}

		dev->pg.mReq_out->length = 512;
		usb_ep_queue( dev->pg.ep_out, dev->pg.mReq_out, GFP_ATOMIC );
        dev->mData_ep_enbl = 1;

	} else {
		_dbgmsg( "unknown interface number\n" );
	}

	set_alt_end = (
		(dev->mCtrl_ep_enbl) & (dev->mData_ep_enbl) );
	speed_check = (dev->cdev->gadget->speed == USB_SPEED_HIGH)?(1):(0);

	if (set_alt_end == 1)
	{
		dtf_if_out_set_alt( speed_check );
	}

	return 0;
}
コード例 #8
0
ファイル: f_uvc.c プロジェクト: 7799/linux
static int
uvc_function_set_alt(struct usb_function *f, unsigned interface, unsigned alt)
{
	struct uvc_device *uvc = to_uvc(f);
	struct v4l2_event v4l2_event;
	struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;
	int ret;

	INFO(f->config->cdev, "uvc_function_set_alt(%u, %u)\n", interface, alt);

	if (interface == uvc->control_intf) {
		if (alt)
			return -EINVAL;

		if (uvc->state == UVC_STATE_DISCONNECTED) {
			memset(&v4l2_event, 0, sizeof(v4l2_event));
			v4l2_event.type = UVC_EVENT_CONNECT;
			uvc_event->speed = f->config->cdev->gadget->speed;
			v4l2_event_queue(uvc->vdev, &v4l2_event);

			uvc->state = UVC_STATE_CONNECTED;
		}

		return 0;
	}

	if (interface != uvc->streaming_intf)
		return -EINVAL;

	/* TODO
	if (usb_endpoint_xfer_bulk(&uvc->desc.vs_ep))
		return alt ? -EINVAL : 0;
	*/

	switch (alt) {
	case 0:
		if (uvc->state != UVC_STATE_STREAMING)
			return 0;

		if (uvc->video.ep)
			usb_ep_disable(uvc->video.ep);

		memset(&v4l2_event, 0, sizeof(v4l2_event));
		v4l2_event.type = UVC_EVENT_STREAMOFF;
		v4l2_event_queue(uvc->vdev, &v4l2_event);

		uvc->state = UVC_STATE_CONNECTED;
		return 0;

	case 1:
		if (uvc->state != UVC_STATE_CONNECTED)
			return 0;

		if (uvc->video.ep) {
			ret = config_ep_by_speed(f->config->cdev->gadget,
					&(uvc->func), uvc->video.ep);
			if (ret)
				return ret;
			usb_ep_enable(uvc->video.ep);
		}

		memset(&v4l2_event, 0, sizeof(v4l2_event));
		v4l2_event.type = UVC_EVENT_STREAMON;
		v4l2_event_queue(uvc->vdev, &v4l2_event);
		return USB_GADGET_DELAYED_STATUS;

	default:
		return -EINVAL;
	}
}
コード例 #9
0
/*void modem_flow_control(struct work_struct *work) {    
    modem_dtr_set(!!setdtr);
    modem_dtr_query(&data_connect, 1);   
}

void dtr_status_query(struct work_struct *work) {  
    modem_dtr_query(&data_connect, 1);   
}
*/
static void do_activate(struct work_struct *data) {
    struct rawbulk_function *fn = container_of(data, struct rawbulk_function,
            activator);
    int rc;
    struct usb_function *functionp = &(fn->function);
   
    printk("%s usb state %s \n", __func__, (fn->activated?"connect":"disconnect"));
    if (fn->activated) { /* enumerated */
        /* enabled endpoints */
        rc = config_ep_by_speed(fn->cdev->gadget, functionp, fn->bulk_out);
        if (rc < 0) {
            printk(KERN_ERR "failed to config speed rawbulk %s %d\n",
                    fn->bulk_out->name, rc);
            return;
        }
        rc = usb_ep_enable(fn->bulk_out);
        if (rc < 0) {
            printk(KERN_ERR "failed to enable rawbulk %s %d\n",
                    fn->bulk_out->name, rc);
            return;
        }
        
        rc = config_ep_by_speed(fn->cdev->gadget, functionp, fn->bulk_in);
        if (rc < 0) {
            printk(KERN_ERR "failed to config speed rawbulk %s %d\n",
                    fn->bulk_in->name, rc);
            return;
        }
        rc = usb_ep_enable(fn->bulk_in);
        if (rc < 0) {
            printk(KERN_ERR "failed to enable rawbulk %s %d\n",
                    fn->bulk_in->name, rc);
            usb_ep_disable(fn->bulk_out);
            return;
        }

        /* start rawbulk if enabled */
        if (rawbulk_check_enable(fn)) {
            wake_lock(&fn->keep_awake);
            rc = rawbulk_start_transactions(fn->transfer_id, fn->nups,
                    fn->ndowns, fn->upsz, fn->downsz);
            if (rc < 0)
                //rawbulk_disable_function(fn);
                printk(KERN_ERR "%s: failed to  bypass, channel id = %d\n", __func__, fn->transfer_id);
        }

        /* start tty io */
        rc = rawbulk_tty_alloc_request(fn);
        if (rc < 0)
            return;
        if (!rawbulk_check_enable(fn))
            rawbulk_tty_start_io(fn);
    } else { /* disconnect */            
        if (rawbulk_check_enable(fn)) {
            if (fn->transfer_id == RAWBULK_TID_MODEM) {
                /* this in interrupt, but DTR need be set firstly then clear it
                 * */
                modem_dtr_set(1, 1);
                modem_dtr_set(0, 1);
                modem_dtr_set(1, 1);
                modem_dcd_state();
            }
            
            rawbulk_stop_transactions(fn->transfer_id);
            /* keep the enable state, so we can enable again in next time */
            //set_enable_state(fn, 0);
            wake_unlock(&fn->keep_awake);
        } else
            rawbulk_tty_stop_io(fn);

        rawbulk_tty_free_request(fn);

        usb_ep_disable(fn->bulk_out);
        usb_ep_disable(fn->bulk_in);

        fn->bulk_out->driver_data = NULL;
        fn->bulk_in->driver_data = NULL;
    }
}
コード例 #10
0
static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
    struct f_rndis		*rndis = func_to_rndis(f);
    struct usb_composite_dev *cdev = f->config->cdev;

    /* we know alt == 0 */
    if (intf == rndis->ctrl_id) {
        if (rndis->notify->driver_data) {
            VDBG(cdev, "reset rndis control %d\n", intf);
            usb_ep_disable(rndis->notify);
        }
        if (!rndis->notify->desc) {
            VDBG(cdev, "init rndis ctrl %d\n", intf);
            if (config_ep_by_speed(cdev->gadget, f, rndis->notify))
                goto fail;
        }
        usb_ep_enable(rndis->notify);
        rndis->notify->driver_data = rndis;

    } else if (intf == rndis->data_id) {
        struct net_device	*net;

        rndis->port.rx_triggered = false;

        if (rndis->port.in_ep->driver_data) {
            DBG(cdev, "reset rndis\n");
            gether_disconnect(&rndis->port);
        }

        if (!rndis->port.in_ep->desc || !rndis->port.out_ep->desc) {
            DBG(cdev, "init rndis\n");
            if (config_ep_by_speed(cdev->gadget, f,
                                   rndis->port.in_ep) ||
                    config_ep_by_speed(cdev->gadget, f,
                                       rndis->port.out_ep)) {
                rndis->port.in_ep->desc = NULL;
                rndis->port.out_ep->desc = NULL;
                goto fail;
            }
        }

        /* Avoid ZLPs; they can be troublesome. */
        rndis->port.is_zlp_ok = false;

        /* RNDIS should be in the "RNDIS uninitialized" state,
         * either never activated or after rndis_uninit().
         *
         * We don't want data to flow here until a nonzero packet
         * filter is set, at which point it enters "RNDIS data
         * initialized" state ... but we do want the endpoints
         * to be activated.  It's a strange little state.
         *
         * REVISIT the RNDIS gadget code has done this wrong for a
         * very long time.  We need another call to the link layer
         * code -- gether_updown(...bool) maybe -- to do it right.
         */
        rndis->port.cdc_filter = 0;

        DBG(cdev, "RNDIS RX/TX early activation ...\n");
        gether_enable_sg(&rndis->port, true);
        net = gether_connect(&rndis->port);
        if (IS_ERR(net))
            return PTR_ERR(net);

        rndis_set_param_dev(rndis->config, net,
                            &rndis->port.cdc_filter);
    } else
        goto fail;

    return 0;
fail:
    return -EINVAL;
}
コード例 #11
0
static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
	struct f_acm        *acm = func_to_acm(f);
	struct usb_composite_dev *cdev = f->config->cdev;
	bool is_setting = 0;
	int ret;

	D("+\n");
	/* we know alt == 0, so this is an activation or a reset */

	/* if it is single interface, intf, acm->ctrl_id and acm->data_id
	 * are the same, so we can setting data and notify interface in the same time.
	 *
	 * if it is multi interface, acm->ctrl_id and acm->data_id are different,
	 * so the setting is go ahead in different times.
	 */
	if (intf == acm->ctrl_id) {
		is_setting = 1;
		if (acm->notify) {
			if (acm->notify->driver_data) {
				VDBG(cdev, "reset acm control interface %d\n", intf);
				usb_ep_disable(acm->notify);
			} else {
				VDBG(cdev, "init acm ctrl interface %d\n", intf);
				if (config_ep_by_speed(cdev->gadget, f, acm->notify))
					return -EINVAL;
			}
			ret = usb_ep_enable(acm->notify);
			if (ret < 0) {
				ERROR(cdev, "Enable acm interface ep failed\n");
				return ret;
			}
			acm->notify->driver_data = acm;
		}
	}

	if (intf == acm->data_id) {
		is_setting = 1;
		if (acm->port.in->driver_data) {
			DBG(cdev, "reset acm ttyGS%d\n", acm->port_num);
			gacm_cdev_disconnect(&acm->port);
		}
		if (!acm->port.in->desc || !acm->port.out->desc) {
			DBG(cdev, "activate acm ttyGS%d\n", acm->port_num);
			if (config_ep_by_speed(cdev->gadget, f,
								   acm->port.in) ||
				config_ep_by_speed(cdev->gadget, f,
								   acm->port.out)) {
				acm->port.in->desc = NULL;
				acm->port.out->desc = NULL;
				return -EINVAL;
			}
		}
		gacm_cdev_connect(&acm->port, acm->port_num);

		bsp_usb_set_enum_stat(acm->data_id, 1);
	}

	if (!is_setting)
		return -EINVAL;

	D("-\n");
	return 0;
}