Re: [PATCH] Bluetooth: Fix HCI_RESET command syncronization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Szymon,

* Szymon Janc <szymon.janc@xxxxxxxxx> [2011-03-17 11:35:20 +0100]:

> > We can't send new commands before a cmd_complete for the HCI_RESET commnnd
> 
> Typo: comm*a*nd
> 
> > shows up.
> > 
> > Reported-by: Mikko Vinni <mmvinni@xxxxxxxxx>
> > Reported-by: Justin P. Mattock <justinmattock@xxxxxxxxx>
> > Reported-by: Ed Tomlinson <edt@xxxxxx>
> > Signed-off-by: Gustavo F. Padovan <padovan@xxxxxxxxxxxxxx>
> > ---
> >  include/net/bluetooth/hci.h |    2 ++
> >  net/bluetooth/hci_core.c    |    3 +++
> >  net/bluetooth/hci_event.c   |    4 +++-
> >  3 files changed, 8 insertions(+), 1 deletions(-)
> > 
> > diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> > index ec6acf2..2c0d309 100644
> > --- a/include/net/bluetooth/hci.h
> > +++ b/include/net/bluetooth/hci.h
> > @@ -84,6 +84,8 @@ enum {
> >  	HCI_SERVICE_CACHE,
> >  	HCI_LINK_KEYS,
> >  	HCI_DEBUG_KEYS,
> > +
> > +	HCI_RESET,
> >  };
> >  
> >  /* HCI ioctl defines */
> > diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> > index b372fb8..32b82e2 100644
> > --- a/net/bluetooth/hci_core.c
> > +++ b/net/bluetooth/hci_core.c
> > @@ -534,6 +534,8 @@ int hci_dev_open(__u16 dev)
> >  		set_bit(HCI_INIT, &hdev->flags);
> >  		hdev->init_last_cmd = 0;
> >  
> > +		set_bit(HCI_RESET, &hdev->flags);
> 
> Does this work with HCI_QUIRK_NO_RESET enabled?
> Shouldn't this bit be set only right before sending HCI_OP_RESET
> (in hci_init_req and hci_reset_req) for doing what commit msg says?
> 
> Now it looks more like a workaround for initialization issue..

Ah yes, I fixed this as well now.

> 
> > +
> >  		ret = __hci_request(hdev, hci_init_req, 0,
> >  					msecs_to_jiffies(HCI_INIT_TIMEOUT));
> >  
> > @@ -1074,6 +1076,7 @@ static void hci_cmd_timer(unsigned long arg)
> >  
> >  	BT_ERR("%s command tx timeout", hdev->name);
> >  	atomic_set(&hdev->cmd_cnt, 1);
> > +	clear_bit(HCI_RESET, &hdev->flags);
> >  	tasklet_schedule(&hdev->cmd_task);
> >  }
> >  
> > diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> > index 3fbfa50..cebe7588 100644
> > --- a/net/bluetooth/hci_event.c
> > +++ b/net/bluetooth/hci_event.c
> > @@ -183,6 +183,8 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
> >  
> >  	BT_DBG("%s status 0x%x", hdev->name, status);
> >  
> > +	clear_bit(HCI_RESET, &hdev->flags);
> > +
> >  	hci_req_complete(hdev, HCI_OP_RESET, status);
> >  }
> >  
> > @@ -1847,7 +1849,7 @@ static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
> >  	if (ev->opcode != HCI_OP_NOP)
> >  		del_timer(&hdev->cmd_timer);
> >  
> > -	if (ev->ncmd) {
> > +	if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
> >  		atomic_set(&hdev->cmd_cnt, 1);
> >  		if (!skb_queue_empty(&hdev->cmd_q))
> >  			tasklet_schedule(&hdev->cmd_task);
> 
> Maybe use unlikely() here?

We don't use this in Bluetooth.

-- 
Gustavo F. Padovan
http://profusion.mobi
--
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


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux