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

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

?? hci_vhci.c

?? Linux下藍牙驅動
?? C
字號:
/*    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 virtual device driver. * * $Id: hci_vhci.c,v 1.3 2002/04/17 17:37:20 maxk Exp $  */#define VERSION "1.1"#include <linux/config.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/poll.h>#include <linux/fcntl.h>#include <linux/init.h>#include <linux/random.h>#include <linux/skbuff.h>#include <linux/miscdevice.h>#include <asm/system.h>#include <asm/uaccess.h>#include <net/bluetooth/bluetooth.h>#include <net/bluetooth/hci_core.h>#include "hci_vhci.h"/* HCI device part */static int hci_vhci_open(struct hci_dev *hdev){	set_bit(HCI_RUNNING, &hdev->flags);	return 0;}static int hci_vhci_flush(struct hci_dev *hdev){	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) hdev->driver_data;	skb_queue_purge(&hci_vhci->readq);	return 0;}static int hci_vhci_close(struct hci_dev *hdev){	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))		return 0;	hci_vhci_flush(hdev);	return 0;}static void hci_vhci_destruct(struct hci_dev *hdev){	struct hci_vhci_struct *vhci;	if (!hdev) return;	vhci = (struct hci_vhci_struct *) hdev->driver_data;	kfree(vhci);	MOD_DEC_USE_COUNT;}static int hci_vhci_send_frame(struct sk_buff *skb){	struct hci_dev* hdev = (struct hci_dev *) skb->dev;	struct hci_vhci_struct *hci_vhci;	if (!hdev) {		BT_ERR("Frame for uknown device (hdev=NULL)");		return -ENODEV;	}	if (!test_bit(HCI_RUNNING, &hdev->flags))		return -EBUSY;	hci_vhci = (struct hci_vhci_struct *) hdev->driver_data;	memcpy(skb_push(skb, 1), &skb->pkt_type, 1);	skb_queue_tail(&hci_vhci->readq, skb);	if (hci_vhci->flags & VHCI_FASYNC)		kill_fasync(&hci_vhci->fasync, SIGIO, POLL_IN);	wake_up_interruptible(&hci_vhci->read_wait);	return 0;}/* Character device part *//* Poll */static unsigned int hci_vhci_chr_poll(struct file *file, poll_table * wait){  	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data;	poll_wait(file, &hci_vhci->read_wait, wait); 	if (skb_queue_len(&hci_vhci->readq))		return POLLIN | POLLRDNORM;	return POLLOUT | POLLWRNORM;}/* Get packet from user space buffer(already verified) */static inline ssize_t hci_vhci_get_user(struct hci_vhci_struct *hci_vhci, const char *buf, size_t count){	struct sk_buff *skb;	if (count > HCI_MAX_FRAME_SIZE)		return -EINVAL;	if (!(skb = bluez_skb_alloc(count, GFP_KERNEL)))		return -ENOMEM;		copy_from_user(skb_put(skb, count), buf, count); 	skb->dev = (void *) &hci_vhci->hdev;	skb->pkt_type = *((__u8 *) skb->data);	skb_pull(skb, 1);	hci_recv_frame(skb);	return count;} /* Write */static ssize_t hci_vhci_chr_write(struct file * file, const char * buf, 			     size_t count, loff_t *pos){	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data;	if (verify_area(VERIFY_READ, buf, count))		return -EFAULT;	return hci_vhci_get_user(hci_vhci, buf, count);}/* Put packet to user space buffer(already verified) */static inline ssize_t hci_vhci_put_user(struct hci_vhci_struct *hci_vhci,				       struct sk_buff *skb, char *buf, int count){	int len = count, total = 0;	char *ptr = buf;	len = MIN(skb->len, len); 	copy_to_user(ptr, skb->data, len); 	total += len;	hci_vhci->hdev.stat.byte_tx += len;	switch (skb->pkt_type) {		case HCI_COMMAND_PKT:			hci_vhci->hdev.stat.cmd_tx++;			break;		case HCI_ACLDATA_PKT:			hci_vhci->hdev.stat.acl_tx++;			break;		case HCI_SCODATA_PKT:			hci_vhci->hdev.stat.cmd_tx++;			break;	};	return total;}/* Read */static ssize_t hci_vhci_chr_read(struct file * file, char * buf, size_t count, loff_t *pos){	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data;	DECLARE_WAITQUEUE(wait, current);	struct sk_buff *skb;	ssize_t ret = 0;	add_wait_queue(&hci_vhci->read_wait, &wait);	while (count) {		set_current_state(TASK_INTERRUPTIBLE);		/* Read frames from device queue */		if (!(skb = skb_dequeue(&hci_vhci->readq))) {			if (file->f_flags & O_NONBLOCK) {				ret = -EAGAIN;				break;			}			if (signal_pending(current)) {				ret = -ERESTARTSYS;				break;			}			/* Nothing to read, let's sleep */			schedule();			continue;		}		if (!verify_area(VERIFY_WRITE, buf, count))			ret = hci_vhci_put_user(hci_vhci, skb, buf, count);		else			ret = -EFAULT;		kfree_skb(skb);		break;	}	set_current_state(TASK_RUNNING);	remove_wait_queue(&hci_vhci->read_wait, &wait);	return ret;}static loff_t hci_vhci_chr_lseek(struct file * file, loff_t offset, int origin){	return -ESPIPE;}static int hci_vhci_chr_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	return -EINVAL;}static int hci_vhci_chr_fasync(int fd, struct file *file, int on){	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data;	int ret;	if ((ret = fasync_helper(fd, file, on, &hci_vhci->fasync)) < 0)		return ret;  	if (on)		hci_vhci->flags |= VHCI_FASYNC;	else 		hci_vhci->flags &= ~VHCI_FASYNC;	return 0;}static int hci_vhci_chr_open(struct inode *inode, struct file * file){	struct hci_vhci_struct *hci_vhci = NULL; 	struct hci_dev *hdev;	if (!(hci_vhci = kmalloc(sizeof(struct hci_vhci_struct), GFP_KERNEL)))		return -ENOMEM;	memset(hci_vhci, 0, sizeof(struct hci_vhci_struct));	skb_queue_head_init(&hci_vhci->readq);	init_waitqueue_head(&hci_vhci->read_wait);	/* Initialize and register HCI device */	hdev = &hci_vhci->hdev;	hdev->type = HCI_VHCI;	hdev->driver_data = hci_vhci;	hdev->open  = hci_vhci_open;	hdev->close = hci_vhci_close;	hdev->flush = hci_vhci_flush;	hdev->send  = hci_vhci_send_frame;	hdev->destruct = hci_vhci_destruct;	if (hci_register_dev(hdev) < 0) {		kfree(hci_vhci);		return -EBUSY;	}	MOD_INC_USE_COUNT;	file->private_data = hci_vhci;	return 0;   }static int hci_vhci_chr_close(struct inode *inode, struct file *file){	struct hci_vhci_struct *hci_vhci = (struct hci_vhci_struct *) file->private_data;	if (hci_unregister_dev(&hci_vhci->hdev) < 0) {		BT_ERR("Can't unregister HCI device %s", hci_vhci->hdev.name);	}	file->private_data = NULL;	return 0;}static struct file_operations hci_vhci_fops = {	owner:	THIS_MODULE,		llseek:	hci_vhci_chr_lseek,	read:	hci_vhci_chr_read,	write:	hci_vhci_chr_write,	poll:	hci_vhci_chr_poll,	ioctl:	hci_vhci_chr_ioctl,	open:	hci_vhci_chr_open,	release:hci_vhci_chr_close,	fasync:	hci_vhci_chr_fasync		};static struct miscdevice hci_vhci_miscdev={        VHCI_MINOR,        "hci_vhci",        &hci_vhci_fops};int __init hci_vhci_init(void){	BT_INFO("BlueZ VHCI driver ver %s Copyright (C) 2000,2001 Qualcomm Inc",  		VERSION);	BT_INFO("Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>");	if (misc_register(&hci_vhci_miscdev)) {		BT_ERR("Can't register misc device %d\n", VHCI_MINOR);		return -EIO;	}	return 0;}void hci_vhci_cleanup(void){	misc_deregister(&hci_vhci_miscdev);}module_init(hci_vhci_init);module_exit(hci_vhci_cleanup);MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>");MODULE_DESCRIPTION("BlueZ VHCI driver ver " VERSION);MODULE_LICENSE("GPL"); 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频一区二区三区| 日韩精品中文字幕一区 | 国产一区三区三区| 日韩中文字幕91| 五月激情综合婷婷| 亚洲成人福利片| 日韩国产精品久久久| 日产国产欧美视频一区精品| 日韩av在线发布| 久色婷婷小香蕉久久| 麻豆成人综合网| 国产在线麻豆精品观看| 国产精品资源网站| 成人午夜精品在线| av电影在线观看一区| 91视频免费看| 欧美日韩在线直播| 欧美精品三级在线观看| 欧美一级精品大片| 久久综合五月天婷婷伊人| 国产清纯在线一区二区www| 日本一区二区免费在线| 最新国产成人在线观看| 亚洲精品一二三四区| 亚洲成人在线观看视频| 99riav一区二区三区| 色婷婷精品久久二区二区蜜臀av| 91精品福利视频| 在线不卡一区二区| www久久精品| 国产精品每日更新在线播放网址 | 激情偷乱视频一区二区三区| 国产毛片精品视频| 成人av免费观看| 欧美在线播放高清精品| 欧美一级视频精品观看| 国产亚洲成aⅴ人片在线观看| 亚洲三级在线免费| 日精品一区二区| 国产成人综合亚洲91猫咪| 91在线视频播放地址| 91精品国模一区二区三区| 久久久久久免费毛片精品| 综合av第一页| 免费在线观看一区| av影院午夜一区| 91精品国产麻豆国产自产在线| 久久久精品日韩欧美| 亚洲精品国产成人久久av盗摄 | 国产成人午夜精品5599| 在线观看日韩毛片| 精品福利一区二区三区| 亚洲精品乱码久久久久久久久 | 狠狠色丁香九九婷婷综合五月| 成人福利电影精品一区二区在线观看| 色综合激情五月| 久久综合国产精品| 有码一区二区三区| 国产一区二区三区蝌蚪| 色婷婷亚洲精品| 久久精品一区二区三区不卡| 亚洲国产精品久久久久秋霞影院 | 99久久久久免费精品国产| 欧美另类变人与禽xxxxx| 国产精品午夜在线观看| 免费观看在线综合| 色综合天天综合给合国产| 久久综合色之久久综合| 亚洲国产精品久久艾草纯爱| 国产精品1区二区.| 8x8x8国产精品| 亚洲日本成人在线观看| 麻豆国产欧美日韩综合精品二区 | 在线一区二区观看| 久久久国产精品麻豆| 日韩成人免费看| 欧美性大战久久久久久久蜜臀| 久久久激情视频| 久久精品国产秦先生| 91黄色免费版| 奇米影视在线99精品| 色婷婷久久一区二区三区麻豆| 欧美国产日韩亚洲一区| 极品少妇一区二区| 欧美一区二区三区不卡| 亚洲国产成人av好男人在线观看| hitomi一区二区三区精品| 国产日韩欧美激情| 精品亚洲国产成人av制服丝袜| 7777精品伊人久久久大香线蕉最新版| 亚洲欧美在线高清| 成人av资源下载| 亚洲国产精品av| 亚洲男人的天堂一区二区| 成人午夜看片网址| 日本一区二区免费在线观看视频| 韩国毛片一区二区三区| 日韩欧美激情四射| 爽好多水快深点欧美视频| 欧美日韩国产a| 亚洲一区二区精品视频| 一本色道久久综合狠狠躁的推荐 | 中文一区在线播放| 国产毛片精品视频| 国产日韩欧美亚洲| 国产精品69毛片高清亚洲| 久久精品视频一区二区三区| 国产乱码精品一区二区三区忘忧草| 欧美sm美女调教| 精品一区二区三区在线播放| 日韩欧美国产系列| 久久99深爱久久99精品| 欧美变态tickle挠乳网站| 免费一级欧美片在线观看| 欧美一区日本一区韩国一区| 免费三级欧美电影| 欧美本精品男人aⅴ天堂| 国产老肥熟一区二区三区| 久久久久久毛片| 成人精品视频.| 亚洲欧美日韩系列| 在线亚洲免费视频| 亚洲444eee在线观看| 正在播放一区二区| 精品一区二区三区在线观看国产| 26uuu国产日韩综合| 成人精品免费网站| 亚洲卡通动漫在线| 7777精品伊人久久久大香线蕉完整版| 日本伊人色综合网| 精品国产亚洲在线| 成人av免费观看| 亚洲精品国产a| 日韩欧美一区电影| 国产精品一区久久久久| 亚洲欧美在线aaa| 欧美日韩小视频| 国内精品久久久久影院色| 国产精品网站一区| 欧美日韩情趣电影| 激情六月婷婷久久| 亚洲视频 欧洲视频| 欧美色区777第一页| 精品一区二区三区不卡| ●精品国产综合乱码久久久久| 欧美日韩一区二区三区四区五区| 久久精品国产**网站演员| 国产精品免费看片| 欧美精品精品一区| 岛国一区二区三区| 亚洲第一福利一区| 久久久国产精华| 欧美性猛交一区二区三区精品| 韩国精品一区二区| 一区二区久久久久| 亚洲精品欧美激情| 日韩精品一区二| 日本韩国精品一区二区在线观看| 蜜臀精品久久久久久蜜臀| 国产精品国产三级国产普通话三级 | 久久久777精品电影网影网| 色综合咪咪久久| 精品亚洲成a人| 一区二区国产视频| 国产欧美日韩精品a在线观看| 精品视频在线免费观看| 国产+成+人+亚洲欧洲自线| 视频精品一区二区| 国产精品电影院| 精品国产一区二区三区不卡| 91国偷自产一区二区三区成为亚洲经典 | 亚洲欧美一区二区三区久本道91 | 6080日韩午夜伦伦午夜伦| 成人美女在线视频| 男女男精品视频网| 一区二区三区在线观看欧美| 久久精品亚洲精品国产欧美kt∨| 欧美男男青年gay1069videost| 波多野结衣在线aⅴ中文字幕不卡| 日本不卡高清视频| 亚洲中国最大av网站| 国产欧美精品一区二区三区四区 | 亚洲天堂av一区| 欧美精品在欧美一区二区少妇| 精品美女一区二区| 在线观看一区二区精品视频| 99精品视频一区二区| 日韩不卡在线观看日韩不卡视频| 亚洲人被黑人高潮完整版| 欧美国产一区二区在线观看| 久久蜜桃一区二区| 正在播放一区二区| 欧美日韩国产三级| 色久综合一二码| 91丝袜美腿高跟国产极品老师| 韩国女主播一区| 精东粉嫩av免费一区二区三区| 日韩av电影天堂| 日韩主播视频在线| 婷婷成人激情在线网|