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

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

?? u132-hcd.c

?? host usb 主設(shè)備程序 支持sd卡 mouse keyboard 的最單單的驅(qū)動程序 gcc編譯
?? C
?? 第 1 頁 / 共 5 頁
字號:
static void u132_ring_queue_work(struct u132 *u132, struct u132_ring *ring,        unsigned int delta){        kref_get(&u132->kref);        u132_ring_requeue_work(u132, ring, delta);        return;}static void u132_ring_cancel_work(struct u132 *u132, struct u132_ring *ring){        if (cancel_delayed_work(&ring->scheduler)) {                kref_put(&u132->kref, u132_hcd_delete);        }}static void u132_endp_delete(struct kref *kref){        struct u132_endp *endp = kref_to_u132_endp(kref);        struct u132 *u132 = endp->u132;        u8 usb_addr = endp->usb_addr;        u8 usb_endp = endp->usb_endp;        u8 address = u132->addr[usb_addr].address;        struct u132_udev *udev = &u132->udev[address];        u8 endp_number = endp->endp_number;        struct usb_host_endpoint *hep = endp->hep;        struct u132_ring *ring = endp->ring;        struct list_head *head = &endp->endp_ring;        ring->length -= 1;        if (endp == ring->curr_endp) {                if (list_empty(head)) {                        ring->curr_endp = NULL;                        list_del(head);                } else {                        struct u132_endp *next_endp = list_entry(head->next,                                struct u132_endp, endp_ring);                        ring->curr_endp = next_endp;                        list_del(head);        }} else                list_del(head);        if (endp->input) {                udev->endp_number_in[usb_endp] = 0;                u132_udev_put_kref(u132, udev);        }        if (endp->output) {                udev->endp_number_out[usb_endp] = 0;                u132_udev_put_kref(u132, udev);        }        u132->endp[endp_number - 1] = NULL;        hep->hcpriv = NULL;        kfree(endp);        u132_u132_put_kref(u132);}static inline void u132_endp_put_kref(struct u132 *u132, struct u132_endp *endp){        kref_put(&endp->kref, u132_endp_delete);}static inline void u132_endp_get_kref(struct u132 *u132, struct u132_endp *endp){        kref_get(&endp->kref);}static inline void u132_endp_init_kref(struct u132 *u132,        struct u132_endp *endp){        kref_init(&endp->kref);        kref_get(&u132->kref);}static void u132_endp_queue_work(struct u132 *u132, struct u132_endp *endp,        unsigned int delta){	if (queue_delayed_work(workqueue, &endp->scheduler, delta))		kref_get(&endp->kref);}static void u132_endp_cancel_work(struct u132 *u132, struct u132_endp *endp){        if (cancel_delayed_work(&endp->scheduler))                kref_put(&endp->kref, u132_endp_delete);}static inline void u132_monitor_put_kref(struct u132 *u132){        kref_put(&u132->kref, u132_hcd_delete);}static void u132_monitor_queue_work(struct u132 *u132, unsigned int delta){	if (queue_delayed_work(workqueue, &u132->monitor, delta))		kref_get(&u132->kref);}static void u132_monitor_requeue_work(struct u132 *u132, unsigned int delta){	if (!queue_delayed_work(workqueue, &u132->monitor, delta))		kref_put(&u132->kref, u132_hcd_delete);}static void u132_monitor_cancel_work(struct u132 *u132){        if (cancel_delayed_work(&u132->monitor))                kref_put(&u132->kref, u132_hcd_delete);}static int read_roothub_info(struct u132 *u132){        u32 revision;        int retval;        retval = u132_read_pcimem(u132, revision, &revision);        if (retval) {                dev_err(&u132->platform_dev->dev, "error %d accessing device co"                        "ntrol\n", retval);                return retval;        } else if ((revision & 0xFF) == 0x10) {        } else if ((revision & 0xFF) == 0x11) {        } else {                dev_err(&u132->platform_dev->dev, "device revision is not valid"                        " %08X\n", revision);                return -ENODEV;        }        retval = u132_read_pcimem(u132, control, &u132->hc_control);        if (retval) {                dev_err(&u132->platform_dev->dev, "error %d accessing device co"                        "ntrol\n", retval);                return retval;        }        retval = u132_read_pcimem(u132, roothub.status,                &u132->hc_roothub_status);        if (retval) {                dev_err(&u132->platform_dev->dev, "error %d accessing device re"                        "g roothub.status\n", retval);                return retval;        }        retval = u132_read_pcimem(u132, roothub.a, &u132->hc_roothub_a);        if (retval) {                dev_err(&u132->platform_dev->dev, "error %d accessing device re"                        "g roothub.a\n", retval);                return retval;        }        {                int I = u132->num_ports;                int i = 0;                while (I-- > 0) {                        retval = u132_read_pcimem(u132, roothub.portstatus[i],                                &u132->hc_roothub_portstatus[i]);                        if (retval) {                                dev_err(&u132->platform_dev->dev, "error %d acc"                                        "essing device roothub.portstatus[%d]\n"                                        , retval, i);                                return retval;                        } else                                i += 1;                }        }        return 0;}static void u132_hcd_monitor_work(struct work_struct *work){        struct u132 *u132 = container_of(work, struct u132, monitor.work);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                u132_monitor_put_kref(u132);                return;        } else if (u132->going > 0) {                dev_err(&u132->platform_dev->dev, "device is being removed\n");                u132_monitor_put_kref(u132);                return;        } else {                int retval;                down(&u132->sw_lock);                retval = read_roothub_info(u132);                if (retval) {                        struct usb_hcd *hcd = u132_to_hcd(u132);                        u132_disable(u132);                        u132->going = 1;                        up(&u132->sw_lock);                        usb_hc_died(hcd);                        ftdi_elan_gone_away(u132->platform_dev);                        u132_monitor_put_kref(u132);                        return;                } else {                        u132_monitor_requeue_work(u132, 500);                        up(&u132->sw_lock);                        return;                }        }}static void u132_hcd_giveback_urb(struct u132 *u132, struct u132_endp *endp,        struct urb *urb, int status){        struct u132_ring *ring;        unsigned long irqs;        struct usb_hcd *hcd = u132_to_hcd(u132);        urb->error_count = 0;        urb->status = status;        urb->hcpriv = NULL;        spin_lock_irqsave(&endp->queue_lock.slock, irqs);        endp->queue_next += 1;        if (ENDP_QUEUE_SIZE > --endp->queue_size) {                endp->active = 0;                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);        } else {                struct list_head *next = endp->urb_more.next;                struct u132_urbq *urbq = list_entry(next, struct u132_urbq,                        urb_more);                list_del(next);                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =                        urbq->urb;                endp->active = 0;                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);                kfree(urbq);        } down(&u132->scheduler_lock);        ring = endp->ring;        ring->in_use = 0;        u132_ring_cancel_work(u132, ring);        u132_ring_queue_work(u132, ring, 0);        up(&u132->scheduler_lock);        u132_endp_put_kref(u132, endp);        usb_hcd_giveback_urb(hcd, urb);        return;}static void u132_hcd_forget_urb(struct u132 *u132, struct u132_endp *endp,        struct urb *urb, int status){        u132_endp_put_kref(u132, endp);}static void u132_hcd_abandon_urb(struct u132 *u132, struct u132_endp *endp,        struct urb *urb, int status){        unsigned long irqs;        struct usb_hcd *hcd = u132_to_hcd(u132);        urb->error_count = 0;        urb->status = status;        urb->hcpriv = NULL;        spin_lock_irqsave(&endp->queue_lock.slock, irqs);        endp->queue_next += 1;        if (ENDP_QUEUE_SIZE > --endp->queue_size) {                endp->active = 0;                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);        } else {                struct list_head *next = endp->urb_more.next;                struct u132_urbq *urbq = list_entry(next, struct u132_urbq,                        urb_more);                list_del(next);                endp->urb_list[ENDP_QUEUE_MASK & endp->queue_last++] =                        urbq->urb;                endp->active = 0;                spin_unlock_irqrestore(&endp->queue_lock.slock, irqs);                kfree(urbq);        } usb_hcd_giveback_urb(hcd, urb);        return;}static inline int edset_input(struct u132 *u132, struct u132_ring *ring,        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,        int toggle_bits, int error_count, int condition_code, int repeat_number,         int halted, int skipped, int actual, int non_null)){        return usb_ftdi_elan_edset_input(u132->platform_dev, ring->number, endp,                 urb, address, endp->usb_endp, toggle_bits, callback);}static inline int edset_setup(struct u132 *u132, struct u132_ring *ring,        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,        int toggle_bits, int error_count, int condition_code, int repeat_number,         int halted, int skipped, int actual, int non_null)){        return usb_ftdi_elan_edset_setup(u132->platform_dev, ring->number, endp,                 urb, address, endp->usb_endp, toggle_bits, callback);}static inline int edset_single(struct u132 *u132, struct u132_ring *ring,        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,        int toggle_bits, int error_count, int condition_code, int repeat_number,         int halted, int skipped, int actual, int non_null)){        return usb_ftdi_elan_edset_single(u132->platform_dev, ring->number,                endp, urb, address, endp->usb_endp, toggle_bits, callback);}static inline int edset_output(struct u132 *u132, struct u132_ring *ring,        struct u132_endp *endp, struct urb *urb, u8 address, u8 toggle_bits,        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,        int toggle_bits, int error_count, int condition_code, int repeat_number,         int halted, int skipped, int actual, int non_null)){        return usb_ftdi_elan_edset_output(u132->platform_dev, ring->number,                endp, urb, address, endp->usb_endp, toggle_bits, callback);}/** must not LOCK sw_lock**/static void u132_hcd_interrupt_recv(void *data, struct urb *urb, u8 *buf,        int len, int toggle_bits, int error_count, int condition_code,        int repeat_number, int halted, int skipped, int actual, int non_null){        struct u132_endp *endp = data;        struct u132 *u132 = endp->u132;        u8 address = u132->addr[endp->usb_addr].address;        struct u132_udev *udev = &u132->udev[address];        down(&u132->scheduler_lock);        if (u132->going > 1) {                dev_err(&u132->platform_dev->dev, "device has been removed %d\n"                        , u132->going);                up(&u132->scheduler_lock);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人亚洲精品狼色在线| 亚洲不卡一区二区三区| 麻豆一区二区三区| 日韩一区二区在线观看视频| 精品在线免费观看| 精品美女被调教视频大全网站| 国内外成人在线| 国产精品久久久久一区二区三区共| www.欧美色图| 亚洲成人av免费| 亚洲精品在线观| 成人精品小蝌蚪| 一区二区三区精品视频| 欧美伊人久久大香线蕉综合69| 日韩激情在线观看| 久久久精品天堂| 一本大道综合伊人精品热热| 日韩二区在线观看| 国产日本欧美一区二区| 91视频免费观看| 日韩国产欧美三级| 国产女主播一区| 欧美亚洲国产bt| 狠狠狠色丁香婷婷综合激情 | 婷婷丁香久久五月婷婷| 精品欧美乱码久久久久久| 国产不卡视频在线观看| 亚洲伊人色欲综合网| 久久久久97国产精华液好用吗| 在线观看欧美日本| 国模无码大尺度一区二区三区| 亚洲视频在线观看三级| 欧美一级片在线看| 91精品国产91久久久久久最新毛片| 另类小说图片综合网| 亚洲欧美另类久久久精品| 日韩欧美久久一区| 在线国产电影不卡| 韩国三级中文字幕hd久久精品| 一区二区久久久| 国产婷婷精品av在线| 91麻豆精品国产91久久久久| www.亚洲在线| 经典三级在线一区| 亚洲一区二区三区四区在线观看| 精品成人一区二区三区四区| 欧美亚洲尤物久久| 成人美女视频在线观看| 九色|91porny| 日韩av中文字幕一区二区 | 亚洲综合图片区| 久久综合一区二区| 欧美一区国产二区| 欧美在线观看一区| 成人高清视频在线观看| 国产在线播放一区| 日本伊人精品一区二区三区观看方式| 亚洲美女电影在线| 国产精品每日更新在线播放网址| 精品国产电影一区二区| 宅男噜噜噜66一区二区66| 欧美色视频在线观看| av电影天堂一区二区在线观看| 国产麻豆日韩欧美久久| 久久精品国产精品亚洲精品| 日本视频一区二区三区| 午夜视频在线观看一区| 一区二区三区欧美日| 亚洲欧美国产77777| 国产精品乱人伦| 中文av一区特黄| 中文字幕不卡的av| 国产精品国产三级国产| 国产人成亚洲第一网站在线播放 | 3d动漫精品啪啪| 欧美日韩一区视频| 欧美另类z0zxhd电影| 欧美日韩免费一区二区三区视频| 欧亚一区二区三区| 在线国产电影不卡| 7777精品伊人久久久大香线蕉超级流畅 | 91免费国产在线| av高清不卡在线| 91亚洲午夜精品久久久久久| 不卡电影免费在线播放一区| av亚洲精华国产精华精| 91成人免费在线| 欧美久久一二区| 日韩欧美国产小视频| 精品va天堂亚洲国产| 国产人伦精品一区二区| 亚洲女厕所小便bbb| 亚洲国产婷婷综合在线精品| 日本不卡一区二区三区 | 国产制服丝袜一区| 国产91丝袜在线18| 91亚洲精品乱码久久久久久蜜桃| 91在线你懂得| 欧美日韩精品一区二区天天拍小说 | 日韩欧美久久一区| 久久九九久久九九| 综合婷婷亚洲小说| 日韩精品五月天| 国产一区不卡视频| 成人av综合在线| 欧美三日本三级三级在线播放| 91麻豆精品国产91久久久资源速度 | 3d成人h动漫网站入口| 日韩精品一区二区在线观看| 国产丝袜欧美中文另类| 亚洲制服丝袜一区| 韩日欧美一区二区三区| 色哟哟欧美精品| 日韩午夜电影av| 中日韩av电影| 性欧美大战久久久久久久久| 激情六月婷婷久久| 色综合欧美在线视频区| 日韩免费看的电影| 亚洲三级电影全部在线观看高清| 亚洲一区二区不卡免费| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美美女黄视频| 国产精品毛片久久久久久| 三级精品在线观看| 成人午夜av电影| 日韩一区二区三区免费看 | 91婷婷韩国欧美一区二区| 欧美一区二区三区日韩视频| 日韩一区欧美一区| 国产真实乱偷精品视频免| 欧美三级电影在线看| 国产精品女同一区二区三区| 免费久久99精品国产| 在线亚洲+欧美+日本专区| 精品理论电影在线观看| 亚洲高清免费观看| 一本色道久久加勒比精品| 久久这里只有精品首页| 午夜av电影一区| 91免费观看在线| 欧美高清一级片在线观看| 激情综合一区二区三区| 欧美精品自拍偷拍| 亚洲猫色日本管| 成人高清伦理免费影院在线观看| 欧美成人vr18sexvr| 亚洲成精国产精品女| 日本高清无吗v一区| 欧美韩国一区二区| 久久9热精品视频| 91精品国产一区二区三区蜜臀| 一区二区三区欧美久久| 一本到不卡精品视频在线观看| 国产精品丝袜久久久久久app| 国产一区二区h| 久久综合九色综合97婷婷女人| 日本成人在线看| 欧美一级片在线看| 99精品久久久久久| 亚洲国产精品99久久久久久久久 | 99精品国产91久久久久久 | 欧美成人精品3d动漫h| 日本不卡视频在线观看| 欧美一级二级三级蜜桃| 美女爽到高潮91| 91精品国产综合久久久蜜臀粉嫩 | 日韩精品一区二区三区视频播放 | 亚洲视频图片小说| 97se亚洲国产综合自在线不卡| 国产精品麻豆久久久| gogo大胆日本视频一区| 亚洲欧洲精品天堂一级| 91视视频在线直接观看在线看网页在线看 | 日韩一区二区三区四区五区六区| 日本 国产 欧美色综合| 日韩免费高清av| 国产一区二区三区免费看 | 日本欧美一区二区| 日韩一区二区三区免费看| 久久国内精品自在自线400部| 欧美成人乱码一区二区三区| 国产综合色视频| 中文字幕一区二区三区av| 一本大道av一区二区在线播放| 一区二区三区加勒比av| 在线成人av影院| 精品一区精品二区高清| 欧美国产日韩精品免费观看| 91亚洲国产成人精品一区二区三 | 日韩欧美一级特黄在线播放| 国产麻豆视频一区二区| 最好看的中文字幕久久| 欧美日韩日日摸| 国产真实乱偷精品视频免| 亚洲视频电影在线| 欧美精品aⅴ在线视频| 国产一区二区按摩在线观看| 亚洲欧美一区二区三区极速播放 | 国产91丝袜在线播放九色|