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

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

?? s3cmci.c

?? 《ARM嵌入式Linux設備驅動實例開發》
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* *  linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver * *  Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */#include <linux/module.h>#include <linux/dma-mapping.h>#include <linux/clk.h>#include <linux/mmc/host.h>#include <linux/mmc/protocol.h>#include <linux/platform_device.h>#include <asm/dma.h>#include <asm/dma-mapping.h>#include <asm/io.h>#include <asm/arch/regs-sdi.h>#include <asm/arch/regs-gpio.h>#include "mmc_debug.h"#include "s3cmci.h"#define DRIVER_NAME "s3c-mci"enum dbg_channels {	dbg_err   = (1 << 0),	dbg_debug = (1 << 1),	dbg_info  = (1 << 2),	dbg_irq   = (1 << 3),	dbg_sg    = (1 << 4),	dbg_dma   = (1 << 5),	dbg_pio   = (1 << 6),	dbg_fail  = (1 << 7),	dbg_conf  = (1 << 8),};static const int dbgmap_err   = dbg_err | dbg_fail;static const int dbgmap_info  = dbg_info | dbg_conf;static const int dbgmap_debug = dbg_debug;#define dbg(host, channels, args...)		 \	if (dbgmap_err & channels) 		 \		dev_err(&host->pdev->dev, args); \	else if (dbgmap_info & channels)	 \		dev_info(&host->pdev->dev, args);\	else if (dbgmap_debug & channels)	 \		dev_dbg(&host->pdev->dev, args);#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)static struct s3c2410_dma_client s3cmci_dma_client = {	.name		= "s3c-mci",};static void finalize_request(struct s3cmci_host *host);static void s3cmci_send_request(struct mmc_host *mmc);static void s3cmci_reset(struct s3cmci_host *host);#ifdef CONFIG_MMC_DEBUGstatic inline void dbg_dumpregs(struct s3cmci_host *host, char *prefix){	u32 con, pre, cmdarg, cmdcon, cmdsta, r0, r1, r2, r3, timer, bsize;	u32 datcon, datcnt, datsta, fsta, imask;	con 	= readl(host->base + S3C2410_SDICON);	pre 	= readl(host->base + S3C2410_SDIPRE);	cmdarg 	= readl(host->base + S3C2410_SDICMDARG);	cmdcon 	= readl(host->base + S3C2410_SDICMDCON);	cmdsta 	= readl(host->base + S3C2410_SDICMDSTAT);	r0 	= readl(host->base + S3C2410_SDIRSP0);	r1 	= readl(host->base + S3C2410_SDIRSP1);	r2 	= readl(host->base + S3C2410_SDIRSP2);	r3 	= readl(host->base + S3C2410_SDIRSP3);	timer 	= readl(host->base + S3C2410_SDITIMER);	bsize 	= readl(host->base + S3C2410_SDIBSIZE);	datcon 	= readl(host->base + S3C2410_SDIDCON);	datcnt 	= readl(host->base + S3C2410_SDIDCNT);	datsta 	= readl(host->base + S3C2410_SDIDSTA);	fsta 	= readl(host->base + S3C2410_SDIFSTA);	imask   = readl(host->base + host->sdiimsk);	dbg(host, dbg_debug, "%s  CON:[%08x]  PRE:[%08x]  TMR:[%08x]\n",				prefix, con, pre, timer);	dbg(host, dbg_debug, "%s CCON:[%08x] CARG:[%08x] CSTA:[%08x]\n",				prefix, cmdcon, cmdarg, cmdsta);	dbg(host, dbg_debug, "%s DCON:[%08x] FSTA:[%08x]"			       " DSTA:[%08x] DCNT:[%08x]\n",				prefix, datcon, fsta, datsta, datcnt);	dbg(host, dbg_debug, "%s   R0:[%08x]   R1:[%08x]"			       "   R2:[%08x]   R3:[%08x]\n",				prefix, r0, r1, r2, r3);}static void prepare_dbgmsg(struct s3cmci_host *host, struct mmc_command *cmd,								int stop){ 	snprintf(host->dbgmsg_cmd, 300,		"#%u%s op:%s(%i) arg:0x%08x flags:0x08%x retries:%u",		host->ccnt, (stop?" (STOP)":""), mmc_cmd2str(cmd->opcode),		cmd->opcode, cmd->arg, cmd->flags, cmd->retries);	if (cmd->data) {		snprintf(host->dbgmsg_dat, 300,			"#%u bsize:%u blocks:%u bytes:%u",			host->dcnt, cmd->data->blksz,			cmd->data->blocks,			cmd->data->blocks * cmd->data->blksz);	} else {		host->dbgmsg_dat[0] = '\0';	}}static void dbg_dumpcmd(struct s3cmci_host *host, struct mmc_command *cmd,								int fail){	unsigned int dbglvl = fail?dbg_fail:dbg_debug;	if (!cmd)		return;	if (cmd->error == MMC_ERR_NONE) {		dbg(host, dbglvl, "CMD[OK] %s R0:0x%08x\n",			host->dbgmsg_cmd, cmd->resp[0]);	} else {		dbg(host, dbglvl, "CMD[%s] %s Status:%s\n",			mmc_err2str(cmd->error), host->dbgmsg_cmd,			host->status);	}	if (!cmd->data)		return;	if (cmd->data->error == MMC_ERR_NONE) {		dbg(host, dbglvl, "DAT[%s] %s\n",			mmc_err2str(cmd->data->error), host->dbgmsg_dat);	} else {		dbg(host, dbglvl, "DAT[%s] %s DCNT:0x%08x\n",			mmc_err2str(cmd->data->error), host->dbgmsg_dat,			readl(host->base + S3C2410_SDIDCNT));	}}#endifstatic inline u32 enable_imask(struct s3cmci_host *host, u32 imask){	u32 newmask;	newmask = readl(host->base + host->sdiimsk);	newmask|= imask;	writel(newmask, host->base + host->sdiimsk);	return newmask;}static inline u32 disable_imask(struct s3cmci_host *host, u32 imask){	u32 newmask;	newmask = readl(host->base + host->sdiimsk);	newmask&= ~imask;	writel(newmask, host->base + host->sdiimsk);	return newmask;}static inline void clear_imask(struct s3cmci_host *host){	writel(0, host->base + host->sdiimsk);}static inline int get_data_buffer(struct s3cmci_host *host,			volatile u32 *words, volatile u32 **pointer){	struct scatterlist *sg;	if (host->pio_active == XFER_NONE)		return -EINVAL;	if ((!host->mrq) || (!host->mrq->data))		return -EINVAL;	if (host->pio_sgptr >= host->mrq->data->sg_len) {		dbg(host, dbg_debug, "no more buffers (%i/%i)\n",		      host->pio_sgptr, host->mrq->data->sg_len);		return -EBUSY;	}	sg = &host->mrq->data->sg[host->pio_sgptr];	*words	= sg->length >> 2;	*pointer= page_address(sg->page) + sg->offset;	host->pio_sgptr++;	dbg(host, dbg_sg, "new buffer (%i/%i)\n",	      host->pio_sgptr, host->mrq->data->sg_len);	return 0;}#define FIFO_FILL(host) ((readl(host->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK) >> 2)#define FIFO_FREE(host) ((63 - (readl(host->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK)) >> 2)static inline void do_pio_read(struct s3cmci_host *host){	int res;	u32 fifo;	void __iomem *from_ptr;	//write real prescaler to host, it might be set slow to fix	writel(host->prescaler, host->base + S3C2410_SDIPRE);	from_ptr = host->base + host->sdidata;	while ((fifo = FIFO_FILL(host))) {		if (!host->pio_words) {			res = get_data_buffer(host, &host->pio_words,							&host->pio_ptr);			if (res) {				host->pio_active = XFER_NONE;				host->complete_what = COMPLETION_FINALIZE;				dbg(host, dbg_pio, "pio_read(): "					"complete (no more data).\n");				return;			}			dbg(host, dbg_pio, "pio_read(): new target: [%i]@[%p]\n",			       host->pio_words, host->pio_ptr);		}		dbg(host, dbg_pio, "pio_read(): fifo:[%02i] "				   "buffer:[%03i] dcnt:[%08X]\n",				   fifo, host->pio_words,				   readl(host->base + S3C2410_SDIDCNT));		if (fifo > host->pio_words)			fifo = host->pio_words;		host->pio_words-= fifo;		host->pio_count+= fifo;		while(fifo--) {			*(host->pio_ptr++) = readl(from_ptr);		}	}	if (!host->pio_words) {		res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);		if (res) {			dbg(host, dbg_pio, "pio_read(): "				"complete (no more buffers).\n");			host->pio_active = XFER_NONE;			host->complete_what = COMPLETION_FINALIZE;			return;		}	}	enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF | S3C2410_SDIIMSK_RXFIFOLAST);}static inline void do_pio_write(struct s3cmci_host *host){	int res;	u32 fifo;	void __iomem *to_ptr;	to_ptr = host->base + host->sdidata;	while ((fifo = FIFO_FREE(host))) {		if (!host->pio_words) {			res = get_data_buffer(host, &host->pio_words,							&host->pio_ptr);			if (res) {				dbg(host, dbg_pio, "pio_write(): "					"complete (no more data).\n");				host->pio_active = XFER_NONE;				return;			}			dbg(host, dbg_pio, "pio_write(): "				"new source: [%i]@[%p]\n",				host->pio_words, host->pio_ptr);		}		if (fifo > host->pio_words)			fifo = host->pio_words;		host->pio_words-= fifo;		host->pio_count+= fifo;		while(fifo--) {			writel(*(host->pio_ptr++), to_ptr);		}	}	enable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);}static void pio_tasklet(unsigned long data){	struct s3cmci_host *host = (struct s3cmci_host *) data;	if (host->pio_active == XFER_WRITE)		do_pio_write(host);	if (host->pio_active == XFER_READ)		do_pio_read(host);	if (host->complete_what == COMPLETION_FINALIZE) {		clear_imask(host);		if (host->pio_active != XFER_NONE) {			dbg(host, dbg_err, "unfinished %s "				"- pio_count:[%u] pio_words:[%u]\n",				(host->pio_active == XFER_READ)?"read":"write",				host->pio_count, host->pio_words);			host->mrq->data->error = MMC_ERR_DMA;		}		disable_irq(host->irq);		finalize_request(host);	}}/* * ISR for SDI Interface IRQ * Communication between driver and ISR works as follows: *   host->mrq 			points to current request *   host->complete_what	tells the ISR when the request is considered done *     COMPLETION_CMDSENT	  when the command was sent *     COMPLETION_RSPFIN          when a response was received *     COMPLETION_XFERFINISH	  when the data transfer is finished *     COMPLETION_XFERFINISH_RSPFIN both of the above. *   host->complete_request	is the completion-object the driver waits for * * 1) Driver sets up host->mrq and host->complete_what * 2) Driver prepares the transfer * 3) Driver enables interrupts * 4) Driver starts transfer * 5) Driver waits for host->complete_rquest * 6) ISR checks for request status (errors and success) * 6) ISR sets host->mrq->cmd->error and host->mrq->data->error * 7) ISR completes host->complete_request * 8) ISR disables interrupts * 9) Driver wakes up and takes care of the request * * Note: "->error"-fields are expected to be set to 0 before the request *       was issued by mmc.c - therefore they are only set, when an error *       contition comes up */static irqreturn_t s3cmci_irq(int irq, void *dev_id){	struct s3cmci_host *host;	struct mmc_command *cmd;	u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt, mci_imsk;	u32 mci_cclear, mci_dclear;	unsigned long iflags;	host = (struct s3cmci_host *)dev_id;	spin_lock_irqsave(&host->complete_lock, iflags);	mci_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	mci_dsta 	= readl(host->base + S3C2410_SDIDSTA);	mci_dcnt 	= readl(host->base + S3C2410_SDIDCNT);	mci_fsta 	= readl(host->base + S3C2410_SDIFSTA);	mci_imsk	= readl(host->base + host->sdiimsk);	mci_cclear	= 0;	mci_dclear	= 0;	if ((host->complete_what == COMPLETION_NONE) ||			(host->complete_what == COMPLETION_FINALIZE)) {		host->status = "nothing to complete";		clear_imask(host);		goto irq_out;	}	if (!host->mrq) {		host->status = "no active mrq";		clear_imask(host);		goto irq_out;	}	cmd = host->cmd_is_stop?host->mrq->stop:host->mrq->cmd;	if (!cmd) {		host->status = "no active cmd";		clear_imask(host);		goto irq_out;	}	if (!host->dodma) {		if ((host->pio_active == XFER_WRITE) &&				(mci_fsta & S3C2410_SDIFSTA_TFDET)) {			disable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);			tasklet_schedule(&host->pio_tasklet);			host->status = "pio tx";		}		if ((host->pio_active == XFER_READ) &&				(mci_fsta & S3C2410_SDIFSTA_RFDET)) {			disable_imask(host,				S3C2410_SDIIMSK_RXFIFOHALF | S3C2410_SDIIMSK_RXFIFOLAST);			tasklet_schedule(&host->pio_tasklet);			host->status = "pio rx";		}	}	if (mci_csta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {		cmd->error = MMC_ERR_TIMEOUT;		host->status = "error: command timeout";		goto fail_transfer;	}	if (mci_csta & S3C2410_SDICMDSTAT_CMDSENT) {		if (host->complete_what == COMPLETION_CMDSENT) {			host->status = "ok: command sent";			goto close_transfer;		}		mci_cclear |= S3C2410_SDICMDSTAT_CMDSENT;	}	if (mci_csta & S3C2410_SDICMDSTAT_RSPFIN) {		if (host->complete_what == COMPLETION_RSPFIN) {			host->status = "ok: command response received";			goto close_transfer;		}		if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN)			host->complete_what = COMPLETION_XFERFINISH;		mci_cclear |= S3C2410_SDICMDSTAT_RSPFIN;	}	/* errors handled after this point are only relevant	   when a data transfer is in progress */	if (!cmd->data)		goto clear_status_bits;	/* Check for FIFO failure */		if (mci_dsta & S3C2410_SDIDSTA_FIFOFAIL) {			cmd->data->error = MMC_ERR_FIFO;			host->status = "error:  fifo failure";			goto fail_transfer;		}		if (mci_dsta & S3C2410_SDIDSTA_RXCRCFAIL) {		cmd->data->error = MMC_ERR_BADCRC;		host->status = "error: bad data crc (outgoing)";		goto fail_transfer;	}	if (mci_dsta & S3C2410_SDIDSTA_CRCFAIL) {		cmd->data->error = MMC_ERR_BADCRC;		host->status = "error: bad data crc (incoming)";		goto fail_transfer;	}	if (mci_dsta & S3C2410_SDIDSTA_DATATIMEOUT) {		cmd->data->error = MMC_ERR_TIMEOUT;		host->status = "error: data timeout";		goto fail_transfer;	}	if (mci_dsta & S3C2410_SDIDSTA_XFERFINISH) {		if (host->complete_what == COMPLETION_XFERFINISH) {			host->status = "ok: data transfer completed";			goto close_transfer;		}		if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN) {			host->complete_what = COMPLETION_RSPFIN;		}		mci_dclear |= S3C2410_SDIDSTA_XFERFINISH;	}clear_status_bits:	writel(mci_cclear, host->base + S3C2410_SDICMDSTAT);	writel(mci_dclear, host->base + S3C2410_SDIDSTA);	goto irq_out;fail_transfer:	host->pio_active = XFER_NONE;close_transfer:	host->complete_what = COMPLETION_FINALIZE;	clear_imask(host);	tasklet_schedule(&host->pio_tasklet);	goto irq_out;irq_out:	dbg(host, dbg_irq, "csta:0x%08x dsta:0x%08x "			   "fsta:0x%08x dcnt:0x%08x status:%s.\n",				mci_csta, mci_dsta, mci_fsta,				mci_dcnt, host->status);	spin_unlock_irqrestore(&host->complete_lock, iflags);	return IRQ_HANDLED;}/* * ISR for the CardDetect Pin*/static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id){	struct s3cmci_host *host = (struct s3cmci_host *)dev_id;	dbg(host, dbg_irq, "card detect\n");	mmc_detect_change(host->mmc, 500);	return IRQ_HANDLED;}void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, void *buf_id,	int size, enum s3c2410_dma_buffresult result){	unsigned long iflags;	u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt;	struct s3cmci_host *host = (struct s3cmci_host *)buf_id;	mci_csta 	= readl(host->base + S3C2410_SDICMDSTAT);	mci_dsta 	= readl(host->base + S3C2410_SDIDSTA);	mci_fsta 	= readl(host->base + S3C2410_SDIFSTA);	mci_dcnt 	= readl(host->base + S3C2410_SDIDCNT);	if ((!host->mrq) || (!host->mrq) || (!host->mrq->data))		return;	if (!host->dmatogo)		return;	spin_lock_irqsave(&host->complete_lock, iflags);	if (result != S3C2410_RES_OK) {		dbg(host, dbg_fail, "DMA FAILED: csta=0x%08x dsta=0x%08x "			"fsta=0x%08x dcnt:0x%08x result:0x%08x toGo:%u\n",			mci_csta, mci_dsta, mci_fsta,			mci_dcnt, result, host->dmatogo);		goto fail_request;	}	host->dmatogo--;	if (host->dmatogo) {		dbg(host, dbg_dma, "DMA DONE  Size:%i DSTA:[%08x] "			"DCNT:[%08x] toGo:%u\n",			size, mci_dsta, mci_dcnt, host->dmatogo);		goto out;	}	dbg(host, dbg_dma, "DMA FINISHED Size:%i DSTA:%08x DCNT:%08x\n",		size, mci_dsta, mci_dcnt);	host->complete_what = COMPLETION_FINALIZE;out:	tasklet_schedule(&host->pio_tasklet);	spin_unlock_irqrestore(&host->complete_lock, iflags);	return;fail_request:	host->mrq->data->error = MMC_ERR_DMA;	host->complete_what = COMPLETION_FINALIZE;	writel(0, host->base + host->sdiimsk);	goto out;}static void finalize_request(struct s3cmci_host *host){	struct mmc_request *mrq = host->mrq;	struct mmc_command *cmd = host->cmd_is_stop?mrq->stop:mrq->cmd;	int debug_as_failure = 0;	u32 mci_con;	if (host->complete_what != COMPLETION_FINALIZE)		return;	if (!mrq)		return;	if (cmd->data && (cmd->error == MMC_ERR_NONE) &&		  (cmd->data->error == MMC_ERR_NONE)) {		if (host->dodma && (!host->dma_complete)) {			dbg(host, dbg_dma, "DMA Missing!\n");			return;		}	}	// Read response	cmd->resp[0] = readl(host->base + S3C2410_SDIRSP0);	cmd->resp[1] = readl(host->base + S3C2410_SDIRSP1);	cmd->resp[2] = readl(host->base + S3C2410_SDIRSP2);	cmd->resp[3] = readl(host->base + S3C2410_SDIRSP3);	// reset clock speed, as it could still be set low for	writel(host->prescaler, host->base + S3C2410_SDIPRE);	if (cmd->error)		debug_as_failure = 1;	if (cmd->data && cmd->data->error)		debug_as_failure = 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲视频在线一区二区| 亚洲永久精品国产| 欧美成人性福生活免费看| 欧美三级资源在线| 欧美精品vⅰdeose4hd| 91久久精品一区二区三| 成人毛片老司机大片| heyzo一本久久综合| 成人教育av在线| 国产主播一区二区| 韩国欧美国产1区| 国产老肥熟一区二区三区| 精品系列免费在线观看| 日本va欧美va精品发布| 亚洲图片欧美综合| 亚洲永久免费视频| 青青草国产精品亚洲专区无| 日本系列欧美系列| 香蕉加勒比综合久久| 久久精品国产**网站演员| 另类中文字幕网| 午夜电影久久久| 日产国产欧美视频一区精品| 日韩综合一区二区| 亚洲妇熟xx妇色黄| 热久久久久久久| 激情综合色综合久久| 国产精品综合网| 成人a区在线观看| 色偷偷久久一区二区三区| 国产呦精品一区二区三区网站| 国产麻豆精品theporn| 国产成人精品免费网站| 色综合网色综合| 欧美另类高清zo欧美| 欧美电影在哪看比较好| 久久精品一区二区三区不卡| 日本一区二区三区电影| 亚洲丝袜另类动漫二区| 无码av免费一区二区三区试看 | 精品国产sm最大网站免费看| 亚洲精品在线免费观看视频| 国产日韩欧美精品一区| 国产精品美女久久久久久2018| 一区免费观看视频| 亚洲精品福利视频网站| 一区二区三区在线视频观看58| 蜜桃一区二区三区四区| 国产精品亚洲专一区二区三区 | 91丨九色丨尤物| 欧洲亚洲国产日韩| 2023国产一二三区日本精品2022| 国产精品无人区| 一区二区免费视频| 国产九色精品成人porny| 色综合久久久久综合体桃花网| 91精品综合久久久久久| 欧美国产成人在线| 亚洲线精品一区二区三区八戒| 精品一区二区综合| 色域天天综合网| 精品国产青草久久久久福利| 亚洲精品乱码久久久久久黑人 | 在线精品视频一区二区三四| 久久久久久久久久电影| 亚洲午夜激情av| 久久精品99国产精品| 欧美在线观看视频一区二区| 精品欧美乱码久久久久久| 一区二区三区在线视频观看 | 91精品国产综合久久久蜜臀图片| 国产精品久久久久婷婷| 美女国产一区二区三区| av一二三不卡影片| 久久久噜噜噜久久人人看| 亚洲线精品一区二区三区八戒| 国产成人高清视频| 欧美r级在线观看| 亚洲永久精品大片| 国产精品一区在线| 精品少妇一区二区三区免费观看| 一区二区三区在线不卡| va亚洲va日韩不卡在线观看| 精品国产电影一区二区| 亚洲一区二区在线观看视频| 91丨porny丨户外露出| 久久久噜噜噜久久人人看 | 91社区在线播放| 欧美mv日韩mv国产网站| 亚洲电影一级黄| 91尤物视频在线观看| 欧美一级免费大片| 视频一区国产视频| 色综合天天天天做夜夜夜夜做| 国产视频不卡一区| 久久精品国产在热久久| 欧美日本在线播放| 一区二区在线观看免费| 成人免费精品视频| 欧美成人三级在线| 亚洲免费观看高清| a在线欧美一区| 国产亚洲精品超碰| 韩国成人精品a∨在线观看| 欧美一区二区三级| 麻豆精品一区二区综合av| 欧美美女bb生活片| 亚洲二区在线观看| 在线综合视频播放| 亚洲成人你懂的| 91免费在线播放| 亚洲综合久久av| 在线视频一区二区免费| 成人欧美一区二区三区1314| 成人免费高清在线| 国产精品国产成人国产三级| 色综合咪咪久久| 亚洲精品国产品国语在线app| 99精品热视频| 国产精品嫩草影院com| 91视频免费播放| 亚洲一区在线电影| 欧美视频中文一区二区三区在线观看 | 欧美肥胖老妇做爰| 天天操天天色综合| 欧美一区二区人人喊爽| 久久精品国产第一区二区三区| 久久久久久日产精品| 国产成人精品影院| 中文字幕日本乱码精品影院| 欧美亚洲尤物久久| 午夜久久福利影院| 欧美变态tickling挠脚心| 粉嫩久久99精品久久久久久夜| 国产精品私人影院| 在线观看视频一区二区欧美日韩| 午夜精品福利久久久| 日韩午夜av一区| 国产精品亚洲а∨天堂免在线| 亚洲欧美激情在线| 欧美日韩免费高清一区色橹橹| 亚洲成av人片观看| 久久一区二区三区四区| 国产超碰在线一区| 亚洲精品视频免费看| 欧美电影免费观看高清完整版在线 | 中文字幕在线不卡一区| 日本精品一级二级| 蜜臀国产一区二区三区在线播放 | 国产精品久久久99| 欧美亚洲国产一区二区三区va| 麻豆91在线播放免费| 国产精品热久久久久夜色精品三区 | 北条麻妃一区二区三区| 日韩精品欧美成人高清一区二区| 国产日韩精品一区二区三区在线| 在线视频中文字幕一区二区| 国内精品自线一区二区三区视频| 一区二区三区四区在线免费观看| 欧美精品一区二区三区很污很色的| 91免费观看视频| 国产精品伊人色| 日韩成人午夜精品| 中文字幕五月欧美| 精品久久久久久亚洲综合网| 在线观看日韩毛片| 国内偷窥港台综合视频在线播放| 亚洲国产精品久久人人爱蜜臀| 久久蜜桃一区二区| 日韩午夜av一区| 欧美日韩精品一区二区| 91麻豆123| 国产一区二区三区美女| 青娱乐精品在线视频| 亚洲综合免费观看高清完整版| 国产精品欧美综合在线| 久久免费视频一区| 日韩女优电影在线观看| 欧美日本高清视频在线观看| 色综合夜色一区| 99这里都是精品| 国产成人综合网站| 精品一区二区三区在线观看国产| 天堂久久一区二区三区| 亚洲综合色视频| 亚洲精品高清视频在线观看| 中文字幕一区二区视频| 国产亚洲婷婷免费| 日韩三级在线免费观看| 7799精品视频| 欧美精选午夜久久久乱码6080| 色狠狠色噜噜噜综合网| 91免费在线看| 色婷婷久久久亚洲一区二区三区| 成人免费毛片高清视频| 国产成人在线免费| 国产精品18久久久久久久久久久久 | 亚洲综合久久av| 亚洲一级在线观看| 亚洲综合在线电影|