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

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

?? hci_usb.c

?? Linux下藍牙驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*    BlueZ - Bluetooth protocol stack for Linux   Copyright (C) 2000-2001 Qualcomm Incorporated   Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>   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;   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS    SOFTWARE IS DISCLAIMED.*//* * BlueZ HCI USB driver. * Based on original USB Bluetooth driver for Linux kernel *    Copyright (c) 2000 Greg Kroah-Hartman        <greg@kroah.com> *    Copyright (c) 2000 Mark Douglas Corner       <mcorner@umich.edu> * * $Id: hci_usb.c,v 1.8 2002/07/18 17:23:09 maxk Exp $     */#define VERSION "2.1"#include <linux/config.h>#include <linux/module.h>#define __KERNEL_SYSCALLS__#include <linux/version.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/unistd.h>#include <linux/types.h>#include <linux/interrupt.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/skbuff.h>#include <linux/kmod.h>#include <linux/usb.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/hci_core.h>#include "hci_usb.h"#define HCI_MAX_PENDING (HCI_MAX_BULK_RX + HCI_MAX_BULK_TX + 1)#ifndef HCI_USB_DEBUG#undef  BT_DBG#define BT_DBG( A... )#undef  BT_DMP#define BT_DMP( A... )#endif#ifndef CONFIG_BLUEZ_USB_ZERO_PACKET#undef  USB_ZERO_PACKET#define USB_ZERO_PACKET 0#endifstatic struct usb_driver hci_usb_driver; static struct usb_device_id bluetooth_ids[] = {	/* Generic Bluetooth USB device */	{ USB_DEVICE_INFO(HCI_DEV_CLASS, HCI_DEV_SUBCLASS, HCI_DEV_PROTOCOL) },	/* Ericsson with non-standard id */	{ USB_DEVICE(0x0bdb, 0x1002) },	{ }	/* Terminating entry */};MODULE_DEVICE_TABLE (usb, bluetooth_ids);static struct usb_device_id ignore_ids[] = {	/* Broadcom BCM2033 without firmware */	{ USB_DEVICE(0x0a5c, 0x2033) },	{ }	/* Terminating entry */};static void hci_usb_interrupt(struct urb *urb);static void hci_usb_rx_complete(struct urb *urb);static void hci_usb_tx_complete(struct urb *urb);static struct urb *hci_usb_get_completed(struct hci_usb *husb){	struct sk_buff *skb;	struct urb *urb = NULL;	skb = skb_dequeue(&husb->completed_q);	if (skb) {		urb = ((struct hci_usb_scb *) skb->cb)->urb;		kfree_skb(skb);	}	BT_DBG("%s urb %p", husb->hdev.name, urb);	return urb;}static int hci_usb_enable_intr(struct hci_usb *husb){	struct urb *urb;	int pipe, size;	void *buf;	BT_DBG("%s", husb->hdev.name); 	if (!(urb = usb_alloc_urb(0)))		return -ENOMEM;	if (!(buf = kmalloc(HCI_MAX_EVENT_SIZE, GFP_KERNEL))) {		usb_free_urb(urb);		return -ENOMEM;	}	husb->intr_urb = urb;	        pipe = usb_rcvintpipe(husb->udev, husb->intr_ep);        size = usb_maxpacket(husb->udev, pipe, usb_pipeout(pipe));	FILL_INT_URB(urb, husb->udev, pipe, buf, size, 			hci_usb_interrupt, husb, husb->intr_interval);		return usb_submit_urb(urb);}static int hci_usb_disable_intr(struct hci_usb *husb){	struct urb *urb = husb->intr_urb;	struct sk_buff *skb;	BT_DBG("%s", husb->hdev.name);	usb_unlink_urb(urb); usb_free_urb(urb);	husb->intr_urb = NULL;	skb = husb->intr_skb;	if (skb) {		husb->intr_skb = NULL;		kfree_skb(skb);	}	return 0;}static int hci_usb_rx_submit(struct hci_usb *husb, struct urb *urb){	struct hci_usb_scb *scb;	struct sk_buff *skb;	int    pipe, size, err;	if (!urb && !(urb = usb_alloc_urb(0)))		return -ENOMEM;        size = HCI_MAX_FRAME_SIZE;	if (!(skb = bluez_skb_alloc(size, GFP_ATOMIC))) {		usb_free_urb(urb);		return -ENOMEM;	}		BT_DBG("%s urb %p", husb->hdev.name, urb);	skb->dev = (void *) &husb->hdev;	skb->pkt_type = HCI_ACLDATA_PKT;	scb = (struct hci_usb_scb *) skb->cb;	scb->urb = urb;        pipe = usb_rcvbulkpipe(husb->udev, husb->bulk_in_ep);        FILL_BULK_URB(urb, husb->udev, pipe, skb->data, size, hci_usb_rx_complete, skb);        urb->transfer_flags = USB_QUEUE_BULK;	skb_queue_tail(&husb->pending_q, skb);	err = usb_submit_urb(urb);	if (err) {		BT_ERR("%s bulk rx submit failed urb %p err %d",				husb->hdev.name, urb, err);		skb_unlink(skb);		usb_free_urb(urb);	}	return err;}/* Initialize device */static int hci_usb_open(struct hci_dev *hdev){	struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;	int i, err;	unsigned long flags;	BT_DBG("%s", hdev->name);	if (test_and_set_bit(HCI_RUNNING, &hdev->flags))		return 0;	MOD_INC_USE_COUNT;	write_lock_irqsave(&husb->completion_lock, flags);	err = hci_usb_enable_intr(husb);	if (!err) {		for (i = 0; i < HCI_MAX_BULK_TX; i++)			hci_usb_rx_submit(husb, NULL);	} else {		clear_bit(HCI_RUNNING, &hdev->flags);		MOD_DEC_USE_COUNT;	}	write_unlock_irqrestore(&husb->completion_lock, flags);	return err;}/* Reset device */static int hci_usb_flush(struct hci_dev *hdev){	struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;	BT_DBG("%s", hdev->name);	skb_queue_purge(&husb->cmd_q);	skb_queue_purge(&husb->acl_q);	return 0;}static inline void hci_usb_unlink_urbs(struct hci_usb *husb){	struct sk_buff *skb;	struct urb *urb;	BT_DBG("%s", husb->hdev.name);	while ((skb = skb_dequeue(&husb->pending_q))) {		urb = ((struct hci_usb_scb *) skb->cb)->urb;		usb_unlink_urb(urb);		kfree_skb(skb);	}	while ((urb = hci_usb_get_completed(husb)))		usb_free_urb(urb);}/* Close device */static int hci_usb_close(struct hci_dev *hdev){	struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;	unsigned long flags;		if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))		return 0;	BT_DBG("%s", hdev->name);	write_lock_irqsave(&husb->completion_lock, flags);		hci_usb_disable_intr(husb);	hci_usb_unlink_urbs(husb);	hci_usb_flush(hdev);	write_unlock_irqrestore(&husb->completion_lock, flags);	MOD_DEC_USE_COUNT;	return 0;}static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb){	struct hci_usb_scb *scb = (void *) skb->cb;	struct urb *urb = hci_usb_get_completed(husb);	struct usb_ctrlrequest *dr;	int pipe, err;	if (!urb && !(urb = usb_alloc_urb(0)))		return -ENOMEM;	if (!(dr = kmalloc(sizeof(*dr), GFP_ATOMIC))) {		usb_free_urb(urb);		return -ENOMEM;	}		pipe = usb_sndctrlpipe(husb->udev, 0);	dr->bRequestType = HCI_CTRL_REQ;	dr->bRequest = 0;	dr->wIndex   = 0;	dr->wValue   = 0;	dr->wLength  = __cpu_to_le16(skb->len);	FILL_CONTROL_URB(urb, husb->udev, pipe, (void *) dr,			skb->data, skb->len, hci_usb_tx_complete, skb);	BT_DBG("%s urb %p len %d", husb->hdev.name, urb, skb->len);	scb->urb = urb;	skb_queue_tail(&husb->pending_q, skb);	err = usb_submit_urb(urb);	if (err) {		BT_ERR("%s ctrl tx submit failed urb %p err %d", 				husb->hdev.name, urb, err);		skb_unlink(skb);		usb_free_urb(urb); kfree(dr);	}	return err;}static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb){	struct hci_usb_scb *scb = (void *) skb->cb;	struct urb *urb = hci_usb_get_completed(husb);	int pipe, err;	if (!urb && !(urb = usb_alloc_urb(0)))		return -ENOMEM;	pipe = usb_sndbulkpipe(husb->udev, husb->bulk_out_ep);        	FILL_BULK_URB(urb, husb->udev, pipe, skb->data, skb->len,	              hci_usb_tx_complete, skb);	urb->transfer_flags = USB_QUEUE_BULK | USB_ZERO_PACKET;	BT_DBG("%s urb %p len %d", husb->hdev.name, urb, skb->len);	scb->urb = urb;	skb_queue_tail(&husb->pending_q, skb);	err = usb_submit_urb(urb);	if (err) {		BT_ERR("%s bulk tx submit failed urb %p err %d", 				husb->hdev.name, urb, err);		skb_unlink(skb);		usb_free_urb(urb);	}	return err;}static void hci_usb_tx_process(struct hci_usb *husb){	struct sk_buff *skb;	BT_DBG("%s", husb->hdev.name);	do {		clear_bit(HCI_USB_TX_WAKEUP, &husb->state);				/* Process ACL queue */		while (skb_queue_len(&husb->pending_q) < HCI_MAX_PENDING &&				(skb = skb_dequeue(&husb->acl_q))) {			if (hci_usb_send_bulk(husb, skb) < 0) {				skb_queue_head(&husb->acl_q, skb);				break;			}		}		/* Process command queue */		if (!test_bit(HCI_USB_CTRL_TX, &husb->state) &&			(skb = skb_dequeue(&husb->cmd_q)) != NULL) {			set_bit(HCI_USB_CTRL_TX, &husb->state);			if (hci_usb_send_ctrl(husb, skb) < 0) {				skb_queue_head(&husb->cmd_q, skb);				clear_bit(HCI_USB_CTRL_TX, &husb->state);			}		}	} while(test_bit(HCI_USB_TX_WAKEUP, &husb->state));}static inline void hci_usb_tx_wakeup(struct hci_usb *husb){	/* Serialize TX queue processing to avoid data reordering */	if (!test_and_set_bit(HCI_USB_TX_PROCESS, &husb->state)) {		hci_usb_tx_process(husb);		clear_bit(HCI_USB_TX_PROCESS, &husb->state);	} else		set_bit(HCI_USB_TX_WAKEUP, &husb->state);}/* Send frames from HCI layer */int hci_usb_send_frame(struct sk_buff *skb){	struct hci_dev *hdev = (struct hci_dev *) skb->dev;	struct hci_usb *husb;	if (!hdev) {		BT_ERR("frame for uknown device (hdev=NULL)");		return -ENODEV;	}	if (!test_bit(HCI_RUNNING, &hdev->flags))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
床上的激情91.| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美激情一区二区三区在线| 在线观看免费视频综合| 成熟亚洲日本毛茸茸凸凹| 亚洲va欧美va人人爽午夜| 国产精品久久久久国产精品日日| 欧美丝袜丝nylons| 在线观看中文字幕不卡| 99久久精品国产导航| 久久99精品久久只有精品| 亚洲va欧美va人人爽| 一二三四社区欧美黄| 国产精品福利一区| 国产精品久久久久久久久动漫| 26uuu另类欧美| 久久夜色精品国产噜噜av| 日韩欧美国产小视频| 精品捆绑美女sm三区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美mv日韩mv国产| 精品国偷自产国产一区| 国产亚洲美州欧州综合国| 久久精品人人爽人人爽| 国产亚洲精久久久久久| 亚洲午夜久久久久久久久电影网| 国产亚洲一区二区三区四区| 久久色在线视频| 精品国产亚洲在线| 国产蜜臀97一区二区三区| 中文字幕一区二区三区av| 亚洲福利电影网| 国内国产精品久久| 色综合色综合色综合| 91 com成人网| 中文字幕不卡一区| 亚洲成人一区二区| 国内精品伊人久久久久av一坑| 91在线你懂得| 欧美成人女星排名| 亚洲日本欧美天堂| 裸体在线国模精品偷拍| 成人av片在线观看| 欧美一区二区美女| 最近中文字幕一区二区三区| 丝袜诱惑亚洲看片| www.欧美精品一二区| 欧美一级一区二区| 一区二区在线观看视频| 国产精品1区2区3区在线观看| 欧美自拍偷拍午夜视频| 欧美国产禁国产网站cc| 蜜臀精品久久久久久蜜臀| 91视频你懂的| 亚洲欧美一区二区三区久本道91 | 亚洲欧美另类在线| 国产福利一区在线| 精品日韩一区二区三区| 日本一区中文字幕| 欧美精品日韩综合在线| 一区二区三区成人在线视频| 欧美一区二区三区思思人 | 亚洲男人的天堂网| 不卡在线观看av| 日韩伦理av电影| 99久久婷婷国产综合精品 | 91丝袜美腿高跟国产极品老师| 欧美国产激情二区三区 | 亚洲精品视频免费观看| 99久久精品免费看国产免费软件| 久久久久高清精品| 国产成人av一区二区三区在线| 久久午夜国产精品| 国产成人亚洲精品青草天美 | 国产精品每日更新在线播放网址| 免费观看日韩av| 久久综合五月天婷婷伊人| 国产资源精品在线观看| 国产日韩高清在线| 91理论电影在线观看| 亚洲一二三四在线| 91精品国产麻豆| 国产suv精品一区二区883| 日本一区二区成人| 欧美日韩黄色一区二区| 国产一区二区网址| 国产精品成人免费在线| 精品视频一区三区九区| 卡一卡二国产精品 | 欧美在线一区二区三区| 精品一区二区在线观看| 国产三级一区二区三区| 色综合一个色综合| 久久99国产精品久久99果冻传媒| 国产精品国产三级国产aⅴ入口| 欧美日本一区二区三区| 欧美一区二区三区在| 91丨九色丨国产丨porny| 99久久国产综合精品麻豆| 亚洲成人中文在线| 亚洲视频综合在线| 久久免费精品国产久精品久久久久 | 欧美日韩视频在线一区二区| 国产乱对白刺激视频不卡| 亚洲h动漫在线| 亚洲综合小说图片| 亚洲婷婷在线视频| 国产日韩精品一区二区浪潮av| 日韩午夜激情免费电影| 欧美影院一区二区| 91亚洲精品乱码久久久久久蜜桃 | 国产精品盗摄一区二区三区| 久久青草欧美一区二区三区| 69堂国产成人免费视频| 欧美视频一区二| 色呦呦日韩精品| 色综合天天综合狠狠| 不卡免费追剧大全电视剧网站| 国产一区二区精品在线观看| 老司机免费视频一区二区三区| 亚洲成av人片www| 日韩福利视频导航| 另类专区欧美蜜桃臀第一页| 日韩和欧美一区二区| 免费看日韩a级影片| 久久福利资源站| 国产成人午夜电影网| 99视频一区二区| 这里只有精品视频在线观看| 日本成人中文字幕| 奇米影视在线99精品| 亚洲午夜一区二区| 亚洲欧美另类图片小说| 亚洲欧洲日产国码二区| 日韩一区在线看| 综合久久综合久久| 亚洲色大成网站www久久九九| 国产亚洲精品精华液| 国产精品久久久久久久蜜臀| 国产精品久久久久影院亚瑟| 136国产福利精品导航| 国产精品国产三级国产普通话99 | 26uuu色噜噜精品一区二区| 色综合天天综合网天天看片| 91亚洲精品乱码久久久久久蜜桃| 久久青草欧美一区二区三区| 久久精品国产精品亚洲精品| 337p亚洲精品色噜噜| 天堂一区二区在线| 8x福利精品第一导航| 麻豆91在线观看| 欧美精品一区二区三| 国产精品99久久久久久似苏梦涵 | 美女视频黄频大全不卡视频在线播放 | 日韩免费看的电影| 狠狠v欧美v日韩v亚洲ⅴ| 精品国产免费一区二区三区四区| 九九热在线视频观看这里只有精品| 日韩一区二区精品| 懂色av一区二区三区免费观看| 日本一区二区成人| 欧美性猛交xxxx乱大交退制版| 日韩精品91亚洲二区在线观看| 欧美丰满少妇xxxxx高潮对白| 亚洲精品水蜜桃| 在线亚洲高清视频| 亚洲精品乱码久久久久| 一本色道久久综合亚洲aⅴ蜜桃| 一区在线中文字幕| 91丨porny丨蝌蚪视频| 一区二区三区日韩精品视频| 成人免费av资源| 中文字幕一区二区日韩精品绯色| 成人不卡免费av| 亚洲天堂成人网| 欧美中文字幕一区| 日产国产欧美视频一区精品| 精品国产精品网麻豆系列 | 91麻豆精品久久久久蜜臀| 麻豆精品视频在线观看视频| 久久综合九色综合久久久精品综合| 国产精品一区二区在线观看不卡| 国产精品久久久久久久久快鸭| 91亚洲精品久久久蜜桃网站| 日韩电影在线免费观看| 国产午夜精品一区二区三区四区| av电影一区二区| 日韩精品高清不卡| 国产精品伦理在线| 91麻豆精品91久久久久同性| 国产成a人无v码亚洲福利| 一区二区三区精品在线| 精品av综合导航| 69p69国产精品| 99久久综合狠狠综合久久| 捆绑紧缚一区二区三区视频| 一区二区三区在线视频观看| 国产午夜精品美女毛片视频| 日韩一级成人av| 欧美军同video69gay|