libertas: convert Mesh Blinding Table access to a direct command
authorDan Williams <dcbw@redhat.com>
Tue, 27 Jul 2010 20:01:47 +0000 (13:01 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 27 Jul 2010 19:11:20 +0000 (15:11 -0400)
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/host.h
drivers/net/wireless/libertas/mesh.c
drivers/net/wireless/libertas/mesh.h

index b8df1fd892408a4e1d740cf847d80984c93d877f..dd25b2a9dbebf48437351b9d339e8a3ab2027cad 100644 (file)
@@ -1208,10 +1208,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
 
 #ifdef CONFIG_LIBERTAS_MESH
 
-       case CMD_BT_ACCESS:
-               ret = lbs_cmd_bt_access(cmdptr, cmd_action, pdata_buf);
-               break;
-
        case CMD_FWT_ACCESS:
                ret = lbs_cmd_fwt_access(cmdptr, cmd_action, pdata_buf);
                break;
index 810d75882e79f3b791e042634143030344cb0ad1..098b6453cb09396d5c2c6c80c474e3045157578d 100644 (file)
@@ -68,13 +68,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
        case CMD_RET(CMD_802_11_BEACON_STOP):
                break;
 
-       case CMD_RET(CMD_BT_ACCESS):
-               spin_lock_irqsave(&priv->driver_lock, flags);
-               if (priv->cur_cmd->callback_arg)
-                       memcpy((void *)priv->cur_cmd->callback_arg,
-                              &resp->params.bt.addr1, 2 * ETH_ALEN);
-               spin_unlock_irqrestore(&priv->driver_lock, flags);
-               break;
        case CMD_RET(CMD_FWT_ACCESS):
                spin_lock_irqsave(&priv->driver_lock, flags);
                if (priv->cur_cmd->callback_arg)
index 0a4ddc1cdd6cf14d202204af971f420812dc57e3..e8171777846a174aec76950f760bfa59158353c2 100644 (file)
@@ -903,6 +903,8 @@ struct cmd_ds_get_tsf {
 } __packed;
 
 struct cmd_ds_bt_access {
+       struct cmd_header hdr;
+
        __le16 action;
        __le32 id;
        u8 addr1[ETH_ALEN];
@@ -959,7 +961,6 @@ struct cmd_ds_command {
        /* command Body */
        union {
                struct cmd_ds_802_11_ps_mode psmode;
-               struct cmd_ds_bt_access bt;
                struct cmd_ds_fwt_access fwt;
        } params;
 } __packed;
index bc5bc1384c355d536692b4e2da9408e093b639d4..35ee574f588f1086eff9735f343ea3342da65794 100644 (file)
@@ -455,44 +455,162 @@ void lbs_mesh_set_txpd(struct lbs_private *priv,
  * Mesh command handling
  */
 
-int lbs_cmd_bt_access(struct cmd_ds_command *cmd,
-                              u16 cmd_action, void *pdata_buf)
+/**
+ *  @brief Add or delete Mesh Blinding Table entries
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param add         TRUE to add the entry, FALSE to delete it
+ *  @param addr1        Destination address to blind or unblind
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_mesh_bt_add_del(struct lbs_private *priv, bool add, u8 *addr1)
 {
-       struct cmd_ds_bt_access *bt_access = &cmd->params.bt;
-       lbs_deb_enter_args(LBS_DEB_CMD, "action %d", cmd_action);
+       struct cmd_ds_bt_access cmd;
+       int ret = 0;
 
-       cmd->command = cpu_to_le16(CMD_BT_ACCESS);
-       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_bt_access) +
-               sizeof(struct cmd_header));
-       cmd->result = 0;
-       bt_access->action = cpu_to_le16(cmd_action);
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       BUG_ON(addr1 == NULL);
 
-       switch (cmd_action) {
-       case CMD_ACT_BT_ACCESS_ADD:
-               memcpy(bt_access->addr1, pdata_buf, 2 * ETH_ALEN);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       memcpy(cmd.addr1, addr1, ETH_ALEN);
+       if (add) {
+               cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_ADD);
                lbs_deb_hex(LBS_DEB_MESH, "BT_ADD: blinded MAC addr",
-                       bt_access->addr1, 6);
-               break;
-       case CMD_ACT_BT_ACCESS_DEL:
-               memcpy(bt_access->addr1, pdata_buf, 1 * ETH_ALEN);
+                       addr1, ETH_ALEN);
+       } else {
+               cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_DEL);
                lbs_deb_hex(LBS_DEB_MESH, "BT_DEL: blinded MAC addr",
-                       bt_access->addr1, 6);
-               break;
-       case CMD_ACT_BT_ACCESS_LIST:
-               bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);
-               break;
-       case CMD_ACT_BT_ACCESS_RESET:
-               break;
-       case CMD_ACT_BT_ACCESS_SET_INVERT:
-               bt_access->id = cpu_to_le32(*(u32 *) pdata_buf);
-               break;
-       case CMD_ACT_BT_ACCESS_GET_INVERT:
-               break;
-       default:
-               break;
+                       addr1, ETH_ALEN);
        }
-       lbs_deb_leave(LBS_DEB_CMD);
-       return 0;
+
+       ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
+
+       lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+       return ret;
+}
+
+/**
+ *  @brief Reset/clear the mesh blinding table
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_mesh_bt_reset(struct lbs_private *priv)
+{
+       struct cmd_ds_bt_access cmd;
+       int ret = 0;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_RESET);
+
+       ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
+
+       lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+       return ret;
+}
+
+/**
+ *  @brief Gets the inverted status of the mesh blinding table
+ *
+ *  Normally the firmware "blinds" or ignores traffic from mesh nodes in the
+ *  table, but an inverted table allows *only* traffic from nodes listed in
+ *  the table.
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param invert      On success, TRUE if the blinding table is inverted,
+ *                        FALSE if it is not inverted
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_mesh_bt_get_inverted(struct lbs_private *priv, bool *inverted)
+{
+       struct cmd_ds_bt_access cmd;
+       int ret = 0;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       BUG_ON(inverted == NULL);
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_GET_INVERT);
+
+       ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
+       if (ret == 0)
+               *inverted = !!cmd.id;
+
+       lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+       return ret;
+}
+
+/**
+ *  @brief Sets the inverted status of the mesh blinding table
+ *
+ *  Normally the firmware "blinds" or ignores traffic from mesh nodes in the
+ *  table, but an inverted table allows *only* traffic from nodes listed in
+ *  the table.
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param invert      TRUE to invert the blinding table (only traffic from
+ *                         listed nodes allowed), FALSE to return it
+ *                         to normal state (listed nodes ignored)
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_mesh_bt_set_inverted(struct lbs_private *priv, bool inverted)
+{
+       struct cmd_ds_bt_access cmd;
+       int ret = 0;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_SET_INVERT);
+       cmd.id = !!inverted;
+
+       ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
+
+       lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+       return ret;
+}
+
+/**
+ *  @brief List an entry in the mesh blinding table
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param id          The ID of the entry to list
+ *  @param addr1       MAC address associated with the table entry
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_mesh_bt_get_entry(struct lbs_private *priv, u32 id, u8 *addr1)
+{
+       struct cmd_ds_bt_access cmd;
+       int ret = 0;
+
+       lbs_deb_enter(LBS_DEB_CMD);
+
+       BUG_ON(addr1 == NULL);
+
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       cmd.action = cpu_to_le16(CMD_ACT_BT_ACCESS_SET_INVERT);
+       cmd.id = cpu_to_le32(id);
+
+       ret = lbs_cmd_with_response(priv, CMD_BT_ACCESS, &cmd);
+       if (ret == 0)
+               memcpy(addr1, cmd.addr1, sizeof(cmd.addr1));
+
+       lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
+       return ret;
 }
 
 int lbs_cmd_fwt_access(struct cmd_ds_command *cmd,
index 84ea2481ff2086da3c486b6da48e197837cb5144..855497902d9ff391a15efe1d246393b5283ef015 100644 (file)
@@ -51,8 +51,12 @@ struct cmd_ds_command;
 struct cmd_ds_mesh_access;
 struct cmd_ds_mesh_config;
 
-int lbs_cmd_bt_access(struct cmd_ds_command *cmd,
-       u16 cmd_action, void *pdata_buf);
+int lbs_mesh_bt_add_del(struct lbs_private *priv, bool add, u8 *addr1);
+int lbs_mesh_bt_reset(struct lbs_private *priv);
+int lbs_mesh_bt_get_inverted(struct lbs_private *priv, bool *inverted);
+int lbs_mesh_bt_set_inverted(struct lbs_private *priv, bool inverted);
+int lbs_mesh_bt_get_entry(struct lbs_private *priv, u32 id, u8 *addr1);
+
 int lbs_cmd_fwt_access(struct cmd_ds_command *cmd,
        u16 cmd_action, void *pdata_buf);
 int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action,