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

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

?? btusb.c

?? Linux環境下的藍牙模塊驅動程序源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * *  Generic Bluetooth USB driver * *  Copyright (C) 2005-2008  Marcel Holtmann <marcel@holtmann.org> * * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/types.h>#include <linux/sched.h>#include <linux/errno.h>#include <linux/skbuff.h>#include <linux/usb.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/hci_core.h>#define VERSION "0.4"static int ignore_dga;static int ignore_csr;static int ignore_sniffer;static int disable_scofix;static int force_scofix;static int reset = 1;static struct usb_driver btusb_driver;#define BTUSB_IGNORE		0x01#define BTUSB_DIGIANSWER	0x02#define BTUSB_CSR		0x04#define BTUSB_SNIFFER		0x08#define BTUSB_BCM92035		0x10#define BTUSB_BROKEN_ISOC	0x20#define BTUSB_WRONG_SCO_MTU	0x40static struct usb_device_id btusb_table[] = {	/* Generic Bluetooth USB device */	{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },	/* AVM BlueFRITZ! USB v2.0 */	{ USB_DEVICE(0x057c, 0x3800) },	/* Bluetooth Ultraport Module from IBM */	{ USB_DEVICE(0x04bf, 0x030a) },	/* ALPS Modules with non-standard id */	{ USB_DEVICE(0x044e, 0x3001) },	{ USB_DEVICE(0x044e, 0x3002) },	/* Ericsson with non-standard id */	{ USB_DEVICE(0x0bdb, 0x1002) },	/* Canyon CN-BTU1 with HID interfaces */	{ USB_DEVICE(0x0c10, 0x0000) },	{ }	/* Terminating entry */};MODULE_DEVICE_TABLE(usb, btusb_table);static struct usb_device_id blacklist_table[] = {	/* CSR BlueCore devices */	{ USB_DEVICE(0x0a12, 0x0001), .driver_info = BTUSB_CSR },	/* Broadcom BCM2033 without firmware */	{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },	/* Broadcom BCM2035 */	{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },	/* Broadcom BCM2045 */	{ USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },	/* IBM/Lenovo ThinkPad with Broadcom chip */	{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },	/* HP laptop with Broadcom chip */	{ USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },	/* Dell laptop with Broadcom chip */	{ USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },	/* Dell Wireless 370 and 410 devices */	{ USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },	/* Belkin F8T012 and F8T013 devices */	{ USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_WRONG_SCO_MTU },	{ USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_WRONG_SCO_MTU },	/* Asus WL-BTD202 device */	{ USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },	/* Kensington Bluetooth USB adapter */	{ USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },	/* RTX Telecom based adapters with buggy SCO support */	{ USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },	{ USB_DEVICE(0x0400, 0x080a), .driver_info = BTUSB_BROKEN_ISOC },	/* CONWISE Technology based adapters with buggy SCO support */	{ USB_DEVICE(0x0e5e, 0x6622), .driver_info = BTUSB_BROKEN_ISOC },	/* Digianswer devices */	{ USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },	{ USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },	/* CSR BlueCore Bluetooth Sniffer */	{ USB_DEVICE(0x0a12, 0x0002), .driver_info = BTUSB_SNIFFER },	/* Frontline ComProbe Bluetooth Sniffer */	{ USB_DEVICE(0x16d3, 0x0002), .driver_info = BTUSB_SNIFFER },	{ }	/* Terminating entry */};#define BTUSB_MAX_ISOC_FRAMES	10#define BTUSB_INTR_RUNNING	0#define BTUSB_BULK_RUNNING	1#define BTUSB_ISOC_RUNNING	2struct btusb_data {	struct hci_dev       *hdev;	struct usb_device    *udev;	struct usb_interface *intf;	struct usb_interface *isoc;	spinlock_t lock;	unsigned long flags;	struct work_struct work;	struct usb_anchor tx_anchor;	struct usb_anchor intr_anchor;	struct usb_anchor bulk_anchor;	struct usb_anchor isoc_anchor;	struct usb_endpoint_descriptor *intr_ep;	struct usb_endpoint_descriptor *bulk_tx_ep;	struct usb_endpoint_descriptor *bulk_rx_ep;	struct usb_endpoint_descriptor *isoc_tx_ep;	struct usb_endpoint_descriptor *isoc_rx_ep;	__u8 cmdreq_type;	int isoc_altsetting;	int suspend_count;};static void btusb_intr_complete(struct urb *urb){	struct hci_dev *hdev = urb->context;	struct btusb_data *data = hdev->driver_data;	int err;	BT_DBG("%s urb %p status %d count %d", hdev->name,					urb, urb->status, urb->actual_length);	if (!test_bit(HCI_RUNNING, &hdev->flags))		return;	if (urb->status == 0) {		hdev->stat.byte_rx += urb->actual_length;		if (hci_recv_fragment(hdev, HCI_EVENT_PKT,						urb->transfer_buffer,						urb->actual_length) < 0) {			BT_ERR("%s corrupted event packet", hdev->name);			hdev->stat.err_rx++;		}	}	if (!test_bit(BTUSB_INTR_RUNNING, &data->flags))		return;	usb_anchor_urb(urb, &data->intr_anchor);	err = usb_submit_urb(urb, GFP_ATOMIC);	if (err < 0) {		BT_ERR("%s urb %p failed to resubmit (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}}static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags){	struct btusb_data *data = hdev->driver_data;	struct urb *urb;	unsigned char *buf;	unsigned int pipe;	int err, size;	BT_DBG("%s", hdev->name);	if (!data->intr_ep)		return -ENODEV;	urb = usb_alloc_urb(0, mem_flags);	if (!urb)		return -ENOMEM;	size = le16_to_cpu(data->intr_ep->wMaxPacketSize);	buf = kmalloc(size, mem_flags);	if (!buf) {		usb_free_urb(urb);		return -ENOMEM;	}	pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);	usb_fill_int_urb(urb, data->udev, pipe, buf, size,						btusb_intr_complete, hdev,						data->intr_ep->bInterval);	urb->transfer_flags |= URB_FREE_BUFFER;	usb_anchor_urb(urb, &data->intr_anchor);	err = usb_submit_urb(urb, mem_flags);	if (err < 0) {		BT_ERR("%s urb %p submission failed (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}	usb_free_urb(urb);	return err;}static void btusb_bulk_complete(struct urb *urb){	struct hci_dev *hdev = urb->context;	struct btusb_data *data = hdev->driver_data;	int err;	BT_DBG("%s urb %p status %d count %d", hdev->name,					urb, urb->status, urb->actual_length);	if (!test_bit(HCI_RUNNING, &hdev->flags))		return;	if (urb->status == 0) {		hdev->stat.byte_rx += urb->actual_length;		if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT,						urb->transfer_buffer,						urb->actual_length) < 0) {			BT_ERR("%s corrupted ACL packet", hdev->name);			hdev->stat.err_rx++;		}	}	if (!test_bit(BTUSB_BULK_RUNNING, &data->flags))		return;	usb_anchor_urb(urb, &data->bulk_anchor);	err = usb_submit_urb(urb, GFP_ATOMIC);	if (err < 0) {		BT_ERR("%s urb %p failed to resubmit (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}}static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags){	struct btusb_data *data = hdev->driver_data;	struct urb *urb;	unsigned char *buf;	unsigned int pipe;	int err, size;	BT_DBG("%s", hdev->name);	if (!data->bulk_rx_ep)		return -ENODEV;	urb = usb_alloc_urb(0, mem_flags);	if (!urb)		return -ENOMEM;	size = le16_to_cpu(data->bulk_rx_ep->wMaxPacketSize);	buf = kmalloc(size, mem_flags);	if (!buf) {		usb_free_urb(urb);		return -ENOMEM;	}	pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);	usb_fill_bulk_urb(urb, data->udev, pipe,					buf, size, btusb_bulk_complete, hdev);	urb->transfer_flags |= URB_FREE_BUFFER;	usb_anchor_urb(urb, &data->bulk_anchor);	err = usb_submit_urb(urb, mem_flags);	if (err < 0) {		BT_ERR("%s urb %p submission failed (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}	usb_free_urb(urb);	return err;}static void btusb_isoc_complete(struct urb *urb){	struct hci_dev *hdev = urb->context;	struct btusb_data *data = hdev->driver_data;	int i, err;	BT_DBG("%s urb %p status %d count %d", hdev->name,					urb, urb->status, urb->actual_length);	if (!test_bit(HCI_RUNNING, &hdev->flags))		return;	if (urb->status == 0) {		for (i = 0; i < urb->number_of_packets; i++) {			unsigned int offset = urb->iso_frame_desc[i].offset;			unsigned int length = urb->iso_frame_desc[i].actual_length;			if (urb->iso_frame_desc[i].status)				continue;			hdev->stat.byte_rx += length;			if (hci_recv_fragment(hdev, HCI_SCODATA_PKT,						urb->transfer_buffer + offset,								length) < 0) {				BT_ERR("%s corrupted SCO packet", hdev->name);				hdev->stat.err_rx++;			}		}	}	if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))		return;	usb_anchor_urb(urb, &data->isoc_anchor);	err = usb_submit_urb(urb, GFP_ATOMIC);	if (err < 0) {		BT_ERR("%s urb %p failed to resubmit (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}}static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu){	int i, offset = 0;	BT_DBG("len %d mtu %d", len, mtu);	for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;					i++, offset += mtu, len -= mtu) {		urb->iso_frame_desc[i].offset = offset;		urb->iso_frame_desc[i].length = mtu;	}	if (len && i < BTUSB_MAX_ISOC_FRAMES) {		urb->iso_frame_desc[i].offset = offset;		urb->iso_frame_desc[i].length = len;		i++;	}	urb->number_of_packets = i;}static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags){	struct btusb_data *data = hdev->driver_data;	struct urb *urb;	unsigned char *buf;	unsigned int pipe;	int err, size;	BT_DBG("%s", hdev->name);	if (!data->isoc_rx_ep)		return -ENODEV;	urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);	if (!urb)		return -ENOMEM;	size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *						BTUSB_MAX_ISOC_FRAMES;	buf = kmalloc(size, mem_flags);	if (!buf) {		usb_free_urb(urb);		return -ENOMEM;	}	pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);	urb->dev      = data->udev;	urb->pipe     = pipe;	urb->context  = hdev;	urb->complete = btusb_isoc_complete;	urb->interval = data->isoc_rx_ep->bInterval;	urb->transfer_flags  = URB_FREE_BUFFER | URB_ISO_ASAP;	urb->transfer_buffer = buf;	urb->transfer_buffer_length = size;	__fill_isoc_descriptor(urb, size,			le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));	usb_anchor_urb(urb, &data->isoc_anchor);	err = usb_submit_urb(urb, mem_flags);	if (err < 0) {		BT_ERR("%s urb %p submission failed (%d)",						hdev->name, urb, -err);		usb_unanchor_urb(urb);	}	usb_free_urb(urb);	return err;}static void btusb_tx_complete(struct urb *urb){	struct sk_buff *skb = urb->context;	struct hci_dev *hdev = (struct hci_dev *) skb->dev;	BT_DBG("%s urb %p status %d count %d", hdev->name,					urb, urb->status, urb->actual_length);	if (!test_bit(HCI_RUNNING, &hdev->flags))		goto done;	if (!urb->status)		hdev->stat.byte_tx += urb->transfer_buffer_length;	else		hdev->stat.err_tx++;done:	kfree(urb->setup_packet);	kfree_skb(skb);}static int btusb_open(struct hci_dev *hdev){	struct btusb_data *data = hdev->driver_data;	int err;	BT_DBG("%s", hdev->name);	if (test_and_set_bit(HCI_RUNNING, &hdev->flags))		return 0;	if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))		return 0;	err = btusb_submit_intr_urb(hdev, GFP_KERNEL);	if (err < 0) {		clear_bit(BTUSB_INTR_RUNNING, &data->flags);		clear_bit(HCI_RUNNING, &hdev->flags);	}	return err;}static int btusb_close(struct hci_dev *hdev){	struct btusb_data *data = hdev->driver_data;	BT_DBG("%s", hdev->name);	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))		return 0;	cancel_work_sync(&data->work);	clear_bit(BTUSB_ISOC_RUNNING, &data->flags);	usb_kill_anchored_urbs(&data->isoc_anchor);	clear_bit(BTUSB_BULK_RUNNING, &data->flags);	usb_kill_anchored_urbs(&data->bulk_anchor);	clear_bit(BTUSB_INTR_RUNNING, &data->flags);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产cao| 欧美精品免费视频| 欧美性生活一区| 久久综合给合久久狠狠狠97色69| 国产精品无遮挡| 午夜精品福利一区二区三区蜜桃| 国产精品 日产精品 欧美精品| 日本精品一区二区三区四区的功能| 日韩欧美一级二级| 亚洲欧美电影院| 国产福利一区在线| 欧美女孩性生活视频| 国产精品久久久久久久久晋中 | 日韩视频一区二区三区在线播放 | 欧美精品亚洲二区| 18成人在线观看| 国产成人亚洲综合a∨婷婷| 精品视频全国免费看| 国产精品美女久久久久aⅴ| 久久99国产精品免费| 欧美精品欧美精品系列| 一区二区三区产品免费精品久久75| 高清在线成人网| 精品福利视频一区二区三区| 欧美aaa在线| 欧美日韩中文精品| 亚洲香肠在线观看| 欧美日韩一区三区| 亚洲一级二级三级| 欧美性大战久久| 亚洲在线视频免费观看| 欧美最新大片在线看| 国内不卡的二区三区中文字幕| 色拍拍在线精品视频8848| 成人欧美一区二区三区白人| 成人av网站免费| 最近中文字幕一区二区三区| av日韩在线网站| 亚洲天堂av一区| 在线观看中文字幕不卡| 亚洲成人av福利| 在线电影欧美成精品| 日本三级亚洲精品| 欧美不卡视频一区| 国产剧情一区在线| 中文乱码免费一区二区| 91美女片黄在线观看| 夜夜嗨av一区二区三区四季av| 欧美少妇bbb| 另类小说图片综合网| 久久综合av免费| 成人av电影在线播放| 一区二区三区精品视频| 欧美日韩精品免费| 极品尤物av久久免费看| 国产精品久久一级| 欧美午夜精品一区二区蜜桃| 午夜精品久久久久久久99樱桃| 日韩手机在线导航| 成人精品免费看| 亚洲成人高清在线| 久久亚洲精品国产精品紫薇| 97久久精品人人澡人人爽| 亚洲综合偷拍欧美一区色| 欧美一区二区三区公司| 国产精品影视在线观看| 亚洲欧美日韩小说| 日韩欧美国产三级| 99精品欧美一区二区三区小说| 亚洲高清免费视频| 久久久电影一区二区三区| 91色|porny| 久久99国产精品免费| 一区二区三区四区不卡在线 | 99久久精品国产网站| 日韩一区精品视频| 久久精品夜色噜噜亚洲aⅴ| 91麻豆免费观看| 激情欧美一区二区| 一区二区激情小说| 久久久精品天堂| 在线不卡a资源高清| www.欧美日韩| 精品一区二区三区免费毛片爱| 有码一区二区三区| 久久久久久97三级| 91精品国产麻豆国产自产在线| www.亚洲人| 国产一区美女在线| 视频一区二区三区中文字幕| 中文字幕一区视频| 26uuu久久天堂性欧美| 欧美人狂配大交3d怪物一区| 成人网在线免费视频| 美女性感视频久久| 亚洲一区二区三区四区在线观看| 中文字幕不卡的av| 久久人人爽爽爽人久久久| 欧美精品自拍偷拍动漫精品| 色婷婷狠狠综合| 成人免费av在线| 国产一区二区精品久久| 秋霞午夜鲁丝一区二区老狼| 亚洲影视在线观看| 一区二区三区免费| 一区二区在线免费观看| **性色生活片久久毛片| 国产欧美日本一区视频| 2023国产精品| 久久久亚洲午夜电影| 欧美精品一区二区三区四区 | 欧美一级二级三级蜜桃| 国产欧美一区二区精品忘忧草| 91精品国产一区二区三区| 欧美私模裸体表演在线观看| 色综合av在线| 日本伦理一区二区| 色av成人天堂桃色av| 91在线免费播放| 国产91丝袜在线观看| 国产69精品一区二区亚洲孕妇| 国产久卡久卡久卡久卡视频精品| 精品一区二区在线视频| 精一区二区三区| 国产在线一区二区| 国产精品一级黄| 风间由美性色一区二区三区| 成人一区二区视频| 99精品在线观看视频| 91麻豆.com| 欧美在线一区二区| 欧美日韩国产综合一区二区| 7777精品伊人久久久大香线蕉完整版 | 国产精品久久久久一区二区三区共| 国产农村妇女精品| 亚洲欧美电影院| 婷婷综合久久一区二区三区| 免费在线看成人av| 国产露脸91国语对白| 99re热这里只有精品视频| 欧美色图一区二区三区| 日韩一区二区精品| 中文字幕成人在线观看| 亚洲综合色噜噜狠狠| 日本不卡免费在线视频| 国产精品996| 色婷婷精品久久二区二区蜜臂av| 欧美女孩性生活视频| 一区二区视频在线看| 一区二区三区小说| 蜜桃av一区二区三区| 成人性生交大片免费 | 粉嫩欧美一区二区三区高清影视| www.日韩av| 91精品国产综合久久久蜜臀图片| xfplay精品久久| 一区二区三区在线视频播放| 麻豆精品在线观看| 色噜噜夜夜夜综合网| 欧美精品一区二区高清在线观看 | 日韩视频永久免费| 国产精品二三区| 麻豆精品视频在线观看免费| 97久久超碰国产精品电影| 欧美一卡二卡三卡| 亚洲黄色录像片| 国产不卡高清在线观看视频| 欧美精品久久99久久在免费线| 中文幕一区二区三区久久蜜桃| 亚洲成av人影院在线观看网| 成人中文字幕合集| 精品国产百合女同互慰| 亚洲第一成年网| 不卡一二三区首页| 久久嫩草精品久久久久| 日日摸夜夜添夜夜添精品视频| 91性感美女视频| 久久免费电影网| 蜜臀av一级做a爰片久久| 欧美影视一区二区三区| **性色生活片久久毛片| 国产一区二区网址| 日韩欧美一区电影| 午夜精品爽啪视频| 欧美三级一区二区| 亚洲乱码中文字幕综合| 北条麻妃一区二区三区| 久久精品亚洲精品国产欧美| 日本不卡视频在线观看| 欧美人与z0zoxxxx视频| 亚洲一区二区中文在线| 91猫先生在线| 国产精品久久久久久一区二区三区| 国产美女娇喘av呻吟久久| 精品国产一区久久| 精品一区二区三区在线观看 | 国产视频在线观看一区二区三区| 美腿丝袜亚洲综合| 日韩无一区二区| 老司机精品视频导航|