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 Tue, Mar 13, 2018 at 7:54 AM, Jaganath Kanakkassery
<jaganath.k.os@xxxxxxxxx> 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
--
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