2005-04-17 02:20:36 +04:00
/*
2005-10-28 21:20:45 +04:00
*
* Bluetooth HCI UART driver
*
* Copyright ( C ) 2000 - 2001 Qualcomm Incorporated
* Copyright ( C ) 2002 - 2003 Maxim Krasnyansky < maxk @ qualcomm . com >
* Copyright ( C ) 2004 - 2005 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
*
2005-04-17 02:20:36 +04:00
*/
2005-10-28 21:20:45 +04:00
# ifndef N_HCI
2005-04-17 02:20:36 +04:00
# define N_HCI 15
# endif
/* Ioctls */
2007-05-09 11:15:35 +04:00
# define HCIUARTSETPROTO _IOW('U', 200, int)
# define HCIUARTGETPROTO _IOR('U', 201, int)
# define HCIUARTGETDEVICE _IOR('U', 202, int)
2010-07-12 18:37:04 +04:00
# define HCIUARTSETFLAGS _IOW('U', 203, int)
# define HCIUARTGETFLAGS _IOR('U', 204, int)
2005-04-17 02:20:36 +04:00
/* UART protocols */
2015-04-05 02:13:03 +03:00
# define HCI_UART_MAX_PROTO 8
2005-04-17 02:20:36 +04:00
# define HCI_UART_H4 0
# define HCI_UART_BCSP 1
# define HCI_UART_3WIRE 2
# define HCI_UART_H4DS 3
2007-10-20 15:42:36 +04:00
# define HCI_UART_LL 4
2010-07-19 11:04:07 +04:00
# define HCI_UART_ATH3K 5
2015-04-05 02:13:02 +03:00
# define HCI_UART_INTEL 6
2015-04-05 02:13:03 +03:00
# define HCI_UART_BCM 7
2005-04-17 02:20:36 +04:00
2010-07-12 18:37:04 +04:00
# define HCI_UART_RAW_DEVICE 0
2012-02-24 20:12:24 +04:00
# define HCI_UART_RESET_ON_INIT 1
2012-02-24 20:09:38 +04:00
# define HCI_UART_CREATE_AMP 2
2012-07-16 17:12:11 +04:00
# define HCI_UART_INIT_PENDING 3
2014-07-11 09:12:58 +04:00
# define HCI_UART_EXT_CONFIG 4
2015-04-05 02:13:01 +03:00
# define HCI_UART_VND_DETECT 5
2010-07-12 18:37:04 +04:00
2005-04-17 02:20:36 +04:00
struct hci_uart ;
struct hci_uart_proto {
unsigned int id ;
2015-04-05 08:27:34 +03:00
const char * name ;
2015-05-28 12:25:03 +03:00
unsigned int init_speed ;
unsigned int oper_speed ;
2005-04-17 02:20:36 +04:00
int ( * open ) ( struct hci_uart * hu ) ;
int ( * close ) ( struct hci_uart * hu ) ;
int ( * flush ) ( struct hci_uart * hu ) ;
2015-04-06 08:52:17 +03:00
int ( * setup ) ( struct hci_uart * hu ) ;
2015-05-28 12:25:03 +03:00
int ( * set_baudrate ) ( struct hci_uart * hu , unsigned int speed ) ;
2015-04-05 06:59:41 +03:00
int ( * recv ) ( struct hci_uart * hu , const void * data , int len ) ;
2005-04-17 02:20:36 +04:00
int ( * enqueue ) ( struct hci_uart * hu , struct sk_buff * skb ) ;
struct sk_buff * ( * dequeue ) ( struct hci_uart * hu ) ;
} ;
struct hci_uart {
2005-10-28 21:20:45 +04:00
struct tty_struct * tty ;
struct hci_dev * hdev ;
unsigned long flags ;
2010-07-12 18:37:04 +04:00
unsigned long hdev_flags ;
2005-04-17 02:20:36 +04:00
2012-07-16 17:12:11 +04:00
struct work_struct init_ready ;
2014-04-23 18:58:26 +04:00
struct work_struct write_work ;
2012-07-16 17:12:11 +04:00
2015-04-05 08:11:43 +03:00
const struct hci_uart_proto * proto ;
2005-10-28 21:20:45 +04:00
void * priv ;
struct sk_buff * tx_skb ;
unsigned long tx_state ;
spinlock_t rx_lock ;
2015-06-18 00:30:56 +03:00
unsigned int init_speed ;
unsigned int oper_speed ;
2005-04-17 02:20:36 +04:00
} ;
2010-07-12 18:37:04 +04:00
/* HCI_UART proto flag bits */
2005-10-28 21:20:45 +04:00
# define HCI_UART_PROTO_SET 0
2012-07-16 17:12:11 +04:00
# define HCI_UART_REGISTERED 1
2005-04-17 02:20:36 +04:00
/* TX states */
2005-10-28 21:20:45 +04:00
# define HCI_UART_SENDING 1
# define HCI_UART_TX_WAKEUP 2
2005-04-17 02:20:36 +04:00
2015-04-05 08:11:43 +03:00
int hci_uart_register_proto ( const struct hci_uart_proto * p ) ;
int hci_uart_unregister_proto ( const struct hci_uart_proto * p ) ;
2005-04-17 02:20:36 +04:00
int hci_uart_tx_wakeup ( struct hci_uart * hu ) ;
2012-07-16 17:12:11 +04:00
int hci_uart_init_ready ( struct hci_uart * hu ) ;
2015-06-18 00:30:56 +03:00
void hci_uart_init_tty ( struct hci_uart * hu ) ;
2015-05-28 12:25:03 +03:00
void hci_uart_set_baudrate ( struct hci_uart * hu , unsigned int speed ) ;
2015-06-18 00:30:56 +03:00
void hci_uart_set_flow_control ( struct hci_uart * hu , bool enable ) ;
void hci_uart_set_speeds ( struct hci_uart * hu , unsigned int init_speed ,
unsigned int oper_speed ) ;
2005-04-17 02:20:36 +04:00
2005-10-28 21:20:45 +04:00
# ifdef CONFIG_BT_HCIUART_H4
int h4_init ( void ) ;
int h4_deinit ( void ) ;
2015-04-05 07:59:24 +03:00
2015-04-06 09:44:59 +03:00
struct h4_recv_pkt {
u8 type ; /* Packet type */
u8 hlen ; /* Header length */
u8 loff ; /* Data length offset in header */
u8 lsize ; /* Data length field size */
u16 maxlen ; /* Max overall packet length */
int ( * recv ) ( struct hci_dev * hdev , struct sk_buff * skb ) ;
} ;
# define H4_RECV_ACL \
. type = HCI_ACLDATA_PKT , \
. hlen = HCI_ACL_HDR_SIZE , \
. loff = 2 , \
. lsize = 2 , \
. maxlen = HCI_MAX_FRAME_SIZE \
# define H4_RECV_SCO \
. type = HCI_SCODATA_PKT , \
. hlen = HCI_SCO_HDR_SIZE , \
. loff = 2 , \
. lsize = 1 , \
. maxlen = HCI_MAX_SCO_SIZE
# define H4_RECV_EVENT \
. type = HCI_EVENT_PKT , \
. hlen = HCI_EVENT_HDR_SIZE , \
. loff = 1 , \
. lsize = 1 , \
. maxlen = HCI_MAX_EVENT_SIZE
2015-04-05 07:59:24 +03:00
struct sk_buff * h4_recv_buf ( struct hci_dev * hdev , struct sk_buff * skb ,
2015-04-06 09:44:59 +03:00
const unsigned char * buffer , int count ,
const struct h4_recv_pkt * pkts , int pkts_count ) ;
2005-10-28 21:20:45 +04:00
# endif
# ifdef CONFIG_BT_HCIUART_BCSP
int bcsp_init ( void ) ;
int bcsp_deinit ( void ) ;
# endif
2007-10-20 15:42:36 +04:00
# ifdef CONFIG_BT_HCIUART_LL
int ll_init ( void ) ;
int ll_deinit ( void ) ;
# endif
2010-07-19 11:04:07 +04:00
# ifdef CONFIG_BT_HCIUART_ATH3K
int ath_init ( void ) ;
int ath_deinit ( void ) ;
# endif
2012-07-16 17:12:02 +04:00
# ifdef CONFIG_BT_HCIUART_3WIRE
int h5_init ( void ) ;
int h5_deinit ( void ) ;
# endif
2015-04-05 02:13:02 +03:00
2015-04-06 08:52:18 +03:00
# ifdef CONFIG_BT_HCIUART_BCM
int bcm_init ( void ) ;
int bcm_deinit ( void ) ;
# endif