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

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

?? hub.c

?? linux2.6.16版本
?? C
?? 第 1 頁 / 共 5 頁
字號:
	/* scan all ports ASAP */	kick_khubd(hub);}static int hub_hub_status(struct usb_hub *hub,		u16 *status, u16 *change){	int ret;	ret = get_hub_status(hub->hdev, &hub->status->hub);	if (ret < 0)		dev_err (hub->intfdev,			"%s failed (err = %d)\n", __FUNCTION__, ret);	else {		*status = le16_to_cpu(hub->status->hub.wHubStatus);		*change = le16_to_cpu(hub->status->hub.wHubChange); 		ret = 0;	}	return ret;}static int hub_port_disable(struct usb_hub *hub, int port1, int set_state){	struct usb_device *hdev = hub->hdev;	int ret;	if (hdev->children[port1-1] && set_state) {		usb_set_device_state(hdev->children[port1-1],				USB_STATE_NOTATTACHED);	}	ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE);	if (ret)		dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n",			port1, ret);	return ret;}/* caller has locked the hub device */static void hub_pre_reset(struct usb_hub *hub, int disable_ports){	struct usb_device *hdev = hub->hdev;	int port1;	for (port1 = 1; port1 <= hdev->maxchild; ++port1) {		if (hdev->children[port1 - 1]) {			usb_disconnect(&hdev->children[port1 - 1]);			if (disable_ports)				hub_port_disable(hub, port1, 0);		}	}	hub_quiesce(hub);}/* caller has locked the hub device */static void hub_post_reset(struct usb_hub *hub){	hub_activate(hub);	hub_power_on(hub);}static int hub_configure(struct usb_hub *hub,	struct usb_endpoint_descriptor *endpoint){	struct usb_device *hdev = hub->hdev;	struct device *hub_dev = hub->intfdev;	u16 hubstatus, hubchange;	u16 wHubCharacteristics;	unsigned int pipe;	int maxp, ret;	char *message;	hub->buffer = usb_buffer_alloc(hdev, sizeof(*hub->buffer), GFP_KERNEL,			&hub->buffer_dma);	if (!hub->buffer) {		message = "can't allocate hub irq buffer";		ret = -ENOMEM;		goto fail;	}	hub->status = kmalloc(sizeof(*hub->status), GFP_KERNEL);	if (!hub->status) {		message = "can't kmalloc hub status buffer";		ret = -ENOMEM;		goto fail;	}	hub->descriptor = kmalloc(sizeof(*hub->descriptor), GFP_KERNEL);	if (!hub->descriptor) {		message = "can't kmalloc hub descriptor";		ret = -ENOMEM;		goto fail;	}	/* Request the entire hub descriptor.	 * hub->descriptor can handle USB_MAXCHILDREN ports,	 * but the hub can/will return fewer bytes here.	 */	ret = get_hub_descriptor(hdev, hub->descriptor,			sizeof(*hub->descriptor));	if (ret < 0) {		message = "can't read hub descriptor";		goto fail;	} else if (hub->descriptor->bNbrPorts > USB_MAXCHILDREN) {		message = "hub has too many ports!";		ret = -ENODEV;		goto fail;	}	hdev->maxchild = hub->descriptor->bNbrPorts;	dev_info (hub_dev, "%d port%s detected\n", hdev->maxchild,		(hdev->maxchild == 1) ? "" : "s");	wHubCharacteristics = le16_to_cpu(hub->descriptor->wHubCharacteristics);	if (wHubCharacteristics & HUB_CHAR_COMPOUND) {		int	i;		char	portstr [USB_MAXCHILDREN + 1];		for (i = 0; i < hdev->maxchild; i++)			portstr[i] = hub->descriptor->DeviceRemovable				    [((i + 1) / 8)] & (1 << ((i + 1) % 8))				? 'F' : 'R';		portstr[hdev->maxchild] = 0;		dev_dbg(hub_dev, "compound device; port removable status: %s\n", portstr);	} else		dev_dbg(hub_dev, "standalone hub\n");	switch (wHubCharacteristics & HUB_CHAR_LPSM) {		case 0x00:			dev_dbg(hub_dev, "ganged power switching\n");			break;		case 0x01:			dev_dbg(hub_dev, "individual port power switching\n");			break;		case 0x02:		case 0x03:			dev_dbg(hub_dev, "no power switching (usb 1.0)\n");			break;	}	switch (wHubCharacteristics & HUB_CHAR_OCPM) {		case 0x00:			dev_dbg(hub_dev, "global over-current protection\n");			break;		case 0x08:			dev_dbg(hub_dev, "individual port over-current protection\n");			break;		case 0x10:		case 0x18:			dev_dbg(hub_dev, "no over-current protection\n");                        break;	}	spin_lock_init (&hub->tt.lock);	INIT_LIST_HEAD (&hub->tt.clear_list);	INIT_WORK (&hub->tt.kevent, hub_tt_kevent, hub);	switch (hdev->descriptor.bDeviceProtocol) {		case 0:			break;		case 1:			dev_dbg(hub_dev, "Single TT\n");			hub->tt.hub = hdev;			break;		case 2:			ret = usb_set_interface(hdev, 0, 1);			if (ret == 0) {				dev_dbg(hub_dev, "TT per port\n");				hub->tt.multi = 1;			} else				dev_err(hub_dev, "Using single TT (err %d)\n",					ret);			hub->tt.hub = hdev;			break;		default:			dev_dbg(hub_dev, "Unrecognized hub protocol %d\n",				hdev->descriptor.bDeviceProtocol);			break;	}	/* Note 8 FS bit times == (8 bits / 12000000 bps) ~= 666ns */	switch (wHubCharacteristics & HUB_CHAR_TTTT) {		case HUB_TTTT_8_BITS:			if (hdev->descriptor.bDeviceProtocol != 0) {				hub->tt.think_time = 666;				dev_dbg(hub_dev, "TT requires at most %d "						"FS bit times (%d ns)\n",					8, hub->tt.think_time);			}			break;		case HUB_TTTT_16_BITS:			hub->tt.think_time = 666 * 2;			dev_dbg(hub_dev, "TT requires at most %d "					"FS bit times (%d ns)\n",				16, hub->tt.think_time);			break;		case HUB_TTTT_24_BITS:			hub->tt.think_time = 666 * 3;			dev_dbg(hub_dev, "TT requires at most %d "					"FS bit times (%d ns)\n",				24, hub->tt.think_time);			break;		case HUB_TTTT_32_BITS:			hub->tt.think_time = 666 * 4;			dev_dbg(hub_dev, "TT requires at most %d "					"FS bit times (%d ns)\n",				32, hub->tt.think_time);			break;	}	/* probe() zeroes hub->indicator[] */	if (wHubCharacteristics & HUB_CHAR_PORTIND) {		hub->has_indicators = 1;		dev_dbg(hub_dev, "Port indicators are supported\n");	}	dev_dbg(hub_dev, "power on to power good time: %dms\n",		hub->descriptor->bPwrOn2PwrGood * 2);	/* power budgeting mostly matters with bus-powered hubs,	 * and battery-powered root hubs (may provide just 8 mA).	 */	ret = usb_get_status(hdev, USB_RECIP_DEVICE, 0, &hubstatus);	if (ret < 2) {		message = "can't get hub status";		goto fail;	}	le16_to_cpus(&hubstatus);	if (hdev == hdev->bus->root_hub) {		if (hdev->bus_mA == 0 || hdev->bus_mA >= 500)			hub->mA_per_port = 500;		else {			hub->mA_per_port = hdev->bus_mA;			hub->limited_power = 1;		}	} else if ((hubstatus & (1 << USB_DEVICE_SELF_POWERED)) == 0) {		dev_dbg(hub_dev, "hub controller current requirement: %dmA\n",			hub->descriptor->bHubContrCurrent);		hub->limited_power = 1;		if (hdev->maxchild > 0) {			int remaining = hdev->bus_mA -					hub->descriptor->bHubContrCurrent;			if (remaining < hdev->maxchild * 100)				dev_warn(hub_dev,					"insufficient power available "					"to use all downstream ports\n");			hub->mA_per_port = 100;		/* 7.2.1.1 */		}	} else {	/* Self-powered external hub */		/* FIXME: What about battery-powered external hubs that		 * provide less current per port? */		hub->mA_per_port = 500;	}	if (hub->mA_per_port < 500)		dev_dbg(hub_dev, "%umA bus power budget for each child\n",				hub->mA_per_port);	ret = hub_hub_status(hub, &hubstatus, &hubchange);	if (ret < 0) {		message = "can't get hub status";		goto fail;	}	/* local power status reports aren't always correct */	if (hdev->actconfig->desc.bmAttributes & USB_CONFIG_ATT_SELFPOWER)		dev_dbg(hub_dev, "local power source is %s\n",			(hubstatus & HUB_STATUS_LOCAL_POWER)			? "lost (inactive)" : "good");	if ((wHubCharacteristics & HUB_CHAR_OCPM) == 0)		dev_dbg(hub_dev, "%sover-current condition exists\n",			(hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");	/* set up the interrupt endpoint */	pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress);	maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe));	if (maxp > sizeof(*hub->buffer))		maxp = sizeof(*hub->buffer);	hub->urb = usb_alloc_urb(0, GFP_KERNEL);	if (!hub->urb) {		message = "couldn't allocate interrupt urb";		ret = -ENOMEM;		goto fail;	}	usb_fill_int_urb(hub->urb, hdev, pipe, *hub->buffer, maxp, hub_irq,		hub, endpoint->bInterval);	hub->urb->transfer_dma = hub->buffer_dma;	hub->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;	/* maybe cycle the hub leds */	if (hub->has_indicators && blinkenlights)		hub->indicator [0] = INDICATOR_CYCLE;	hub_power_on(hub);	hub_activate(hub);	return 0;fail:	dev_err (hub_dev, "config failed, %s (err %d)\n",			message, ret);	/* hub_disconnect() frees urb and descriptor */	return ret;}static unsigned highspeed_hubs;static void hub_disconnect(struct usb_interface *intf){	struct usb_hub *hub = usb_get_intfdata (intf);	struct usb_device *hdev;	usb_set_intfdata (intf, NULL);	hdev = hub->hdev;	if (hdev->speed == USB_SPEED_HIGH)		highspeed_hubs--;	/* Disconnect all children and quiesce the hub */	hub_pre_reset(hub, 1);	usb_free_urb(hub->urb);	hub->urb = NULL;	spin_lock_irq(&hub_event_lock);	list_del_init(&hub->event_list);	spin_unlock_irq(&hub_event_lock);	kfree(hub->descriptor);	hub->descriptor = NULL;	kfree(hub->status);	hub->status = NULL;	if (hub->buffer) {		usb_buffer_free(hdev, sizeof(*hub->buffer), hub->buffer,				hub->buffer_dma);		hub->buffer = NULL;	}	kfree(hub);}static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id){	struct usb_host_interface *desc;	struct usb_endpoint_descriptor *endpoint;	struct usb_device *hdev;	struct usb_hub *hub;	desc = intf->cur_altsetting;	hdev = interface_to_usbdev(intf);	/* Some hubs have a subclass of 1, which AFAICT according to the */	/*  specs is not defined, but it works */	if ((desc->desc.bInterfaceSubClass != 0) &&	    (desc->desc.bInterfaceSubClass != 1)) {descriptor_error:		dev_err (&intf->dev, "bad descriptor, ignoring hub\n");		return -EIO;	}	/* Multiple endpoints? What kind of mutant ninja-hub is this? */	if (desc->desc.bNumEndpoints != 1)		goto descriptor_error;	endpoint = &desc->endpoint[0].desc;	/* Output endpoint? Curiouser and curiouser.. */	if (!(endpoint->bEndpointAddress & USB_DIR_IN))		goto descriptor_error;	/* If it's not an interrupt endpoint, we'd better punt! */	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)			!= USB_ENDPOINT_XFER_INT)		goto descriptor_error;	/* We found a hub */	dev_info (&intf->dev, "USB hub found\n");	hub = kzalloc(sizeof(*hub), GFP_KERNEL);	if (!hub) {		dev_dbg (&intf->dev, "couldn't kmalloc hub struct\n");		return -ENOMEM;	}	INIT_LIST_HEAD(&hub->event_list);	hub->intfdev = &intf->dev;	hub->hdev = hdev;	INIT_WORK(&hub->leds, led_work, hub);	usb_set_intfdata (intf, hub);	if (hdev->speed == USB_SPEED_HIGH)		highspeed_hubs++;	if (hub_configure(hub, endpoint) >= 0)		return 0;	hub_disconnect (intf);	return -ENODEV;}static inthub_ioctl(struct usb_interface *intf, unsigned int code, void *user_data){	struct usb_device *hdev = interface_to_usbdev (intf);	/* assert ifno == 0 (part of hub spec) */	switch (code) {	case USBDEVFS_HUB_PORTINFO: {		struct usbdevfs_hub_portinfo *info = user_data;		int i;		spin_lock_irq(&device_state_lock);		if (hdev->devnum <= 0)			info->nports = 0;		else {			info->nports = hdev->maxchild;			for (i = 0; i < info->nports; i++) {				if (hdev->children[i] == NULL)					info->port[i] = 0;				else					info->port[i] =						hdev->children[i]->devnum;			}		}		spin_unlock_irq(&device_state_lock);		return info->nports + 1;		}	default:		return -ENOSYS;	}}/* grab device/port lock, returning index of that port (zero based). * protects the upstream link used by this device from concurrent * tree operations like suspend, resume, reset, and disconnect, which * apply to everything downstream of a given port. */static int locktree(struct usb_device *udev){	int			t;	struct usb_device	*hdev;	if (!udev)		return -ENODEV;	/* root hub is always the first lock in the series */	hdev = udev->parent;	if (!hdev) {		usb_lock_device(udev);		return 0;	}	/* on the path from root to us, lock everything from	 * top down, dropping parent locks when not needed	 */	t = locktree(hdev);	if (t < 0)		return t;	/* everything is fail-fast once disconnect	 * processing starts	 */	if (udev->state == USB_STATE_NOTATTACHED) {		usb_unlock_device(hdev);		return -ENODEV;	}	/* when everyone grabs locks top->bottom,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品伦理在线| 美女视频黄免费的久久| 久久综合色综合88| 欧美一区二区成人6969| 6080亚洲精品一区二区| 56国语精品自产拍在线观看| 日韩一区二区在线观看视频播放| 91精品国产一区二区人妖| 欧美一级专区免费大片| 日韩欧美国产一区在线观看| 久久免费美女视频| 国产喂奶挤奶一区二区三区| 中文字幕亚洲视频| 亚洲激情自拍视频| 日韩中文字幕麻豆| 国内精品嫩模私拍在线| 丰满岳乱妇一区二区三区| 成人黄色网址在线观看| 91蝌蚪porny| 91精品国产综合久久久久久| 久久伊人蜜桃av一区二区| 国产精品丝袜在线| 亚洲资源在线观看| 日日夜夜一区二区| 国产精品综合一区二区三区| a美女胸又www黄视频久久| 韩国成人福利片在线播放| 日本一区二区综合亚洲| 91福利社在线观看| 欧美一区二区精美| 中文字幕欧美日韩一区| 一二三四区精品视频| 青青草伊人久久| 成熟亚洲日本毛茸茸凸凹| 欧美亚洲国产bt| 精品国产乱码久久久久久牛牛| 国产精品人妖ts系列视频| 亚洲国产精品一区二区www在线| 韩国成人精品a∨在线观看| 日本韩国一区二区| 久久久青草青青国产亚洲免观| 亚洲激情自拍偷拍| 国产精品中文有码| 欧美日韩精品一区二区天天拍小说 | 91视频www| 久久综合成人精品亚洲另类欧美 | 7777精品伊人久久久大香线蕉 | av不卡免费在线观看| 老汉av免费一区二区三区| 欧美婷婷六月丁香综合色| 青青草精品视频| 人人超碰91尤物精品国产| 成人小视频在线观看| 在线成人av影院| 亚洲综合丝袜美腿| 国产精品少妇自拍| 奇米精品一区二区三区在线观看一 | 91小视频免费观看| 国产亚洲美州欧州综合国| 亚洲1区2区3区4区| 一本久久a久久免费精品不卡| 久久久久久影视| 美国十次了思思久久精品导航| 91福利资源站| 亚洲欧美激情在线| 99久久精品一区二区| 中文字幕精品三区| 国产成人免费av在线| 亚洲精品一区二区在线观看| 一区二区三区鲁丝不卡| 成人免费高清视频在线观看| 久久亚洲一区二区三区四区| 爽好多水快深点欧美视频| 欧美在线观看视频一区二区| 亚洲日韩欧美一区二区在线| eeuss鲁片一区二区三区在线观看| 欧美精品一区二区三区很污很色的 | 欧美成人艳星乳罩| 日本不卡不码高清免费观看| 91麻豆精品国产91久久久使用方法 | 亚洲日本青草视频在线怡红院 | 精品国产成人系列| 美女视频黄久久| 欧美精品一区二区不卡| 狠狠色综合播放一区二区| www精品美女久久久tv| 国产乱码一区二区三区| 中文字幕+乱码+中文字幕一区| 成人性生交大片免费看中文| 国产精品久久久一本精品| 91麻豆国产在线观看| 一区2区3区在线看| 91精品国产欧美一区二区| 毛片av一区二区三区| 久久精品网站免费观看| 99久久综合狠狠综合久久| 亚洲精品乱码久久久久久日本蜜臀| 99riav一区二区三区| 亚洲成人免费在线观看| 欧美一区二区三区免费视频| 国产激情精品久久久第一区二区| 日本一区二区三区在线不卡| 99久久免费视频.com| 亚洲国产精品久久人人爱蜜臀| 日韩视频免费观看高清完整版在线观看| 蜜桃在线一区二区三区| 欧美国产日本韩| 欧美精品日日鲁夜夜添| 国产一区二区三区香蕉| 亚洲特黄一级片| 欧美一区二区性放荡片| 成人综合婷婷国产精品久久 | 国产日本欧美一区二区| 欧美怡红院视频| 国产美女在线观看一区| 亚洲一区二区成人在线观看| 日韩写真欧美这视频| 91日韩在线专区| 国产在线精品一区二区三区不卡| 亚洲婷婷综合色高清在线| 欧美电视剧免费全集观看| 91视频免费播放| 国产一区二区三区视频在线播放 | 91精品一区二区三区久久久久久| 成人午夜视频在线观看| 日本伊人色综合网| 亚洲欧美另类久久久精品2019| 久久亚洲综合av| 欧美日韩国产一区| jizzjizzjizz欧美| 国产精品影音先锋| 日韩精品一二三四| 一区二区免费在线播放| 中文字幕免费不卡| 精品国产三级a在线观看| 欧美影视一区在线| 在线观看亚洲精品视频| 暴力调教一区二区三区| 国产乱人伦偷精品视频免下载| 麻豆成人在线观看| 日韩av一区二区三区四区| 亚洲bt欧美bt精品777| 亚洲黄色小视频| 亚洲精品视频免费观看| 亚洲欧美怡红院| 国产精品欧美一级免费| 日本一区二区三区电影| 久久免费视频色| 国产欧美日韩另类视频免费观看| 欧美成人a∨高清免费观看| 538在线一区二区精品国产| 欧美日韩精品一区二区三区四区| 色综合天天综合在线视频| 99国产欧美另类久久久精品 | 夜夜嗨av一区二区三区四季av| 成人欧美一区二区三区1314| 中文字幕综合网| 亚洲免费观看高清| 亚洲乱码国产乱码精品精98午夜| 日韩理论片一区二区| 洋洋成人永久网站入口| 亚洲成人精品一区二区| 日韩成人av影视| 久久精品999| 风间由美一区二区三区在线观看| 成人不卡免费av| 一本久久a久久精品亚洲| 欧美性受xxxx| 91精品免费观看| 精品国产网站在线观看| 欧美激情一区二区三区在线| 中文字幕制服丝袜成人av| 亚洲三级理论片| 视频一区视频二区在线观看| 免费成人在线影院| 国产成人综合亚洲网站| 99视频一区二区三区| 欧美日韩亚洲丝袜制服| 精品电影一区二区| 国产精品欧美极品| 亚洲自拍偷拍九九九| 麻豆国产精品777777在线| 国产精品2024| 欧美综合亚洲图片综合区| 欧美一区二区在线免费观看| 国产精品久久综合| 日韩av不卡在线观看| 成人动漫一区二区| 欧美精品123区| 国产精品妹子av| 午夜av电影一区| 成人午夜看片网址| 在线播放欧美女士性生活| 国产欧美日韩精品一区| 亚洲高清视频在线| 国产成人av一区二区三区在线观看| 欧美视频一二三区| 亚洲国产精品成人久久综合一区| 亚洲国产wwwccc36天堂| 国产成人精品在线看|