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

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

?? hub.c

?? 有關(guān)于USB的一些主機(jī)端驅(qū)動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * USB hub driver.
 *
 * (C) Copyright 1999 Linus Torvalds
 * (C) Copyright 1999 Johannes Erdfelt
 * (C) Copyright 1999 Gregory P. Smith
 */
/*
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/completion.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/smp_lock.h>
#ifdef CONFIG_USB_DEBUG
	#define DEBUG
#else
	#undef DEBUG
#endif
*/
//#include "usb.h"
/*
#include <linux/usbdevice_fs.h>

#include <asm/semaphore.h>
#include <asm/uaccess.h>
#include <asm/byteorder.h>
*/
#include "hub.h"
//#include "usb-ohci.h"
//extern void hc_register_info(ohci_t *ohci);
/* Wakes up khubd */
//static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED;
//static DECLARE_MUTEX(usb_address0_sem);
extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request, __u8 requesttype,__u16 value, __u16 index, void *data, __u16 size, int timeout);
extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,void *data, int len, int *actual_length, int timeout);
extern int list_empty(struct list_head *head);
void usb_hub_events();
extern void usb_scan_devices();
extern void atomic_inc(atomic_t *v);
extern void clear_bit(int nr, volatile void * addr);
extern unsigned int __create_pipe(struct usb_device *dev, unsigned int endpoint);
extern void list_del(struct list_head *entry);
extern int atomic_dec_and_test(atomic_t *v);
extern void wait_ms(unsigned int ms);

static LIST_HEAD(hub_event_list);	/* List of hubs needing servicing */
static LIST_HEAD(hub_list);		/* List containing all of the hubs (for cleanup) */

//static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);
//static int khubd_pid = 0;			/* PID of khubd */
//static DECLARE_COMPLETION(khubd_exited);


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";
}


static int usb_get_hub_descriptor(struct usb_device *dev, void *data, int size)
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_RT_HUB,
		USB_DT_HUB << 8, 0, data, size, HZ);
}

static int usb_clear_hub_feature(struct usb_device *dev, int feature)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_CLEAR_FEATURE, USB_RT_HUB, feature, 0, NULL, 0, HZ);
}

static int usb_clear_port_feature(struct usb_device *dev, int port, int feature)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_CLEAR_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);
}

static int usb_set_port_feature(struct usb_device *dev, int port, int feature)
{
	return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
		USB_REQ_SET_FEATURE, USB_RT_PORT, feature, port, NULL, 0, HZ);
}

static int usb_get_hub_status(struct usb_device *dev, void *data)
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_HUB, 0, 0,
		data, sizeof(struct usb_hub_status), HZ);
}

static int usb_get_port_status(struct usb_device *dev, int port, void *data)
{
	return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
		USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port,
		data, sizeof(struct usb_hub_status), HZ);
}

static void hub_irq(struct urb *urb)
{
	struct usb_hub *hub = (struct usb_hub *)urb->context;
	unsigned long flags;

	/* Cause a hub reset after 10 consecutive errors */
	if (urb->status) {
		if (urb->status == -ENOENT)
			return;

		printf("nonzero status in irq %d", urb->status);

		if ((++hub->nerrors < 10) || hub->error)
			return;

		hub->error = urb->status;
	}

	hub->nerrors = 0;

	/* Something happened, let khubd figure it out */
//	spin_lock_irqsave(&hub_event_lock, flags);
	if (list_empty(&hub->event_list)) {
		list_add(&hub->event_list, &hub_event_list);
//		wake_up(&khubd_wait);
		usb_hub_events();
	}
//	spin_unlock_irqrestore(&hub_event_lock, flags);

}

static void usb_hub_power_on(struct usb_hub *hub)
{
	int i;

	/* Enable power to the ports */
	printf("enabling power on all ports \n");
	for (i = 0; i < hub->descriptor->bNbrPorts; i++)
		usb_set_port_feature(hub->dev, i + 1, USB_PORT_FEAT_POWER);

	/* Wait for power to be enabled */
	wait_ms(hub->descriptor->bPwrOn2PwrGood * 2);
}

static int usb_hub_configure(struct usb_hub *hub, struct usb_endpoint_descriptor *endpoint)
{
	struct usb_device *dev = hub->dev;
	struct usb_hub_status hubstatus;
	char portstr[USB_MAXCHILDREN + 1];
	unsigned int pipe;
	int i, maxp, ret;

	hub->descriptor = (struct usb_hub_descriptor *)malloc(sizeof(*hub->descriptor));
	if (!hub->descriptor) {
		err("Unable to kmalloc %Zd bytes for hub descriptor", sizeof(*hub->descriptor));
		return -1;
	}

	/* Request the entire hub descriptor. */
	ret = usb_get_hub_descriptor(dev, hub->descriptor, sizeof(*hub->descriptor));
		/* <hub->descriptor> is large enough for a hub with 127 ports;
		 * the hub can/will return fewer bytes here. */
	if (ret < 0) {
		err("Unable to get hub descriptor (err = %d)", ret);
		free(hub->descriptor);
		return -1;
	}

	dev->maxchild = hub->descriptor->bNbrPorts;
//	info("%d port%s detected", hub->descriptor->bNbrPorts, (hub->descriptor->bNbrPorts == 1) ? "" : "s");

	le16_to_cpus(&hub->descriptor->wHubCharacteristics);

	if (hub->descriptor->wHubCharacteristics & HUB_CHAR_COMPOUND)
		printf("part of a compound device\n");
	else
		printf("standalone hub\n");

	switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) {
		case 0x00:
			printf("ganged power switching\n");
			break;
		case 0x01:
			printf("individual port power switching\n");
			break;
		case 0x02:
		case 0x03:
			printf("unknown reserved power switching mode\n");
			break;
	}

	switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_OCPM) {
		case 0x00:
			printf("global over-current protection\n");
			break;
		case 0x08:
			printf("individual port over-current protection\n");
			break;
		case 0x10:
		case 0x18:
			printf("no over-current protection\n");
                        break;
	}

	switch (dev->descriptor.bDeviceProtocol) {
		case 0:
			break;
		case 1:
			printf("Single TT\n");
			break;
		case 2:
			printf("Multiple TT\n");
			break;
		default:
			printf("Unrecognized hub protocol %d\n",
				dev->descriptor.bDeviceProtocol);
			break;
	}

	switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {
		case 0x00:
			if (dev->descriptor.bDeviceProtocol != 0)
				printf("TT requires at most 8 FS bit times\n");
			break;
		case 0x20:
			printf("TT requires at most 16 FS bit times\n");
			break;
		case 0x40:
			printf("TT requires at most 24 FS bit times\n");
			break;
		case 0x60:
			printf("TT requires at most 32 FS bit times\n");
			break;
	}

	printf("Port indicators are %s supported\n", 
	    (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) ? "" : "not");

	printf("power on to power good time: %d ms\n", hub->descriptor->bPwrOn2PwrGood * 2);
	printf("hub controller current requirement: %d mA\n", hub->descriptor->bHubContrCurrent);

	for (i = 0; i < dev->maxchild; i++)
		portstr[i] = hub->descriptor->bitmap[((i + 1) / 8)] & (1 << ((i + 1) % 8)) ? 'F' : 'R';
	portstr[dev->maxchild] = 0;

	printf("port removable status: %s\n", portstr);

	ret = usb_get_hub_status(dev, &hubstatus);
	if (ret < 0) {
		err("Unable to get hub status (err = %d)\n", ret);
		free(hub->descriptor);
		return -1;
	}

	le16_to_cpus(&hubstatus.wHubStatus);

	printf("local power source is %s\n",
		(hubstatus.wHubStatus & HUB_STATUS_LOCAL_POWER) ? "lost (inactive)" : "good");

	printf("%s over-current condition exists\n",
		(hubstatus.wHubStatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");

	/* Start the interrupt endpoint */
	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
	maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));

	if (maxp > sizeof(hub->buffer))
		maxp = sizeof(hub->buffer);

	hub->urb = (struct urb *)usb_alloc_urb(0);
	if (!hub->urb) {
		err("couldn't allocate interrupt urb\n");
		free(hub->descriptor);
		return -1;
	}

	FILL_INT_URB(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq,
		hub, endpoint->bInterval);
	ret = usb_submit_urb(hub->urb);
	if (ret) {
		err("usb_submit_urb failed (%d)\n", ret);
		free(hub->descriptor);
		return -1;
	}
		
	/* Wake up khubd */
//	wake_up(&khubd_wait);

	usb_hub_power_on(hub);

	return 0;
}

//static int hub_probe(struct usb_device *dev, unsigned int i,struct usb_device_id *id)
void * hub_probe(struct usb_device *dev, unsigned int i)
{
	struct usb_interface_descriptor *interface;
	struct usb_endpoint_descriptor *endpoint;
	struct usb_hub *hub;
	unsigned long flags;

	interface = &dev->actconfig->interface[i].altsetting[0];

	/* Some hubs have a subclass of 1, which AFAICT according to the */
	/*  specs is not defined, but it works */
	if ((interface->bInterfaceSubClass != 0) &&
	    (interface->bInterfaceSubClass != 1)) {
//		printf("invalid subclass (%d) for USB hub device #%d\n",	interface->bInterfaceSubClass, dev->devnum);
		return NULL;
	}

	/* Multiple endpoints? What kind of mutant ninja-hub is this? */
	if (interface->bNumEndpoints != 1) {
		printf("invalid bNumEndpoints (%d) for USB hub device #%d\n",interface->bNumEndpoints, dev->devnum);
		return NULL;
	}

	endpoint = &interface->endpoint[0];

	/* Output endpoint? Curiousier and curiousier.. */
	if (!(endpoint->bEndpointAddress & USB_DIR_IN)) {
		printf("Device #%d is hub class, but has output endpoint?\n",dev->devnum);
		return NULL;
	}

	/* If it's not an interrupt endpoint, we'd better punt! */
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) {
		err("Device #%d is hub class, but has endpoint other than interrupt?\n",
			dev->devnum);
		return NULL;
	}

	/* We found a hub */
	printf("USB hub found\n");

	hub = (struct usb_hub *)malloc(sizeof(*hub));
	if (!hub) {
		printf("couldn't kmalloc hub struct\n");
		return NULL;
//		return 0;
	}

	memset(hub, 0, sizeof(*hub));

	INIT_LIST_HEAD(&hub->event_list);
	hub->dev = dev;
	atomic_set(&hub->refcnt, 1);

	/* Record the new hub's existence */
//	spin_lock_irqsave(&hub_event_lock, flags);
	INIT_LIST_HEAD(&hub->hub_list);
	list_add(&hub->hub_list, &hub_list);
//	spin_unlock_irqrestore(&hub_event_lock, flags);

	if (usb_hub_configure(hub, endpoint) >= 0){
//		printf("Complete hub configuration\n");
		return hub;
	}

	printf("hub configuration failed for device #%d\n", dev->devnum);

	/* free hub, but first clean up its list. */
//	spin_lock_irqsave(&hub_event_lock, flags);

	/* Delete it and then reset it */
	list_del(&hub->event_list);
	INIT_LIST_HEAD(&hub->event_list);
	list_del(&hub->hub_list);
	INIT_LIST_HEAD(&hub->hub_list);

//	spin_unlock_irqrestore(&hub_event_lock, flags);

	free(hub);
//	return NULL;
	return 0;
}

static void hub_get(struct usb_hub *hub)
{
	atomic_inc(&hub->refcnt);
}

static void hub_put(struct usb_hub *hub)
{
	if (atomic_dec_and_test(&hub->refcnt)) {
		if (hub->descriptor) {
			free(hub->descriptor);
			hub->descriptor = NULL;
		}

		free(hub);
	}
}

static void hub_disconnect(struct usb_device *dev, void *ptr)
{
	struct usb_hub *hub = (struct usb_hub *)ptr;
	unsigned long flags;

	if (hub->urb) {
		usb_unlink_urb(hub->urb);
		usb_free_urb(hub->urb);
		hub->urb = NULL;
	}

//	spin_lock_irqsave(&hub_event_lock, flags);

	/* Delete it and then reset it */
	list_del(&hub->event_list);
	INIT_LIST_HEAD(&hub->event_list);
	list_del(&hub->hub_list);
	INIT_LIST_HEAD(&hub->hub_list);

//	spin_unlock_irqrestore(&hub_event_lock, flags);

	hub_put(hub);
}
#if 0
static int hub_ioctl(struct usb_device *hub, unsigned int code, void *user_data)
{
	/* assert ifno == 0 (part of hub spec) */
	switch (code) {
	case USBDEVFS_HUB_PORTINFO: {
		struct usbdevfs_hub_portinfo *info = user_data;
		unsigned long flags;
		int i;

		spin_lock_irqsave(&hub_event_lock, flags);
		if (hub->devnum <= 0)
			info->nports = 0;
		else {
			info->nports = hub->maxchild;
			for (i = 0; i < info->nports; i++) {
				if (hub->children[i] == NULL)
					info->port[i] = 0;
				else
					info->port[i] = hub->children[i]->devnum;
			}
		}
		spin_unlock_irqrestore(&hub_event_lock, flags);

		return info->nports + 1;
		}

	default:
		return -ENOSYS;
	}
}
#endif
static int usb_hub_reset(struct usb_hub *hub)
{
	struct usb_device *dev = hub->dev;
	int i;

	/* Disconnect any attached devices */
	for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
		if (dev->children[i])
			usb_disconnect(&dev->children[i]);
	}

	/* Attempt to reset the hub */
	if (hub->urb)
		usb_unlink_urb(hub->urb);
	else
		return -1;

	if (usb_reset_device(dev))
		return -1;

	hub->urb->dev = dev;                                                    
	if (usb_submit_urb(hub->urb))
		return -1;

	usb_hub_power_on(hub);

	return 0;
}

static void usb_hub_disconnect(struct usb_device *dev)
{
	struct usb_device *parent = dev->parent;
	int i;

	/* Find the device pointer to disconnect */
	if (parent) {
		for (i = 0; i < parent->maxchild; i++) {
			if (parent->children[i] == dev) {
				usb_disconnect(&parent->children[i]);
				return;
			}
		}
	}

	err("cannot disconnect hub %d\n", dev->devnum);
}

#define HUB_RESET_TRIES		5
#define HUB_PROBE_TRIES		2
#define HUB_SHORT_RESET_TIME	10
#define HUB_LONG_RESET_TIME	200
#define HUB_RESET_TIMEOUT	500

/* return: -1 on error, 0 on success, 1 on disconnect.  */
static int usb_hub_port_wait_reset(struct usb_device *hub, int port,
				struct usb_device *dev, unsigned int delay)
{
	int delay_time, ret;
	struct usb_port_status portsts;
	unsigned short portchange, portstatus;

	for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT; delay_time += delay) {
		/* wait to give the device a chance to reset */
		wait_ms(delay);

		/* read and decode port status */
		ret = usb_get_port_status(hub, port + 1, &portsts);
		if (ret < 0) {
			err("get_port_status(%d) failed (err = %d)\n", port + 1, ret);
			return -1;
		}

		portstatus = le16_to_cpu(portsts.wPortStatus);
		portchange = le16_to_cpu(portsts.wPortChange);

//		printf("Portstatus :%x\n",portstatus);//added by changming HUANG
//		printf("PortChange :%x\n",portchange);
		
		printf("port %d, portstatus %d, change %d %s\n", port + 1,
			portstatus, portchange, portspeed (portstatus));

		/* Device went away? */
		if (!(portstatus & USB_PORT_STAT_CONNECTION))
			return 1;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久欧美中文字幕| 国产校园另类小说区| 国产在线日韩欧美| 一区二区三区四区视频精品免费| 日韩欧美电影一区| 在线观看视频一区二区欧美日韩| 国产在线精品一区二区三区不卡| 一区二区在线观看视频| 久久看人人爽人人| 91精品国产福利在线观看| 99精品国产视频| 久久99精品一区二区三区| 亚洲一区二区三区四区不卡| 久久久久国产精品麻豆ai换脸| 欧美日韩国产大片| 91碰在线视频| 国产成人在线免费观看| 久久久精品国产99久久精品芒果 | 亚洲精品美国一| 精品少妇一区二区三区日产乱码| av亚洲精华国产精华精华| 国产麻豆日韩欧美久久| 蜜乳av一区二区三区| 午夜国产不卡在线观看视频| 亚洲欧美另类综合偷拍| 久久www免费人成看片高清| 亚洲精品国产无套在线观| 亚洲国产精品av| 精品成人一区二区| 精品女同一区二区| 日韩三级av在线播放| 777精品伊人久久久久大香线蕉| 色哟哟在线观看一区二区三区| 波多野结衣中文一区| 大胆欧美人体老妇| 成人午夜在线视频| 成人天堂资源www在线| 国产传媒欧美日韩成人| 国产河南妇女毛片精品久久久 | 狠狠色伊人亚洲综合成人| 全国精品久久少妇| 蜜臀av一区二区| 美女性感视频久久| 国产又黄又大久久| 国产不卡视频一区二区三区| 国产成人av一区二区三区在线观看| 国产一区久久久| 不卡区在线中文字幕| 99国产精品一区| 在线观看免费成人| 7777精品伊人久久久大香线蕉的 | 肉丝袜脚交视频一区二区| 天堂在线一区二区| 亚洲 欧美综合在线网络| 亚洲成av人在线观看| 蜜桃视频在线观看一区| 国产一区二区三区免费观看| 国产91精品一区二区麻豆亚洲| 成人一区二区视频| 91成人看片片| 日韩午夜小视频| 国产欧美日韩中文久久| 国产精品视频第一区| 一区二区三区高清不卡| 天堂精品中文字幕在线| 国产综合色产在线精品| av网站一区二区三区| 欧美色大人视频| 日韩精品一区二区三区四区| 国产欧美日韩在线看| 一区二区久久久| 久久国产尿小便嘘嘘| 成人美女视频在线看| 国产精品电影院| 亚洲小说春色综合另类电影| 精品在线观看免费| 成人av网址在线观看| 欧美久久久久久久久中文字幕| 欧美tickle裸体挠脚心vk| 中文幕一区二区三区久久蜜桃| 一区二区在线观看免费| 精品一二三四区| 91麻豆国产精品久久| 日韩视频国产视频| 专区另类欧美日韩| 美美哒免费高清在线观看视频一区二区| 国产成人在线影院| 精品视频1区2区3区| 久久精品人人爽人人爽| 亚洲一区二区在线观看视频| 国产自产2019最新不卡| 欧美亚洲国产bt| 久久精品这里都是精品| 亚洲国产视频一区| 国产成人啪午夜精品网站男同| 在线日韩av片| 精品国产一区久久| 亚洲日穴在线视频| 国产一区二区在线观看视频| 欧美写真视频网站| 国产精品久久久久影院老司| 毛片基地黄久久久久久天堂| 一本久道久久综合中文字幕| 精品国产自在久精品国产| 亚洲va在线va天堂| 99r国产精品| 欧美激情一区在线观看| 久久99久久久欧美国产| 欧美午夜片在线看| 亚洲四区在线观看| 岛国精品在线观看| 久久综合久久久久88| 视频一区中文字幕国产| 日本高清不卡在线观看| 国产精品第四页| 国产99久久久精品| 久久一二三国产| 久久国内精品自在自线400部| 欧美性大战久久久久久久| 最新不卡av在线| 成+人+亚洲+综合天堂| 久久九九久久九九| 国内不卡的二区三区中文字幕| 91精品国产欧美一区二区18| 亚洲国产精品久久久久婷婷884| caoporm超碰国产精品| 中文字幕精品一区| 国产jizzjizz一区二区| 久久久久久久电影| 国产高清精品在线| 国产片一区二区三区| 精品一区二区久久| 精品欧美一区二区久久| 理论电影国产精品| 欧美成人一区二区三区在线观看| 亚洲图片欧美视频| 欧美日韩亚洲国产综合| 亚洲国产精品久久人人爱| 欧美日韩一区二区三区在线| 亚洲一级片在线观看| 欧美午夜不卡视频| 五月综合激情日本mⅴ| 欧美精品v日韩精品v韩国精品v| 午夜日韩在线电影| 91麻豆精品国产91久久久久| 日韩电影在线观看一区| 在线播放91灌醉迷j高跟美女 | 日韩久久久久久| 久久99精品国产.久久久久久 | 亚洲第一综合色| 91精品欧美福利在线观看| 日日欢夜夜爽一区| 欧美白人最猛性xxxxx69交| 狠狠色丁香婷婷综合久久片| 国产免费久久精品| 91女神在线视频| 婷婷国产v国产偷v亚洲高清| 日韩欧美国产综合一区 | 欧美色中文字幕| 日韩国产精品久久久| 欧美成人性战久久| 波多野结衣精品在线| 亚洲一区二区欧美| 欧美成人精精品一区二区频| 福利视频网站一区二区三区| 亚洲欧美aⅴ...| 欧美一区中文字幕| 国产99精品国产| 一区二区在线观看视频| 日韩欧美一区二区久久婷婷| 高清在线不卡av| 亚洲6080在线| 中文字幕二三区不卡| 精品视频一区二区不卡| 国产精品影视网| 亚洲综合成人在线| 精品动漫一区二区三区在线观看| 不卡的看片网站| 日韩中文字幕一区二区三区| 久久久精品黄色| 欧美日韩国产影片| 成人综合激情网| 五月综合激情网| 国产精品久久久久久一区二区三区| 欧美日韩一区二区三区四区五区| 国产精品自在欧美一区| 亚洲高清一区二区三区| 久久久国产一区二区三区四区小说| 欧美亚洲高清一区二区三区不卡| 久久成人av少妇免费| 亚洲欧美国产77777| 亚洲精品在线观看视频| 精品视频在线视频| 99久久精品久久久久久清纯| 久久99久久99精品免视看婷婷 | 国产欧美精品一区二区三区四区 | 欧美日韩成人综合在线一区二区| 国产精品99久久久久久宅男| 日韩综合小视频| 亚洲视频一二三|