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

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

?? hub.c

?? Linux Kernel 2.6.9 for OMAP1710
?? C
?? 第 1 頁 / 共 5 頁
字號:
			break;		msleep(HUB_DEBOUNCE_STEP);	}	dev_dbg (hubdev (hdev),		"debounce: port %d: total %dms stable %dms status 0x%x\n",		port + 1, total_time, stable_time, portstatus);	if (stable_time < HUB_DEBOUNCE_STABLE)		return -ETIMEDOUT;	return portstatus;}static int hub_set_address(struct usb_device *udev){	int retval;	if (udev->devnum == 0)		return -EINVAL;	if (udev->state != USB_STATE_DEFAULT &&			udev->state != USB_STATE_ADDRESS)		return -EINVAL;	retval = usb_control_msg(udev, (PIPE_CONTROL << 30) /* Address 0 */,		USB_REQ_SET_ADDRESS, 0, udev->devnum, 0,		NULL, 0, HZ * USB_CTRL_SET_TIMEOUT);	if (retval == 0)		usb_set_device_state(udev, USB_STATE_ADDRESS);	return retval;}/* Reset device, (re)assign address, get device descriptor. * Device connection must be stable, no more debouncing needed. * Returns device in USB_STATE_ADDRESS, except on error. * * If this is called for an already-existing device (as part of * usb_reset_device), the caller must own the device lock.  For a * newly detected device that is not accessible through any global * pointers, it's not necessary to lock the device. */static inthub_port_init (struct usb_device *hdev, struct usb_device *udev, int port){	static DECLARE_MUTEX(usb_address0_sem);	int			i, j, retval;	unsigned		delay = HUB_SHORT_RESET_TIME;	enum usb_device_speed	oldspeed = udev->speed;	/* root hub ports have a slightly longer reset period	 * (from USB 2.0 spec, section 7.1.7.5)	 */	if (!hdev->parent) {		delay = HUB_ROOT_RESET_TIME;		if (port + 1 == hdev->bus->otg_port)			hdev->bus->b_hnp_enable = 0;	}	retval = clear_port_feature(hdev, port, USB_PORT_FEAT_SUSPEND);	if (retval < 0 && retval != -EPIPE)		dev_dbg(&udev->dev, "can't clear suspend; %d\n", retval);	/* Some low speed devices have problems with the quick delay, so */	/*  be a bit pessimistic with those devices. RHbug #23670 */	if (oldspeed == USB_SPEED_LOW)		delay = HUB_LONG_RESET_TIME;	down(&usb_address0_sem);	/* Reset the device; full speed may morph to high speed */	retval = hub_port_reset(hdev, port, udev, delay);	if (retval < 0)		/* error or disconnect */		goto fail;				/* success, speed is known */	retval = -ENODEV;	if (oldspeed != USB_SPEED_UNKNOWN && oldspeed != udev->speed) {		dev_dbg(&udev->dev, "device reset changed speed!\n");		goto fail;	}  	/* USB 2.0 section 5.5.3 talks about ep0 maxpacket ...	 * it's fixed size except for full speed devices.	 */	switch (udev->speed) {	case USB_SPEED_HIGH:		/* fixed at 64 */		i = 64;		break;	case USB_SPEED_FULL:		/* 8, 16, 32, or 64 */		/* to determine the ep0 maxpacket size, read the first 8		 * bytes from the device descriptor to get bMaxPacketSize0;		 * then correct our initial (small) guess.		 */		// FALLTHROUGH	case USB_SPEED_LOW:		/* fixed at 8 */		i = 8;		break;	default:		goto fail;	}	udev->epmaxpacketin [0] = i;	udev->epmaxpacketout[0] = i; 	dev_info (&udev->dev,			"%s %s speed USB device using address %d\n",			(udev->config) ? "reset" : "new",			({ char *speed; switch (udev->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;			}; speed;}),			udev->devnum);	/* Set up TT records, if needed  */	if (hdev->tt) {		udev->tt = hdev->tt;		udev->ttport = hdev->ttport;	} else if (udev->speed != USB_SPEED_HIGH			&& hdev->speed == USB_SPEED_HIGH) {		struct usb_hub *hub;		hub = usb_get_intfdata(hdev->actconfig->interface[0]);		udev->tt = &hub->tt;		udev->ttport = port + 1;	} 	/* Why interleave GET_DESCRIPTOR and SET_ADDRESS this way?	 * Because device hardware and firmware is sometimes buggy in	 * this area, and this is how Linux has done it for ages.	 * Change it cautiously.	 *	 * NOTE:  Windows gets the descriptor first, seemingly to help	 * work around device bugs like "can't use addresses with bit 3	 * set in certain configurations".  Yes, really.	 */	for (i = 0; i < GET_DESCRIPTOR_TRIES; ++i) {		for (j = 0; j < SET_ADDRESS_TRIES; ++j) {			retval = hub_set_address(udev);			if (retval >= 0)				break;			msleep(200);		}		if (retval < 0) {			dev_err(&udev->dev,				"device not accepting address %d, error %d\n",				udev->devnum, retval);			goto fail;		} 		/* cope with hardware quirkiness:		 *  - let SET_ADDRESS settle, some device hardware wants it		 *  - read ep0 maxpacket even for high and low speed,  		 */		msleep(10);		retval = usb_get_device_descriptor(udev, 8);		if (retval >= 8)			break;		msleep(100);	}	if (retval != 8) {		dev_err(&udev->dev, "device descriptor read/%s, error %d\n",				"8", retval);		if (retval >= 0)			retval = -EMSGSIZE;		goto fail;	}	if (udev->speed == USB_SPEED_FULL			&& (udev->epmaxpacketin [0]				!= udev->descriptor.bMaxPacketSize0)) {		usb_disable_endpoint(udev, 0 + USB_DIR_IN);		usb_disable_endpoint(udev, 0 + USB_DIR_OUT);		udev->epmaxpacketin [0] = udev->descriptor.bMaxPacketSize0;		udev->epmaxpacketout[0] = udev->descriptor.bMaxPacketSize0;	}  	retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);	if (retval < (signed)sizeof(udev->descriptor)) {		dev_err(&udev->dev, "device descriptor read/%s, error %d\n",			"all", retval);		if (retval >= 0)			retval = -ENOMSG;		goto fail;	}	retval = 0;fail:	up(&usb_address0_sem);	return retval;}static voidcheck_highspeed (struct usb_hub *hub, struct usb_device *udev, int port){	struct usb_qualifier_descriptor	*qual;	int				status;	qual = kmalloc (sizeof *qual, SLAB_KERNEL);	if (qual == 0)		return;	status = usb_get_descriptor (udev, USB_DT_DEVICE_QUALIFIER, 0,			qual, sizeof *qual);	if (status == sizeof *qual) {		dev_info(&udev->dev, "not running at top speed; "			"connect to a high speed hub\n");		/* hub LEDs are probably harder to miss than syslog */		if (hub->has_indicators) {			hub->indicator[port] = INDICATOR_GREEN_BLINK;			schedule_work (&hub->leds);		}	}	kfree (qual);}static unsignedhub_power_remaining (struct usb_hub *hub){	struct usb_device *hdev = hub->hdev;	int remaining;	unsigned i;	remaining = hub->power_budget;	if (!remaining)		/* self-powered */		return 0;	for (i = 0; i < hdev->maxchild; i++) {		struct usb_device	*udev = hdev->children[i];		int			delta, ceiling;		if (!udev)			continue;		/* 100mA per-port ceiling, or 8mA for OTG ports */		if (i != (udev->bus->otg_port - 1) || hdev->parent)			ceiling = 50;		else			ceiling = 4;		if (udev->actconfig)			delta = udev->actconfig->desc.bMaxPower;		else			delta = ceiling;		// dev_dbg(&udev->dev, "budgeted %dmA\n", 2 * delta);		if (delta > ceiling)			dev_warn(&udev->dev, "%dmA over %dmA budget!\n",				2 * (delta - ceiling), 2 * ceiling);		remaining -= delta;	}	if (remaining < 0) {		dev_warn(&hub->intf->dev,			"%dmA over power budget!\n",			-2 * remaining);		remaining = 0;	}	return remaining;}/* Handle physical or logical connection change events. * This routine is called when: * 	a port connection-change occurs; *	a port enable-change occurs (often caused by EMI); *	usb_reset_device() encounters changed descriptors (as from *		a firmware download) * caller already locked the hub */static void hub_port_connect_change(struct usb_hub *hub, int port,					u16 portstatus, u16 portchange){	struct usb_device *hdev = hub->hdev;	struct device *hub_dev = &hub->intf->dev;	int status, i; 	dev_dbg (hub_dev,		"port %d, status %04x, change %04x, %s\n",		port + 1, portstatus, portchange, portspeed (portstatus));	if (hub->has_indicators) {		set_port_led(hdev, port + 1, HUB_LED_AUTO);		hub->indicator[port] = INDICATOR_AUTO;	} 	/* Disconnect any existing devices under this port */	if (hdev->children[port])		usb_disconnect(&hdev->children[port]);	clear_bit(port, hub->change_bits);#ifdef	CONFIG_USB_OTG	/* during HNP, don't repeat the debounce */	if (hdev->bus->is_b_host)		portchange &= ~USB_PORT_STAT_C_CONNECTION;#endif	if (portchange & USB_PORT_STAT_C_CONNECTION) {		status = hub_port_debounce(hdev, port);		if (status < 0) {			dev_err (hub_dev,				"connect-debounce failed, port %d disabled\n",				port+1);			goto done;		}		portstatus = status;	}	/* Return now if nothing is connected */	if (!(portstatus & USB_PORT_STAT_CONNECTION)) {		/* maybe switch power back on (e.g. root hub was reset) */		if ((hub->descriptor->wHubCharacteristics					& HUB_CHAR_LPSM) < 2				&& !(portstatus & (1 << USB_PORT_FEAT_POWER)))			set_port_feature(hdev, port + 1, USB_PORT_FEAT_POWER); 		if (portstatus & USB_PORT_STAT_ENABLE)  			goto done;		return;	}	for (i = 0; i < SET_CONFIG_TRIES; i++) {		struct usb_device *udev;		/* reallocate for each attempt, since references		 * to the previous one can escape in various ways		 */		udev = usb_alloc_dev(hdev, hdev->bus, port);		if (!udev) {			dev_err (hub_dev,				"couldn't allocate port %d usb_device\n", port+1);			goto done;		}		usb_set_device_state(udev, USB_STATE_POWERED);		udev->speed = USB_SPEED_UNKNOWN; 		/* set the address */		choose_address(udev);		if (udev->devnum <= 0) {			status = -ENOTCONN;	/* Don't retry */			goto loop;		}		/* reset and get descriptor */		status = hub_port_init(hdev, udev, port);		if (status < 0)			goto loop;		/* consecutive bus-powered hubs aren't reliable; they can		 * violate the voltage drop budget.  if the new child has		 * a "powered" LED, users should notice we didn't enable it		 * (without reading syslog), even without per-port LEDs		 * on the parent.		 */		if (udev->descriptor.bDeviceClass == USB_CLASS_HUB				&& hub->power_budget) {			u16	devstat;			status = usb_get_status(udev, USB_RECIP_DEVICE, 0,					&devstat);			if (status < 0) {				dev_dbg(&udev->dev, "get status %d ?\n", status);				goto loop;			}			cpu_to_le16s(&devstat);			if ((devstat & (1 << USB_DEVICE_SELF_POWERED)) == 0) {				dev_err(&udev->dev,					"can't connect bus-powered hub "					"to this port\n");				if (hub->has_indicators) {					hub->indicator[port] =						INDICATOR_AMBER_BLINK;					schedule_work (&hub->leds);				}				status = -ENOTCONN;	/* Don't retry */				goto loop;			}		} 		/* check for devices running slower than they could */		if (udev->descriptor.bcdUSB >= 0x0200				&& udev->speed == USB_SPEED_FULL				&& highspeed_hubs != 0)			check_highspeed (hub, udev, port);		/* Store the parent's children[] pointer.  At this point		 * udev becomes globally accessible, although presumably		 * no one will look at it until hdev is unlocked.		 */		down (&udev->serialize);		status = 0;		/* We mustn't add new devices if the parent hub has		 * been disconnected; we would race with the		 * recursively_mark_NOTATTACHED() routine.		 */		spin_lock_irq(&device_state_lock);		if (hdev->state == USB_STATE_NOTATTACHED)			status = -ENOTCONN;		else			hdev->children[port] = udev;		spin_unlock_irq(&device_state_lock);		/* Run it through the hoops (find a driver, etc) */		if (!status) {			status = usb_new_device(udev);			if (status) {				spin_lock_irq(&device_state_lock);				hdev->children[port] = NULL;				spin_unlock_irq(&device_state_lock);			}		}		up (&udev->serialize);		if (status)			goto loop;		status = hub_power_remaining(hub);		if (status)			dev_dbg(hub_dev,				"%dmA power budget left\n",				2 * status);		return;loop:		hub_port_disable(hdev, port);		usb_disable_endpoint(udev, 0 + USB_DIR_IN);		usb_disable_endpoint(udev, 0 + USB_DIR_OUT);		release_address(udev);		usb_put_dev(udev);		if (status == -ENOTCONN)			break;	} done:	hub_port_disable(hdev, port);}static void hub_events(void){	struct list_head *tmp;	struct usb_device *hdev;	struct usb_hub *hub;	struct device *hub_dev;	u16 hubstatus;	u16 hubchange;	u16 portstatus;	u16 portchange;	int i, ret;	int connect_change;	/*	 *  We restart the list every time to avoid a deadlock with	 * deleting hubs downstream from this one. This should be	 * safe since we delete the hub from the event list.	 * Not the most efficient, but avoids deadlocks.	 */	while (1) {		/* Grab the first entry at the beginning of the list */		spin_lock_irq(&hub_event_lock);		if (list_empty(&hub_event_list)) {			spin_unlock_irq(&hub_event_lock);			break;		}		tmp = hub_event_list.next;		list_del_init(tmp);		hub = list_entry(tmp, struct usb_hub, event_list);		hdev = hub->hdev;		hub_dev = &hub->intf->dev;		usb_get_dev(hdev);		spin_unlock_irq(&hub_event_lock);		/* Lock the device, then check to see if we were		 * disconnected while waiting for the lock to succeed. */		if (locktree(hdev) < 0)			break;		if (hdev->state != USB_STATE_CONFIGURED ||				!hdev->actconfig ||				hub != usb_get_intfdata(					hdev->actconfig->interface[0]))			goto loop;		if (hub->error) {			dev_dbg (hub_dev, "resetting for error %d\n",				hub->error);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品日韩欧美在线| 在线影视一区二区三区| 欧美xxxxx牲另类人与| 偷拍亚洲欧洲综合| 欧美日韩午夜在线视频| 奇米亚洲午夜久久精品| 欧美一区二区三区免费视频| 男女性色大片免费观看一区二区| 日韩一区二区影院| 久久国内精品自在自线400部| 精品欧美一区二区久久| 国产乱码精品1区2区3区| 国产女主播一区| 色哟哟一区二区| 爽好久久久欧美精品| 精品久久久久久亚洲综合网| 国产91综合网| 亚洲制服丝袜av| 日韩女优av电影| 成人网页在线观看| 亚洲成人一区在线| 日韩一区二区三区观看| 国产成人久久精品77777最新版本| 国产精品久久久久aaaa| 欧美日韩夫妻久久| 国产成人精品一区二区三区四区 | 日韩视频一区二区在线观看| 精品一区二区三区视频在线观看| 国产精品女同互慰在线看| 欧美无砖专区一中文字| 国产成人免费av在线| 成人免费视频一区| 亚洲国产精品久久久男人的天堂| 欧美刺激午夜性久久久久久久| 成人aaaa免费全部观看| 日日夜夜免费精品| 国产精品乱人伦中文| 欧美一区二区在线视频| caoporm超碰国产精品| 美女视频黄 久久| 日韩毛片高清在线播放| 精品国产一区二区精华| 色噜噜狠狠成人中文综合| 狠狠网亚洲精品| 亚洲自拍偷拍综合| 国产精品人妖ts系列视频| 91麻豆精品国产自产在线观看一区| 成人污污视频在线观看| 久色婷婷小香蕉久久| 亚洲午夜久久久久久久久久久| 久久亚洲一级片| 欧美日韩视频第一区| 91一区一区三区| 国产盗摄一区二区三区| 久久激情五月婷婷| 亚洲福利视频导航| 亚洲欧美激情在线| 中文字幕乱码亚洲精品一区| 日韩色在线观看| 欧美日本一区二区三区四区 | 色女孩综合影院| 国产乱淫av一区二区三区| 视频一区在线播放| 樱桃国产成人精品视频| 国产精品久久国产精麻豆99网站 | 欧美日韩第一区日日骚| 色国产综合视频| 一本高清dvd不卡在线观看| 国产大陆a不卡| 国产一区二区在线视频| 久久精品噜噜噜成人88aⅴ| 婷婷国产在线综合| 亚洲午夜私人影院| 亚洲成人久久影院| 亚洲一区二区三区激情| 亚洲小说春色综合另类电影| 伊人性伊人情综合网| 亚洲精品高清在线观看| 亚洲黄色性网站| 亚洲欧美成人一区二区三区| 亚洲人成电影网站色mp4| 一色屋精品亚洲香蕉网站| 亚洲欧洲精品一区二区三区| 国产精品素人视频| 自拍偷拍亚洲综合| 国产激情一区二区三区| 成人午夜免费av| 色天天综合久久久久综合片| 7777精品伊人久久久大香线蕉超级流畅 | 欧美色视频一区| 在线观看视频欧美| 欧美系列一区二区| 欧美一区二区三区小说| 精品久久久久久久久久久久久久久久久 | 一区二区三区av电影 | 91精品国产综合久久久蜜臀粉嫩| 制服.丝袜.亚洲.中文.综合| 精品国产麻豆免费人成网站| 久久久亚洲欧洲日产国码αv| 欧美高清在线一区| 国产精品久久777777| 亚洲伦理在线免费看| 亚洲18女电影在线观看| 麻豆成人久久精品二区三区小说| 激情图片小说一区| 波多野结衣在线aⅴ中文字幕不卡| www.在线成人| 欧美理论电影在线| 精品少妇一区二区三区免费观看| 国产婷婷色一区二区三区在线| 国产精品电影一区二区| 亚洲综合男人的天堂| 麻豆91免费看| aaa亚洲精品一二三区| 欧美福利视频导航| 久久久久久久久久美女| 亚洲综合视频在线| 国产黄色精品网站| 欧美性大战久久久久久久| 久久色在线观看| 亚洲一区二区三区免费视频| 欧美日韩国产免费一区二区 | 亚洲免费在线观看视频| 蜜臀91精品一区二区三区| 国产sm精品调教视频网站| 欧美午夜精品理论片a级按摩| 欧美tk丨vk视频| 亚洲小少妇裸体bbw| 高清av一区二区| 91精品国产综合久久福利软件 | 亚洲综合在线五月| 狠狠色丁香久久婷婷综合丁香| 在线免费av一区| 国产蜜臀av在线一区二区三区| 性久久久久久久| 91免费视频观看| 国产欧美日韩精品a在线观看| 日韩av中文在线观看| 色悠悠久久综合| 国产亚洲欧洲997久久综合| 五月婷婷久久丁香| 色婷婷精品久久二区二区蜜臀av | 中文字幕制服丝袜一区二区三区 | 亚洲图片有声小说| 99久久伊人网影院| 亚洲精品一区二区三区99| 婷婷成人综合网| 欧美亚洲一区二区在线观看| 成人欧美一区二区三区黑人麻豆 | 国产精品不卡视频| 国产精品亚洲一区二区三区妖精 | 国产99久久久久久免费看农村| 日韩欧美一区在线| 色域天天综合网| 成人欧美一区二区三区1314| 成熟亚洲日本毛茸茸凸凹| 亚洲精品一区在线观看| 免费不卡在线观看| 日韩欧美一级精品久久| 免播放器亚洲一区| 日韩一区二区三区四区| 天堂精品中文字幕在线| 欧美丝袜自拍制服另类| 亚洲自拍偷拍av| 欧美日韩亚洲综合| 日韩高清不卡一区| 欧美军同video69gay| 午夜精品福利视频网站| 欧美美女黄视频| 日韩 欧美一区二区三区| 91精品久久久久久久91蜜桃| 日韩av一级片| 欧美一区二区成人6969| 麻豆中文一区二区| 久久久噜噜噜久噜久久综合| 国产电影精品久久禁18| 中文字幕一区二区三区在线观看| 成人av在线观| 亚洲精品视频自拍| 欧美日韩成人一区二区| 人人狠狠综合久久亚洲| 2017欧美狠狠色| 大白屁股一区二区视频| 亚洲人精品午夜| 欧美视频精品在线观看| 蜜臀av一级做a爰片久久| 精品欧美一区二区久久| 成人一级片网址| 亚洲激情中文1区| 欧美猛男超大videosgay| 另类人妖一区二区av| 国产免费久久精品| 欧美伊人久久久久久午夜久久久久| 亚洲国产综合91精品麻豆 | 国产欧美日韩视频在线观看| 风间由美中文字幕在线看视频国产欧美| 国产精品国产馆在线真实露脸| 一本到三区不卡视频| 免费人成在线不卡| 国产精品午夜春色av|