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

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

?? cdc-acm.c

?? USB Abstract Control Model driver for USB modems and ISDN adapters(for Linux)
?? C
?? 第 1 頁 / 共 2 頁
字號:
	if (!ACM_READY(acm))
		return -EINVAL;

	return -ENOIOCTLCMD;
}

static __u32 acm_tty_speed[] = {
	0, 50, 75, 110, 134, 150, 200, 300, 600,
	1200, 1800, 2400, 4800, 9600, 19200, 38400,
	57600, 115200, 230400, 460800, 500000, 576000,
	921600, 1000000, 1152000, 1500000, 2000000,
	2500000, 3000000, 3500000, 4000000
};

static __u8 acm_tty_size[] = {
	5, 6, 7, 8
};

static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_old)
{
	struct acm *acm = tty->driver_data;
	struct termios *termios = tty->termios;
	struct acm_line newline;
	int newctrl = acm->ctrlout;

	if (!ACM_READY(acm))
		return;

	newline.speed = cpu_to_le32p(acm_tty_speed +
		(termios->c_cflag & CBAUD & ~CBAUDEX) + (termios->c_cflag & CBAUDEX ? 15 : 0));
	newline.stopbits = termios->c_cflag & CSTOPB ? 2 : 0;
	newline.parity = termios->c_cflag & PARENB ?
		(termios->c_cflag & PARODD ? 1 : 2) + (termios->c_cflag & CMSPAR ? 2 : 0) : 0;
	newline.databits = acm_tty_size[(termios->c_cflag & CSIZE) >> 4];

	acm->clocal = ((termios->c_cflag & CLOCAL) != 0);

	if (!newline.speed) {
		newline.speed = acm->line.speed;
		newctrl &= ~ACM_CTRL_DTR;
	} else  newctrl |=  ACM_CTRL_DTR;

	if (newctrl != acm->ctrlout)
		acm_set_control(acm, acm->ctrlout = newctrl);

	if (memcmp(&acm->line, &newline, sizeof(struct acm_line))) {
		memcpy(&acm->line, &newline, sizeof(struct acm_line));
		dbg("set line: %d %d %d %d", newline.speed, newline.stopbits, newline.parity, newline.databits);
		acm_set_line(acm, &acm->line);
	}
}

/*
 * USB probe and disconnect routines.
 */

static int acm_probe (struct usb_interface *intf,
		      const struct usb_device_id *id)
{
	struct union_desc *union_header = NULL;
	char *buffer = intf->altsetting->extra;
	int buflen = intf->altsetting->extralen;
	struct usb_interface *control_interface;
	struct usb_interface *data_interface;
	struct usb_endpoint_descriptor *epctrl;
	struct usb_endpoint_descriptor *epread;
	struct usb_endpoint_descriptor *epwrite;
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	struct acm *acm;
	int minor;
	int ctrlsize,readsize;
	u8 *buf;
	u8 ac_management_function = 0;
	u8 call_management_function = 0;
	int call_interface_num = -1;
	int data_interface_num;
	unsigned long quirks;

	/* handle quirks deadly to normal probing*/
	quirks = (unsigned long)id->driver_info;
	if (quirks == NO_UNION_NORMAL) {
		data_interface = usb_ifnum_to_if(usb_dev, 1);
		control_interface = usb_ifnum_to_if(usb_dev, 0);
		goto skip_normal_probe;
	}
	
	/* normal probing*/
	if (!buffer) {
		err("Wierd descriptor references\n");
		return -EINVAL;
	}

	if (!buflen) {
		if (intf->cur_altsetting->endpoint->extralen && intf->cur_altsetting->endpoint->extra) {
			dev_dbg(&intf->dev,"Seeking extra descriptors on endpoint\n");
			buflen = intf->cur_altsetting->endpoint->extralen;
			buffer = intf->cur_altsetting->endpoint->extra;
		} else {
			err("Zero length descriptor references\n");
			return -EINVAL;
		}
	}

	while (buflen > 0) {
		if (buffer [1] != USB_DT_CS_INTERFACE) {
			err("skipping garbage\n");
			goto next_desc;
		}

		switch (buffer [2]) {
			case CDC_UNION_TYPE: /* we've found it */
				if (union_header) {
					err("More than one union descriptor, skipping ...");
					goto next_desc;
				}
				union_header = (struct union_desc *)buffer;
				break;
			case CDC_COUNTRY_TYPE: /* maybe somehow export */
				break; /* for now we ignore it */
			case CDC_HEADER_TYPE: /* maybe check version */ 
				break; /* for now we ignore it */ 
			case CDC_AC_MANAGEMENT_TYPE:
				ac_management_function = buffer[3];
				break;
			case CDC_CALL_MANAGEMENT_TYPE:
				call_management_function = buffer[3];
				call_interface_num = buffer[4];
				if ((call_management_function & 3) != 3)
					err("This device cannot do calls on its own. It is no modem.");
				break;
				
			default:
				err("Ignoring extra header, type %d, length %d", buffer[2], buffer[0]);
				break;
			}
next_desc:
		buflen -= buffer[0];
		buffer += buffer[0];
	}

	if (!union_header) {
		if (call_interface_num > 0) {
			dev_dbg(&intf->dev,"No union descriptor, using call management descriptor\n");
			data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
			control_interface = intf;
		} else {
			dev_dbg(&intf->dev,"No union descriptor, giving up\n");
			return -ENODEV;
		}
	} else {
		control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
		data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = union_header->bSlaveInterface0));
		if (!control_interface || !data_interface) {
			dev_dbg(&intf->dev,"no interfaces\n");
			return -ENODEV;
		}
	}
	
	if (data_interface_num != call_interface_num)
		dev_dbg(&intf->dev,"Seperate call control interface. That is not fully supported.\n");

skip_normal_probe:

	/*workaround for switched interfaces */
	if (data_interface->cur_altsetting->desc.bInterfaceClass != CDC_DATA_INTERFACE_TYPE) {
		if (control_interface->cur_altsetting->desc.bInterfaceClass == CDC_DATA_INTERFACE_TYPE) {
			struct usb_interface *t;
			dev_dbg(&intf->dev,"Your device has switched interfaces.\n");

			t = control_interface;
			control_interface = data_interface;
			data_interface = t;
		} else {
			return -EINVAL;
		}
	}
	
	if (usb_interface_claimed(data_interface)) { /* valid in this context */
		dev_dbg(&intf->dev,"The data interface isn't available\n");
		return -EBUSY;
	}


	if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
		return -EINVAL;

	epctrl = &control_interface->cur_altsetting->endpoint[0].desc;
	epread = &data_interface->cur_altsetting->endpoint[0].desc;
	epwrite = &data_interface->cur_altsetting->endpoint[1].desc;


	/* workaround for switched endpoints */
	if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
		/* descriptors are swapped */
		struct usb_endpoint_descriptor *t;
		dev_dbg(&intf->dev,"The data interface has switched endpoints\n");
		
		t = epread;
		epread = epwrite;
		epwrite = t;
	}
	dbg("interfaces are valid");
	for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);

	if (minor == ACM_TTY_MINORS) {
		err("no more free acm devices");
		return -ENODEV;
	}

	if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
		dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
		goto alloc_fail;
	}
	memset(acm, 0, sizeof(struct acm));

	ctrlsize = le16_to_cpu(epctrl->wMaxPacketSize);
	readsize = le16_to_cpu(epread->wMaxPacketSize);
	acm->writesize = le16_to_cpu(epwrite->wMaxPacketSize);
	acm->control = control_interface;
	acm->data = data_interface;
	acm->minor = minor;
	acm->dev = usb_dev;
	acm->ctrl_caps = ac_management_function;
	acm->ctrlsize = ctrlsize;
	acm->readsize = readsize;
	acm->bh.func = acm_rx_tasklet;
	acm->bh.data = (unsigned long) acm;
	INIT_WORK(&acm->work, acm_softint, acm);
	spin_lock_init(&acm->throttle_lock);
	acm->ready_for_write = 1;

	buf = usb_buffer_alloc(usb_dev, ctrlsize, GFP_KERNEL, &acm->ctrl_dma);
	if (!buf) {
		dev_dbg(&intf->dev, "out of memory (ctrl buffer alloc)\n");
		goto alloc_fail2;
	}
	acm->ctrl_buffer = buf;

	buf = usb_buffer_alloc(usb_dev, readsize, GFP_KERNEL, &acm->read_dma);
	if (!buf) {
		dev_dbg(&intf->dev, "out of memory (read buffer alloc)\n");
		goto alloc_fail3;
	}
	acm->read_buffer = buf;

	buf = usb_buffer_alloc(usb_dev, acm->writesize, GFP_KERNEL, &acm->write_dma);
	if (!buf) {
		dev_dbg(&intf->dev, "out of memory (write buffer alloc)\n");
		goto alloc_fail4;
	}
	acm->write_buffer = buf;	

	acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
	if (!acm->ctrlurb) {
		dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
		goto alloc_fail5;
	}
	acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
	if (!acm->readurb) {
		dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
		goto alloc_fail6;
	}
	acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
	if (!acm->writeurb) {
		dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
		goto alloc_fail7;
	}

	usb_fill_int_urb(acm->ctrlurb, usb_dev, usb_rcvintpipe(usb_dev, epctrl->bEndpointAddress),
			 acm->ctrl_buffer, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
	acm->ctrlurb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
	acm->ctrlurb->transfer_dma = acm->ctrl_dma;

	usb_fill_bulk_urb(acm->readurb, usb_dev, usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress),
			  acm->read_buffer, readsize, acm_read_bulk, acm);
	acm->readurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
	acm->readurb->transfer_dma = acm->read_dma;

	usb_fill_bulk_urb(acm->writeurb, usb_dev, usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
			  acm->write_buffer, acm->writesize, acm_write_bulk, acm);
	acm->writeurb->transfer_flags |= URB_NO_FSBR | URB_NO_TRANSFER_DMA_MAP;
	acm->writeurb->transfer_dma = acm->write_dma;

	dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);

	acm_set_control(acm, acm->ctrlout);

	acm->line.speed = cpu_to_le32(9600);
	acm->line.databits = 8;
	acm_set_line(acm, &acm->line);

	usb_driver_claim_interface(&acm_driver, data_interface, acm);

	tty_register_device(acm_tty_driver, minor, &intf->dev);

	acm_table[minor] = acm;
	usb_set_intfdata (intf, acm);
	return 0;

alloc_fail7:
	usb_free_urb(acm->readurb);
alloc_fail6:
	usb_free_urb(acm->ctrlurb);
alloc_fail5:
	usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
alloc_fail4:
	usb_buffer_free(usb_dev, readsize, acm->read_buffer, acm->read_dma);
alloc_fail3:
	usb_buffer_free(usb_dev, ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
alloc_fail2:
	kfree(acm);
alloc_fail:
	return -ENOMEM;
}

static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata (intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);

	if (!acm || !acm->dev) {
		dbg("disconnect on nonexisting interface");
		return;
	}

	down(&open_sem);
	acm->dev = NULL;
	usb_set_intfdata (intf, NULL);

	usb_kill_urb(acm->ctrlurb);
	usb_kill_urb(acm->readurb);
	usb_kill_urb(acm->writeurb);

	flush_scheduled_work(); /* wait for acm_softint */

	usb_buffer_free(usb_dev, acm->writesize, acm->write_buffer, acm->write_dma);
	usb_buffer_free(usb_dev, acm->readsize, acm->read_buffer, acm->read_dma);
	usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);

	usb_driver_release_interface(&acm_driver, acm->data);

	if (!acm->used) {
		tty_unregister_device(acm_tty_driver, acm->minor);
		acm_table[acm->minor] = NULL;
		usb_free_urb(acm->ctrlurb);
		usb_free_urb(acm->readurb);
		usb_free_urb(acm->writeurb);
		kfree(acm);
		up(&open_sem);
		return;
	}

	up(&open_sem);

	if (acm->tty)
		tty_hangup(acm->tty);
}

/*
 * USB driver structure.
 */

static struct usb_device_id acm_ids[] = {
	/* quirky and broken devices */
	{ USB_DEVICE(0x0870, 0x0001), /* Metricom GS Modem */
	.driver_info = NO_UNION_NORMAL, /* has no union descriptor */
	},
	/* control interfaces with various AT-command sets */
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 1) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 2) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 3) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 4) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 5) },
	{ USB_INTERFACE_INFO(USB_CLASS_COMM, 2, 6) },

	/* NOTE:  COMM/2/0xff is likely MSFT RNDIS ... NOT a modem!! */
	{ }
};

MODULE_DEVICE_TABLE (usb, acm_ids);

static struct usb_driver acm_driver = {
	.owner =	THIS_MODULE,
	.name =		"cdc_acm",
	.probe =	acm_probe,
	.disconnect =	acm_disconnect,
	.id_table =	acm_ids,
};

/*
 * TTY driver structures.
 */

static struct tty_operations acm_ops = {
	.open =			acm_tty_open,
	.close =		acm_tty_close,
	.write =		acm_tty_write,
	.write_room =		acm_tty_write_room,
	.ioctl =		acm_tty_ioctl,
	.throttle =		acm_tty_throttle,
	.unthrottle =		acm_tty_unthrottle,
	.chars_in_buffer =	acm_tty_chars_in_buffer,
	.break_ctl =		acm_tty_break_ctl,
	.set_termios =		acm_tty_set_termios,
	.tiocmget =		acm_tty_tiocmget,
	.tiocmset =		acm_tty_tiocmset,
};

/*
 * Init / exit.
 */

static int __init acm_init(void)
{
	int retval;
	acm_tty_driver = alloc_tty_driver(ACM_TTY_MINORS);
	if (!acm_tty_driver)
		return -ENOMEM;
	acm_tty_driver->owner = THIS_MODULE,
	acm_tty_driver->driver_name = "acm",
	acm_tty_driver->name = "ttyACM",
	acm_tty_driver->devfs_name = "usb/acm/",
	acm_tty_driver->major = ACM_TTY_MAJOR,
	acm_tty_driver->minor_start = 0,
	acm_tty_driver->type = TTY_DRIVER_TYPE_SERIAL,
	acm_tty_driver->subtype = SERIAL_TYPE_NORMAL,
	acm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS,
	acm_tty_driver->init_termios = tty_std_termios;
	acm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
	tty_set_operations(acm_tty_driver, &acm_ops);

	retval = tty_register_driver(acm_tty_driver);
	if (retval) {
		put_tty_driver(acm_tty_driver);
		return retval;
	}

	retval = usb_register(&acm_driver);
	if (retval) {
		tty_unregister_driver(acm_tty_driver);
		put_tty_driver(acm_tty_driver);
		return retval;
	}

	info(DRIVER_VERSION ":" DRIVER_DESC);

	return 0;
}

static void __exit acm_exit(void)
{
	usb_deregister(&acm_driver);
	tty_unregister_driver(acm_tty_driver);
	put_tty_driver(acm_tty_driver);
}

module_init(acm_init);
module_exit(acm_exit);

MODULE_AUTHOR( DRIVER_AUTHOR );
MODULE_DESCRIPTION( DRIVER_DESC );
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va天堂va国产va久| 国产精品久久久久久久久免费丝袜 | 日本一区二区成人在线| 国产不卡免费视频| 国产精品沙发午睡系列990531| 国产成人在线视频网址| 中文字幕不卡三区| 一本久道久久综合中文字幕| 亚洲综合一二三区| 欧美日韩国产区一| 免费成人av在线| 久久免费午夜影院| www.欧美亚洲| 亚洲bt欧美bt精品| 亚洲成人av一区二区| 欧美精品久久99久久在免费线 | 中文字幕日韩av资源站| 91免费观看在线| 日韩精品亚洲一区| 26uuu久久天堂性欧美| 成人h版在线观看| 亚洲综合一区二区| 精品久久国产字幕高潮| 99亚偷拍自图区亚洲| 亚洲成人久久影院| 久久久久久亚洲综合| 色婷婷综合久久久中文一区二区| 天涯成人国产亚洲精品一区av| 精品国产成人在线影院| 99久久精品国产网站| 日本vs亚洲vs韩国一区三区| 国产欧美精品一区二区色综合朱莉| 色婷婷综合五月| 国产乱子伦视频一区二区三区 | 国产丶欧美丶日本不卡视频| 亚洲综合视频网| 久久久久久夜精品精品免费| 欧美色手机在线观看| 国产成人自拍在线| 天天av天天翘天天综合网色鬼国产| 国产网站一区二区| 欧美精品少妇一区二区三区| 北岛玲一区二区三区四区| 另类欧美日韩国产在线| 一个色综合av| 日本一二三四高清不卡| 欧美一级一区二区| 色94色欧美sute亚洲13| 九九精品一区二区| 午夜欧美2019年伦理 | 亚洲乱码国产乱码精品精98午夜| 欧美v国产在线一区二区三区| 欧美亚洲尤物久久| 91视频免费看| 国产一区二区电影| 麻豆精品久久久| 午夜av电影一区| 亚洲一区二区三区四区在线免费观看 | 久久这里只有精品6| 欧美精品国产精品| 欧美专区日韩专区| 91理论电影在线观看| 成人综合日日夜夜| 国产传媒一区在线| 国产麻豆精品在线观看| 看电视剧不卡顿的网站| 日韩精品乱码免费| 日韩在线卡一卡二| 五月天中文字幕一区二区| 亚洲精品国产精品乱码不99| 国产精品丝袜一区| 国产精品色婷婷| 国产精品乱人伦中文| 国产欧美日韩综合精品一区二区 | 欧美视频一区在线观看| 91女神在线视频| 色婷婷综合久色| 在线看日韩精品电影| 欧洲亚洲精品在线| 91久久国产最好的精华液| 日本福利一区二区| 欧洲国内综合视频| 欧美三级三级三级爽爽爽| 欧美日韩一级片网站| 337p亚洲精品色噜噜噜| 日韩欧美美女一区二区三区| 日韩精品中文字幕在线不卡尤物| 欧美成人女星排名| 久久在线观看免费| 久久久99久久精品欧美| 国产精品热久久久久夜色精品三区| 国产精品麻豆久久久| 亚洲日本乱码在线观看| 亚洲一区二区高清| 日本亚洲天堂网| 国内一区二区视频| 成人av影视在线观看| 色婷婷av一区二区三区之一色屋| 精品视频123区在线观看| 91精品国产美女浴室洗澡无遮挡| 日韩一区二区三区电影在线观看| 日韩美女视频在线| 国产精品传媒视频| 丝袜亚洲精品中文字幕一区| 精品一区二区三区免费毛片爱| 国产成都精品91一区二区三| 色激情天天射综合网| 欧美一卡二卡在线| 国产精品久久久久影视| 午夜欧美一区二区三区在线播放| 极品瑜伽女神91| 91麻豆精品在线观看| 51久久夜色精品国产麻豆| 久久精品视频一区| 亚洲综合丁香婷婷六月香| 久久99精品久久久久久久久久久久| 国产99久久久国产精品潘金网站| 欧美专区在线观看一区| 久久久三级国产网站| 一区二区激情视频| 韩国精品一区二区| 欧亚一区二区三区| 久久久亚洲精品一区二区三区| 亚洲少妇30p| 狠狠v欧美v日韩v亚洲ⅴ| 色菇凉天天综合网| 国产婷婷色一区二区三区 | 国产精品三级av在线播放| 亚洲va韩国va欧美va精品| 丁香天五香天堂综合| 7777精品伊人久久久大香线蕉经典版下载 | 日本欧美一区二区三区乱码| 国产a精品视频| 91精品国产综合久久久久久漫画 | 99精品在线免费| 欧美大片在线观看| 亚洲一区在线电影| 成人午夜私人影院| 26uuu亚洲综合色| 日日夜夜精品视频天天综合网| 成人黄色大片在线观看| 精品美女一区二区| 视频一区二区国产| 欧美综合视频在线观看| 中文天堂在线一区| 国产原创一区二区| 欧美电影影音先锋| 亚洲综合一区二区三区| av爱爱亚洲一区| 国产女同性恋一区二区| 久久国产精品区| 欧美日本在线视频| 亚洲午夜免费福利视频| 色久综合一二码| 亚洲精品老司机| 色女孩综合影院| 亚洲人妖av一区二区| 成人福利电影精品一区二区在线观看| 26uuu另类欧美亚洲曰本| 久久成人麻豆午夜电影| 欧美一区二区福利视频| 天涯成人国产亚洲精品一区av| 欧美日韩中文另类| 亚洲成在人线在线播放| 欧美日韩精品一二三区| 亚洲成av人片在线观看无码| 亚洲综合激情小说| 色综合 综合色| 亚洲精品欧美二区三区中文字幕| 99精品视频一区二区三区| 中文字幕在线一区| 一本色道亚洲精品aⅴ| 一区二区三区精品视频在线| 欧美主播一区二区三区| 亚洲第一电影网| 日韩三级免费观看| 国产在线精品一区二区| 国产喂奶挤奶一区二区三区| 成人深夜在线观看| 亚洲精品中文在线观看| 欧美三级韩国三级日本三斤| 丝袜亚洲精品中文字幕一区| 日韩免费高清视频| 国产精品18久久久久久久久久久久| 国产亚洲一二三区| 99久久精品一区二区| 亚洲国产精品麻豆| 日韩欧美成人一区| 国产另类ts人妖一区二区| 中文字幕永久在线不卡| 欧洲国产伦久久久久久久| 视频一区免费在线观看| 久久精品亚洲国产奇米99| av欧美精品.com| 天天综合天天做天天综合| 精品国产精品网麻豆系列| 99麻豆久久久国产精品免费 | 秋霞电影一区二区| 久久久久久久久久美女| 一本色道久久综合精品竹菊|