2019-05-29 17:17:58 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2012-05-29 14:59:02 +04:00
/*
Copyright ( c ) 2010 , 2011 Code Aurora Forum . All rights reserved .
Copyright ( c ) 2011 , 2012 Intel Corp .
*/
# ifndef __A2MP_H
# define __A2MP_H
2012-05-29 14:59:17 +04:00
# include <net/bluetooth/l2cap.h>
2012-09-27 18:26:07 +04:00
enum amp_mgr_state {
READ_LOC_AMP_INFO ,
2012-09-27 18:26:09 +04:00
READ_LOC_AMP_ASSOC ,
2012-09-27 18:26:22 +04:00
READ_LOC_AMP_ASSOC_FINAL ,
2012-12-07 16:59:05 +04:00
WRITE_REMOTE_AMP_ASSOC ,
2012-09-27 18:26:07 +04:00
} ;
2012-05-29 14:59:02 +04:00
struct amp_mgr {
2012-09-27 18:26:07 +04:00
struct list_head list ;
2012-05-29 14:59:02 +04:00
struct l2cap_conn * l2cap_conn ;
struct l2cap_chan * a2mp_chan ;
2012-09-27 18:26:16 +04:00
struct l2cap_chan * bredr_chan ;
2012-05-29 14:59:02 +04:00
struct kref kref ;
__u8 ident ;
__u8 handle ;
2012-12-07 16:59:08 +04:00
unsigned long state ;
2012-05-29 14:59:02 +04:00
unsigned long flags ;
2012-09-27 18:26:12 +04:00
struct list_head amp_ctrls ;
struct mutex amp_ctrls_lock ;
2012-05-29 14:59:02 +04:00
} ;
2012-05-29 14:59:03 +04:00
struct a2mp_cmd {
__u8 code ;
__u8 ident ;
__le16 len ;
2020-02-27 02:02:27 +03:00
__u8 data [ ] ;
2012-05-29 14:59:03 +04:00
} __packed ;
2012-05-29 14:59:05 +04:00
/* A2MP command codes */
# define A2MP_COMMAND_REJ 0x01
struct a2mp_cmd_rej {
__le16 reason ;
2020-02-27 02:02:27 +03:00
__u8 data [ ] ;
2012-05-29 14:59:05 +04:00
} __packed ;
# define A2MP_DISCOVER_REQ 0x02
struct a2mp_discov_req {
__le16 mtu ;
__le16 ext_feat ;
} __packed ;
struct a2mp_cl {
__u8 id ;
__u8 type ;
__u8 status ;
} __packed ;
# define A2MP_DISCOVER_RSP 0x03
struct a2mp_discov_rsp {
__le16 mtu ;
__le16 ext_feat ;
2020-02-27 02:02:27 +03:00
struct a2mp_cl cl [ ] ;
2012-05-29 14:59:05 +04:00
} __packed ;
# define A2MP_CHANGE_NOTIFY 0x04
# define A2MP_CHANGE_RSP 0x05
# define A2MP_GETINFO_REQ 0x06
struct a2mp_info_req {
__u8 id ;
} __packed ;
# define A2MP_GETINFO_RSP 0x07
struct a2mp_info_rsp {
__u8 id ;
__u8 status ;
__le32 total_bw ;
__le32 max_bw ;
__le32 min_latency ;
__le16 pal_cap ;
__le16 assoc_size ;
} __packed ;
# define A2MP_GETAMPASSOC_REQ 0x08
struct a2mp_amp_assoc_req {
__u8 id ;
} __packed ;
# define A2MP_GETAMPASSOC_RSP 0x09
struct a2mp_amp_assoc_rsp {
__u8 id ;
__u8 status ;
2020-02-27 02:02:27 +03:00
__u8 amp_assoc [ ] ;
2012-05-29 14:59:05 +04:00
} __packed ;
# define A2MP_CREATEPHYSLINK_REQ 0x0A
# define A2MP_DISCONNPHYSLINK_REQ 0x0C
struct a2mp_physlink_req {
__u8 local_id ;
__u8 remote_id ;
2020-02-27 02:02:27 +03:00
__u8 amp_assoc [ ] ;
2012-05-29 14:59:05 +04:00
} __packed ;
# define A2MP_CREATEPHYSLINK_RSP 0x0B
# define A2MP_DISCONNPHYSLINK_RSP 0x0D
struct a2mp_physlink_rsp {
__u8 local_id ;
__u8 remote_id ;
__u8 status ;
} __packed ;
2012-05-29 14:59:06 +04:00
/* A2MP response status */
# define A2MP_STATUS_SUCCESS 0x00
# define A2MP_STATUS_INVALID_CTRL_ID 0x01
# define A2MP_STATUS_UNABLE_START_LINK_CREATION 0x02
# define A2MP_STATUS_NO_PHYSICAL_LINK_EXISTS 0x02
# define A2MP_STATUS_COLLISION_OCCURED 0x03
# define A2MP_STATUS_DISCONN_REQ_RECVD 0x04
# define A2MP_STATUS_PHYS_LINK_EXISTS 0x05
# define A2MP_STATUS_SECURITY_VIOLATION 0x06
2012-10-18 14:16:19 +04:00
struct amp_mgr * amp_mgr_get ( struct amp_mgr * mgr ) ;
2015-07-24 12:12:55 +03:00
# if IS_ENABLED(CONFIG_BT_HS)
2012-05-29 14:59:02 +04:00
int amp_mgr_put ( struct amp_mgr * mgr ) ;
2012-05-29 14:59:17 +04:00
struct l2cap_chan * a2mp_channel_create ( struct l2cap_conn * conn ,
struct sk_buff * skb ) ;
2012-09-27 18:26:16 +04:00
void a2mp_discover_amp ( struct l2cap_chan * chan ) ;
2015-07-24 12:12:55 +03:00
# else
static inline int amp_mgr_put ( struct amp_mgr * mgr )
{
return 0 ;
}
static inline struct l2cap_chan * a2mp_channel_create ( struct l2cap_conn * conn ,
struct sk_buff * skb )
{
return NULL ;
}
static inline void a2mp_discover_amp ( struct l2cap_chan * chan )
{
}
# endif
2012-09-27 18:26:08 +04:00
void a2mp_send_getinfo_rsp ( struct hci_dev * hdev ) ;
2012-09-27 18:26:09 +04:00
void a2mp_send_getampassoc_rsp ( struct hci_dev * hdev , u8 status ) ;
2012-09-27 18:26:22 +04:00
void a2mp_send_create_phy_link_req ( struct hci_dev * hdev , u8 status ) ;
2012-12-07 16:59:05 +04:00
void a2mp_send_create_phy_link_rsp ( struct hci_dev * hdev , u8 status ) ;
2012-05-29 14:59:02 +04:00
# endif /* __A2MP_H */