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

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

?? serial.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*
 *  linux/kernel/serial.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  Extensively rewritten by Theodore Ts'o, 8/16/92 -- 9/14/92.  Now
 *  much more extensible to support other serial cards based on the
 *  16450/16550A UART's.  Added support for the AST FourPort and the
 *  Accent Async board.  
 *
 *  set_serial_info fixed to set the flags, custom divisor, and uart
 * 	type fields.  Fix suggested by Michael K. Johnson 12/12/92.
 *
 * This module exports the following rs232 io functions:
 *
 *	long rs_init(long);
 * 	int  rs_open(struct tty_struct * tty, struct file * filp)
 */

#include <linux/errno.h>
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <linux/tty.h>
#include <linux/serial.h>
#include <linux/interrupt.h>
#include <linux/config.h>
#include <linux/major.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/ptrace.h>

#include <asm/system.h>
#include <asm/io.h>
#include <asm/segment.h>
#include <asm/bitops.h>

/*
 * Serial driver configuration section.  Here are the various options:
 *
 * CONFIG_AUTO_IRQ
 *		Enables automatic IRQ detection.  I've put in some
 * 		fixes to this which should make this work much more
 * 		cleanly than it used to in 0.98pl2-6.  It should be
 * 		much less vulnerable to false IRQs now.
 * 
 * CONFIG_AST_FOURPORT
 *		Enables support for the AST Fourport serial port.
 * 
 * CONFIG_ACCENT_ASYNC
 *		Enables support for the Accent Async 4 port serial
 * 		port.
 *
 * CONFIG_HUB6
 *		Enables support for the venerable Bell Technologies
 *		HUB6 card.
 */

#undef ISR_HACK

/*
 * rs_event		- Bitfield of serial lines that events pending
 * 				to be processed at the next clock tick.
 * IRQ_timeout		- How long the timeout should be for each IRQ
 * 				should be after the IRQ has been active.
 * IRQ_timer		- Array of timeout values for each interrupt IRQ.
 * 				This is based on jiffies; not offsets.
 * 
 * We assume here that int's are 32 bits, so an array of two gives us
 * 64 lines, which is the maximum we can support.
 */
static int rs_event[2];

static struct async_struct *IRQ_ports[16];
static int IRQ_active;
static unsigned long IRQ_timer[16];
static int IRQ_timeout[16];
static volatile int rs_irq_triggered;
static volatile int rs_triggered;
static int rs_wild_int_mask;

static void autoconfig(struct async_struct * info);
static void change_speed(unsigned int line);
	
/*
 * This assumes you have a 1.8432 MHz clock for your UART.
 *
 * It'd be nice if someone built a serial card with a 24.576 MHz
 * clock, since the 16550A is capable of handling a top speed of 1.5
 * megabits/second; but this requires the faster clock.
 */
#define BASE_BAUD ( 1843200 / 16 )

#ifdef CONFIG_AUTO_IRQ
#define AUTO_IRQ_FLAG ASYNC_AUTO_IRQ
#else
#define AUTO_IRQ_FLAG 0
#endif

/* Standard COM flags (except for COM4, because of the 8514 problem) */
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | AUTO_IRQ_FLAG)
#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | AUTO_IRQ_FLAG)

#ifdef CONFIG_AST_FOURPORT
#define FOURPORT_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_FOURPORT | AUTO_IRQ_FLAG)
#else
#define FOURPORT_FLAGS (ASYNC_FOURPORT | AUTO_IRQ_FLAG)
#endif

#ifdef CONFIG_ACCENT_ASYNC
#define ACCENT_FLAGS (ASYNC_BOOT_AUTOCONF | AUTO_IRQ_FLAG)
#else
#define ACCENT_FLAGS AUTO_IRQ_FLAG
#endif

#ifdef CONFIG_BOCA
#define BOCA_FLAGS (ASYNC_BOOT_AUTOCONF | AUTO_IRQ_FLAG)
#else
#define BOCA_FLAGS AUTO_IRQ_FLAG
#endif

#ifdef CONFIG_HUB6
#define HUB6_FLAGS (ASYNC_BOOT_AUTOCONF)
#else
#define HUB6_FLAGS 0
#endif
	
/*
 * The following define the access methods for the HUB6 card. All
 * access is through two ports for all 24 possible chips. The card is
 * selected through the high 2 bits, the port on that card with the
 * "middle" 3 bits, and the register on that port with the bottom
 * 3 bits.
 *
 * While the access port and interrupt is configurable, the default
 * port locations are 0x302 for the port control register, and 0x303
 * for the data read/write register. Normally, the interrupt is at irq3
 * but can be anything from 3 to 7 inclusive. Note tht using 3 will
 * require disabling com2.
 */

#define C_P(card,port) (((card)<<6|(port)<<3) + 1)

struct async_struct rs_table[] = {
	/* UART CLK   PORT IRQ     FLAGS        */
	{ BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },		/* ttyS0 */
	{ BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS },		/* ttyS1 */
	{ BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS },		/* ttyS2 */
	{ BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS },	/* ttyS3 */

	{ BASE_BAUD, 0x1A0, 9, FOURPORT_FLAGS }, 	/* ttyS4 */
	{ BASE_BAUD, 0x1A8, 9, FOURPORT_FLAGS },	/* ttyS5 */
	{ BASE_BAUD, 0x1B0, 9, FOURPORT_FLAGS },	/* ttyS6 */
	{ BASE_BAUD, 0x1B8, 9, FOURPORT_FLAGS },	/* ttyS7 */

	{ BASE_BAUD, 0x2A0, 5, FOURPORT_FLAGS },	/* ttyS8 */
	{ BASE_BAUD, 0x2A8, 5, FOURPORT_FLAGS },	/* ttyS9 */
	{ BASE_BAUD, 0x2B0, 5, FOURPORT_FLAGS },	/* ttyS10 */
	{ BASE_BAUD, 0x2B8, 5, FOURPORT_FLAGS },	/* ttyS11 */
	
	{ BASE_BAUD, 0x330, 4, ACCENT_FLAGS },		/* ttyS12 */
	{ BASE_BAUD, 0x338, 4, ACCENT_FLAGS },		/* ttyS13 */
	{ BASE_BAUD, 0x000, 0, 0 },	/* ttyS14 (spare; user configurable) */
	{ BASE_BAUD, 0x000, 0, 0 },	/* ttyS15 (spare; user configurable) */

	{ BASE_BAUD, 0x100, 12, BOCA_FLAGS },	/* ttyS16 */
	{ BASE_BAUD, 0x108, 12, BOCA_FLAGS },	/* ttyS17 */
	{ BASE_BAUD, 0x110, 12, BOCA_FLAGS },	/* ttyS18 */
	{ BASE_BAUD, 0x118, 12, BOCA_FLAGS },	/* ttyS19 */
	{ BASE_BAUD, 0x120, 12, BOCA_FLAGS },	/* ttyS20 */
	{ BASE_BAUD, 0x128, 12, BOCA_FLAGS },	/* ttyS21 */
	{ BASE_BAUD, 0x130, 12, BOCA_FLAGS },	/* ttyS22 */
	{ BASE_BAUD, 0x138, 12, BOCA_FLAGS },	/* ttyS23 */
	{ BASE_BAUD, 0x140, 12, BOCA_FLAGS },	/* ttyS24 */
	{ BASE_BAUD, 0x148, 12, BOCA_FLAGS },	/* ttyS25 */
	{ BASE_BAUD, 0x150, 12, BOCA_FLAGS },	/* ttyS26 */
	{ BASE_BAUD, 0x158, 12, BOCA_FLAGS },	/* ttyS27 */
	{ BASE_BAUD, 0x160, 12, BOCA_FLAGS },	/* ttyS28 */
	{ BASE_BAUD, 0x168, 12, BOCA_FLAGS },	/* ttyS29 */
	{ BASE_BAUD, 0x170, 12, BOCA_FLAGS },	/* ttyS30 */
	{ BASE_BAUD, 0x178, 12, BOCA_FLAGS },	/* ttyS31 */

/* You can have up to four HUB6's in the system, but I've only
 * included two cards here for a total of twelve ports.
 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,0) },	/* ttyS32 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,1) },	/* ttyS33 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,2) },	/* ttyS34 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,3) },	/* ttyS35 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,4) },	/* ttyS36 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(0,5) },	/* ttyS37 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,0) },	/* ttyS32 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,1) },	/* ttyS33 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,2) },	/* ttyS34 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,3) },	/* ttyS35 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,4) },	/* ttyS36 */
	{ BASE_BAUD, 0x302, 3, HUB6_FLAGS, C_P(1,5) },	/* ttyS37 */
};

#define NR_PORTS	(sizeof(rs_table)/sizeof(struct async_struct))

/*
 * This is used to figure out the divsor speeds and the timeouts
 */
static int baud_table[] = {
	0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
	9600, 19200, 38400, 57600, 115200, 0 };

static void rs_throttle(struct tty_struct * tty, int status);

static inline unsigned int serial_in(struct async_struct *info, int offset)
{
    if (info->hub6) {
	outb(info->hub6 - 1 + offset, info->port);
	return inb(info->port+1);
    } else
	return inb(info->port + offset);
}

static inline unsigned int serial_inp(struct async_struct *info, int offset)
{
    if (info->hub6) {
	outb(info->hub6 - 1 + offset, info->port);
	return inb_p(info->port+1);
    } else
	return inb_p(info->port + offset);
}

static inline void serial_out(struct async_struct *info, int offset, int value)
{
    if (info->hub6) {
	outb(info->hub6 - 1 + offset, info->port);
	outb(value, info->port+1);
    } else
	outb(value, info->port+offset);
}

static inline void serial_outp(struct async_struct *info, int offset,
			       int value)
{
    if (info->hub6) {
	outb(info->hub6 - 1 + offset, info->port);
	outb_p(value, info->port+1);
    } else
	outb_p(value, info->port+offset);
}

/*
 * ------------------------------------------------------------
 * rs_stop() and rs_start()
 *
 * This routines are called before setting or resetting tty->stopped.
 * They enable or disable transmitter interrupts, as necessary.
 * ------------------------------------------------------------
 */
static void rs_stop(struct tty_struct *tty)
{
	struct async_struct *info;
	
	info = rs_table + DEV_TO_SL(tty->line);

	if (info->flags & ASYNC_CLOSING) {
		tty->stopped = 0;
		tty->hw_stopped = 0;
		return;
	}

	info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
#ifdef ISR_HACK
	serial_out(info, UART_IER, info->IER);
#endif
}

static void rs_start(struct tty_struct *tty)
{
	struct async_struct *info;
	
	info = rs_table + DEV_TO_SL(tty->line);
	
	info->IER = (UART_IER_MSI | UART_IER_RLSI |
		     UART_IER_THRI | UART_IER_RDI);
#ifdef ISR_HACK
	serial_out(info, UART_IER, info->IER);
#endif
}

/*
 * ----------------------------------------------------------------------
 *
 * Here starts the interrupt handling routines.  All of the following
 * subroutines are declared as inline and are folded into
 * rs_interrupt().  They were separated out for readability's sake.
 *
 * Note: rs_interrupt() is a "fast" interrupt, which means that it
 * runs with interrupts turned off.  People who may want to modify
 * rs_interrupt() should try to keep the interrupt handler as fast as
 * possible.  After you are done making modifications, it is not a bad
 * idea to do:
 * 
 * gcc -S -DKERNEL -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer serial.c
 *
 * and look at the resulting assemble code in serial.s.
 *
 * 				- Ted Ts'o (tytso@mit.edu), 7-Mar-93
 * -----------------------------------------------------------------------
 */

/*
 * This is the serial driver's interrupt routine while we are probing
 * for submarines.
 */
static void rs_probe(int irq)
{
	rs_irq_triggered = irq;
	rs_triggered |= 1 << irq;
	return;
}

/*
 * This routine is used by the interrupt handler to schedule
 * processing in the software interrupt portion of the driver.
 */
static inline void rs_sched_event(struct async_struct *info,
				  int event)
{
	info->event |= 1 << event;
	set_bit(info->line, rs_event);
	mark_bh(SERIAL_BH);
}

static inline void receive_chars(struct async_struct *info,
				 int *status)
{
	struct tty_queue * queue;
	int head, tail, ch;

/*
 * Just like the LEFT(x) macro, except it uses the loal tail
 * and head variables.
 */
#define VLEFT ((tail-head-1)&(TTY_BUF_SIZE-1))

	queue = &info->tty->read_q;
	head = queue->head;
	tail = queue->tail;
	do {
		ch = serial_inp(info, UART_RX);
		/*
		 * There must be at least 2 characters
		 * free in the queue; otherwise we punt.
		 */
		if (VLEFT < 2)
			break;
		if (*status & info->read_status_mask) {
			set_bit(head, &info->tty->readq_flags);
			if (*status & (UART_LSR_BI)) {
				queue->buf[head++]= TTY_BREAK;
				rs_sched_event(info, RS_EVENT_BREAK);
			} else if (*status & UART_LSR_PE)
				queue->buf[head++]= TTY_PARITY;
			else if (*status & UART_LSR_FE)
				queue->buf[head++]= TTY_FRAME;
			else if (*status & UART_LSR_OE)
				queue->buf[head++]= TTY_OVERRUN;
			head &= TTY_BUF_SIZE-1;
		}
		queue->buf[head++] = ch;
		head &= TTY_BUF_SIZE-1;
	} while ((*status = serial_inp(info, UART_LSR)) & UART_LSR_DR);
	queue->head = head;
	if ((VLEFT < RQ_THRESHOLD_LW) && !set_bit(TTY_RQ_THROTTLED,
						  &info->tty->flags)) 
		rs_throttle(info->tty, TTY_THROTTLE_RQ_FULL);
	rs_sched_event(info, RS_EVENT_READ_PROCESS);
#ifdef SERIAL_DEBUG_INTR
	printk("DR...");
#endif
}

static inline void transmit_chars(struct async_struct *info, int *done_work)
{
	struct tty_queue * queue;
	int head, tail, count;
	
	queue = &info->tty->write_q;
	head = queue->head;
	tail = queue->tail;
	if (head==tail && !info->x_char) {
		info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI;
#ifdef ISR_HACK
		serial_out(info, UART_IER, info->IER);
#endif
		return;
	}
	count = info->xmit_fifo_size;
	if (info->x_char) {
		serial_outp(info, UART_TX, info->x_char);
		info->x_char = 0;
		count--;
	}
	while (count-- && (tail != head)) {
		serial_outp(info, UART_TX, queue->buf[tail++]);
		tail &= TTY_BUF_SIZE-1;
	}
	queue->tail = tail;
	if (VLEFT > WAKEUP_CHARS) {
		rs_sched_event(info, RS_EVENT_WRITE_WAKEUP);
		if (info->tty->write_data_cnt) {
			set_bit(info->tty->line, &tty_check_write);
			mark_bh(TTY_BH);
		}
	}
#ifdef SERIAL_DEBUG_INTR
	printk("THRE...");
#endif
	(*done_work)++;
}

static inline int check_modem_status(struct async_struct *info)
{
	int	status;
	
	status = serial_in(info, UART_MSR);
		
	if ((status & UART_MSR_DDCD) && !C_CLOCAL(info->tty)) {
#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR))
		printk("ttys%d CD now %s...", info->line,
		       (status & UART_MSR_DCD) ? "on" : "off");
#endif		
		if (status & UART_MSR_DCD)
			rs_sched_event(info, RS_EVENT_OPEN_WAKEUP);
		else if (!((info->flags & ASYNC_CALLOUT_ACTIVE) &&
			   (info->flags & ASYNC_CALLOUT_NOHUP))) {
#ifdef SERIAL_DEBUG_OPEN
			printk("scheduling hangup...");
#endif
			rs_sched_event(info, RS_EVENT_HANGUP);
		}
	}
	if (C_CRTSCTS(info->tty) && !(info->flags & ASYNC_CLOSING)) {
		if (info->tty->hw_stopped) {
			if (status & UART_MSR_CTS) {
#ifdef SERIAL_DEBUG_INTR
				printk("CTS tx start...");
#endif
				info->tty->hw_stopped = 0;
				rs_start(info->tty);
				return 1;
			}
		} else {
			if (!(status & UART_MSR_CTS)) {
#ifdef SERIAL_DEBUG_INTR
				printk("CTS tx stop...");
#endif
				info->tty->hw_stopped = 1;
				rs_stop(info->tty);
			}
		}
	}
	return 0;
}

static inline void figure_RS_timer(void)
{
	int	timeout = jiffies + 60*HZ; /* 60 seconds; really big :-) */
	int	i, mask;
	
	if (!IRQ_active)
		return;
	for (i=0, mask = 1; mask <= IRQ_active; i++, mask <<= 1) {
		if (!(mask & IRQ_active))
			continue;
		if (IRQ_timer[i] < timeout)
			timeout = IRQ_timer[i];
	}
	timer_table[RS_TIMER].expires = timeout;
	timer_active |= 1 << RS_TIMER;
}


/*
 * This is the serial driver's generic interrupt routine
 */
static void rs_interrupt(int irq)
{
	int status;
	struct async_struct * info;
	int done, done_work, pass_number, recheck_count;

	rs_irq_triggered = irq;
	rs_triggered |= 1 << irq;
	
	info = IRQ_ports[irq];
	done = 1;
	done_work = 0;
	pass_number = 0;
	while (info) {
		if (info->tty &&
		    info->tty->termios &&
		    (!pass_number ||
		     !(serial_inp(info, UART_IIR) & UART_IIR_NO_INT))) {
			done = 0;
			status = serial_inp(info, UART_LSR);
			if (status & UART_LSR_DR) {
				receive_chars(info, &status);
				done_work++;
			}
		recheck_count = 0;
		recheck_write:
			if (status & UART_LSR_THRE) {
				wake_up_interruptible(&info->xmit_wait);
				if (!info->tty->stopped &&
				    !info->tty->hw_stopped)
					transmit_chars(info, &done_work);
			}
			if (check_modem_status(info) &&
			    (recheck_count++ <= 64))
				goto recheck_write;
#ifdef SERIAL_DEBUG_INTR

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人精品二区三区99精品| 中文字幕制服丝袜成人av | 国产精品沙发午睡系列990531| 亚洲精品免费在线播放| 激情综合五月婷婷| 欧洲精品一区二区三区在线观看| 日韩免费电影一区| 亚洲一区在线观看免费观看电影高清| 国产在线观看一区二区| 91精品国产综合久久久久久漫画 | 亚洲欧美另类在线| 国产一区二区三区精品视频| 欧美日韩另类国产亚洲欧美一级| 国产日韩欧美综合一区| 久久91精品久久久久久秒播| 欧美精品第1页| 亚洲一区二区三区视频在线| 99久久免费国产| 国产午夜精品一区二区三区视频 | 日本精品视频一区二区| 国产精品天美传媒沈樵| 国产美女精品一区二区三区| 欧美成人乱码一区二区三区| 亚洲午夜精品网| 欧美亚洲图片小说| 亚洲伦在线观看| 色综合一区二区三区| 国产精品大尺度| 91天堂素人约啪| 亚洲伦理在线精品| 一本色道综合亚洲| 亚洲人成网站精品片在线观看| 成人免费视频一区| 中文欧美字幕免费| 成人免费电影视频| 亚洲女爱视频在线| 色国产综合视频| 亚洲尤物在线视频观看| 欧美午夜电影网| 午夜精品久久久久| 日韩精品综合一本久道在线视频| 免费三级欧美电影| 精品国产欧美一区二区| 韩国av一区二区三区四区| 久久久久久夜精品精品免费| 高清久久久久久| 成人欧美一区二区三区黑人麻豆| 97久久精品人人做人人爽50路| 亚洲色图欧洲色图| 91.xcao| 日韩av不卡一区二区| 欧美成人video| 岛国av在线一区| 亚洲精品视频免费看| 欧美日韩免费一区二区三区| 美女视频黄 久久| 国产亚洲欧美色| 91搞黄在线观看| 麻豆一区二区99久久久久| 国产亚洲欧美激情| 色猫猫国产区一区二在线视频| 午夜精品一区二区三区免费视频 | 国产精品一二三在| 亚洲美女在线一区| 日韩一区二区电影在线| 波多野结衣欧美| 三级久久三级久久| 中文字幕欧美区| 欧美精品丝袜中出| 国产精品综合二区| 亚洲国产毛片aaaaa无费看 | 欧美大片拔萝卜| 色综合久久综合网| 蜜臀av一区二区| 亚洲精品成人天堂一二三| 亚洲精品一区二区三区香蕉| 丁香婷婷综合色啪| 青青草成人在线观看| 亚洲欧美国产高清| 337p日本欧洲亚洲大胆精品| 在线看国产日韩| 国产99久久精品| 免费人成网站在线观看欧美高清| 亚洲天堂2016| 国产日本欧美一区二区| 欧美一区二区三区视频在线| 91蜜桃视频在线| 国产精品一区二区在线观看不卡| 亚洲国产精品一区二区尤物区| 国产精品麻豆99久久久久久| 日韩欧美中文字幕一区| 色香蕉久久蜜桃| 不卡的av中国片| 国产成人亚洲综合色影视| 视频一区二区中文字幕| 一区二区三区国产精华| 亚洲天堂网中文字| 国产拍揄自揄精品视频麻豆| 欧美成人午夜电影| 日韩欧美中文一区| 欧美日韩mp4| 在线亚洲高清视频| 色拍拍在线精品视频8848| 成人精品视频一区二区三区| 国产精品一区二区三区99| 久久国产精品一区二区| 五月天激情小说综合| 亚洲6080在线| 午夜精品久久久久久久99樱桃| 亚洲综合自拍偷拍| 自拍偷拍欧美激情| 亚洲色图欧美激情| 国产精品你懂的在线欣赏| 精品剧情在线观看| 久久亚洲精华国产精华液 | www.av亚洲| 99久久久国产精品免费蜜臀| av在线不卡网| 成人成人成人在线视频| 成人美女视频在线看| 99精品欧美一区二区三区综合在线| 成人午夜视频福利| 99热国产精品| 91官网在线免费观看| 欧美日韩在线三区| 欧美裸体一区二区三区| 日韩视频一区在线观看| 精品国产乱子伦一区| 国产日本欧美一区二区| 日韩伦理av电影| 五月婷婷欧美视频| 免费不卡在线观看| 国产夫妻精品视频| 色综合久久久久网| 欧美另类变人与禽xxxxx| 日韩免费视频线观看| 中文字幕av在线一区二区三区| 国产精品毛片久久久久久| 亚洲激情综合网| 久久精工是国产品牌吗| 成人国产精品免费观看动漫| 色妹子一区二区| 91精品福利在线一区二区三区| 亚洲精品一区二区三区福利| 亚洲色图丝袜美腿| 亚洲成av人片在线| 99久久国产综合色|国产精品| 成人免费视频caoporn| 成人app下载| 亚洲夂夂婷婷色拍ww47 | 久久久精品国产免费观看同学| 中文字幕精品一区二区三区精品| 亚洲欧美乱综合| 美女视频黄免费的久久| www.成人在线| 日韩三级免费观看| 综合在线观看色| 天天综合网 天天综合色| 国产成人无遮挡在线视频| 欧美视频一区在线| 国产色综合久久| 日本女优在线视频一区二区| 成人精品一区二区三区四区 | 精品在线一区二区| 色综合久久中文综合久久97| 精品欧美黑人一区二区三区| 亚洲制服丝袜av| 国产精品一二一区| 9191久久久久久久久久久| 成人免费看片app下载| 欧美日本一道本在线视频| 国产欧美日韩三级| 青草国产精品久久久久久| 色一情一伦一子一伦一区| 久久久久国产精品麻豆ai换脸| 婷婷开心激情综合| 一本久久精品一区二区| 久久综合久久综合九色| 天天做天天摸天天爽国产一区| 91香蕉视频mp4| 国产欧美一区二区精品性色| 蜜桃av一区二区三区| 欧美影院一区二区三区| 亚洲欧洲精品成人久久奇米网| 久草精品在线观看| 日韩女优电影在线观看| 日韩av网站在线观看| 欧美久久免费观看| 亚洲无线码一区二区三区| 91麻豆免费在线观看| 中文字幕视频一区| av激情亚洲男人天堂| 欧美激情一区二区三区不卡| 精久久久久久久久久久| 欧美va亚洲va香蕉在线| 九一九一国产精品| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 91看片淫黄大片一级在线观看| 国产调教视频一区| 国产成人在线免费|