All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/4] monitor: Add support PHY management commands and event
@ 2018-03-13  5:54 Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Jaganath Kanakkassery @ 2018-03-13  5:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Jaganath Kanakkassery

---
 monitor/packet.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/monitor/packet.c b/monitor/packet.c
index b800a2d..e3b5ab7 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -97,6 +97,7 @@
 #define COLOR_UNKNOWN_ADDRESS_TYPE	COLOR_WHITE_BG
 #define COLOR_UNKNOWN_DEVICE_FLAG	COLOR_WHITE_BG
 #define COLOR_UNKNOWN_ADV_FLAG		COLOR_WHITE_BG
+#define COLOR_UNKNOWN_PHY		COLOR_WHITE_BG
 
 #define COLOR_PHY_PACKET		COLOR_BLUE
 
@@ -10611,6 +10612,7 @@ static const struct {
 	{ 13, "Privacy"			},
 	{ 14, "Controller Configuration"},
 	{ 15, "Static Address"		},
+	{ 16, "PHY Configuration"	},
 	{ }
 };
 
@@ -11905,6 +11907,54 @@ static void mgmt_set_apperance_cmd(const void *data, uint16_t size)
 	print_appearance(appearance);
 }
 
+static const struct {
+	uint8_t bit;
+	const char *str;
+} mgmt_phy_table[] = {
+	{  0, "1MTX"	},
+	{  1, "1MRX"	},
+	{  2, "2MTX"	},
+	{  3, "2MRX"	},
+	{  4, "CODEDTX"	},
+	{  5, "CODEDRX"	},
+	{ }
+};
+
+static void mgmt_print_phys(const char *label, uint16_t phys)
+{
+	uint16_t mask = phys;
+	int i;
+
+	print_field("%s: 0x%4.4x", label, phys);
+
+	for (i = 0; mgmt_phy_table[i].str; i++) {
+		if (phys & (1 << mgmt_phy_table[i].bit)) {
+			print_field("  %s", mgmt_phy_table[i].str);
+			mask &= ~(1 << mgmt_phy_table[i].bit);
+		}
+	}
+
+	if (mask)
+		print_text(COLOR_UNKNOWN_PHY, "  Unknown PHYs"
+							" (0x%8.8x)", mask);
+}
+
+static void mgmt_get_phy_rsp(const void *data, uint16_t size)
+{
+	uint16_t supported_phys = get_le16(data);
+	uint16_t selected_phys = get_le16(data + 2);
+
+	mgmt_print_phys("Supported PHYs", supported_phys);
+	mgmt_print_phys("Selected PHYs", selected_phys);
+}
+
+static void mgmt_set_phy_cmd(const void *data, uint16_t size)
+{
+	uint16_t default_phys = get_le16(data);
+
+	mgmt_print_phys("Default PHYs", default_phys);
+}
+
 struct mgmt_data {
 	uint16_t opcode;
 	const char *str;
@@ -12118,6 +12168,12 @@ static const struct mgmt_data mgmt_command_table[] = {
 	{ 0x0043, "Set Appearance",
 				mgmt_set_apperance_cmd, 2, true,
 				mgmt_null_rsp, 0, true },
+	{ 0x0044, "Get PHY Configuration",
+				mgmt_null_cmd, 0, true,
+				mgmt_get_phy_rsp, 4, true },
+	{ 0x0045, "Set PHY Configuration",
+				mgmt_set_phy_cmd, 2, true,
+				mgmt_null_rsp, 0, true },
 	{ }
 };
 
@@ -12496,6 +12552,13 @@ static void mgmt_ext_controller_info_changed_evt(const void *data, uint16_t size
 	print_eir(data + 2, size - 2, false);
 }
 
+static void mgmt_phy_changed_evt(const void *data, uint16_t size)
+{
+	uint16_t selected_phys = get_le16(data);
+
+	mgmt_print_phys("Selected PHYs", selected_phys);
+}
+
 static const struct mgmt_data mgmt_event_table[] = {
 	{ 0x0001, "Command Complete",
 			mgmt_command_complete_evt, 3, false },
@@ -12571,6 +12634,8 @@ static const struct mgmt_data mgmt_event_table[] = {
 			mgmt_advertising_removed_evt, 1, true },
 	{ 0x0025, "Extended Controller Information Changed",
 			mgmt_ext_controller_info_changed_evt, 2, false },
+	{ 0x0026, "PHY Configuration Changed",
+			mgmt_phy_changed_evt, 2, true },
 	{ }
 };
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands
  2018-03-13  5:54 [PATCH v2 1/4] monitor: Add support PHY management commands and event Jaganath Kanakkassery
@ 2018-03-13  5:54 ` Jaganath Kanakkassery
  2018-03-14  7:42   ` Luiz Augusto von Dentz
  2018-03-14 10:00   ` ERAMOTO Masaya
  2018-03-13  5:54 ` [PATCH v2 3/4] monitor: Add support for Secondary PHY flags in Add Advertising Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv Jaganath Kanakkassery
  2 siblings, 2 replies; 8+ messages in thread
From: Jaganath Kanakkassery @ 2018-03-13  5:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Jaganath Kanakkassery

---
 lib/mgmt.h     |  33 +++++++++++++++
 tools/btmgmt.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 165 insertions(+)
 mode change 100644 => 100755 tools/btmgmt.c

diff --git a/lib/mgmt.h b/lib/mgmt.h
index 798a05e..7a25e17 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -101,6 +101,7 @@ struct mgmt_rp_read_index_list {
 #define MGMT_SETTING_PRIVACY		0x00002000
 #define MGMT_SETTING_CONFIGURATION	0x00004000
 #define MGMT_SETTING_STATIC_ADDRESS	0x00008000
+#define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
 
 #define MGMT_OP_READ_INFO		0x0004
 struct mgmt_rp_read_info {
@@ -546,6 +547,30 @@ struct mgmt_cp_set_appearance {
 	uint16_t appearance;
 } __packed;
 
+#define MGMT_OP_GET_PHY_CONFIGURATION	0x0044
+struct mgmt_rp_get_phy_confguration {
+	uint16_t	supported_phys;
+	uint16_t	selected_phys;
+} __packed;
+
+#define MGMT_PHY_LE_1M_TX		0x0001
+#define MGMT_PHY_LE_1M_RX		0x0002
+#define MGMT_PHY_LE_2M_TX		0x0004
+#define MGMT_PHY_LE_2M_RX		0x0008
+#define MGMT_PHY_LE_CODED_TX		0x0010
+#define MGMT_PHY_LE_CODED_RX		0x0020
+
+#define MGMT_PHY_LE_TX_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_2M_TX | \
+			     MGMT_PHY_LE_CODED_TX)
+#define MGMT_PHY_LE_RX_MASK (MGMT_PHY_LE_1M_RX | MGMT_PHY_LE_2M_RX | \
+			     MGMT_PHY_LE_CODED_RX)
+
+#define MGMT_OP_SET_PHY_CONFIGURATION	0x0045
+struct mgmt_cp_set_phy_confguration {
+	uint16_t	default_phys;
+} __packed;
+
+
 #define MGMT_EV_CMD_COMPLETE		0x0001
 struct mgmt_ev_cmd_complete {
 	uint16_t opcode;
@@ -764,6 +789,11 @@ struct mgmt_ev_ext_info_changed {
 	uint8_t  eir[0];
 } __packed;
 
+#define MGMT_EV_PHY_CONFIGURATION_CHANGED	0x0026
+struct mgmt_ev_phy_configuration_changed {
+	uint16_t	selected_phys;
+} __packed;
+
 static const char *mgmt_op[] = {
 	"<0x0000>",
 	"Read Version",
@@ -833,6 +863,8 @@ static const char *mgmt_op[] = {
 	"Start Limited Discovery",
 	"Read Extended Controller Information",
 	"Set Appearance",
+	"Get PHY Configuration",
+	"Set PHY Configuration",
 };
 
 static const char *mgmt_ev[] = {
@@ -874,6 +906,7 @@ static const char *mgmt_ev[] = {
 	"Advertising Added",
 	"Advertising Removed",
 	"Extended Controller Information Changed",
+	"PHY Configuration Changed",
 };
 
 static const char *mgmt_status[] = {
diff --git a/tools/btmgmt.c b/tools/btmgmt.c
old mode 100644
new mode 100755
index 122c46d..6ada176
--- a/tools/btmgmt.c
+++ b/tools/btmgmt.c
@@ -4165,6 +4165,134 @@ static void cmd_appearance(int argc, char **argv)
 	}
 }
 
+static const char *phys_str[] = {
+	"1MTX",
+	"1MRX",
+	"2MTX",
+	"2MRX",
+	"CODEDTX",
+	"CODEDRX",
+};
+
+static const char *phys2str(uint16_t phys)
+{
+	static char str[256];
+	unsigned i;
+	int off;
+
+	off = 0;
+	str[0] = '\0';
+
+	for (i = 0; i < NELEM(phys_str); i++) {
+		if ((phys & (1 << i)) != 0)
+			off += snprintf(str + off, sizeof(str) - off, "%s ",
+							phys_str[i]);
+	}
+
+	return str;
+}
+
+static void get_phy_rsp(uint8_t status, uint16_t len, const void *param,
+							void *user_data)
+{
+	const struct mgmt_rp_get_phy_confguration *rp = param;
+	uint16_t supported_flags, selected_phys;
+
+	if (status != 0) {
+		error("Get PHY Configuration failed with status 0x%02x (%s)",
+						status, mgmt_errstr(status));
+		goto done;
+	}
+
+	if (len < sizeof(*rp)) {
+		error("Too small get-phy reply (%u bytes)", len);
+		goto done;
+	}
+
+	supported_flags = get_le16(&rp->supported_phys);
+	selected_phys = get_le16(&rp->selected_phys);
+
+	print("Supported phys: %s", phys2str(supported_flags));
+	print("Selected phys: %s", phys2str(selected_phys));
+
+done:
+	bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_get_phy(int argc, char **argv)
+{
+	uint16_t index;
+
+	index = mgmt_index;
+	if (index == MGMT_INDEX_NONE)
+		index = 0;
+
+	if (mgmt_send(mgmt, MGMT_OP_GET_PHY_CONFIGURATION, index, 0, NULL,
+					get_phy_rsp, NULL, NULL) == 0) {
+		error("Unable to send Get PHY cmd");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+}
+
+static void set_phy_rsp(uint8_t status, uint16_t len, const void *param,
+							void *user_data)
+{
+	if (status != 0)
+		error("Could not set PHY Configuration with status 0x%02x (%s)",
+						status, mgmt_errstr(status));
+	else
+		print("PHY Configuration successfully set");
+
+	bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_set_phy(int argc, char **argv)
+{
+	struct mgmt_cp_set_phy_confguration cp;
+	int i;
+	uint16_t phys = 0;
+	uint16_t index;
+
+	if (argc < 2) {
+		print("Specify one or more of \"1MTX\" \"1MRX\" \"2MTX\" \
+			\"2MRX\" \"CODEDTX\" \"CODEDRX\"");
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+
+	for (i = 1; i < argc; i++) {
+		if (strcasecmp(argv[i], "1MTX") == 0)
+			phys |= MGMT_PHY_LE_1M_TX;
+
+		if (strcasecmp(argv[i], "1MRX") == 0)
+			phys |= MGMT_PHY_LE_1M_RX;
+
+		if (strcasecmp(argv[i], "2MTX") == 0)
+			phys |= MGMT_PHY_LE_2M_TX;
+
+		if (strcasecmp(argv[i], "2MRX") == 0)
+			phys |= MGMT_PHY_LE_2M_RX;
+
+		if (strcasecmp(argv[i], "CODEDTX") == 0)
+			phys |= MGMT_PHY_LE_CODED_TX;
+
+		if (strcasecmp(argv[i], "CODEDRX") == 0)
+			phys |= MGMT_PHY_LE_CODED_RX;
+	}
+
+	cp.default_phys = cpu_to_le16(phys);
+
+	index = mgmt_index;
+	if (index == MGMT_INDEX_NONE)
+		index = 0;
+
+	if (mgmt_send(mgmt, MGMT_OP_SET_PHY_CONFIGURATION, index, sizeof(cp),
+					&cp, set_phy_rsp, NULL, NULL) == 0) {
+		error("Unable to send %s cmd",
+				mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
+		return bt_shell_noninteractive_quit(EXIT_FAILURE);
+	}
+}
+
 static void register_mgmt_callbacks(struct mgmt *mgmt, uint16_t index)
 {
 	mgmt_register(mgmt, MGMT_EV_CONTROLLER_ERROR, index, controller_error,
@@ -4360,6 +4488,10 @@ static const struct bt_shell_menu main_menu = {
 		cmd_clr_adv,		"Clear advertising instances"	},
 	{ "appearance",		"<appearance>",
 		cmd_appearance,		"Set appearance"		},
+	{ "get-phy",		NULL,
+		cmd_get_phy,		"Get PHY Configuration"         },
+        { "set-phy",		"<phys>",
+		cmd_set_phy,		"Set PHY Configuration"         },
 	{} },
 };
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 3/4] monitor: Add support for Secondary PHY flags in Add Advertising
  2018-03-13  5:54 [PATCH v2 1/4] monitor: Add support PHY management commands and event Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
@ 2018-03-13  5:54 ` Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv Jaganath Kanakkassery
  2 siblings, 0 replies; 8+ messages in thread
From: Jaganath Kanakkassery @ 2018-03-13  5:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Jaganath Kanakkassery

---
 monitor/packet.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/monitor/packet.c b/monitor/packet.c
index e3b5ab7..2a22e7d 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -10741,6 +10741,9 @@ static const struct {
 	{  4, "Add TX Power field to Advertising Data"	},
 	{  5, "Add Appearance field to Scan Response"	},
 	{  6, "Add Local Name in Scan Response"		},
+	{  7, "Advertise in 1M on Secondary channel"	},
+	{  8, "Advertise in 2M on Secondary channel"	},
+	{  9, "Advertise in CODED on Secondary channel"	},
 	{ }
 };
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv
  2018-03-13  5:54 [PATCH v2 1/4] monitor: Add support PHY management commands and event Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
  2018-03-13  5:54 ` [PATCH v2 3/4] monitor: Add support for Secondary PHY flags in Add Advertising Jaganath Kanakkassery
@ 2018-03-13  5:54 ` Jaganath Kanakkassery
  2018-03-14  7:45   ` Luiz Augusto von Dentz
  2 siblings, 1 reply; 8+ messages in thread
From: Jaganath Kanakkassery @ 2018-03-13  5:54 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Jaganath Kanakkassery

---
 lib/mgmt.h     |  3 +++
 tools/btmgmt.c | 17 ++++++++++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/lib/mgmt.h b/lib/mgmt.h
index 7a25e17..ec6a380 100644
--- a/lib/mgmt.h
+++ b/lib/mgmt.h
@@ -506,6 +506,9 @@ struct mgmt_rp_add_advertising {
 #define MGMT_ADV_FLAG_TX_POWER		(1 << 4)
 #define MGMT_ADV_FLAG_APPEARANCE	(1 << 5)
 #define MGMT_ADV_FLAG_LOCAL_NAME	(1 << 6)
+#define MGMT_ADV_FLAG_SEC_1M		(1 << 7)
+#define MGMT_ADV_FLAG_SEC_2M		(1 << 8)
+#define MGMT_ADV_FLAG_SEC_CODED		(1 << 9)
 
 #define MGMT_OP_REMOVE_ADVERTISING	0x003F
 struct mgmt_cp_remove_advertising {
diff --git a/tools/btmgmt.c b/tools/btmgmt.c
index 6ada176..e44ecac 100755
--- a/tools/btmgmt.c
+++ b/tools/btmgmt.c
@@ -3629,6 +3629,9 @@ static const char *adv_flags_str[] = {
 				"tx-power",
 				"scan-rsp-appearance",
 				"scan-rsp-local-name",
+				"Secondary-channel-1M",
+				"Secondary-channel-2M",
+				"Secondary-channel-CODED",
 };
 
 static const char *adv_flags2str(uint32_t flags)
@@ -3846,6 +3849,7 @@ static void add_adv_usage(void)
 		"\t -s, --scan-rsp <data>     Scan Response Data bytes\n"
 		"\t -t, --timeout <timeout>   Timeout in seconds\n"
 		"\t -D, --duration <duration> Duration in seconds\n"
+		"\t -P, --phy <phy>           Phy type, Specify 1M/2M/CODED\n"
 		"\t -c, --connectable         \"connectable\" flag\n"
 		"\t -g, --general-discov      \"general-discoverable\" flag\n"
 		"\t -l, --limited-discov      \"limited-discoverable\" flag\n"
@@ -3864,6 +3868,7 @@ static struct option add_adv_options[] = {
 	{ "scan-rsp",		1, 0, 's' },
 	{ "timeout",		1, 0, 't' },
 	{ "duration",		1, 0, 'D' },
+	{ "phy",		1, 0, 'P' },
 	{ "connectable",	0, 0, 'c' },
 	{ "general-discov",	0, 0, 'g' },
 	{ "limited-discov",	0, 0, 'l' },
@@ -3932,7 +3937,7 @@ static void cmd_add_adv(int argc, char **argv)
 	uint32_t flags = 0;
 	uint16_t index;
 
-	while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:cglmphna",
+	while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:P:cglmphna",
 						add_adv_options, NULL)) != -1) {
 		switch (opt) {
 		case 'u':
@@ -4017,6 +4022,16 @@ static void cmd_add_adv(int argc, char **argv)
 		case 'a':
 			flags |= MGMT_ADV_FLAG_APPEARANCE;
 			break;
+		case 'P':
+			if (strcasecmp(optarg, "1M") == 0)
+				flags |= MGMT_ADV_FLAG_SEC_1M;
+			else if (strcasecmp(optarg, "2M") == 0)
+				flags |= MGMT_ADV_FLAG_SEC_2M;
+			else if (strcasecmp(optarg, "CODED") == 0)
+				flags |= MGMT_ADV_FLAG_SEC_CODED;
+			else
+				goto done;
+			break;
 		case 'h':
 			success = true;
 			/* fall through */
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands
  2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
@ 2018-03-14  7:42   ` Luiz Augusto von Dentz
  2018-03-14 10:00   ` ERAMOTO Masaya
  1 sibling, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2018-03-14  7:42 UTC (permalink / raw)
  To: Jaganath Kanakkassery; +Cc: linux-bluetooth, Jaganath Kanakkassery

Hi Jaganath,

On Tue, Mar 13, 2018 at 7:54 AM, Jaganath Kanakkassery
<jaganath.k.os@gmail.com> wrote:
> ---
>  lib/mgmt.h     |  33 +++++++++++++++
>  tools/btmgmt.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 165 insertions(+)
>  mode change 100644 => 100755 tools/btmgmt.c
>
> diff --git a/lib/mgmt.h b/lib/mgmt.h
> index 798a05e..7a25e17 100644
> --- a/lib/mgmt.h
> +++ b/lib/mgmt.h
> @@ -101,6 +101,7 @@ struct mgmt_rp_read_index_list {
>  #define MGMT_SETTING_PRIVACY           0x00002000
>  #define MGMT_SETTING_CONFIGURATION     0x00004000
>  #define MGMT_SETTING_STATIC_ADDRESS    0x00008000
> +#define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
>
>  #define MGMT_OP_READ_INFO              0x0004
>  struct mgmt_rp_read_info {
> @@ -546,6 +547,30 @@ struct mgmt_cp_set_appearance {
>         uint16_t appearance;
>  } __packed;
>
> +#define MGMT_OP_GET_PHY_CONFIGURATION  0x0044
> +struct mgmt_rp_get_phy_confguration {
> +       uint16_t        supported_phys;
> +       uint16_t        selected_phys;
> +} __packed;
> +
> +#define MGMT_PHY_LE_1M_TX              0x0001
> +#define MGMT_PHY_LE_1M_RX              0x0002
> +#define MGMT_PHY_LE_2M_TX              0x0004
> +#define MGMT_PHY_LE_2M_RX              0x0008
> +#define MGMT_PHY_LE_CODED_TX           0x0010
> +#define MGMT_PHY_LE_CODED_RX           0x0020
> +
> +#define MGMT_PHY_LE_TX_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_2M_TX | \
> +                            MGMT_PHY_LE_CODED_TX)
> +#define MGMT_PHY_LE_RX_MASK (MGMT_PHY_LE_1M_RX | MGMT_PHY_LE_2M_RX | \
> +                            MGMT_PHY_LE_CODED_RX)
> +
> +#define MGMT_OP_SET_PHY_CONFIGURATION  0x0045
> +struct mgmt_cp_set_phy_confguration {
> +       uint16_t        default_phys;
> +} __packed;
> +
> +
>  #define MGMT_EV_CMD_COMPLETE           0x0001
>  struct mgmt_ev_cmd_complete {
>         uint16_t opcode;
> @@ -764,6 +789,11 @@ struct mgmt_ev_ext_info_changed {
>         uint8_t  eir[0];
>  } __packed;
>
> +#define MGMT_EV_PHY_CONFIGURATION_CHANGED      0x0026
> +struct mgmt_ev_phy_configuration_changed {
> +       uint16_t        selected_phys;
> +} __packed;
> +
>  static const char *mgmt_op[] = {
>         "<0x0000>",
>         "Read Version",
> @@ -833,6 +863,8 @@ static const char *mgmt_op[] = {
>         "Start Limited Discovery",
>         "Read Extended Controller Information",
>         "Set Appearance",
> +       "Get PHY Configuration",
> +       "Set PHY Configuration",
>  };
>
>  static const char *mgmt_ev[] = {
> @@ -874,6 +906,7 @@ static const char *mgmt_ev[] = {
>         "Advertising Added",
>         "Advertising Removed",
>         "Extended Controller Information Changed",
> +       "PHY Configuration Changed",
>  };
>
>  static const char *mgmt_status[] = {
> diff --git a/tools/btmgmt.c b/tools/btmgmt.c
> old mode 100644
> new mode 100755
> index 122c46d..6ada176
> --- a/tools/btmgmt.c
> +++ b/tools/btmgmt.c
> @@ -4165,6 +4165,134 @@ static void cmd_appearance(int argc, char **argv)
>         }
>  }
>
> +static const char *phys_str[] = {
> +       "1MTX",
> +       "1MRX",
> +       "2MTX",
> +       "2MRX",
> +       "CODEDTX",
> +       "CODEDRX",
> +};
> +
> +static const char *phys2str(uint16_t phys)
> +{
> +       static char str[256];
> +       unsigned i;
> +       int off;
> +
> +       off = 0;
> +       str[0] = '\0';
> +
> +       for (i = 0; i < NELEM(phys_str); i++) {
> +               if ((phys & (1 << i)) != 0)
> +                       off += snprintf(str + off, sizeof(str) - off, "%s ",
> +                                                       phys_str[i]);
> +       }
> +
> +       return str;
> +}
> +
> +static void get_phy_rsp(uint8_t status, uint16_t len, const void *param,
> +                                                       void *user_data)
> +{
> +       const struct mgmt_rp_get_phy_confguration *rp = param;
> +       uint16_t supported_flags, selected_phys;
> +
> +       if (status != 0) {
> +               error("Get PHY Configuration failed with status 0x%02x (%s)",
> +                                               status, mgmt_errstr(status));
> +               goto done;
> +       }
> +
> +       if (len < sizeof(*rp)) {
> +               error("Too small get-phy reply (%u bytes)", len);
> +               goto done;
> +       }
> +
> +       supported_flags = get_le16(&rp->supported_phys);
> +       selected_phys = get_le16(&rp->selected_phys);
> +
> +       print("Supported phys: %s", phys2str(supported_flags));
> +       print("Selected phys: %s", phys2str(selected_phys));
> +
> +done:
> +       bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> +static void cmd_get_phy(int argc, char **argv)
> +{
> +       uint16_t index;
> +
> +       index = mgmt_index;
> +       if (index == MGMT_INDEX_NONE)
> +               index = 0;
> +
> +       if (mgmt_send(mgmt, MGMT_OP_GET_PHY_CONFIGURATION, index, 0, NULL,
> +                                       get_phy_rsp, NULL, NULL) == 0) {
> +               error("Unable to send Get PHY cmd");
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +}
> +
> +static void set_phy_rsp(uint8_t status, uint16_t len, const void *param,
> +                                                       void *user_data)
> +{
> +       if (status != 0)
> +               error("Could not set PHY Configuration with status 0x%02x (%s)",
> +                                               status, mgmt_errstr(status));
> +       else
> +               print("PHY Configuration successfully set");
> +
> +       bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> +static void cmd_set_phy(int argc, char **argv)
> +{
> +       struct mgmt_cp_set_phy_confguration cp;
> +       int i;
> +       uint16_t phys = 0;
> +       uint16_t index;
> +
> +       if (argc < 2) {
> +               print("Specify one or more of \"1MTX\" \"1MRX\" \"2MTX\" \
> +                       \"2MRX\" \"CODEDTX\" \"CODEDRX\"");
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +
> +       for (i = 1; i < argc; i++) {
> +               if (strcasecmp(argv[i], "1MTX") == 0)
> +                       phys |= MGMT_PHY_LE_1M_TX;
> +
> +               if (strcasecmp(argv[i], "1MRX") == 0)
> +                       phys |= MGMT_PHY_LE_1M_RX;
> +
> +               if (strcasecmp(argv[i], "2MTX") == 0)
> +                       phys |= MGMT_PHY_LE_2M_TX;
> +
> +               if (strcasecmp(argv[i], "2MRX") == 0)
> +                       phys |= MGMT_PHY_LE_2M_RX;
> +
> +               if (strcasecmp(argv[i], "CODEDTX") == 0)
> +                       phys |= MGMT_PHY_LE_CODED_TX;
> +
> +               if (strcasecmp(argv[i], "CODEDRX") == 0)
> +                       phys |= MGMT_PHY_LE_CODED_RX;
> +       }
> +
> +       cp.default_phys = cpu_to_le16(phys);
> +
> +       index = mgmt_index;
> +       if (index == MGMT_INDEX_NONE)
> +               index = 0;
> +
> +       if (mgmt_send(mgmt, MGMT_OP_SET_PHY_CONFIGURATION, index, sizeof(cp),
> +                                       &cp, set_phy_rsp, NULL, NULL) == 0) {
> +               error("Unable to send %s cmd",
> +                               mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
> +               return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +       }
> +}
> +
>  static void register_mgmt_callbacks(struct mgmt *mgmt, uint16_t index)
>  {
>         mgmt_register(mgmt, MGMT_EV_CONTROLLER_ERROR, index, controller_error,
> @@ -4360,6 +4488,10 @@ static const struct bt_shell_menu main_menu = {
>                 cmd_clr_adv,            "Clear advertising instances"   },
>         { "appearance",         "<appearance>",
>                 cmd_appearance,         "Set appearance"                },
> +       { "get-phy",            NULL,
> +               cmd_get_phy,            "Get PHY Configuration"         },
> +        { "set-phy",           "<phys>",
> +               cmd_set_phy,            "Set PHY Configuration"         },
>         {} },
>  };

Instead of having 2 commands we could have just phy and in case there
is no parameter given it would print the current value.


-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv
  2018-03-13  5:54 ` [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv Jaganath Kanakkassery
@ 2018-03-14  7:45   ` Luiz Augusto von Dentz
  2018-03-14  7:47     ` Luiz Augusto von Dentz
  0 siblings, 1 reply; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2018-03-14  7:45 UTC (permalink / raw)
  To: Jaganath Kanakkassery; +Cc: linux-bluetooth, Jaganath Kanakkassery

Hi Jaganath,

On Tue, Mar 13, 2018 at 7:54 AM, Jaganath Kanakkassery
<jaganath.k.os@gmail.com> wrote:
> ---
>  lib/mgmt.h     |  3 +++
>  tools/btmgmt.c | 17 ++++++++++++++++-
>  2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/lib/mgmt.h b/lib/mgmt.h
> index 7a25e17..ec6a380 100644
> --- a/lib/mgmt.h
> +++ b/lib/mgmt.h
> @@ -506,6 +506,9 @@ struct mgmt_rp_add_advertising {
>  #define MGMT_ADV_FLAG_TX_POWER         (1 << 4)
>  #define MGMT_ADV_FLAG_APPEARANCE       (1 << 5)
>  #define MGMT_ADV_FLAG_LOCAL_NAME       (1 << 6)
> +#define MGMT_ADV_FLAG_SEC_1M           (1 << 7)
> +#define MGMT_ADV_FLAG_SEC_2M           (1 << 8)
> +#define MGMT_ADV_FLAG_SEC_CODED                (1 << 9)
>
>  #define MGMT_OP_REMOVE_ADVERTISING     0x003F
>  struct mgmt_cp_remove_advertising {
> diff --git a/tools/btmgmt.c b/tools/btmgmt.c
> index 6ada176..e44ecac 100755
> --- a/tools/btmgmt.c
> +++ b/tools/btmgmt.c
> @@ -3629,6 +3629,9 @@ static const char *adv_flags_str[] = {
>                                 "tx-power",
>                                 "scan-rsp-appearance",
>                                 "scan-rsp-local-name",
> +                               "Secondary-channel-1M",
> +                               "Secondary-channel-2M",
> +                               "Secondary-channel-CODED",
>  };
>
>  static const char *adv_flags2str(uint32_t flags)
> @@ -3846,6 +3849,7 @@ static void add_adv_usage(void)
>                 "\t -s, --scan-rsp <data>     Scan Response Data bytes\n"
>                 "\t -t, --timeout <timeout>   Timeout in seconds\n"
>                 "\t -D, --duration <duration> Duration in seconds\n"
> +               "\t -P, --phy <phy>           Phy type, Specify 1M/2M/CODED\n"

This is not longer needed since btmgmt uses bt_shell it can run in
non-iterative mode thus the command handler itself can be used, you
just have to remember to use bt_shell_noninteractive_quit when done
with the command.

>                 "\t -c, --connectable         \"connectable\" flag\n"
>                 "\t -g, --general-discov      \"general-discoverable\" flag\n"
>                 "\t -l, --limited-discov      \"limited-discoverable\" flag\n"
> @@ -3864,6 +3868,7 @@ static struct option add_adv_options[] = {
>         { "scan-rsp",           1, 0, 's' },
>         { "timeout",            1, 0, 't' },
>         { "duration",           1, 0, 'D' },
> +       { "phy",                1, 0, 'P' },
>         { "connectable",        0, 0, 'c' },
>         { "general-discov",     0, 0, 'g' },
>         { "limited-discov",     0, 0, 'l' },
> @@ -3932,7 +3937,7 @@ static void cmd_add_adv(int argc, char **argv)
>         uint32_t flags = 0;
>         uint16_t index;
>
> -       while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:cglmphna",
> +       while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:P:cglmphna",
>                                                 add_adv_options, NULL)) != -1) {
>                 switch (opt) {
>                 case 'u':
> @@ -4017,6 +4022,16 @@ static void cmd_add_adv(int argc, char **argv)
>                 case 'a':
>                         flags |= MGMT_ADV_FLAG_APPEARANCE;
>                         break;
> +               case 'P':
> +                       if (strcasecmp(optarg, "1M") == 0)
> +                               flags |= MGMT_ADV_FLAG_SEC_1M;
> +                       else if (strcasecmp(optarg, "2M") == 0)
> +                               flags |= MGMT_ADV_FLAG_SEC_2M;
> +                       else if (strcasecmp(optarg, "CODED") == 0)
> +                               flags |= MGMT_ADV_FLAG_SEC_CODED;
> +                       else
> +                               goto done;
> +                       break;
>                 case 'h':
>                         success = true;
>                         /* fall through */
> --
> 2.7.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv
  2018-03-14  7:45   ` Luiz Augusto von Dentz
@ 2018-03-14  7:47     ` Luiz Augusto von Dentz
  0 siblings, 0 replies; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2018-03-14  7:47 UTC (permalink / raw)
  To: Jaganath Kanakkassery; +Cc: linux-bluetooth, Jaganath Kanakkassery

Hi Jaganath,

On Wed, Mar 14, 2018 at 9:45 AM, Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
> Hi Jaganath,
>
> On Tue, Mar 13, 2018 at 7:54 AM, Jaganath Kanakkassery
> <jaganath.k.os@gmail.com> wrote:
>> ---
>>  lib/mgmt.h     |  3 +++
>>  tools/btmgmt.c | 17 ++++++++++++++++-
>>  2 files changed, 19 insertions(+), 1 deletion(-)
>>
>> diff --git a/lib/mgmt.h b/lib/mgmt.h
>> index 7a25e17..ec6a380 100644
>> --- a/lib/mgmt.h
>> +++ b/lib/mgmt.h
>> @@ -506,6 +506,9 @@ struct mgmt_rp_add_advertising {
>>  #define MGMT_ADV_FLAG_TX_POWER         (1 << 4)
>>  #define MGMT_ADV_FLAG_APPEARANCE       (1 << 5)
>>  #define MGMT_ADV_FLAG_LOCAL_NAME       (1 << 6)
>> +#define MGMT_ADV_FLAG_SEC_1M           (1 << 7)
>> +#define MGMT_ADV_FLAG_SEC_2M           (1 << 8)
>> +#define MGMT_ADV_FLAG_SEC_CODED                (1 << 9)
>>
>>  #define MGMT_OP_REMOVE_ADVERTISING     0x003F
>>  struct mgmt_cp_remove_advertising {
>> diff --git a/tools/btmgmt.c b/tools/btmgmt.c
>> index 6ada176..e44ecac 100755
>> --- a/tools/btmgmt.c
>> +++ b/tools/btmgmt.c
>> @@ -3629,6 +3629,9 @@ static const char *adv_flags_str[] = {
>>                                 "tx-power",
>>                                 "scan-rsp-appearance",
>>                                 "scan-rsp-local-name",
>> +                               "Secondary-channel-1M",
>> +                               "Secondary-channel-2M",
>> +                               "Secondary-channel-CODED",
>>  };
>>
>>  static const char *adv_flags2str(uint32_t flags)
>> @@ -3846,6 +3849,7 @@ static void add_adv_usage(void)
>>                 "\t -s, --scan-rsp <data>     Scan Response Data bytes\n"
>>                 "\t -t, --timeout <timeout>   Timeout in seconds\n"
>>                 "\t -D, --duration <duration> Duration in seconds\n"
>> +               "\t -P, --phy <phy>           Phy type, Specify 1M/2M/CODED\n"
>
> This is not longer needed since btmgmt uses bt_shell it can run in
> non-iterative mode thus the command handler itself can be used, you
> just have to remember to use bt_shell_noninteractive_quit when done
> with the command.

Nevermind, I though this were a tool option not a command option, so
please disconsider what I just said.

>
>>                 "\t -c, --connectable         \"connectable\" flag\n"
>>                 "\t -g, --general-discov      \"general-discoverable\" flag\n"
>>                 "\t -l, --limited-discov      \"limited-discoverable\" flag\n"
>> @@ -3864,6 +3868,7 @@ static struct option add_adv_options[] = {
>>         { "scan-rsp",           1, 0, 's' },
>>         { "timeout",            1, 0, 't' },
>>         { "duration",           1, 0, 'D' },
>> +       { "phy",                1, 0, 'P' },
>>         { "connectable",        0, 0, 'c' },
>>         { "general-discov",     0, 0, 'g' },
>>         { "limited-discov",     0, 0, 'l' },
>> @@ -3932,7 +3937,7 @@ static void cmd_add_adv(int argc, char **argv)
>>         uint32_t flags = 0;
>>         uint16_t index;
>>
>> -       while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:cglmphna",
>> +       while ((opt = getopt_long(argc, argv, "+u:d:s:t:D:P:cglmphna",
>>                                                 add_adv_options, NULL)) != -1) {
>>                 switch (opt) {
>>                 case 'u':
>> @@ -4017,6 +4022,16 @@ static void cmd_add_adv(int argc, char **argv)
>>                 case 'a':
>>                         flags |= MGMT_ADV_FLAG_APPEARANCE;
>>                         break;
>> +               case 'P':
>> +                       if (strcasecmp(optarg, "1M") == 0)
>> +                               flags |= MGMT_ADV_FLAG_SEC_1M;
>> +                       else if (strcasecmp(optarg, "2M") == 0)
>> +                               flags |= MGMT_ADV_FLAG_SEC_2M;
>> +                       else if (strcasecmp(optarg, "CODED") == 0)
>> +                               flags |= MGMT_ADV_FLAG_SEC_CODED;
>> +                       else
>> +                               goto done;
>> +                       break;
>>                 case 'h':
>>                         success = true;
>>                         /* fall through */
>> --
>> 2.7.4
>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>
>
> --
> Luiz Augusto von Dentz



-- 
Luiz Augusto von Dentz

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands
  2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
  2018-03-14  7:42   ` Luiz Augusto von Dentz
@ 2018-03-14 10:00   ` ERAMOTO Masaya
  1 sibling, 0 replies; 8+ messages in thread
From: ERAMOTO Masaya @ 2018-03-14 10:00 UTC (permalink / raw)
  To: Jaganath Kanakkassery; +Cc: linux-bluetooth, Jaganath Kanakkassery

Hi Jaganath,

On 03/13/2018 02:54 PM, Jaganath Kanakkassery wrote:
> ---
>  lib/mgmt.h     |  33 +++++++++++++++
>  tools/btmgmt.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 165 insertions(+)
>  mode change 100644 => 100755 tools/btmgmt.c
> 
> diff --git a/lib/mgmt.h b/lib/mgmt.h
> index 798a05e..7a25e17 100644
> --- a/lib/mgmt.h
> +++ b/lib/mgmt.h
> @@ -101,6 +101,7 @@ struct mgmt_rp_read_index_list {
>  #define MGMT_SETTING_PRIVACY		0x00002000
>  #define MGMT_SETTING_CONFIGURATION	0x00004000
>  #define MGMT_SETTING_STATIC_ADDRESS	0x00008000
> +#define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
>  
>  #define MGMT_OP_READ_INFO		0x0004
>  struct mgmt_rp_read_info {
> @@ -546,6 +547,30 @@ struct mgmt_cp_set_appearance {
>  	uint16_t appearance;
>  } __packed;
>  
> +#define MGMT_OP_GET_PHY_CONFIGURATION	0x0044
> +struct mgmt_rp_get_phy_confguration {
> +	uint16_t	supported_phys;
> +	uint16_t	selected_phys;
> +} __packed;
> +
> +#define MGMT_PHY_LE_1M_TX		0x0001
> +#define MGMT_PHY_LE_1M_RX		0x0002
> +#define MGMT_PHY_LE_2M_TX		0x0004
> +#define MGMT_PHY_LE_2M_RX		0x0008
> +#define MGMT_PHY_LE_CODED_TX		0x0010
> +#define MGMT_PHY_LE_CODED_RX		0x0020
> +
> +#define MGMT_PHY_LE_TX_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_2M_TX | \
> +			     MGMT_PHY_LE_CODED_TX)
> +#define MGMT_PHY_LE_RX_MASK (MGMT_PHY_LE_1M_RX | MGMT_PHY_LE_2M_RX | \
> +			     MGMT_PHY_LE_CODED_RX)
> +
> +#define MGMT_OP_SET_PHY_CONFIGURATION	0x0045
> +struct mgmt_cp_set_phy_confguration {
> +	uint16_t	default_phys;
> +} __packed;
> +
> +
>  #define MGMT_EV_CMD_COMPLETE		0x0001
>  struct mgmt_ev_cmd_complete {
>  	uint16_t opcode;
> @@ -764,6 +789,11 @@ struct mgmt_ev_ext_info_changed {
>  	uint8_t  eir[0];
>  } __packed;
>  
> +#define MGMT_EV_PHY_CONFIGURATION_CHANGED	0x0026
> +struct mgmt_ev_phy_configuration_changed {
> +	uint16_t	selected_phys;
> +} __packed;
> +
>  static const char *mgmt_op[] = {
>  	"<0x0000>",
>  	"Read Version",
> @@ -833,6 +863,8 @@ static const char *mgmt_op[] = {
>  	"Start Limited Discovery",
>  	"Read Extended Controller Information",
>  	"Set Appearance",
> +	"Get PHY Configuration",
> +	"Set PHY Configuration",
>  };
>  
>  static const char *mgmt_ev[] = {
> @@ -874,6 +906,7 @@ static const char *mgmt_ev[] = {
>  	"Advertising Added",
>  	"Advertising Removed",
>  	"Extended Controller Information Changed",
> +	"PHY Configuration Changed",
>  };
>  
>  static const char *mgmt_status[] = {
> diff --git a/tools/btmgmt.c b/tools/btmgmt.c
> old mode 100644
> new mode 100755
> index 122c46d..6ada176
> --- a/tools/btmgmt.c
> +++ b/tools/btmgmt.c
> @@ -4165,6 +4165,134 @@ static void cmd_appearance(int argc, char **argv)
>  	}
>  }
>  
> +static const char *phys_str[] = {
> +	"1MTX",
> +	"1MRX",
> +	"2MTX",
> +	"2MRX",
> +	"CODEDTX",
> +	"CODEDRX",
> +};
> +
> +static const char *phys2str(uint16_t phys)
> +{
> +	static char str[256];
> +	unsigned i;
> +	int off;
> +
> +	off = 0;
> +	str[0] = '\0';
> +
> +	for (i = 0; i < NELEM(phys_str); i++) {
> +		if ((phys & (1 << i)) != 0)
> +			off += snprintf(str + off, sizeof(str) - off, "%s ",
> +							phys_str[i]);
> +	}
> +
> +	return str;
> +}
> +
> +static void get_phy_rsp(uint8_t status, uint16_t len, const void *param,
> +							void *user_data)
> +{
> +	const struct mgmt_rp_get_phy_confguration *rp = param;
> +	uint16_t supported_flags, selected_phys;
> +
> +	if (status != 0) {
> +		error("Get PHY Configuration failed with status 0x%02x (%s)",
> +						status, mgmt_errstr(status));
> +		goto done;

bt_shell_noninteractive_quit(EXIT_FAILURE) should be called if being error.


> +	}
> +
> +	if (len < sizeof(*rp)) {
> +		error("Too small get-phy reply (%u bytes)", len);
> +		goto done;

This is the same as above.


> +	}
> +
> +	supported_flags = get_le16(&rp->supported_phys);
> +	selected_phys = get_le16(&rp->selected_phys);
> +
> +	print("Supported phys: %s", phys2str(supported_flags));
> +	print("Selected phys: %s", phys2str(selected_phys));
> +
> +done:
> +	bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> +static void cmd_get_phy(int argc, char **argv)
> +{
> +	uint16_t index;
> +
> +	index = mgmt_index;
> +	if (index == MGMT_INDEX_NONE)
> +		index = 0;
> +
> +	if (mgmt_send(mgmt, MGMT_OP_GET_PHY_CONFIGURATION, index, 0, NULL,
> +					get_phy_rsp, NULL, NULL) == 0) {
> +		error("Unable to send Get PHY cmd");
> +		return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +	}
> +}
> +
> +static void set_phy_rsp(uint8_t status, uint16_t len, const void *param,
> +							void *user_data)
> +{
> +	if (status != 0)
> +		error("Could not set PHY Configuration with status 0x%02x (%s)",
> +						status, mgmt_errstr(status));

This is the same as above.


Regards,
Eramoto


> +	else
> +		print("PHY Configuration successfully set");
> +
> +	bt_shell_noninteractive_quit(EXIT_SUCCESS);
> +}
> +
> +static void cmd_set_phy(int argc, char **argv)
> +{
> +	struct mgmt_cp_set_phy_confguration cp;
> +	int i;
> +	uint16_t phys = 0;
> +	uint16_t index;
> +
> +	if (argc < 2) {
> +		print("Specify one or more of \"1MTX\" \"1MRX\" \"2MTX\" \
> +			\"2MRX\" \"CODEDTX\" \"CODEDRX\"");
> +		return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +	}
> +
> +	for (i = 1; i < argc; i++) {
> +		if (strcasecmp(argv[i], "1MTX") == 0)
> +			phys |= MGMT_PHY_LE_1M_TX;
> +
> +		if (strcasecmp(argv[i], "1MRX") == 0)
> +			phys |= MGMT_PHY_LE_1M_RX;
> +
> +		if (strcasecmp(argv[i], "2MTX") == 0)
> +			phys |= MGMT_PHY_LE_2M_TX;
> +
> +		if (strcasecmp(argv[i], "2MRX") == 0)
> +			phys |= MGMT_PHY_LE_2M_RX;
> +
> +		if (strcasecmp(argv[i], "CODEDTX") == 0)
> +			phys |= MGMT_PHY_LE_CODED_TX;
> +
> +		if (strcasecmp(argv[i], "CODEDRX") == 0)
> +			phys |= MGMT_PHY_LE_CODED_RX;
> +	}
> +
> +	cp.default_phys = cpu_to_le16(phys);
> +
> +	index = mgmt_index;
> +	if (index == MGMT_INDEX_NONE)
> +		index = 0;
> +
> +	if (mgmt_send(mgmt, MGMT_OP_SET_PHY_CONFIGURATION, index, sizeof(cp),
> +					&cp, set_phy_rsp, NULL, NULL) == 0) {
> +		error("Unable to send %s cmd",
> +				mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
> +		return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +	}
> +}
> +
>  static void register_mgmt_callbacks(struct mgmt *mgmt, uint16_t index)
>  {
>  	mgmt_register(mgmt, MGMT_EV_CONTROLLER_ERROR, index, controller_error,
> @@ -4360,6 +4488,10 @@ static const struct bt_shell_menu main_menu = {
>  		cmd_clr_adv,		"Clear advertising instances"	},
>  	{ "appearance",		"<appearance>",
>  		cmd_appearance,		"Set appearance"		},
> +	{ "get-phy",		NULL,
> +		cmd_get_phy,		"Get PHY Configuration"         },
> +        { "set-phy",		"<phys>",
> +		cmd_set_phy,		"Set PHY Configuration"         },
>  	{} },
>  };
>  
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-03-14 10:00 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-13  5:54 [PATCH v2 1/4] monitor: Add support PHY management commands and event Jaganath Kanakkassery
2018-03-13  5:54 ` [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands Jaganath Kanakkassery
2018-03-14  7:42   ` Luiz Augusto von Dentz
2018-03-14 10:00   ` ERAMOTO Masaya
2018-03-13  5:54 ` [PATCH v2 3/4] monitor: Add support for Secondary PHY flags in Add Advertising Jaganath Kanakkassery
2018-03-13  5:54 ` [PATCH v2 4/4] btmgmt: Add support for setting PHY in add-adv Jaganath Kanakkassery
2018-03-14  7:45   ` Luiz Augusto von Dentz
2018-03-14  7:47     ` Luiz Augusto von Dentz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.