Re: [PATCH v2 2/4] btmgmt: Add PHY configuration get/set commands

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

 



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"         },
>  	{} },
>  };
>  
> 

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