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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? hub.c

?? linux-2.6.15.6
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
/* * USB hub driver. * * (C) Copyright 1999 Linus Torvalds * (C) Copyright 1999 Johannes Erdfelt * (C) Copyright 1999 Gregory P. Smith * (C) Copyright 2001 Brad Hards (bhards@bigpond.net.au) * */#include <linux/config.h>#include <linux/kernel.h>#include <linux/errno.h>#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/completion.h>#include <linux/sched.h>#include <linux/list.h>#include <linux/slab.h>#include <linux/smp_lock.h>#include <linux/ioctl.h>#include <linux/usb.h>#include <linux/usbdevice_fs.h>#include <linux/kthread.h>#include <asm/semaphore.h>#include <asm/uaccess.h>#include <asm/byteorder.h>#include "usb.h"#include "hcd.h"#include "hub.h"/* Protect struct usb_device->state and ->children members * Note: Both are also protected by ->serialize, except that ->state can * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */static DEFINE_SPINLOCK(device_state_lock);/* khubd's worklist and its lock */static DEFINE_SPINLOCK(hub_event_lock);static LIST_HEAD(hub_event_list);	/* List of hubs needing servicing *//* Wakes up khubd */static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);static struct task_struct *khubd_task;/* cycle leds on hubs that aren't blinking for attention */static int blinkenlights = 0;module_param (blinkenlights, bool, S_IRUGO);MODULE_PARM_DESC (blinkenlights, "true to cycle leds on hubs");/* * As of 2.6.10 we introduce a new USB device initialization scheme which * closely resembles the way Windows works.  Hopefully it will be compatible * with a wider range of devices than the old scheme.  However some previously * working devices may start giving rise to "device not accepting address" * errors; if that happens the user can try the old scheme by adjusting the * following module parameters. * * For maximum flexibility there are two boolean parameters to control the * hub driver's behavior.  On the first initialization attempt, if the * "old_scheme_first" parameter is set then the old scheme will be used, * otherwise the new scheme is used.  If that fails and "use_both_schemes" * is set, then the driver will make another attempt, using the other scheme. */static int old_scheme_first = 0;module_param(old_scheme_first, bool, S_IRUGO | S_IWUSR);MODULE_PARM_DESC(old_scheme_first,		 "start with the old device initialization scheme");static int use_both_schemes = 1;module_param(use_both_schemes, bool, S_IRUGO | S_IWUSR);MODULE_PARM_DESC(use_both_schemes,		"try the other device initialization scheme if the "		"first one fails");#ifdef	DEBUGstatic inline char *portspeed (int portstatus){	if (portstatus & (1 << USB_PORT_FEAT_HIGHSPEED))    		return "480 Mb/s";	else if (portstatus & (1 << USB_PORT_FEAT_LOWSPEED))		return "1.5 Mb/s";	else		return "12 Mb/s";}#endif/* Note that hdev or one of its children must be locked! */static inline struct usb_hub *hdev_to_hub(struct usb_device *hdev){	return usb_get_intfdata(hdev->actconfig->interface[0]);}/* USB 2.0 spec Section 11.24.4.5 */static int get_hub_descriptor(struct usb_device *hdev, void *data, int size){	int i, ret;	for (i = 0; i < 3; i++) {		ret = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),			USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,			USB_DT_HUB << 8, 0, data, size,			USB_CTRL_GET_TIMEOUT);		if (ret >= (USB_DT_HUB_NONVAR_SIZE + 2))			return ret;	}	return -EINVAL;}/* * USB 2.0 spec Section 11.24.2.1 */static int clear_hub_feature(struct usb_device *hdev, int feature){	return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),		USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, 1000);}/* * USB 2.0 spec Section 11.24.2.2 */static int clear_port_feature(struct usb_device *hdev, int port1, int feature){	return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),		USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port1,		NULL, 0, 1000);}/* * USB 2.0 spec Section 11.24.2.13 */static int set_port_feature(struct usb_device *hdev, int port1, int feature){	return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),		USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port1,		NULL, 0, 1000);}/* * USB 2.0 spec Section 11.24.2.7.1.10 and table 11-7 * for info about using port indicators */static void set_port_led(	struct usb_hub *hub,	int port1,	int selector){	int status = set_port_feature(hub->hdev, (selector << 8) | port1,			USB_PORT_FEAT_INDICATOR);	if (status < 0)		dev_dbg (hub->intfdev,			"port %d indicator %s status %d\n",			port1,			({ char *s; switch (selector) {			case HUB_LED_AMBER: s = "amber"; break;			case HUB_LED_GREEN: s = "green"; break;			case HUB_LED_OFF: s = "off"; break;			case HUB_LED_AUTO: s = "auto"; break;			default: s = "??"; break;			}; s; }),			status);}#define	LED_CYCLE_PERIOD	((2*HZ)/3)static void led_work (void *__hub){	struct usb_hub		*hub = __hub;	struct usb_device	*hdev = hub->hdev;	unsigned		i;	unsigned		changed = 0;	int			cursor = -1;	if (hdev->state != USB_STATE_CONFIGURED || hub->quiescing)		return;	for (i = 0; i < hub->descriptor->bNbrPorts; i++) {		unsigned	selector, mode;		/* 30%-50% duty cycle */		switch (hub->indicator[i]) {		/* cycle marker */		case INDICATOR_CYCLE:			cursor = i;			selector = HUB_LED_AUTO;			mode = INDICATOR_AUTO;			break;		/* blinking green = sw attention */		case INDICATOR_GREEN_BLINK:			selector = HUB_LED_GREEN;			mode = INDICATOR_GREEN_BLINK_OFF;			break;		case INDICATOR_GREEN_BLINK_OFF:			selector = HUB_LED_OFF;			mode = INDICATOR_GREEN_BLINK;			break;		/* blinking amber = hw attention */		case INDICATOR_AMBER_BLINK:			selector = HUB_LED_AMBER;			mode = INDICATOR_AMBER_BLINK_OFF;			break;		case INDICATOR_AMBER_BLINK_OFF:			selector = HUB_LED_OFF;			mode = INDICATOR_AMBER_BLINK;			break;		/* blink green/amber = reserved */		case INDICATOR_ALT_BLINK:			selector = HUB_LED_GREEN;			mode = INDICATOR_ALT_BLINK_OFF;			break;		case INDICATOR_ALT_BLINK_OFF:			selector = HUB_LED_AMBER;			mode = INDICATOR_ALT_BLINK;			break;		default:			continue;		}		if (selector != HUB_LED_AUTO)			changed = 1;		set_port_led(hub, i + 1, selector);		hub->indicator[i] = mode;	}	if (!changed && blinkenlights) {		cursor++;		cursor %= hub->descriptor->bNbrPorts;		set_port_led(hub, cursor + 1, HUB_LED_GREEN);		hub->indicator[cursor] = INDICATOR_CYCLE;		changed++;	}	if (changed)		schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);}/* use a short timeout for hub/port status fetches */#define	USB_STS_TIMEOUT		1000#define	USB_STS_RETRIES		5/* * USB 2.0 spec Section 11.24.2.6 */static int get_hub_status(struct usb_device *hdev,		struct usb_hub_status *data){	int i, status = -ETIMEDOUT;	for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) {		status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),			USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0,			data, sizeof(*data), USB_STS_TIMEOUT);	}	return status;}/* * USB 2.0 spec Section 11.24.2.7 */static int get_port_status(struct usb_device *hdev, int port1,		struct usb_port_status *data){	int i, status = -ETIMEDOUT;	for (i = 0; i < USB_STS_RETRIES && status == -ETIMEDOUT; i++) {		status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),			USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1,			data, sizeof(*data), USB_STS_TIMEOUT);	}	return status;}static void kick_khubd(struct usb_hub *hub){	unsigned long	flags;	spin_lock_irqsave(&hub_event_lock, flags);	if (list_empty(&hub->event_list)) {		list_add_tail(&hub->event_list, &hub_event_list);		wake_up(&khubd_wait);	}	spin_unlock_irqrestore(&hub_event_lock, flags);}void usb_kick_khubd(struct usb_device *hdev){	kick_khubd(hdev_to_hub(hdev));}/* completion function, fires on port status changes and various faults */static void hub_irq(struct urb *urb, struct pt_regs *regs){	struct usb_hub *hub = (struct usb_hub *)urb->context;	int status;	int i;	unsigned long bits;	switch (urb->status) {	case -ENOENT:		/* synchronous unlink */	case -ECONNRESET:	/* async unlink */	case -ESHUTDOWN:	/* hardware going away */		return;	default:		/* presumably an error */		/* Cause a hub reset after 10 consecutive errors */		dev_dbg (hub->intfdev, "transfer --> %d\n", urb->status);		if ((++hub->nerrors < 10) || hub->error)			goto resubmit;		hub->error = urb->status;		/* FALL THROUGH */		/* let khubd handle things */	case 0:			/* we got data:  port status changed */		bits = 0;		for (i = 0; i < urb->actual_length; ++i)			bits |= ((unsigned long) ((*hub->buffer)[i]))					<< (i*8);		hub->event_bits[0] = bits;		break;	}	hub->nerrors = 0;	/* Something happened, let khubd figure it out */	kick_khubd(hub);resubmit:	if (hub->quiescing)		return;	if ((status = usb_submit_urb (hub->urb, GFP_ATOMIC)) != 0			&& status != -ENODEV && status != -EPERM)		dev_err (hub->intfdev, "resubmit --> %d\n", status);}/* USB 2.0 spec Section 11.24.2.3 */static inline inthub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt){	return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),			       HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo,			       tt, NULL, 0, 1000);}/* * enumeration blocks khubd for a long time. we use keventd instead, since * long blocking there is the exception, not the rule.  accordingly, HCDs * talking to TTs must queue control transfers (not just bulk and iso), so * both can talk to the same hub concurrently. */static void hub_tt_kevent (void *arg){	struct usb_hub		*hub = arg;	unsigned long		flags;	spin_lock_irqsave (&hub->tt.lock, flags);	while (!list_empty (&hub->tt.clear_list)) {		struct list_head	*temp;		struct usb_tt_clear	*clear;		struct usb_device	*hdev = hub->hdev;		int			status;		temp = hub->tt.clear_list.next;		clear = list_entry (temp, struct usb_tt_clear, clear_list);		list_del (&clear->clear_list);		/* drop lock so HCD can concurrently report other TT errors */		spin_unlock_irqrestore (&hub->tt.lock, flags);		status = hub_clear_tt_buffer (hdev, clear->devinfo, clear->tt);		spin_lock_irqsave (&hub->tt.lock, flags);		if (status)			dev_err (&hdev->dev,				"clear tt %d (%04x) error %d\n",				clear->tt, clear->devinfo, status);		kfree(clear);	}	spin_unlock_irqrestore (&hub->tt.lock, flags);}/** * usb_hub_tt_clear_buffer - clear control/bulk TT state in high speed hub * @udev: the device whose split transaction failed * @pipe: identifies the endpoint of the failed transaction * * High speed HCDs use this to tell the hub driver that some split control or * bulk transaction failed in a way that requires clearing internal state of * a transaction translator.  This is normally detected (and reported) from * interrupt context. * * It may not be possible for that hub to handle additional full (or low) * speed transactions until that state is fully cleared out. */void usb_hub_tt_clear_buffer (struct usb_device *udev, int pipe){	struct usb_tt		*tt = udev->tt;	unsigned long		flags;	struct usb_tt_clear	*clear;	/* we've got to cope with an arbitrary number of pending TT clears,	 * since each TT has "at least two" buffers that can need it (and	 * there can be many TTs per hub).  even if they're uncommon.	 */	if ((clear = kmalloc (sizeof *clear, SLAB_ATOMIC)) == NULL) {		dev_err (&udev->dev, "can't save CLEAR_TT_BUFFER state\n");		/* FIXME recover somehow ... RESET_TT? */		return;	}	/* info that CLEAR_TT_BUFFER needs */	clear->tt = tt->multi ? udev->ttport : 1;	clear->devinfo = usb_pipeendpoint (pipe);	clear->devinfo |= udev->devnum << 4;	clear->devinfo |= usb_pipecontrol (pipe)			? (USB_ENDPOINT_XFER_CONTROL << 11)			: (USB_ENDPOINT_XFER_BULK << 11);	if (usb_pipein (pipe))		clear->devinfo |= 1 << 15;		/* tell keventd to clear state for this TT */	spin_lock_irqsave (&tt->lock, flags);	list_add_tail (&clear->clear_list, &tt->clear_list);	schedule_work (&tt->kevent);	spin_unlock_irqrestore (&tt->lock, flags);}static void hub_power_on(struct usb_hub *hub){	int port1;	unsigned pgood_delay = hub->descriptor->bPwrOn2PwrGood * 2;	u16 wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics);	/* if hub supports power switching, enable power on each port */	if ((wHubCharacteristics & HUB_CHAR_LPSM) < 2) {		dev_dbg(hub->intfdev, "enabling power on all ports\n");		for (port1 = 1; port1 <= hub->descriptor->bNbrPorts; port1++)			set_port_feature(hub->hdev, port1,					USB_PORT_FEAT_POWER);	}	/* Wait at least 100 msec for power to become stable */	msleep(max(pgood_delay, (unsigned) 100));}static inline void __hub_quiesce(struct usb_hub *hub){	/* (nonblocking) khubd and related activity won't re-trigger */	hub->quiescing = 1;	hub->activating = 0;	hub->resume_root_hub = 0;}static void hub_quiesce(struct usb_hub *hub){	/* (blocking) stop khubd and related activity */	__hub_quiesce(hub);	usb_kill_urb(hub->urb);	if (hub->has_indicators)		cancel_delayed_work(&hub->leds);	if (hub->has_indicators || hub->tt.hub)		flush_scheduled_work();}static void hub_activate(struct usb_hub *hub){	int	status;	hub->quiescing = 0;	hub->activating = 1;	hub->resume_root_hub = 0;	status = usb_submit_urb(hub->urb, GFP_NOIO);	if (status < 0)		dev_err(hub->intfdev, "activate --> %d\n", status);	if (hub->has_indicators && blinkenlights)		schedule_delayed_work(&hub->leds, LED_CYCLE_PERIOD);	/* scan all ports ASAP */	kick_khubd(hub);}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成av人片| 成人高清视频在线| 精品一区二区三区av| 国产91色综合久久免费分享| 色综合色狠狠综合色| 日韩久久精品一区| 亚洲最新视频在线观看| 国产一区二区三区不卡在线观看 | 久久99国产精品麻豆| 91玉足脚交白嫩脚丫在线播放| 欧美一卡二卡在线| 一级精品视频在线观看宜春院 | 99免费精品在线| 日韩欧美一区二区在线视频| 亚洲欧洲www| 久久99精品久久久久| 色欧美乱欧美15图片| 欧美国产一区二区| 久久 天天综合| 91精品欧美久久久久久动漫| 一区二区三区在线视频观看58| 国产一区二区三区四区五区入口| 91麻豆精品91久久久久久清纯| 亚洲乱码国产乱码精品精小说| 国产精品一区在线观看你懂的| 4438x成人网最大色成网站| 国产精品不卡在线| 国产精品一二三四五| 欧美精品一区二区三区在线 | 欧美高清视频在线高清观看mv色露露十八| 国产精品三级视频| 成人一区二区三区在线观看| 欧美大片在线观看一区| 热久久一区二区| 91精品国产手机| 热久久免费视频| 日韩一区二区视频| 日本不卡高清视频| 日韩欧美黄色影院| 久久精品国产一区二区| 欧美成人官网二区| 国产综合色在线| 精品国产91九色蝌蚪| 国产乱国产乱300精品| 国产午夜亚洲精品羞羞网站| 国产精品综合久久| 国产精品国产成人国产三级| 成人免费视频caoporn| 国产精品久久久久一区二区三区 | 日韩激情av在线| 欧美一区二区在线观看| 久久 天天综合| 久久久久国产精品人| 成人免费视频播放| 一区二区三区 在线观看视频| 日本久久电影网| 视频在线观看一区二区三区| 日韩亚洲国产中文字幕欧美| 国产乱子伦视频一区二区三区 | 极品美女销魂一区二区三区| 2017欧美狠狠色| av亚洲产国偷v产偷v自拍| 亚洲欧美日韩系列| 制服.丝袜.亚洲.中文.综合| 国产一区二区在线观看视频| 中文一区二区在线观看| 欧美亚洲自拍偷拍| 国内精品嫩模私拍在线| 亚洲欧美一区二区在线观看| 欧美日韩成人综合| 国产精品888| 亚洲一区二区三区三| 欧美不卡在线视频| 97精品电影院| 久久精品免费观看| 免费视频最近日韩| 国产精品人妖ts系列视频| 在线精品视频免费播放| 黄页视频在线91| 亚洲人成在线播放网站岛国| 欧美电影免费观看高清完整版在线观看| 国产精品资源网| 午夜精品久久久| 欧美国产激情二区三区 | 高清在线不卡av| 亚洲成人中文在线| 日本一区二区三区高清不卡| 欧美日韩国产一级二级| 成人av免费在线观看| 蜜臀av一区二区三区| 亚洲精品免费看| 欧美国产日本韩| 精品久久久久久久久久久久包黑料| 97国产一区二区| 国产精品一区二区三区网站| 偷拍日韩校园综合在线| 亚洲欧美日韩国产中文在线| 久久久久久久综合| 欧美变态凌虐bdsm| 欧美日韩国产首页| 色94色欧美sute亚洲线路二 | 日韩精品最新网址| 欧美日韩一级片在线观看| 9i在线看片成人免费| 国产精品一二一区| 美国欧美日韩国产在线播放| 亚洲成a人片综合在线| 亚洲人成7777| 亚洲色图视频网站| 中文字幕在线一区| 欧美国产精品久久| 久久久精品综合| 久久久亚洲欧洲日产国码αv| 日韩精品专区在线| 日韩一本二本av| 亚洲人成亚洲人成在线观看图片 | av一区二区三区黑人| 国产精品69毛片高清亚洲| 国产资源精品在线观看| 久久99精品久久久久久久久久久久| 欧美a级一区二区| 日本网站在线观看一区二区三区| 香蕉加勒比综合久久 | 亚洲国产成人一区二区三区| 国产偷国产偷亚洲高清人白洁| 久久综合色天天久久综合图片| 欧美不卡一区二区三区四区| 欧美精品一区在线观看| 久久久久久久网| 国产精品国产自产拍高清av| 亚洲欧洲在线观看av| 亚洲六月丁香色婷婷综合久久| 亚洲人精品午夜| 亚洲国产成人精品视频| 五月婷婷综合激情| 久久国产精品无码网站| 国产精品 欧美精品| av成人老司机| 欧美日韩亚洲丝袜制服| 欧美一区二区三区四区五区 | 91精品欧美一区二区三区综合在| 91精品国产手机| 国产亚洲va综合人人澡精品| 亚洲欧洲性图库| 午夜电影久久久| 国产精品一区久久久久| 91香蕉视频黄| 91精品在线观看入口| 国产偷国产偷精品高清尤物| 久久66热偷产精品| 不卡的电影网站| 欧美人体做爰大胆视频| 久久一区二区视频| 亚洲摸摸操操av| 老司机一区二区| 91网站最新网址| 欧美电视剧在线观看完整版| 国产精品久久看| 免费观看一级欧美片| 成人白浆超碰人人人人| 91精品婷婷国产综合久久竹菊| 国产欧美日韩精品在线| 亚洲成人av福利| 丁香激情综合五月| 欧美一区二视频| 亚洲美女视频在线观看| 精品一区二区三区日韩| 在线观看免费成人| 久久久99久久精品欧美| 亚洲高清免费视频| 成人性生交大合| 日韩欧美一二三| 亚洲最色的网站| 成人app软件下载大全免费| 欧美一级淫片007| 亚洲精品高清在线| 国产精品123| 日韩欧美成人午夜| 亚洲国产婷婷综合在线精品| 成人国产在线观看| 精品国产sm最大网站免费看 | 中文在线资源观看网站视频免费不卡| 首页综合国产亚洲丝袜| 一本大道av伊人久久综合| 日本一区二区三级电影在线观看 | 精品国产免费人成电影在线观看四季 | 乱中年女人伦av一区二区| 色婷婷综合中文久久一本| 国产日韩欧美不卡在线| 美女在线视频一区| 欧美福利电影网| 亚洲午夜精品一区二区三区他趣| 成人午夜短视频| 中文字幕国产精品一区二区| 国内外成人在线视频| 精品久久99ma| 久久99热国产| 精品乱码亚洲一区二区不卡| 免费人成在线不卡| 日韩精品综合一本久道在线视频|