Merge changes I4b01ddca,I15b9ab7d into msm-3.0

* changes:
  Bluetooth: Use hci dev number as AMP controller ID
  Bluetooth: Release module reference counts
This commit is contained in:
Linux Build Service Account
2011-11-29 16:58:29 -08:00
committed by QuIC Gerrit Code Review
3 changed files with 24 additions and 20 deletions

View File

@@ -45,9 +45,6 @@ struct a2mp_cmd_rej {
__le16 reason;
} __packed;
#define HCI_A2MP_ID(id) ((id)+0x10) /* convert HCI dev index to AMP ID */
#define A2MP_HCI_ID(id) ((id)-0x10) /* convert AMP ID to HCI dev index */
struct a2mp_discover_req {
__le16 mtu;
__le16 ext_feat;

View File

@@ -255,7 +255,7 @@ static struct amp_ctx *get_ctx_hdev(struct hci_dev *hdev, u8 evt_type,
read_lock(&mgr->ctx_list_lock);
list_for_each_entry(ctx, &mgr->ctx_list, list) {
struct hci_dev *ctx_hdev;
ctx_hdev = hci_dev_get(A2MP_HCI_ID(ctx->id));
ctx_hdev = hci_dev_get(ctx->id);
if ((ctx_hdev == hdev) && (ctx->evt_type & evt_type)) {
switch (evt_type) {
case AMP_HCI_CMD_STATUS:
@@ -356,7 +356,7 @@ static int send_a2mp_cl(struct amp_mgr *mgr, u8 ident, u8 code, u16 len,
if (hdev) {
if ((hdev->amp_type != HCI_BREDR) &&
test_bit(HCI_UP, &hdev->flags)) {
(cl + num_ctrls)->id = HCI_A2MP_ID(hdev->id);
(cl + num_ctrls)->id = hdev->id;
(cl + num_ctrls)->type = hdev->amp_type;
(cl + num_ctrls)->status = hdev->amp_status;
++num_ctrls;
@@ -459,7 +459,7 @@ static inline int getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb)
rsp.status = 1;
BT_DBG("id %d", id);
hdev = hci_dev_get(A2MP_HCI_ID(id));
hdev = hci_dev_get(id);
if (hdev && hdev->amp_type != HCI_BREDR) {
rsp.status = 0;
@@ -510,14 +510,14 @@ static void accept_physical(struct l2cap_conn *lcon, u8 id, struct sock *sk)
int result = -EINVAL;
BT_DBG("lcon %p", lcon);
hdev = hci_dev_get(id);
if (!hdev)
goto ap_finished;
BT_DBG("hdev %p", hdev);
mgr = get_create_amp_mgr(lcon, NULL);
if (!mgr)
goto ap_finished;
BT_DBG("mgr %p", mgr);
hdev = hci_dev_get(A2MP_HCI_ID(id));
if (!hdev)
goto ap_finished;
BT_DBG("hdev %p", hdev);
conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
&mgr->l2cap_conn->hcon->dst);
if (conn) {
@@ -534,6 +534,8 @@ static void accept_physical(struct l2cap_conn *lcon, u8 id, struct sock *sk)
return;
ap_finished:
if (hdev)
hci_dev_put(hdev);
l2cap_amp_physical_complete(result, id, remote_id, sk);
}
@@ -553,7 +555,7 @@ static int getampassoc_req(struct amp_mgr *mgr, struct sk_buff *skb)
return -ENOMEM;
ctx->id = req->id;
ctx->d.gaa.req_ident = hdr->ident;
ctx->hdev = hci_dev_get(A2MP_HCI_ID(ctx->id));
ctx->hdev = hci_dev_get(ctx->id);
if (ctx->hdev)
ctx->d.gaa.assoc = kmalloc(ctx->hdev->amp_assoc_size,
GFP_ATOMIC);
@@ -826,7 +828,7 @@ static int createphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb)
ctx->d.apl.len_so_far = 0;
ctx->d.apl.rem_len = skb->len;
skb_pull(skb, skb->len);
ctx->hdev = hci_dev_get(A2MP_HCI_ID(ctx->id));
ctx->hdev = hci_dev_get(ctx->id);
start_ctx(mgr, ctx);
return 0;
}
@@ -1122,7 +1124,7 @@ static u8 createphyslink_handler(struct amp_ctx *ctx, u8 evt_type, void *data)
if (hdev) {
struct hci_conn *conn;
ctx->hdev = hdev;
ctx->id = HCI_A2MP_ID(hdev->id);
ctx->id = hdev->id;
ctx->d.cpl.remote_id = cl->id;
conn = hci_conn_hash_lookup_ba(hdev,
ACL_LINK,
@@ -1425,7 +1427,7 @@ static int disconnphyslink_req(struct amp_mgr *mgr, struct sk_buff *skb)
rsp.status = 0;
BT_DBG("local_id %d remote_id %d",
(int) rsp.local_id, (int) rsp.remote_id);
hdev = hci_dev_get(A2MP_HCI_ID(rsp.local_id));
hdev = hci_dev_get(rsp.local_id);
if (!hdev) {
rsp.status = 1; /* Invalid Controller ID */
goto dpl_finished;

View File

@@ -3158,21 +3158,23 @@ static struct hci_chan *l2cap_chan_admit(u8 amp_id, struct l2cap_pinfo *pi)
struct hci_conn *hcon;
struct hci_chan *chan;
hdev = hci_dev_get(A2MP_HCI_ID(amp_id));
hdev = hci_dev_get(amp_id);
if (!hdev)
return NULL;
BT_DBG("hdev %s", hdev->name);
hcon = hci_conn_hash_lookup_ba(hdev, ACL_LINK, pi->conn->dst);
if (!hcon)
return NULL;
if (!hcon) {
chan = NULL;
goto done;
}
chan = hci_chan_list_lookup_id(hdev, hcon->handle);
if (chan) {
l2cap_aggregate(chan, pi);
hci_chan_hold(chan);
return chan;
goto done;
}
if (bt_sk(pi)->parent) {
@@ -3186,6 +3188,8 @@ static struct hci_chan *l2cap_chan_admit(u8 amp_id, struct l2cap_pinfo *pi)
(struct hci_ext_fs *) &pi->local_fs,
(struct hci_ext_fs *) &pi->remote_fs);
}
done:
hci_dev_put(hdev);
return chan;
}
@@ -4727,7 +4731,7 @@ static inline int l2cap_create_channel_req(struct l2cap_conn *conn,
struct hci_dev *hdev;
/* Validate AMP controller id */
hdev = hci_dev_get(A2MP_HCI_ID(req->amp_id));
hdev = hci_dev_get(req->amp_id);
if (!hdev || !test_bit(HCI_UP, &hdev->flags)) {
struct l2cap_create_chan_rsp rsp;
@@ -4805,7 +4809,7 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
if (req->dest_amp_id) {
struct hci_dev *hdev;
hdev = hci_dev_get(A2MP_HCI_ID(req->dest_amp_id));
hdev = hci_dev_get(req->dest_amp_id);
if (!hdev || !test_bit(HCI_UP, &hdev->flags)) {
if (hdev)
hci_dev_put(hdev);
@@ -4813,6 +4817,7 @@ static inline int l2cap_move_channel_req(struct l2cap_conn *conn,
result = L2CAP_MOVE_CHAN_REFUSED_CONTROLLER;
goto send_move_response;
}
hci_dev_put(hdev);
}
if (((pi->amp_move_state != L2CAP_AMP_STATE_STABLE &&