Commit f97268fc authored by Andrei Emeltchenko's avatar Andrei Emeltchenko Committed by Gustavo Padovan

Bluetooth: A2MP: Create amp_mgr global list

Create amp_mgr_list global list which will be used by different
hci devices to find amp_mgr.
Signed-off-by: default avatarAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
parent b078b564
...@@ -19,12 +19,18 @@ ...@@ -19,12 +19,18 @@
#define A2MP_FEAT_EXT 0x8000 #define A2MP_FEAT_EXT 0x8000
enum amp_mgr_state {
READ_LOC_AMP_INFO,
};
struct amp_mgr { struct amp_mgr {
struct list_head list;
struct l2cap_conn *l2cap_conn; struct l2cap_conn *l2cap_conn;
struct l2cap_chan *a2mp_chan; struct l2cap_chan *a2mp_chan;
struct kref kref; struct kref kref;
__u8 ident; __u8 ident;
__u8 handle; __u8 handle;
enum amp_mgr_state state;
unsigned long flags; unsigned long flags;
}; };
...@@ -118,9 +124,13 @@ struct a2mp_physlink_rsp { ...@@ -118,9 +124,13 @@ struct a2mp_physlink_rsp {
#define A2MP_STATUS_PHYS_LINK_EXISTS 0x05 #define A2MP_STATUS_PHYS_LINK_EXISTS 0x05
#define A2MP_STATUS_SECURITY_VIOLATION 0x06 #define A2MP_STATUS_SECURITY_VIOLATION 0x06
extern struct list_head amp_mgr_list;
extern struct mutex amp_mgr_list_lock;
void amp_mgr_get(struct amp_mgr *mgr); void amp_mgr_get(struct amp_mgr *mgr);
int amp_mgr_put(struct amp_mgr *mgr); int amp_mgr_put(struct amp_mgr *mgr);
struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn, struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn,
struct sk_buff *skb); struct sk_buff *skb);
struct amp_mgr *amp_mgr_lookup_by_state(u8 state);
#endif /* __A2MP_H */ #endif /* __A2MP_H */
...@@ -17,6 +17,10 @@ ...@@ -17,6 +17,10 @@
#include <net/bluetooth/l2cap.h> #include <net/bluetooth/l2cap.h>
#include <net/bluetooth/a2mp.h> #include <net/bluetooth/a2mp.h>
/* Global AMP Manager list */
LIST_HEAD(amp_mgr_list);
DEFINE_MUTEX(amp_mgr_list_lock);
/* A2MP build & send command helper functions */ /* A2MP build & send command helper functions */
static struct a2mp_cmd *__a2mp_build(u8 code, u8 ident, u16 len, void *data) static struct a2mp_cmd *__a2mp_build(u8 code, u8 ident, u16 len, void *data)
{ {
...@@ -516,6 +520,10 @@ static void amp_mgr_destroy(struct kref *kref) ...@@ -516,6 +520,10 @@ static void amp_mgr_destroy(struct kref *kref)
BT_DBG("mgr %p", mgr); BT_DBG("mgr %p", mgr);
mutex_lock(&amp_mgr_list_lock);
list_del(&mgr->list);
mutex_unlock(&amp_mgr_list_lock);
kfree(mgr); kfree(mgr);
} }
...@@ -552,6 +560,10 @@ static struct amp_mgr *amp_mgr_create(struct l2cap_conn *conn) ...@@ -552,6 +560,10 @@ static struct amp_mgr *amp_mgr_create(struct l2cap_conn *conn)
kref_init(&mgr->kref); kref_init(&mgr->kref);
mutex_lock(&amp_mgr_list_lock);
list_add(&mgr->list, &amp_mgr_list);
mutex_unlock(&amp_mgr_list_lock);
return mgr; return mgr;
} }
...@@ -570,3 +582,20 @@ struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn, ...@@ -570,3 +582,20 @@ struct l2cap_chan *a2mp_channel_create(struct l2cap_conn *conn,
return mgr->a2mp_chan; return mgr->a2mp_chan;
} }
struct amp_mgr *amp_mgr_lookup_by_state(u8 state)
{
struct amp_mgr *mgr;
mutex_lock(&amp_mgr_list_lock);
list_for_each_entry(mgr, &amp_mgr_list, list) {
if (mgr->state == state) {
amp_mgr_get(mgr);
mutex_unlock(&amp_mgr_list_lock);
return mgr;
}
}
mutex_unlock(&amp_mgr_list_lock);
return NULL;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment