mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	 1da177e4c3
			
		
	
	
		1da177e4c3
		
	
	
	
	
		
			
			Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
		
			
				
	
	
		
			128 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 
 | |
|    HCI USB driver for Linux Bluetooth protocol stack (BlueZ)
 | |
|    Copyright (C) 2000-2001 Qualcomm Incorporated
 | |
|    Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
 | |
| 
 | |
|    Copyright (C) 2003 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.
 | |
| */
 | |
| 
 | |
| /* Class, SubClass, and Protocol codes that describe a Bluetooth device */
 | |
| #define HCI_DEV_CLASS		0xe0	/* Wireless class */
 | |
| #define HCI_DEV_SUBCLASS	0x01	/* RF subclass */
 | |
| #define HCI_DEV_PROTOCOL	0x01	/* Bluetooth programming protocol */
 | |
| 
 | |
| #define HCI_IGNORE		0x01
 | |
| #define HCI_RESET		0x02
 | |
| #define HCI_DIGIANSWER		0x04
 | |
| #define HCI_SNIFFER		0x08
 | |
| #define HCI_BROKEN_ISOC		0x10
 | |
| #define HCI_BCM92035		0x20
 | |
| 
 | |
| #define HCI_MAX_IFACE_NUM	3
 | |
| 
 | |
| #define HCI_MAX_BULK_TX		4
 | |
| #define HCI_MAX_BULK_RX		1
 | |
| 
 | |
| #define HCI_MAX_ISOC_RX		2
 | |
| #define HCI_MAX_ISOC_TX		2
 | |
| 
 | |
| #define HCI_MAX_ISOC_FRAMES	10
 | |
| 
 | |
| struct _urb_queue {
 | |
| 	struct list_head head;
 | |
| 	spinlock_t       lock;
 | |
| };
 | |
| 
 | |
| struct _urb {
 | |
| 	struct list_head  list;
 | |
| 	struct _urb_queue *queue;
 | |
| 	int               type;
 | |
| 	void              *priv;
 | |
| 	struct urb        urb;
 | |
| };
 | |
| 
 | |
| static inline void _urb_free(struct _urb *_urb)
 | |
| {
 | |
| 	kfree(_urb);
 | |
| }
 | |
| 
 | |
| static inline void _urb_queue_init(struct _urb_queue *q)
 | |
| {
 | |
| 	INIT_LIST_HEAD(&q->head);
 | |
| 	spin_lock_init(&q->lock);
 | |
| }
 | |
| 
 | |
| static inline void _urb_queue_head(struct _urb_queue *q, struct _urb *_urb)
 | |
| {
 | |
| 	unsigned long flags;
 | |
| 	spin_lock_irqsave(&q->lock, flags);
 | |
| 	list_add(&_urb->list, &q->head); _urb->queue = q;
 | |
| 	spin_unlock_irqrestore(&q->lock, flags);
 | |
| }
 | |
| 
 | |
| static inline void _urb_queue_tail(struct _urb_queue *q, struct _urb *_urb)
 | |
| {
 | |
| 	unsigned long flags;
 | |
| 	spin_lock_irqsave(&q->lock, flags);
 | |
| 	list_add_tail(&_urb->list, &q->head); _urb->queue = q;
 | |
| 	spin_unlock_irqrestore(&q->lock, flags);
 | |
| }
 | |
| 
 | |
| static inline void _urb_unlink(struct _urb *_urb)
 | |
| {
 | |
| 	struct _urb_queue *q = _urb->queue;
 | |
| 	unsigned long flags;
 | |
| 	if (q) {
 | |
| 		spin_lock_irqsave(&q->lock, flags);
 | |
| 		list_del(&_urb->list); _urb->queue = NULL;
 | |
| 		spin_unlock_irqrestore(&q->lock, flags);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| struct hci_usb {
 | |
| 	struct hci_dev		*hdev;
 | |
| 
 | |
| 	unsigned long		state;
 | |
| 	
 | |
| 	struct usb_device	*udev;
 | |
| 	
 | |
| 	struct usb_host_endpoint	*bulk_in_ep;
 | |
| 	struct usb_host_endpoint	*bulk_out_ep;
 | |
| 	struct usb_host_endpoint	*intr_in_ep;
 | |
| 
 | |
| 	struct usb_interface		*isoc_iface;
 | |
| 	struct usb_host_endpoint	*isoc_out_ep;
 | |
| 	struct usb_host_endpoint	*isoc_in_ep;
 | |
| 
 | |
| 	__u8			ctrl_req;
 | |
| 
 | |
| 	struct sk_buff_head	transmit_q[4];
 | |
| 	struct sk_buff		*reassembly[4];		/* Reassembly buffers */
 | |
| 
 | |
| 	rwlock_t		completion_lock;
 | |
| 
 | |
| 	atomic_t		pending_tx[4];		/* Number of pending requests */
 | |
| 	struct _urb_queue	pending_q[4];		/* Pending requests */
 | |
| 	struct _urb_queue	completed_q[4];		/* Completed requests */
 | |
| };
 | |
| 
 | |
| /* States  */
 | |
| #define HCI_USB_TX_PROCESS	1
 | |
| #define HCI_USB_TX_WAKEUP	2
 |