亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? zero.c

?? h內核
?? C
?? 第 1 頁 / 共 3 頁
字號:
		hs = !hs;	if (hs)		function = is_source_sink			? hs_source_sink_function			: hs_loopback_function;	else#endif		function = is_source_sink			? fs_source_sink_function			: fs_loopback_function;	/* for now, don't advertise srp-only devices */	if (!gadget->is_otg)		function++;	len = usb_gadget_config_buf (is_source_sink					? &source_sink_config					: &loopback_config,			buf, USB_BUFSIZ, function);	if (len < 0)		return len;	((struct usb_config_descriptor *) buf)->bDescriptorType = type;	return len;}/*-------------------------------------------------------------------------*/static struct usb_request *alloc_ep_req (struct usb_ep *ep, unsigned length){	struct usb_request	*req;	req = usb_ep_alloc_request (ep, GFP_ATOMIC);	if (req) {		req->length = length;		req->buf = usb_ep_alloc_buffer (ep, length,				&req->dma, GFP_ATOMIC);		if (!req->buf) {			usb_ep_free_request (ep, req);			req = NULL;		}	}	return req;}static void free_ep_req (struct usb_ep *ep, struct usb_request *req){	if (req->buf)		usb_ep_free_buffer (ep, req->buf, req->dma, req->length);	usb_ep_free_request (ep, req);}/*-------------------------------------------------------------------------*//* optionally require specific source/sink data patterns  */static intcheck_read_data (	struct zero_dev		*dev,	struct usb_ep		*ep,	struct usb_request	*req){	unsigned	i;	u8		*buf = req->buf;	for (i = 0; i < req->actual; i++, buf++) {		switch (pattern) {		/* all-zeroes has no synchronization issues */		case 0:			if (*buf == 0)				continue;			break;		/* mod63 stays in sync with short-terminated transfers,		 * or otherwise when host and gadget agree on how large		 * each usb transfer request should be.  resync is done		 * with set_interface or set_config.		 */		case 1:			if (*buf == (u8)(i % 63))				continue;			break;		}		ERROR (dev, "bad OUT byte, buf [%d] = %d\n", i, *buf);		usb_ep_set_halt (ep);		return -EINVAL;	}	return 0;}static voidreinit_write_data (	struct zero_dev		*dev,	struct usb_ep		*ep,	struct usb_request	*req){	unsigned	i;	u8		*buf = req->buf;	switch (pattern) {	case 0:		memset (req->buf, 0, req->length);		break;	case 1:		for  (i = 0; i < req->length; i++)			*buf++ = (u8) (i % 63);		break;	}}/* if there is only one request in the queue, there'll always be an * irq delay between end of one request and start of the next. * that prevents using hardware dma queues. */static void source_sink_complete (struct usb_ep *ep, struct usb_request *req){	struct zero_dev	*dev = ep->driver_data;	int		status = req->status;	switch (status) {	case 0: 			/* normal completion? */		if (ep == dev->out_ep)			check_read_data (dev, ep, req);		else			reinit_write_data (dev, ep, req);		break;	/* this endpoint is normally active while we're configured */	case -ECONNABORTED: 		/* hardware forced ep reset */	case -ECONNRESET:		/* request dequeued */	case -ESHUTDOWN:		/* disconnect from host */		VDBG (dev, "%s gone (%d), %d/%d\n", ep->name, status,				req->actual, req->length);		if (ep == dev->out_ep)			check_read_data (dev, ep, req);		free_ep_req (ep, req);		return;	case -EOVERFLOW:		/* buffer overrun on read means that					 * we didn't provide a big enough					 * buffer.					 */	default:#if 1		DBG (dev, "%s complete --> %d, %d/%d\n", ep->name,				status, req->actual, req->length);#endif	case -EREMOTEIO:		/* short read */		break;	}	status = usb_ep_queue (ep, req, GFP_ATOMIC);	if (status) {		ERROR (dev, "kill %s:  resubmit %d bytes --> %d\n",				ep->name, req->length, status);		usb_ep_set_halt (ep);		/* FIXME recover later ... somehow */	}}static struct usb_request *source_sink_start_ep (struct usb_ep *ep, int gfp_flags){	struct usb_request	*req;	int			status;	req = alloc_ep_req (ep, buflen);	if (!req)		return NULL;	memset (req->buf, 0, req->length);	req->complete = source_sink_complete;	if (strcmp (ep->name, EP_IN_NAME) == 0)		reinit_write_data (ep->driver_data, ep, req);	status = usb_ep_queue (ep, req, gfp_flags);	if (status) {		struct zero_dev	*dev = ep->driver_data;		ERROR (dev, "start %s --> %d\n", ep->name, status);		free_ep_req (ep, req);		req = NULL;	}	return req;}static intset_source_sink_config (struct zero_dev *dev, int gfp_flags){	int			result = 0;	struct usb_ep		*ep;	struct usb_gadget	*gadget = dev->gadget;	gadget_for_each_ep (ep, gadget) {		const struct usb_endpoint_descriptor	*d;		/* one endpoint writes (sources) zeroes in (to the host) */		if (strcmp (ep->name, EP_IN_NAME) == 0) {			d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);			result = usb_ep_enable (ep, d);			if (result == 0) {				ep->driver_data = dev;				if (source_sink_start_ep (ep, gfp_flags) != 0) {					dev->in_ep = ep;					continue;				}				usb_ep_disable (ep);				result = -EIO;			}		/* one endpoint reads (sinks) anything out (from the host) */		} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {			d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);			result = usb_ep_enable (ep, d);			if (result == 0) {				ep->driver_data = dev;				if (source_sink_start_ep (ep, gfp_flags) != 0) {					dev->out_ep = ep;					continue;				}				usb_ep_disable (ep);				result = -EIO;			}		/* ignore any other endpoints */		} else			continue;		/* stop on error */		ERROR (dev, "can't start %s, result %d\n", ep->name, result);		break;	}	if (result == 0)		DBG (dev, "buflen %d\n", buflen);	/* caller is responsible for cleanup on error */	return result;}/*-------------------------------------------------------------------------*/static void loopback_complete (struct usb_ep *ep, struct usb_request *req){	struct zero_dev	*dev = ep->driver_data;	int		status = req->status;	switch (status) {	case 0: 			/* normal completion? */		if (ep == dev->out_ep) {			/* loop this OUT packet back IN to the host */			req->zero = (req->actual < req->length);			req->length = req->actual;			status = usb_ep_queue (dev->in_ep, req, GFP_ATOMIC);			if (status == 0)				return;			/* "should never get here" */			ERROR (dev, "can't loop %s to %s: %d\n",				ep->name, dev->in_ep->name,				status);		}		/* queue the buffer for some later OUT packet */		req->length = buflen;		status = usb_ep_queue (dev->out_ep, req, GFP_ATOMIC);		if (status == 0)			return;		/* "should never get here" */		/* FALLTHROUGH */	default:		ERROR (dev, "%s loop complete --> %d, %d/%d\n", ep->name,				status, req->actual, req->length);		/* FALLTHROUGH */	/* NOTE:  since this driver doesn't maintain an explicit record	 * of requests it submitted (just maintains qlen count), we	 * rely on the hardware driver to clean up on disconnect or	 * endpoint disable.	 */	case -ECONNABORTED: 		/* hardware forced ep reset */	case -ECONNRESET:		/* request dequeued */	case -ESHUTDOWN:		/* disconnect from host */		free_ep_req (ep, req);		return;	}}static intset_loopback_config (struct zero_dev *dev, int gfp_flags){	int			result = 0;	struct usb_ep		*ep;	struct usb_gadget	*gadget = dev->gadget;	gadget_for_each_ep (ep, gadget) {		const struct usb_endpoint_descriptor	*d;		/* one endpoint writes data back IN to the host */		if (strcmp (ep->name, EP_IN_NAME) == 0) {			d = ep_desc (gadget, &hs_source_desc, &fs_source_desc);			result = usb_ep_enable (ep, d);			if (result == 0) {				ep->driver_data = dev;				dev->in_ep = ep;				continue;			}		/* one endpoint just reads OUT packets */		} else if (strcmp (ep->name, EP_OUT_NAME) == 0) {			d = ep_desc (gadget, &hs_sink_desc, &fs_sink_desc);			result = usb_ep_enable (ep, d);			if (result == 0) {				ep->driver_data = dev;				dev->out_ep = ep;				continue;			}		/* ignore any other endpoints */		} else			continue;		/* stop on error */		ERROR (dev, "can't enable %s, result %d\n", ep->name, result);		break;	}	/* allocate a bunch of read buffers and queue them all at once.	 * we buffer at most 'qlen' transfers; fewer if any need more	 * than 'buflen' bytes each.	 */	if (result == 0) {		struct usb_request	*req;		unsigned		i;		ep = dev->out_ep;		for (i = 0; i < qlen && result == 0; i++) {			req = alloc_ep_req (ep, buflen);			if (req) {				req->complete = loopback_complete;				result = usb_ep_queue (ep, req, GFP_ATOMIC);				if (result)					DBG (dev, "%s queue req --> %d\n",							ep->name, result);			} else				result = -ENOMEM;		}	}	if (result == 0)		DBG (dev, "qlen %d, buflen %d\n", qlen, buflen);	/* caller is responsible for cleanup on error */	return result;}/*-------------------------------------------------------------------------*/static void zero_reset_config (struct zero_dev *dev){	if (dev->config == 0)		return;	DBG (dev, "reset config\n");	/* just disable endpoints, forcing completion of pending i/o.	 * all our completion handlers free their requests in this case.	 */	if (dev->in_ep) {		usb_ep_disable (dev->in_ep);		dev->in_ep = NULL;	}	if (dev->out_ep) {		usb_ep_disable (dev->out_ep);		dev->out_ep = NULL;	}	dev->config = 0;	del_timer (&dev->resume);}/* change our operational config.  this code must agree with the code * that returns config descriptors, and altsetting code. * * it's also responsible for power management interactions. some * configurations might not work with our current power sources. * * note that some device controller hardware will constrain what this * code can do, perhaps by disallowing more than one configuration or * by limiting configuration choices (like the pxa2xx). */static intzero_set_config (struct zero_dev *dev, unsigned number, int gfp_flags){	int			result = 0;	struct usb_gadget	*gadget = dev->gadget;	if (number == dev->config)		return 0;	if (gadget_is_sa1100 (gadget) && dev->config) {		/* tx fifo is full, but we can't clear it...*/		INFO (dev, "can't change configurations\n");		return -ESPIPE;	}	zero_reset_config (dev);	switch (number) {	case CONFIG_SOURCE_SINK:		result = set_source_sink_config (dev, gfp_flags);		break;	case CONFIG_LOOPBACK:		result = set_loopback_config (dev, gfp_flags);		break;	default:		result = -EINVAL;		/* FALL THROUGH */	case 0:		return result;	}	if (!result && (!dev->in_ep || !dev->out_ep))		result = -ENODEV;	if (result)		zero_reset_config (dev);	else {		char *speed;		switch (gadget->speed) {		case USB_SPEED_LOW:	speed = "low"; break;		case USB_SPEED_FULL:	speed = "full"; break;		case USB_SPEED_HIGH:	speed = "high"; break;		default: 		speed = "?"; break;		}		dev->config = number;		INFO (dev, "%s speed config #%d: %s\n", speed, number,				(number == CONFIG_SOURCE_SINK)					? source_sink : loopback);	}	return result;}/*-------------------------------------------------------------------------*/static void zero_setup_complete (struct usb_ep *ep, struct usb_request *req){

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久av老司机精品网站导航| 欧美精选一区二区| 欧美日韩精品专区| 国产精品视频一二三区| 亚洲高清免费视频| av电影天堂一区二区在线| 日韩欧美你懂的| 亚洲国产成人91porn| 成人午夜av电影| 精品少妇一区二区| 婷婷六月综合亚洲| 91蝌蚪porny| 国产精品伦理在线| 国产成人av影院| 久久色中文字幕| 美女在线视频一区| 欧美日本一区二区| 亚洲高清在线视频| 欧洲精品一区二区| 亚洲乱码中文字幕| 99re这里都是精品| 国产精品入口麻豆原神| 国产精品羞羞答答xxdd| 精品国精品自拍自在线| 日日夜夜精品视频免费| 欧美另类变人与禽xxxxx| 亚洲成精国产精品女| 色欧美片视频在线观看在线视频| 国产精品国产a| 91在线观看美女| 亚洲天堂久久久久久久| 一本一本大道香蕉久在线精品| 亚洲色图丝袜美腿| 日本韩国一区二区三区| 亚洲自拍偷拍图区| 欧美狂野另类xxxxoooo| 日韩精彩视频在线观看| 欧美一二三区在线| 狠狠色综合色综合网络| 久久久久国产精品厨房| av中文字幕一区| 亚洲同性同志一二三专区| 91九色02白丝porn| 日韩精品一级二级 | 久久夜色精品国产噜噜av| 麻豆精品视频在线观看视频| 久久久久久久电影| 97se亚洲国产综合自在线| 亚洲高清在线精品| 日韩视频免费观看高清完整版在线观看| 美日韩黄色大片| 欧美激情在线看| 在线一区二区三区四区| 日韩精品1区2区3区| 精品国产第一区二区三区观看体验| 国产在线视视频有精品| 国产精品情趣视频| 欧美日韩国产免费一区二区 | 欧美成va人片在线观看| 国产a级毛片一区| 亚洲一区欧美一区| 日韩美女天天操| 91免费在线看| 免费一级欧美片在线观看| 中文字幕av不卡| 91精品国产色综合久久ai换脸| 国产成人丝袜美腿| 天堂蜜桃91精品| 欧美激情资源网| 欧美麻豆精品久久久久久| 国产真实乱子伦精品视频| 亚洲精品国产精品乱码不99 | 中文字幕电影一区| 欧美伦理电影网| 99久久er热在这里只有精品66| 五月天丁香久久| 国产午夜精品美女毛片视频| 欧美三片在线视频观看| 成人av网址在线| 美女一区二区视频| 亚洲色图欧洲色图| 久久一留热品黄| 欧美精品自拍偷拍动漫精品| 99免费精品在线观看| 国产一区二区三区在线观看免费 | 国产一区二区视频在线| 天堂在线亚洲视频| 伊人开心综合网| 欧美国产一区二区| 欧美成人一区二区三区| 欧美图区在线视频| 99免费精品在线| 高清av一区二区| 国产一区二区网址| 久久99久久久欧美国产| 亚洲国产精品久久不卡毛片| 亚洲精品高清在线| 亚洲欧美日韩国产成人精品影院| 国产日韩欧美电影| 久久看人人爽人人| 精品国产乱码久久久久久夜甘婷婷 | 美女一区二区在线观看| 婷婷国产v国产偷v亚洲高清| 一区二区三区在线看| 国产精品国产三级国产| 国产精品久久一卡二卡| 中文字幕精品—区二区四季| 久久九九久久九九| 国产欧美日韩另类一区| 久久久三级国产网站| 久久精品视频在线免费观看| 337p粉嫩大胆色噜噜噜噜亚洲| 9191成人精品久久| 欧美一卡在线观看| 精品国产污污免费网站入口| 精品久久国产字幕高潮| 欧美mv日韩mv国产网站| 久久久久久免费网| 国产精品网友自拍| 亚洲日本免费电影| 亚洲国产一区二区在线播放| 一区二区三区四区亚洲| 一区二区三区小说| 日本强好片久久久久久aaa| 日本va欧美va精品| 国产在线国偷精品免费看| 国产电影精品久久禁18| 99在线精品观看| 欧美日韩免费电影| 国产亚洲1区2区3区| 国产精品久久久久久久浪潮网站| 国产精品美女久久久久高潮| 精品视频一区 二区 三区| 在线观看国产精品网站| 欧美高清视频www夜色资源网| 777午夜精品免费视频| 91精品国产手机| 国产欧美一区二区三区在线老狼| 国产精品视频一二三| 亚洲激情成人在线| 日韩av一区二区三区四区| 久久超碰97中文字幕| 国产不卡视频在线播放| 一本大道av一区二区在线播放| 欧美三级韩国三级日本三斤| 精品久久免费看| 亚洲天堂免费看| 老司机精品视频线观看86 | 国产精品系列在线播放| av亚洲精华国产精华| 91精品国产91综合久久蜜臀| 国产亚洲欧美中文| 亚洲一区二区在线视频| 国产精品一区在线| 在线观看成人小视频| 国产亚洲一本大道中文在线| 亚洲自拍偷拍综合| 国产不卡高清在线观看视频| 欧美性受xxxx黑人xyx性爽| 久久久综合网站| 午夜伊人狠狠久久| 成人高清免费观看| 欧美大片拔萝卜| 亚洲第一搞黄网站| 成人黄色网址在线观看| 日韩写真欧美这视频| 一区二区在线观看视频| 国产成人免费视频一区| 3d动漫精品啪啪一区二区竹菊| 国产精品久久久久久久久动漫| 久久电影国产免费久久电影| 欧美最猛黑人xxxxx猛交| 国产精品网站导航| 国产在线精品一区二区三区不卡 | 93久久精品日日躁夜夜躁欧美| 日韩亚洲欧美一区| 亚洲高清免费视频| 一本高清dvd不卡在线观看| 国产欧美一区二区三区鸳鸯浴 | 色婷婷久久99综合精品jk白丝| 精品精品国产高清a毛片牛牛 | 日韩三级.com| 亚洲成人免费观看| 欧洲另类一二三四区| 亚洲视频免费在线观看| 不卡一区二区中文字幕| 久久精品一区二区三区四区| 另类的小说在线视频另类成人小视频在线 | 亚洲中国最大av网站| 色偷偷88欧美精品久久久| 国产精品视频第一区| 国产精品一区专区| 国产人伦精品一区二区| 国产精品一区二区三区99| 精品国产三级a在线观看| 精品在线视频一区| 日韩欧美综合一区| 另类人妖一区二区av| 亚洲精品在线一区二区| 精品无码三级在线观看视频|