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

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

?? ohci-hcd-1.c

?? Usb1.1驅動c語言源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * URB OHCI HCD (Host Controller Driver) for USB. * * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> *  * [ Initialisation is based on Linus'  ] * [ uhci code and gregs ohci fragments ] * [ (C) Copyright 1999 Linus Torvalds  ] * [ (C) Copyright 1999 Gregory P. Smith] *  *  * History: *  * v5.2 1999/12/07 URB 3rd preview,  * v5.1 1999/11/30 URB 2nd preview, cpia, (usb-scsi) * v5.0 1999/11/22 URB Technical preview, Paul Mackerras powerbook susp/resume  * 	i386: HUB, Keyboard, Mouse, Printer  * * v4.3 1999/10/27 multiple HCs, bulk_request * v4.2 1999/09/05 ISO API alpha, new dev alloc, neg Error-codes * v4.1 1999/08/27 Randy Dunlap's - ISO API first impl. * v4.0 1999/08/18  * v3.0 1999/06/25  * v2.1 1999/05/09  code clean up * v2.0 1999/05/04  * v1.0 1999/04/27 initial release *   */ #include <linux/config.h>#include <linux/module.h>#include <linux/pci.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/ioport.h>#include <linux/sched.h>#include <linux/malloc.h>#include <linux/smp_lock.h>#include <linux/errno.h>#include <linux/timer.h>// #include <linux/spinlock.h>#include <linux/list.h>#include <linux/interrupt.h>  /* for in_interrupt() */#include <asm/io.h>#include <asm/irq.h>#include <asm/system.h>#define DEBUG#include "usb.h"#include "ohci-hcd.h"#ifdef DEBUG	#define dbg printk#else	#define dbg __xxxstatic void __xxx (const char *format, ...) {}#endif#ifdef CONFIG_APM#include <linux/apm_bios.h>static int handle_apm_event (apm_event_t event);#endif#ifdef CONFIG_PMAC_PBOOK#include <linux/adb.h>#include <linux/pmu.h>#endifstatic DECLARE_WAIT_QUEUE_HEAD (op_wakeup); static LIST_HEAD (ohci_hcd_list);spinlock_t usb_ed_lock = SPIN_LOCK_UNLOCKED;/*-------------------------------------------------------------------------* * URB support functions  *-------------------------------------------------------------------------*/  /* free the private part of an URB */ static void urb_rm_priv (urb_t * urb) {	urb_priv_t * urb_priv = urb->hcpriv;	int i;	void * wait;		if (!urb_priv) return;		wait = urb_priv->wait;		for (i = 0; i < urb_priv->length; i++) {		if (urb_priv->td [i]) {			OHCI_FREE (urb_priv->td [i]);		}	}	kfree (urb->hcpriv);	urb->hcpriv = NULL;		if (wait) {		add_wait_queue (&op_wakeup, wait); 		wake_up (&op_wakeup);	}}/*-------------------------------------------------------------------------*/ #ifdef DEBUGstatic int sohci_get_current_frame_number (struct usb_device * dev);/* debug| print the main components of an URB      * small: 0) header + data packets 1) just header */ static void urb_print (urb_t * urb, char * str, int small){	unsigned int pipe= urb->pipe;	int i, len;		if (!urb->dev || !urb->dev->bus) {		printk(KERN_DEBUG " %s URB: no dev\n", str);		return;	}		printk (KERN_DEBUG "%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,"			"flags:%4x,len:%d/%d,stat:%d(%x)\n", 			str,		 	sohci_get_current_frame_number (urb->dev), 		 	usb_pipedevice (pipe),		 	usb_pipeendpoint (pipe), 		 	usb_pipeout (pipe)? 'O': 'I',		 	usb_pipetype (pipe) < 2? (usb_pipeint (pipe)? "INTR": "ISOC"):		 		(usb_pipecontrol (pipe)? "CTRL": "BULK"),		 	urb->transfer_flags, 		 	urb->actual_length, 		 	urb->transfer_buffer_length,		 	urb->status, urb->status);	if (!small) {		if (usb_pipecontrol (pipe)) {			printk (KERN_DEBUG " cmd(8):");			for (i = 0; i < 8 ; i++) 				printk (" %02x", ((__u8 *) urb->setup_packet) [i]);			printk ("\n");		}		if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {			printk (KERN_DEBUG " data(%d/%d):", 				urb->actual_length, 				urb->transfer_buffer_length);			len = usb_pipeout (pipe)? 						urb->transfer_buffer_length: urb->actual_length;			for (i = 0; i < 16 && i < len; i++) 				printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);			printk ("%s stat:%d\n", i < len? "...": "", urb->status);		}	} 	}/* just for debugging; prints all 32 branches of the int ed tree inclusive iso eds*/void ep_print_int_eds (ohci_t * ohci, char * str) {	int i, j;	 __u32 * ed_p;	for (i= 0; i < 32; i++) {		j = 5;		printk (KERN_DEBUG " %s branch int %2d(%2x): ", str, i, i);		ed_p = &(ohci->hcca.int_table [i]);		while (*ed_p != 0 && j--) {			printk ("ed: %4x; ", (((ed_t *) bus_to_virt (*ed_p))->hwINFO));			ed_p = &(((ed_t *) bus_to_virt (*ed_p))->hwNextED);		}		printk ("\n");	}}		#endif/*-------------------------------------------------------------------------* * Interface functions (URB) *-------------------------------------------------------------------------*//* return a request to the completion handler */ static int sohci_return_urb (urb_t * urb){	urb_priv_t * urb_priv = urb->hcpriv;	urb_t * urbt;	unsigned int flags;	int i;		/* just to be sure */	if (!urb->complete) {		urb_rm_priv (urb);		usb_dec_dev_use (urb->dev);		return -1;	}		if (!urb_priv) return -1; /* urb already unlinked */	#ifdef DEBUG	urb_print (urb, "RET", usb_pipeout (urb->pipe));#endif	switch (usb_pipetype (urb->pipe)) {  		case PIPE_INTERRUPT:			urb->complete (urb); /* call complete and requeue URB */	  			urb->actual_length = 0;  			urb->status = USB_ST_URB_PENDING;  			if (urb_priv->state != URB_DEL)  				td_submit_urb (urb);  			break;  					case PIPE_ISOCHRONOUS:			for (urbt = urb->next; urbt && (urbt != urb); urbt = urbt->next);			if (urbt) { /* send the reply and requeue URB */					urb->complete (urb);								spin_lock_irqsave (&usb_ed_lock, flags);				urb->actual_length = 0;  				urb->status = USB_ST_URB_PENDING;  				urb->start_frame = urb_priv->ed->last_iso + 1;  				if (urb_priv->state != URB_DEL) {  					for (i = 0; i < urb->number_of_packets; i++) {  						urb->iso_frame_desc[i].actual_length = 0;  						urb->iso_frame_desc[i].status = -EXDEV;  					}  					td_submit_urb (urb);  				}  				spin_unlock_irqrestore (&usb_ed_lock, flags);  				  			} else { /* unlink URB, call complete */				urb_rm_priv (urb);				usb_dec_dev_use (urb->dev);				urb->complete (urb); 				}					break;  						case PIPE_BULK:		case PIPE_CONTROL: /* unlink URB, call complete */			urb_rm_priv (urb);			usb_dec_dev_use (urb->dev);			urb->complete (urb);				break;	}	return 0;}/*-------------------------------------------------------------------------*//* get a transfer request */ static int sohci_submit_urb (urb_t * urb){	ohci_t * ohci;	ed_t * ed;	urb_priv_t * urb_priv;	unsigned int pipe = urb->pipe;	int i, size = 0;	unsigned int flags;		if (!urb->dev || !urb->dev->bus) return -EINVAL;		if (urb->hcpriv) return -EINVAL; /* urb already in use */	usb_inc_dev_use (urb->dev);	ohci = (ohci_t *) urb->dev->bus->hcpriv;	#ifdef DEBUG	urb_print (urb, "SUB", usb_pipein (pipe));#endif		if (usb_pipedevice (pipe) == ohci->rh.devnum) 		return rh_submit_urb (urb); /* a request to the virtual root hub */	/* every endpoint has a ed, locate and fill it */	if (!(ed = ep_add_ed (urb->dev, pipe, urb->interval, 1))) {		usb_dec_dev_use (urb->dev);			return -ENOMEM;	}	/* for the private part of the URB we need the number of TDs (size) */	switch (usb_pipetype (pipe)) {		case PIPE_BULK:	/* one TD for every 4096 Byte */			size = (urb->transfer_buffer_length - 1) / 4096 + 1;			break;		case PIPE_ISOCHRONOUS: /* number of packets from URB */			size = urb->number_of_packets;			for (i = 0; i < urb->number_of_packets; i++) {  				urb->iso_frame_desc[i].actual_length = 0;  				urb->iso_frame_desc[i].status = -EXDEV;  			}			break;		case PIPE_CONTROL: /* 1 TD for setup, 1 for ACK and 1 for every 4096 B */			size = (urb->transfer_buffer_length == 0)? 2: 						(urb->transfer_buffer_length - 1) / 4096 + 3;			break;		case PIPE_INTERRUPT: /* one TD */			size = 1;						break;	}	/* allocate the private part or the URB */	urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (td_t *), 							in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);	if (!urb_priv) {		usb_dec_dev_use (urb->dev);			return -ENOMEM;	}	memset (urb_priv, 0, sizeof (urb_priv_t) + size * sizeof (td_t *));		/* fill the private part of the URB */	urb->hcpriv = urb_priv;	urb_priv->length = size;	urb_priv->td_cnt = 0;	urb_priv->state = 0;	urb_priv->ed = ed;		urb_priv->wait = NULL;		/* allocate the TDs */	for (i = 0; i < size; i++) { 		OHCI_ALLOC (urb_priv->td[i], sizeof (td_t));		if (!urb_priv->td[i]) {			usb_dec_dev_use (urb->dev);				urb_rm_priv (urb);			return -ENOMEM;		}	}		spin_lock_irqsave (&usb_ed_lock, flags);		if (ed->state == ED_NEW || (ed->state & ED_DEL)) {		urb_rm_priv(urb);		usb_dec_dev_use (urb->dev);			return -EINVAL;	}		/* for ISOC transfers calculate start frame index */	if (urb->transfer_flags & USB_ISO_ASAP) { 		urb->start_frame = ((ed->state == ED_OPER)? (ed->last_iso + 1): 								(ohci->hcca.frame_no + 10)) & 0xffff;	}			td_submit_urb (urb); /* fill the TDs and link it to the ed */							if (ed->state != ED_OPER)  /* link the ed into a chain if is not already */		ep_link (ohci, ed);	spin_unlock_irqrestore (&usb_ed_lock, flags);		urb->status = USB_ST_URB_PENDING; 	// queue_urb(s, &urb->urb_list);	return 0;	}/*-------------------------------------------------------------------------*//* deactivate all TDs and remove the private part of the URB */ static int sohci_unlink_urb (urb_t * urb){	unsigned int flags;	ohci_t * ohci;	DECLARE_WAITQUEUE (wait, current);		if (!urb) /* just to be sure */ 		return -EINVAL;		#ifdef DEBUG	urb_print (urb, "UNLINK", 1);#endif		  	ohci = (ohci_t *) urb->dev->bus->hcpriv; 	if (usb_pipedevice (urb->pipe) == ohci->rh.devnum) 		return rh_unlink_urb (urb); /* a request to the virtual root hub */		if (urb->hcpriv) { 		if (urb->status == USB_ST_URB_PENDING) { /* URB active? */			urb_priv_t  * urb_priv = urb->hcpriv;			urb_priv->state = URB_DEL; 			/* we want to delete the TDs of an URB from an ed 			 * request the deletion, it will be handled at the next USB-frame */			urb_priv->wait = &wait;						spin_lock_irqsave (&usb_ed_lock, flags);			ep_rm_ed (urb->dev, urb_priv->ed);			urb_priv->ed->state |= ED_URB_DEL;			spin_unlock_irqrestore (&usb_ed_lock, flags);			current->state = TASK_UNINTERRUPTIBLE;			schedule_timeout (HZ / 10); /* wait until all TDs are deleted */			remove_wait_queue (&op_wakeup, &wait); 		} else 			urb_rm_priv (urb);		usb_dec_dev_use (urb->dev);			}		return 0;}/*-------------------------------------------------------------------------*//* allocate private data space for a usb device */static int sohci_alloc_dev (struct usb_device *usb_dev){	struct ohci_device * dev;	dev = kmalloc (sizeof (*dev), GFP_KERNEL);	if (!dev)		return -ENOMEM;			memset (dev, 0, sizeof (*dev));	usb_dev->hcpriv = dev;	return 0;}/*-------------------------------------------------------------------------*//* free private data space of usb device */  static int sohci_free_dev (struct usb_device * usb_dev){	unsigned int flags;	int i, cnt = 0;	ed_t * ed;	DECLARE_WAITQUEUE (wait, current);	struct ohci_device * dev = usb_to_ohci (usb_dev);	ohci_t * ohci = usb_dev->bus->hcpriv;		if (!dev) return 0;		if (usb_dev->devnum >= 0) {			/* delete all TDs of all EDs */		spin_lock_irqsave (&usb_ed_lock, flags);			for(i = 0; i < NUM_EDS; i++) {  			ed = &(dev->ed[i]);  			if (ed->state != ED_NEW) {  				if (ed->state == ED_OPER) ep_unlink (ohci, ed);  				ep_rm_ed (usb_dev, ed);  				ed->state = ED_DEL;  				cnt++;  			}  		}  		spin_unlock_irqrestore (&usb_ed_lock, flags);  		    	if (cnt > 0) {     		dev->wait = &wait;			current->state = TASK_UNINTERRUPTIBLE;			schedule_timeout (HZ / 10);			remove_wait_queue (&op_wakeup, &wait);		}	}	kfree (dev);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩三级电影网址| 国产成人高清在线| 国产日韩精品一区二区浪潮av| 9i看片成人免费高清| 日本在线不卡视频| 伊人色综合久久天天人手人婷| 久久久久久久综合日本| 91精品国产色综合久久不卡电影 | 91丨porny丨户外露出| 国产成人精品影视| 欧美精品第1页| 在线观看国产精品网站| 91伊人久久大香线蕉| 日韩精品一区二区三区中文不卡| 91精品国产综合久久久蜜臀粉嫩| 宅男在线国产精品| 亚洲男同性视频| 亚洲综合激情网| 亚洲国产精品久久一线不卡| 亚洲va国产va欧美va观看| 亚洲一区二区在线观看视频| 国产成人综合精品三级| 日韩三级视频在线观看| 日韩av午夜在线观看| 91麻豆产精品久久久久久| 中文字幕av不卡| 亚洲图片你懂的| 亚洲成av人在线观看| 91网上在线视频| 亚洲欧洲日产国码二区| 亚洲无线码一区二区三区| 不卡一区中文字幕| 欧美在线制服丝袜| 一区二区三区欧美日韩| 美国欧美日韩国产在线播放 | 亚洲一区视频在线观看视频| av在线播放一区二区三区| 国产欧美精品一区二区色综合| 国产原创一区二区| 成人动漫一区二区在线| 国产精品电影一区二区三区| 日本人妖一区二区| 精品久久久久一区二区国产| 中文字幕va一区二区三区| 成人小视频在线| 日韩欧美精品在线| 国产精品白丝av| 91精品国产综合久久久久久漫画| 久久成人麻豆午夜电影| 色偷偷久久人人79超碰人人澡 | 精品福利一二区| 亚洲一区免费在线观看| 欧美日韩在线精品一区二区三区激情 | 韩国毛片一区二区三区| 欧美日韩精品一区二区天天拍小说| 久久精品无码一区二区三区| 性久久久久久久久久久久| 7777精品伊人久久久大香线蕉最新版| 午夜久久久影院| 91久久奴性调教| 国产精品人妖ts系列视频| 蜜臀av一区二区三区| 国产亚洲综合在线| 在线观看日韩精品| 麻豆视频观看网址久久| 久久精品亚洲国产奇米99| 91污在线观看| 九色综合狠狠综合久久| 欧美日韩国产乱码电影| 久久99精品国产麻豆不卡| 久久久精品一品道一区| 在线观看亚洲精品| 精品中文字幕一区二区| 亚洲视频在线一区二区| 欧美一区二区日韩一区二区| 国产成人av一区二区三区在线观看| 亚洲人成伊人成综合网小说| 日韩一区二区在线观看视频| 不卡高清视频专区| 日韩精品电影一区亚洲| 欧美亚洲禁片免费| 亚洲综合小说图片| 久久女同精品一区二区| 欧美亚洲国产一区二区三区va| 极品美女销魂一区二区三区| 亚洲欧美区自拍先锋| 久久新电视剧免费观看| 国产精品资源在线观看| 亚洲在线观看免费| 亚洲欧美影音先锋| 精品国产一二三| 欧美精品日韩精品| 91美女视频网站| 高清不卡在线观看av| 中文字幕在线一区| 欧美一区二区三区男人的天堂| 97久久精品人人做人人爽| 亚洲一区视频在线| 国产精品丝袜在线| 国产亚洲综合色| 欧美大片一区二区三区| 欧美高清激情brazzers| 91亚洲午夜精品久久久久久| 国产一区在线看| 精品一区二区免费视频| 日本va欧美va欧美va精品| 日韩精品一区国产麻豆| 欧美日韩一卡二卡| 欧美亚洲国产bt| 91精品91久久久中77777| 风间由美中文字幕在线看视频国产欧美| 美女性感视频久久| 蜜桃视频一区二区三区 | 成人欧美一区二区三区小说| 久久久精品免费免费| 欧美成人aa大片| 4438x成人网最大色成网站| 欧美优质美女网站| 欧美性一二三区| 欧美四级电影在线观看| 欧美最猛性xxxxx直播| 色八戒一区二区三区| 99热在这里有精品免费| 91亚洲午夜精品久久久久久| 99国产精品一区| 一本一道久久a久久精品| 91老师片黄在线观看| 色八戒一区二区三区| 欧美日韩免费电影| 91精品国产免费| 精品久久久久久久久久久久久久久久久| 日韩欧美美女一区二区三区| 久久久国产综合精品女国产盗摄| 欧美国产日本韩| 日韩美女视频19| 亚洲在线视频一区| 美女久久久精品| 国产精品亚洲а∨天堂免在线| 成人激情午夜影院| 欧美视频在线一区二区三区 | 97se狠狠狠综合亚洲狠狠| 91日韩一区二区三区| 欧美色综合网站| 精品日韩99亚洲| 中文字幕第一页久久| 一区二区免费看| 蜜桃视频一区二区| 91在线视频播放| 欧美一级二级三级蜜桃| 国产三级三级三级精品8ⅰ区| 亚洲欧洲日韩女同| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产中文一区二区三区| 99精品欧美一区二区蜜桃免费| 一道本成人在线| 精品99一区二区三区| 亚洲三级在线看| 美国三级日本三级久久99| 99re这里只有精品首页| 欧美三级电影网站| 国产拍揄自揄精品视频麻豆| 亚洲国产综合色| 成+人+亚洲+综合天堂| 欧美一区二区三区在线观看视频| 国产精品青草综合久久久久99| 午夜精品久久久久久| youjizz国产精品| 欧美精品一区二区三区蜜桃| 一区二区三区在线视频观看58| 国内精品久久久久影院薰衣草| 欧美在线一区二区| 国产精品久久久久久久久免费桃花| 日韩精品成人一区二区三区| 99久久99久久免费精品蜜臀| 精品国产免费一区二区三区四区 | 欧美日产在线观看| 亚洲视频在线观看三级| 麻豆成人91精品二区三区| 另类欧美日韩国产在线| 国产精品久久久99| 欧美在线观看一区| 久久久久久久久久久黄色| 丝袜脚交一区二区| 99精品久久免费看蜜臀剧情介绍| 91精品一区二区三区在线观看| 国产亚洲欧美激情| 日本午夜一本久久久综合| 99在线热播精品免费| 精品国产乱码久久| 日本vs亚洲vs韩国一区三区二区 | 日韩午夜激情视频| 亚洲男同性恋视频| 国产乱码精品一区二区三区忘忧草| 欧美午夜精品理论片a级按摩| 欧美日韩精品一区视频| 亚洲www啪成人一区二区麻豆| 成人午夜视频网站| 久久久久国产精品麻豆| 国内精品第一页| 日韩欧美国产电影|