Re: [PATCH v4 07/13] Bluetooth: Read no of adv sets during init

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

 



Hi Jaganath,

> This patch reads the number of advertising sets in the controller
> during init and save it in hdev.
> 
> This also checks ext adv support before send Read Adv TX Power
> since legacy and extended Adv commands should not be mixed.
> 
> Signed-off-by: Jaganath Kanakkassery <jaganathx.kanakkassery@xxxxxxxxx>
> ---
> include/net/bluetooth/hci.h      |  7 +++++++
> include/net/bluetooth/hci_core.h |  4 ++++
> net/bluetooth/hci_core.c         | 12 ++++++++++--
> net/bluetooth/hci_event.c        | 18 ++++++++++++++++++
> 4 files changed, 39 insertions(+), 2 deletions(-)
> 
> diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
> index fcd1d57..e584863 100644
> --- a/include/net/bluetooth/hci.h
> +++ b/include/net/bluetooth/hci.h
> @@ -411,6 +411,7 @@ enum {
> #define HCI_LE_SLAVE_FEATURES		0x08
> #define HCI_LE_PING			0x10
> #define HCI_LE_DATA_LEN_EXT		0x20
> +#define HCI_LE_EXT_ADV			0x10
> #define HCI_LE_EXT_SCAN_POLICY		0x80
> #define HCI_LE_PHY_2M			0x01
> #define HCI_LE_PHY_CODED		0x08
> @@ -1580,6 +1581,12 @@ struct hci_cp_le_ext_conn_param {
> 	__le16 max_ce_len;
> } __packed;
> 
> +#define HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS	0x203b
> +struct hci_rp_le_read_num_supported_adv_sets {
> +	__u8  status;
> +	__u8  num_of_sets;
> +} __packed;
> +
> /* ---- HCI Events ---- */
> #define HCI_EV_INQUIRY_COMPLETE		0x01
> 
> diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
> index 33aab89e..e845ca6 100644
> --- a/include/net/bluetooth/hci_core.h
> +++ b/include/net/bluetooth/hci_core.h
> @@ -222,6 +222,7 @@ struct hci_dev {
> 	__u8		le_features[8];
> 	__u8		le_white_list_size;
> 	__u8		le_resolv_list_size;
> +	__u8		le_no_of_adv_sets;

I think our style was to use _num instead of _no. See num_iac for example.

> 	__u8		le_states[8];
> 	__u8		commands[64];
> 	__u8		hci_ver;
> @@ -1180,6 +1181,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
> /* Use ext create connection if command is supported */
> #define use_ext_conn(dev) ((dev)->commands[37] & 0x80)
> 
> +/* Extended advertising support */
> +#define ext_adv_capable(dev) (((dev)->le_features[1] & HCI_LE_EXT_ADV))
> +
> /* ----- HCI protocols ----- */
> #define HCI_PROTO_DEFER             0x01
> 
> diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
> index 0d88dc9..b423587 100644
> --- a/net/bluetooth/hci_core.c
> +++ b/net/bluetooth/hci_core.c
> @@ -715,8 +715,10 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
> 		hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
> 			    events);
> 
> -		if (hdev->commands[25] & 0x40) {
> -			/* Read LE Advertising Channel TX Power */
> +		if ((hdev->commands[25] & 0x40) && !ext_adv_capable(hdev)) {
> +			/* Read LE Advertising Channel TX Power only if
> +			 * extended advertising is not supported
> +			 */
> 			hci_req_add(req, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL);
> 		}

Why? I prefer that we read the adv TX power always. Even if we are not using it, it is good to have it in the traces.

> @@ -750,6 +752,12 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
> 			hci_req_add(req, HCI_OP_LE_READ_DEF_DATA_LEN, 0, NULL);
> 		}
> 
> +		if (ext_adv_capable(hdev)) {
> +			/* Read LE Number of Supported Advertising Sets */
> +			hci_req_add(req, HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS,
> +				    0, NULL);
> +		}
> +
> 		hci_set_le_support(req);
> 	}
> 
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 027abe6..90e7235 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -1267,6 +1267,20 @@ static void hci_cc_le_set_ext_scan_enable(struct hci_dev *hdev,
> 	le_set_scan_enable_complete(hdev, cp->enable);
> }
> 
> +static void hci_cc_le_read_num_adv_sets(struct hci_dev *hdev,
> +				      struct sk_buff *skb)
> +{
> +	struct hci_rp_le_read_num_supported_adv_sets *rp = (void *) skb->data;
> +
> +	BT_DBG("%s status 0x%2.2x No of Adv sets %u", hdev->name, rp->status,
> +	       rp->num_of_sets);
> +
> +	if (rp->status)
> +		return;
> +
> +	hdev->le_no_of_adv_sets = rp->num_of_sets;
> +}
> +
> static void hci_cc_le_read_white_list_size(struct hci_dev *hdev,
> 					   struct sk_buff *skb)
> {
> @@ -3189,6 +3203,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb,
> 		hci_cc_le_set_default_phy(hdev, skb);
> 		break;
> 
> +	case HCI_OP_LE_READ_NUM_SUPPORTED_ADV_SETS:
> +		hci_cc_le_read_num_adv_sets(hdev, skb);
> +		break;
> +
> 	default:
> 		BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
> 		break;

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