Re: [PATCH 05/12 v3] Bluetooth: Switch from hdev->cmd_q to using transactions

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

 



Hi Johan,

> This patch converts the code from using a single hdev->cmd_q HCI command
> queue to use the HCI transaction infrastructure.
> 
> Signed-off-by: Johan Hedberg <johan.hedberg@xxxxxxxxx>
> ---
>  net/bluetooth/hci_core.c  |   87 ++++++++++++++++++++++++++++++++++++++-------
>  net/bluetooth/hci_event.c |   12 +++++--
>  net/bluetooth/hci_sock.c  |    5 +--
>  3 files changed, 88 insertions(+), 16 deletions(-)
> 
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index 6569248..4f55225 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -80,10 +80,18 @@ void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result)
>  			return;
>  
>  		skb = skb_clone(hdev->sent_cmd, GFP_ATOMIC);
> +		hci_transaction_lock(hdev);
>  		if (skb) {
> -			skb_queue_head(&hdev->cmd_q, skb);
> -			queue_work(hdev->workqueue, &hdev->cmd_work);
> +			struct hci_transaction *transaction =
> +						hdev->current_transaction;
> +			if (transaction) {
> +				skb_queue_head(&transaction->cmd_q, skb);
> +				queue_work(hdev->workqueue, &hdev->cmd_work);
> +			} else {
> +				kfree_skb(skb);
> +			}
>  		}
> +		hci_transaction_unlock(hdev);
>  
>  		return;
>  	}
> @@ -203,22 +211,30 @@ static void amp_init(struct hci_dev *hdev)
>  
>  static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
>  {
> +	struct hci_transaction *transaction;
>  	struct sk_buff *skb;
>  
>  	BT_DBG("%s %ld", hdev->name, opt);
>  
>  	/* Driver initialization */
>  
> +	if (hci_start_transaction(hdev) < 0)
> +		return;
> +
> +	hci_transaction_lock(hdev);
> +
> +	transaction = hdev->build_transaction;
> +
>  	/* Special commands */
>  	while ((skb = skb_dequeue(&hdev->driver_init))) {
>  		bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
>  		skb->dev = (void *) hdev;
> -
> -		skb_queue_tail(&hdev->cmd_q, skb);
> -		queue_work(hdev->workqueue, &hdev->cmd_work);
> +		skb_queue_tail(&transaction->cmd_q, skb);
>  	}
>  	skb_queue_purge(&hdev->driver_init);

if we have to touch this one, then please look at my hdev->setup()
patches I send a while back. We should get these merged so that drivers
can use a transaction within the driver and remove the driver_init queue
actually.

Regards

Marcel


--
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