btmgmt: Add PHY configuration get/set commands 17/185817/1
authorAnupam Roy <anupam.r@samsung.com>
Wed, 1 Aug 2018 14:54:58 +0000 (20:24 +0530)
committerAnupam Roy <anupam.r@samsung.com>
Thu, 2 Aug 2018 15:07:31 +0000 (20:37 +0530)
Taken from following upstream commit-
commit dca915f54c1f969d977e9433d336bf3f6264632b

Change-Id: Ic8842ad0687c607b4606648f0813221d0c18c4c7
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
lib/mgmt.h
tools/btmgmt.c

index f12e402..9553bb2 100644 (file)
@@ -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 {
@@ -505,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 {
@@ -546,6 +550,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 +792,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 +866,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 +909,7 @@ static const char *mgmt_ev[] = {
        "Advertising Added",
        "Advertising Removed",
        "Extended Controller Information Changed",
+       "PHY Configuration Changed",
 };
 
 static const char *mgmt_status[] = {
index 122c46d..4ac49bd 100755 (executable)
@@ -4165,6 +4165,135 @@ 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 int 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));
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+
+       if (len < sizeof(*rp)) {
+               error("Too small get-phy reply (%u bytes)", len);
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+
+       supported_flags = get_le16(&rp->supported_phys);
+       selected_phys = get_le16(&rp->selected_phys);
+
+       print("@@Anupam:Supported phys: 0x%x", supported_flags);
+       print("@@Anupam:Selected phys: 0x%x", selected_phys);
+
+       print("Supported phys: %s", phys2str(supported_flags));
+       print("Selected phys: %s", phys2str(selected_phys));
+
+       bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void get_phy(void)
+{
+       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));
+               return bt_shell_noninteractive_quit(EXIT_FAILURE);
+       }
+
+       print("PHY Configuration successfully set");
+
+       bt_shell_noninteractive_quit(EXIT_SUCCESS);
+}
+
+static void cmd_phy(int argc, char **argv)
+{
+       struct mgmt_cp_set_phy_confguration cp;
+       int i;
+       uint16_t phys = 0;
+       uint16_t index;
+
+       if (argc < 2)
+               return get_phy();
+
+       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 +4489,8 @@ static const struct bt_shell_menu main_menu = {
                cmd_clr_adv,            "Clear advertising instances"   },
        { "appearance",         "<appearance>",
                cmd_appearance,         "Set appearance"                },
+       { "phy",                "[phys]",
+               cmd_phy,                "Get/Set PHY Configuration"     },
        {} },
 };