Hi Andrei, On Tue, Mar 6, 2012 at 10:16 AM, Andrei Emeltchenko <Andrei.Emeltchenko.news@xxxxxxxxx> wrote: > From: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx> > > > Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@xxxxxxxxx> > --- > include/net/bluetooth/hci_core.h | 2 + > net/bluetooth/hci_core.c | 42 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h > index 2ef515e..47f1631 100644 > --- a/include/net/bluetooth/hci_core.h > +++ b/include/net/bluetooth/hci_core.h > @@ -1103,5 +1103,7 @@ int hci_cmd_cb(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param, > void (*cb)(struct hci_dev *hdev, struct cb_cmd *cmd), void *opt, > void (*destructor)(struct cb_cmd *cmd)); > void hci_remove_cb(struct cb_cmd *cmd); > +void hci_queue_cb(struct hci_dev *hdev, struct cb_cmd *cmd, > + struct workqueue_struct *workqueue); > > #endif /* __HCI_CORE_H */ > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c > index cdc0220..2bd97b4 100644 > --- a/net/bluetooth/hci_core.c > +++ b/net/bluetooth/hci_core.c > @@ -2273,6 +2273,48 @@ struct cb_cmd *hci_find_cb(struct hci_dev *hdev, __u16 opcode) > return NULL; > } > > +struct cb_work { Again, maybe hci_cb_work? > + struct work_struct work; > + struct hci_dev *hdev; > + struct cb_cmd *cmd; > +}; > + > +static void hci_cb_work(struct work_struct *w) And here hci_cb_worker? > +{ > + struct cb_work *work = (struct cb_work *) w; > + struct cb_cmd *cmd = work->cmd; > + struct hci_dev *hdev = work->hdev; > + > + cmd->cb(hdev, cmd); > + > + hci_dev_put(hdev); > + > + hci_remove_cb(cmd); > + kfree(w); > +} > + > +void hci_queue_cb(struct hci_dev *hdev, struct cb_cmd *cmd, > + struct workqueue_struct *workqueue) > +{ > + struct cb_work *work; > + > + BT_ERR("Queue cmd %p opt %p", cmd, cmd->opt); > + > + work = kmalloc(sizeof(*work), GFP_ATOMIC); Why not GFP_KERNEL? > + if (!work) > + return; > + > + INIT_WORK(&work->work, hci_cb_work); > + work->hdev = hdev; > + work->cmd = cmd; > + hci_dev_hold(hdev); > + > + if (!queue_work(workqueue, &work->work)) { > + kfree(work); > + hci_dev_put(hdev); > + } > +} > + > void hci_remove_cb(struct cb_cmd *cmd) > { > list_del(&cmd->list); And again, no callers of hci_queue_cb so I'm assuming you'll only use in for AMP, is that it? Regards, -- Ulisses Furquim ProFUSION embedded systems http://profusion.mobi Mobile: +55 19 9250 0942 Skype: ulissesffs -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html