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

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

?? usbhcdsl811hslib.c

?? sl811hs_vxworks_host_driver_v1_0_13 sl811的主驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* usbHcdSl811hsLib.c - Defines entry point for ScanLogic SL811Hs HCD */

/* Copyright 2000 Wind River Systems, Inc. */

/*
Modification history
--------------------
01a,16nov01,dgj  Initial version, based on version 01n of usbHcdUhciLib.c
*/

/*
DESCRIPTION

This is the HCD (host controller driver) for the ScanLogic SL811HS USB controller.
This file implements low-level functions required by the client (typically the USBD) 
to talk to the underlying USB host controller hardware.  

The <param> to the HRB_ATTACH request should be a pointer to a 
PCI_CFG_HEADER which contains the PCI configuration header for the
universal host controller to be managed.  Each invocation of the HRB_ATTACH
function will return an HCD_CLIENT_HANDLE for which a single host controller
will be exposed.

NOTE: This HCD implementation assumes that the caller has already initialized
the osServices and handleFuncs libraries by calling ossInitialize() and
usbHandleInitialize(), respectively.  The USBD implementation guarantees that
these libraries have been initialized prior to invoking the HCD.

Regarding IRP callbacks...

There are two callback function pointers in each IRP, <usbdCallback> and
<userCallback>.  By convention, if a non-NULL <usbdCallback> is supplied,
then the HCD invokes only the <usbdCallback> upon IRP completion - and it is
the USBD's responsibility to invoke the <userCallback>.  If no <usbdCallback>
is provided, then the HCD invokes the <userCallback> directly.	Typically, 
all IRPs are delivered to the HCD through the USBD and a non-NULL <usbdCallback>
will in fact be provided.

Regarding UHCI frame lists...

We use the UHCI frame list in a way anticipated by, but not directly described
by the UHCI specfication.  As anticipated, we create an array of 1024 frame
list entries.  We also create an array of 1024 "interrupt anchor" QHs, one
"control anchor" QH and one "bulk anchor" QH.  Each frame list entry is 
initialized to point to a corresponding interrupt anchor.  Each interrupt anchor
points to the single control anchor, and the control anchor initially points to
the bulk anchor.  

When one or more interrupt transfers are pending, QHs for these transfers will
be inserted after the interrupt anchor QHs corresponding to the frames dictated 
by the interrupt scheduling interval.  The last pending interrupt QH in each
list points to the common control anchor QH.  While clients can request any
interrupt service interval they like, the algorithms here always choose an
interval which is the largest power of 2 less than or equal to the client's
desired interval.  For example, if a client requests an interval of 20msec, the
HCD will select a real interval of 16msec.  In each frame work list, the least
frequently scheduled QHs appear ahead of more frequently scheduled QHs.  Since
only a single QH is actually created for each interrupt transfer, the individual
frame lists actually "merge" at each interrupt QH.  Now, using the preceding
example of 16msec, suppose that there is a second interrupt QH with an interval
of 8 msec.  In half of the frame lists for which the 8msec interval transfer is
scheduled, the "interrupt anchor" QH will point to it directly.  In the other
half, the 16msec interval transfer will point to it.  

When control transfer QHs are scheduled, they are always placed in the list 
following the "control anchor" QH.  Similarly, bulk transfer QHs are always
placed after the "bulk anchor" QH.  When low speed control transfers are
pending, they are always inserted after the "control anchor" QH before any
high-speed control transfers.

The anchors themselves never describe work.  Instead, they are just
placeholders in the work lists to facilitate clean QH and TD list updates.
For example, when queuing a new control or bulk transfer, it is only necessary
to modify the work list after the single "control" or "bulk" anchor.  Similiarly,
when queuing interrupt transfers, it is only necessary to modify the work
list after the QH anchor in which the interrupt is to be scheduled.  Finally,
isochronous transfers can be added cleanly at the beginning of each frame's
work list; and the last isoch transfer TD in each frame always points to the
QH anchor corresponding to that frame.

In effect, this scheme decouples isoch, interrupt, control, and bulk transfers
in the TD/QH work lists.

Regarding bus time calculations...

The host controller driver is responsible for ensuring that certain kinds of
scheduled transfers never exceed the time available in a USB frame.  The HCD 
and the USBD work cooperatively to ensure this.  For its part, the USBD never 
allows isochronous and interrupt transfers to be scheduled which would exceed 
90% of the bus bandwidth.  However, the USBD will freely allow control and bulk 
pipes to be created, as these types of transfers take whatever bus time is left 
over after isochronous and interrupt transfers have been schedule - and the
HCD gives priority to control transfers.

The HCD keeps a running total of the worst case amount of bus time alloted to 
active isochronous and interrupt transfers.  As for control and bulk transfers,
the UHC theoretically allows us to schedule as many of them as we desire, and it
keeps track of how much time remains in each frame, executing only as many of
these transfers as will fit.  However, the UHC requires that the driver schedule
only as many low speed control transfers (as opposed to full speed control
transfers) as can actually fit within the frame.  Therefore, after taking into
account the time already allotted to isochronous and interrupt transfers, the
HCD only schedules as many low speed control transfers as can fit within the
current frame - and full speed control and bulk transfers follow. 
*/


/* includes */

#include "usb/usbPlatform.h"

#include "string.h"

#include "memLib.h"		/* memory sub-allocation functions */
#include "cacheLib.h"		/* cache functions */
#include "semLib.h"		/* semaphore functions */


#include "usb/ossLib.h"
#include "usb/usbHandleLib.h"
#include "usb/pciConstants.h"
#include "usb/usbPciLib.h"

#include "usb/usbLib.h"
#include "drv/usb/usbHcd.h"
#include "drv/usb/usbUhci.h"
#include "drv/usb/usbHcdUhciLib.h"

#include "usbSl811hs.h"
#include "config.h"
#include "sysLib.h"
#include "intLib.h"
#include "stdio.h"
#include "logLib.h"
/* defines */
#undef LOCAL
#define LOCAL

/* #define SL811HS_DEBUG */
/* #define SL811HS_LOG */

#ifdef SL811HS_DEBUG
char sl811hDebug = 1;
/*#define DBG_PRINTF(p1,p2,p3,p4) if (sl811hDebug) printf(p1,p2,p3,p4)*/
#define DBG_PRINTF(X) if (sl811hDebug) printf X;
#else
#define DBG_PRINTF(X)
#endif /* SL811HS_DEBUG */

#ifdef SL811HS_LOG
char sl811hLog = 1;
#define DBG_LOG(f,a1,a2,a3,a4,a5,a6) if (sl811hLog) logMsg(f,a1,a2,a3,a4,a5,a6)
#else
#define DBG_LOG(f,a1,a2,a3,a4,a5,a6)
#endif /* SL811HS_LOG */

#define PENDING 	1

#define HCD_HOST_SIG	    ((UINT32) 0x00cd0000)
#define HCD_PIPE_SIG	    ((UINT32) 0x00cd0001)


#define MAX_INT_DEPTH	    8	/* max depth of pending interrupts */
#define INT_TIMEOUT	5000	/* wait 5 seconds for int routine to exit */
#define BIT_TIMEOUT	1000	/* max time to wait for a bit change */

#define UHC_ROOT_SRVC_INTERVAL	256 /* milliseconds */


/* UHC_HOST_DELAY and UHC_HUB_LS_SETUP are host-controller specific.
 * The following values are estimates for the UHCI controller.
 */

#define UHC_HOST_DELAY              ((UINT32) 120000L) /* ns, est. */
#define UHC_HUB_LS_SETUP            ((UINT32) 500L)    /* ns, est. */

/*
 * MEMORY
 * 
 * To improve performance, a single block of (probably) "non-cached"
 * memory is allocated.  Then, all UHCI control structures are sub-allocated
 * from this block as needed.  The vxWorks CACHE_DMA_FLUSH/INVALIDATE macros
 * are used to ensure that this memory is flushed/invalidated at the correct
 * times (assuming that cacheable-memory *might* be allocated).
 */

#define DMA_MEMORY_SIZE 	0x10000 /* 64k */

#define DMA_MALLOC(bytes, alignment)	\
    memPartAlignedAlloc (pHost->memPartId, bytes, alignment)

#define DMA_FREE(pBfr)		memPartFree (pHost->memPartId, (char *) pBfr)

#if 0
#define DMA_FLUSH(pBfr, bytes)	    CACHE_DMA_FLUSH (pBfr, bytes)
#define DMA_INVALIDATE(pBfr, bytes) CACHE_DMA_INVALIDATE (pBfr, bytes)
#define USER_FLUSH(pBfr, bytes)     CACHE_USER_FLUSH (pBfr, bytes)
#define USER_INVALIDATE(pBfr,bytes) CACHE_USER_INVALIDATE (pBfr, bytes)
#else
#define DMA_FLUSH(pBfr, bytes)	    CACHE_DMA_FLUSH (pBfr, bytes);EIEIO_SYNC
#define DMA_INVALIDATE(pBfr, bytes) CACHE_DMA_INVALIDATE (pBfr, bytes);EIEIO_SYNC
#define USER_FLUSH(pBfr, bytes)
#define USER_INVALIDATE(pBfr,bytes)
#endif


/*
 * PLAN_AHEAD_TIME
 *
 * There is always going to be some latency betwen the time the UHC finishes
 * a portion of the frame list and before the HCD updates the frame list with
 * additional work.  It is not acceptable for certain transfers, like isoch.
 * transfers, to be interrupted by this latency.  Therefore, the UHCI HCD is
 * designed to plan ahead by the PLAN_AHEAD_TIME.  It is assumed that the
 * max interrupt latency will be *one half* of this time, and the HCD will
 * schedule itself accordingly.
 */

#define PLAN_AHEAD_TIME     125     /* plan UHCI TD list n msec in advance */
#define ISOCH_INT_INTERVAL  16	    /* generate isoch int every n msec */

#define MAX_IRP_TDS	32	/* overriding maximum number of TDs */
		    /* allowed for a single non-isoch IRP */

#ifdef INCLUDE_USB_PCI
#define UHC_END_OF_LIST     TO_LITTLEL (UHCI_LINK_TERMINATE)
#else
#define UHC_END_OF_LIST     UHCI_LINK_TERMINATE
#endif


/*
 * Default macro definitions for BSP interface.
 * These macros can be redefined in a wrapper file, to generate
 * a new module with an optimized interface.
 */

#ifndef UHC_INT_CONNECT
#define UHC_INT_CONNECT(pHost,routine,arg,pResult) \
    { \
    *pResult = intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC (pHost->sl811CfgHdr.intVec), \
			     routine, (int)arg); \
    }
#endif /*UHC_INT_CONNECT*/

#ifndef UHC_INT_DISCONNECT
LOCAL VOID uhcDummyISR (void) { };
#define UHC_INT_DISCONNECT(pHost,routine,arg,pResult) \
    { \
    *pResult = intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC (pHost->sl811CfgHdr.intVec), \
                             uhcDummyISR, (int)arg); \
    }
#endif /*UHC_INT_DISCONNECT*/

#ifndef UHC_INT_ENABLE
#define UHC_INT_ENABLE(pHost,pResult) \
    { \
    *pResult = intEnable (pHost->sl811CfgHdr.intLvl); \
    }
#endif /* UHC_INT_ENABLE*/

/* Macro to disable the appropriate interrupt level */

#ifndef UHC_INT_DISABLE
#define UHC_INT_DISABLE(pHost,pResult) \
    { \
    *pResult = intDisable (pHost->sl811CfgHdr.intLvl); \
    }
#endif

/* SL811HS I/O access macros.
 *
 * NOTE: These macros assume that the calling function defines pHost.
 */

#define SL811_REG_WRITE(a,d)   (sysOutByte(pHost->ioBase, a), \
                                sysOutByte(pHost->ioBaseData, d))

#define SL811_REG_READ(a)    (sysOutByte(pHost->ioBase, a), \
                                sysInByte(pHost->ioBaseData))

#define SL811_BUF_WRITE(a,d,l) {\
                                 sysOutByte(pHost->ioBase, a);\
                                 while (l--) sysOutByte(pHost->ioBaseData, *d++);\
                               }

#define SL811_BUF_READ(a,d,l) {\
                                 sysOutByte(pHost->ioBase, a);\
                                 while (l--) *d++ = sysInByte(pHost->ioBaseData);\
                               }
                                

#ifdef INCLUDE_USB_PCI
#define UHC_WORD_IN(p)	    USB_PCI_WORD_IN (pHost->ioBase + (p))
/*#define UHC_DWORD_IN(p)     USB_PCI_DWORD_IN (pHost->ioBase + (p))*/

#define UHC_BYTE_OUT(p,b)   USB_PCI_BYTE_OUT (pHost->ioBase + (p), (b))
#define UHC_WORD_OUT(p,w)   USB_PCI_WORD_OUT (pHost->ioBase + (p), (w))
/*#define UHC_DWORD_OUT(p,d)  USB_PCI_DWORD_OUT (pHost->ioBase + (p), (d))*/

#define UHC_SET_BITS(p,bits)	UHC_WORD_OUT (p, UHC_WORD_IN (p) | (bits))
#define UHC_CLR_BITS(p,bits)	UHC_WORD_OUT (p, UHC_WORD_IN (p) & ~(bits))
#endif


/* UHC run state flags to setUhcRunState() function */

#define UHC_RUN     1
#define UHC_STOP    0


/*
 * The HCD adds UHC_FRAME_SKIP to the current frame counter to determine
 * the first available frame for scheduling. This introduces a latency at
 * the beginning of each IRP, but also helps to ensure that the UHC won't
 * run ahead of the HCD while the HCD is scheduling a transaction.
 */

#define UHC_FRAME_SKIP		2


/* macro to produce frame list index from frame number */

#define FINDEX(f)	((f) & (UHCI_FRAME_LIST_ENTRIES - 1))


/* vendor/model identifiers */

#define PCI_VID_INTEL	    0x8086
#define PCI_VID_VIATECH     0x1106

#define PCI_DID_INTEL_PIIX3 0x7020
#define PCI_DID_INTEL_PIIX4 0x7112
#define PCI_DID_VIATECH_82C586	0x3038	    /* same for 83C572 */


/* UHC capabilities (vendor/model specific */

#define UHC_ATTR_BW_RECLAMATION 0x0001
#define UHC_ATTR_HC_SYNCH   0x0002


/* UHC_ATTR_DEFAULT is the combination of UHC attributes used for unrecognized
 * UHCI implementations.  It is generally the most conservative.
 */

#define UHC_ATTR_DEFAULT    UHC_ATTR_HC_SYNCH


/* Macros to interpret UHC capabilities. */

#define ENABLE_BANDWIDTH_RECLAMATION(pHost) FALSE
    /*(((pHost->uhcAttributes & UHC_ATTR_BW_RECLAMATION) != 0) ? TRUE : FALSE)*/

#define ENABLE_HC_SYNCH(pHost)	\
    (((pHost->uhcAttributes & UHC_ATTR_HC_SYNCH) != 0) ? TRUE : FALSE)

#define HC_SYNCH(pHost) { if (ENABLE_HC_SYNCH (pHost)) hcSynch (pHost); }


/* defines for emulated USB descriptors */

#define USB_RELEASE	0x0110	/* USB level supported by this code */

#define UHC_MAX_PACKET_SIZE	8
    
#define UHC_CONFIG_VALUE	1

#define UHC_STATUS_ENDPOINT_ADRS    (1 | USB_ENDPOINT_IN)


/* interrupt bits */

#define UHC_INT_ENABLE_MASK (UHCI_INTR_SHORT | UHCI_INTR_COMPLETE | \
			     UHCI_INTR_RESUME | UHCI_INTR_TIME_CRC)

#define UHC_INT_PENDING_MASK	(UHCI_STS_PROCERR | UHCI_STS_HOSTERR | \
				 UHCI_STS_RESUME | UHCI_STS_USBERR | \
				 UHCI_STS_USBINT)


/* string identifiers */

#define UNICODE_ENGLISH     0x409

#define UHC_STR_MFG	1
#define UHC_STR_MFG_VAL     "Wind River Systems"

#define UHC_STR_PROD	    2
#define UHC_STR_PROD_VAL    "SL811HS Root Hub"


/* PCI pointer macros */

#ifdef INCLUDE_USB_PCI
#define UHC_IF_INIT()
#define TO_PCIPTR(p)	    TO_LITTLEL (USB_MEM_TO_PCI (p))
#define FROM_PCIPTR(d)	    USB_PCI_TO_MEM (d)
#define QH_TO_PCIPTR(p)     (TO_PCIPTR (p) | TO_LITTLEL (UHCI_LINK_QH))
#define QH_FROM_PCIPTR(d)   \
    ((pQH_WRAPPER) (FROM_PCIPTR (FROM_LITTLEL (d) & UHCI_LINK_PTR_MASK)))
#define TD_FROM_PCIPTR(d)   \
    ((pTD_WRAPPER) (FROM_PCIPTR (FROM_LITTLEL (d) & UHCI_LINK_PTR_MASK)))
#define UHC_FROM_LITTLEL(d) FROM_LITTLEL(d)
#else
#define UHC_IF_INIT()       sl811DcrInit()         
#define TO_PCIPTR(p)	    ((UINT32) (p))
#define FROM_PCIPTR(d)	    (d)
#define QH_TO_PCIPTR(p)     (TO_PCIPTR (p) | (UHCI_LINK_QH))
#define QH_FROM_PCIPTR(d)   \
    ((pQH_WRAPPER) (FROM_PCIPTR ((d) & UHCI_LINK_PTR_MASK)))
#define TD_FROM_PCIPTR(d)   \
    ((pTD_WRAPPER) (FROM_PCIPTR ((d) & UHCI_LINK_PTR_MASK)))
#define UHC_FROM_LITTLEL(d) (d)
#endif

/* typedefs */

/* UHC_TABLE
 *
 * Differences have been observed among UHCI implementations (including bugs
 * in some of those implementations) which favor a table-driven approach to
 * enabling certain features/operational modes.
 */

typedef struct uhc_table
    {
    UINT16 pciVendorId;     /* PCI vendor ID */
    UINT16 pciDeviceId;     /* vendor-assigned device ID */
    UINT16 uhcAttributes;   /* attributes */
    } UHC_TABLE, *pUHC_TABLE;


/*
 * TD_WRAPPER
 *
 * UHCI defines TD as 32 bytes long, with the last 16 bytes being reserved
 * for software use.  Each UHCI_TD must be aligned to a 16 byte boundary.
 */

typedef union td_wrapper
    {
    VOLATILE UHCI_TD td;	/* standard UHCI TD, 16 bytes */
    struct
	{
        VOLATILE UINT32 reserved [4]; /* 4 DWORDs used by TD */
        struct irp_workspace *pWork;/* pointer to IRP workspace */
        union td_wrapper *pNext;	/* next TD_WRAPPER used by the IRP */
        UINT32 nanoseconds;     /* calculated time for this TD to execute */
        UINT32 frameNo;	    /* used only for isoch. TDs */
	} sw;
    } TD_WRAPPER, *pTD_WRAPPER;

#define TD_WRAPPER_LEN	    32
#define TD_WRAPPER_ACTLEN   sizeof (TD_WRAPPER)


/*
 * QH_WRAPPER
 *
 * UHCI defines QH as 8 bytes long.  This wrapper adds fields at the end
 * for software use, padding the QH_WRAPPER to 16 bytes in the process.  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人免费影院| 亚洲大型综合色站| 欧美午夜片在线看| 精品写真视频在线观看| 亚洲黄色av一区| 久久久精品黄色| 日韩欧美你懂的| 在线亚洲免费视频| 成人黄页在线观看| 国内成人自拍视频| 免费一级片91| 亚洲午夜日本在线观看| 国产精品美女www爽爽爽| 日韩精品一区二区三区视频在线观看| 91九色最新地址| 黄页网站大全一区二区| 亚洲第一激情av| 亚洲免费毛片网站| 亚洲国产精华液网站w | 日韩一区二区免费电影| 欧洲激情一区二区| 91丨porny丨最新| 成人午夜激情影院| 国产成人精品一区二| 韩国女主播一区| 蜜桃视频在线观看一区二区| 天天综合天天做天天综合| 亚洲午夜久久久久中文字幕久| ●精品国产综合乱码久久久久| 久久久久久久久久美女| 久久综合资源网| 久久久久久久久久看片| 久久婷婷国产综合国色天香| 欧美电影免费观看高清完整版在线观看| 欧美男女性生活在线直播观看| 在线免费观看不卡av| 91丨九色丨尤物| 色婷婷久久久久swag精品| 99热精品国产| 一本大道久久精品懂色aⅴ| 91麻豆精品视频| 欧美少妇bbb| 欧美日韩精品综合在线| 91精品啪在线观看国产60岁| 日韩一区二区三区电影在线观看 | 亚洲成人资源在线| 亚洲成人精品在线观看| 午夜婷婷国产麻豆精品| 蜜臂av日日欢夜夜爽一区| 蜜臀av一区二区在线免费观看| 蜜桃视频在线观看一区二区| 国产一区二区三区香蕉| 高清不卡一二三区| av影院午夜一区| 欧美日韩一级大片网址| 欧美一区二区视频在线观看2020 | 日韩欧美一二三| 国产亚洲综合在线| 国产精品不卡视频| 一区二区三区四区精品在线视频 | 亚洲一区二区在线免费观看视频| 一区二区三区四区乱视频| 午夜精品久久久久久久| 久久99精品久久久| 丁香婷婷综合激情五月色| 91尤物视频在线观看| 欧美巨大另类极品videosbest | 久久精品网站免费观看| 日韩一区在线看| 天天综合日日夜夜精品| 国产精品一区二区不卡| 色综合中文字幕国产 | 亚洲图片你懂的| 亚洲成人福利片| 久久成人免费网| 不卡一区二区中文字幕| 欧美色爱综合网| 欧美精品一区二| 一区二区三区视频在线看| 日韩国产成人精品| 国产成人在线视频免费播放| 一本大道综合伊人精品热热| 日韩精品一区二区三区蜜臀| 中文字幕在线视频一区| 亚洲国产aⅴ天堂久久| 国内外成人在线| 欧美亚洲丝袜传媒另类| 久久精品人人做| 日韩精品乱码免费| 成人黄色免费短视频| 在线综合视频播放| 亚洲国产岛国毛片在线| 日韩二区三区在线观看| 成a人片国产精品| 欧美一区二区三区免费大片| 亚洲色大成网站www久久九九| 另类综合日韩欧美亚洲| 日本乱人伦一区| 国产欧美精品在线观看| 三级不卡在线观看| 99视频有精品| 精品日韩一区二区三区免费视频| 亚洲精品日韩一| 国产美女娇喘av呻吟久久| 欧美日本一区二区三区四区 | 中文在线一区二区| 蜜臀久久久99精品久久久久久| 97精品视频在线观看自产线路二| 日韩一区二区视频在线观看| 亚洲一区二区综合| 91麻豆国产在线观看| 国产欧美日本一区视频| 麻豆91免费看| 欧美一区二区黄| 亚洲图片欧美视频| 色婷婷av一区二区三区大白胸| 久久久午夜精品理论片中文字幕| 丝袜诱惑亚洲看片 | 日本一区二区三区久久久久久久久不 | 老司机精品视频线观看86| 色偷偷久久一区二区三区| 国产精品萝li| 成人精品高清在线| 久久九九久精品国产免费直播| 欧美aaaaaa午夜精品| 欧美人伦禁忌dvd放荡欲情| 亚洲国产精品久久久久秋霞影院| 99久久er热在这里只有精品66| 久久久久97国产精华液好用吗| 激情伊人五月天久久综合| 欧美成人精品二区三区99精品| 午夜精品福利视频网站| 欧美影视一区二区三区| 亚洲最新在线观看| 在线欧美小视频| 一区二区三区精品视频在线| 色综合久久久久综合体| 亚洲激情图片小说视频| 色8久久精品久久久久久蜜| 亚洲日本一区二区| 色哟哟国产精品| 亚洲最新视频在线观看| 在线观看亚洲精品| 亚洲国产中文字幕在线视频综合| 91成人看片片| 午夜久久久久久久久久一区二区| 91精品国产综合久久婷婷香蕉| 人人爽香蕉精品| 欧美成人一区二区| 国产九色精品成人porny| 国产精品私人自拍| 99精品欧美一区二区蜜桃免费| ㊣最新国产の精品bt伙计久久| 色哟哟一区二区在线观看| 亚洲一级片在线观看| 欧美日韩国产在线播放网站| 秋霞电影一区二区| 久久精品一区二区三区av| 成人小视频在线| 玉足女爽爽91| 日韩欧美一区二区不卡| 国产成人三级在线观看| 亚洲色图.com| 欧美一级欧美三级| 国产精品18久久久久久vr| 中文字幕日本不卡| 欧美日韩国产一区二区三区地区| 免费成人深夜小野草| 国产色爱av资源综合区| 91在线视频在线| 日韩精品成人一区二区在线| 精品久久久久香蕉网| 9人人澡人人爽人人精品| 午夜一区二区三区视频| 2023国产精品| 在线视频一区二区免费| 国产资源精品在线观看| 成人免费小视频| 欧美日韩国产大片| 国产露脸91国语对白| 一区二区三区中文字幕在线观看| 欧美一二区视频| 91尤物视频在线观看| 免费人成精品欧美精品| 中文无字幕一区二区三区| 欧美日韩免费视频| 国产成人精品亚洲777人妖| 亚洲高清免费视频| 中文字幕精品一区 | 国产精品高潮久久久久无| 8v天堂国产在线一区二区| 成人高清伦理免费影院在线观看| 亚洲成人av电影在线| 中文字幕免费在线观看视频一区| 91精品国产一区二区| 99精品国产99久久久久久白柏| 日本va欧美va精品| 亚洲精品免费在线观看| 久久夜色精品一区| 91精品国产入口|