1/*
2   Copyright (c) 2010,2011 Code Aurora Forum.  All rights reserved.
3   Copyright (c) 2011,2012 Intel Corp.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License version 2 and
7   only version 2 as published by the Free Software Foundation.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13*/
14
15#ifndef __A2MP_H
16#define __A2MP_H
17
18#include <net/bluetooth/l2cap.h>
19
20enum amp_mgr_state {
21	READ_LOC_AMP_INFO,
22	READ_LOC_AMP_ASSOC,
23	READ_LOC_AMP_ASSOC_FINAL,
24	WRITE_REMOTE_AMP_ASSOC,
25};
26
27struct amp_mgr {
28	struct list_head	list;
29	struct l2cap_conn	*l2cap_conn;
30	struct l2cap_chan	*a2mp_chan;
31	struct l2cap_chan	*bredr_chan;
32	struct kref		kref;
33	__u8			ident;
34	__u8			handle;
35	unsigned long		state;
36	unsigned long		flags;
37
38	struct list_head	amp_ctrls;
39	struct mutex		amp_ctrls_lock;
40};
41
42struct a2mp_cmd {
43	__u8	code;
44	__u8	ident;
45	__le16	len;
46	__u8	data[0];
47} __packed;
48
49/* A2MP command codes */
50#define A2MP_COMMAND_REJ         0x01
51struct a2mp_cmd_rej {
52	__le16	reason;
53	__u8	data[0];
54} __packed;
55
56#define A2MP_DISCOVER_REQ        0x02
57struct a2mp_discov_req {
58	__le16	mtu;
59	__le16	ext_feat;
60} __packed;
61
62struct a2mp_cl {
63	__u8	id;
64	__u8	type;
65	__u8	status;
66} __packed;
67
68#define A2MP_DISCOVER_RSP        0x03
69struct a2mp_discov_rsp {
70	__le16     mtu;
71	__le16     ext_feat;
72	struct a2mp_cl cl[0];
73} __packed;
74
75#define A2MP_CHANGE_NOTIFY       0x04
76#define A2MP_CHANGE_RSP          0x05
77
78#define A2MP_GETINFO_REQ         0x06
79struct a2mp_info_req {
80	__u8       id;
81} __packed;
82
83#define A2MP_GETINFO_RSP         0x07
84struct a2mp_info_rsp {
85	__u8	id;
86	__u8	status;
87	__le32	total_bw;
88	__le32	max_bw;
89	__le32	min_latency;
90	__le16	pal_cap;
91	__le16	assoc_size;
92} __packed;
93
94#define A2MP_GETAMPASSOC_REQ     0x08
95struct a2mp_amp_assoc_req {
96	__u8	id;
97} __packed;
98
99#define A2MP_GETAMPASSOC_RSP     0x09
100struct a2mp_amp_assoc_rsp {
101	__u8	id;
102	__u8	status;
103	__u8	amp_assoc[0];
104} __packed;
105
106#define A2MP_CREATEPHYSLINK_REQ  0x0A
107#define A2MP_DISCONNPHYSLINK_REQ 0x0C
108struct a2mp_physlink_req {
109	__u8	local_id;
110	__u8	remote_id;
111	__u8	amp_assoc[0];
112} __packed;
113
114#define A2MP_CREATEPHYSLINK_RSP  0x0B
115#define A2MP_DISCONNPHYSLINK_RSP 0x0D
116struct a2mp_physlink_rsp {
117	__u8	local_id;
118	__u8	remote_id;
119	__u8	status;
120} __packed;
121
122/* A2MP response status */
123#define A2MP_STATUS_SUCCESS			0x00
124#define A2MP_STATUS_INVALID_CTRL_ID		0x01
125#define A2MP_STATUS_UNABLE_START_LINK_CREATION	0x02
126#define A2MP_STATUS_NO_PHYSICAL_LINK_EXISTS	0x02
127#define A2MP_STATUS_COLLISION_OCCURED		0x03
128#define A2MP_STATUS_DISCONN_REQ_RECVD		0x04
129#define A2MP_STATUS_PHYS_LINK_EXISTS		0x05
130#define A2MP_STATUS_SECURITY_VIOLATION		0x06
131
132struct amp_mgr *amp_mgr_get(struct amp_mgr *mgr);
133int amp_mgr_put(struct amp_mgr *mgr);
134struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn,
135				       struct sk_buff *skb);
136void a2mp_discover_amp(struct l2cap_chan *chan);
137void a2mp_send_getinfo_rsp(struct hci_dev *hdev);
138void a2mp_send_getampassoc_rsp(struct hci_dev *hdev, u8 status);
139void a2mp_send_create_phy_link_req(struct hci_dev *hdev, u8 status);
140void a2mp_send_create_phy_link_rsp(struct hci_dev *hdev, u8 status);
141
142#endif /* __A2MP_H */
143