]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/libertas/assoc.c
libertas: convert CMD_802_11_DEAUTHENTICATE to a direct command
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / libertas / assoc.c
index a267d6e65f03e82df3ef7f22403117a5fb3b003a..5072a8917fd994898558b81c5ada46d34c5e7a05 100644 (file)
@@ -1029,7 +1029,9 @@ void lbs_association_worker(struct work_struct *work)
         */
        if (priv->mode == IW_MODE_INFRA) {
                if (should_deauth_infrastructure(priv, assoc_req)) {
-                       ret = lbs_send_deauthentication(priv);
+                       ret = lbs_cmd_80211_deauthenticate(priv,
+                                                          priv->curbssparams.bssid,
+                                                          WLAN_REASON_DEAUTH_LEAVING);
                        if (ret) {
                                lbs_deb_assoc("Deauthentication due to new "
                                        "configuration request failed: %d\n",
@@ -1289,18 +1291,6 @@ static void lbs_set_basic_rate_flags(u8 *rates, size_t len)
        }
 }
 
-/**
- *  @brief Send Deauthentication Request
- *
- *  @param priv      A pointer to struct lbs_private structure
- *  @return          0--success, -1--fail
- */
-int lbs_send_deauthentication(struct lbs_private *priv)
-{
-       return lbs_prepare_and_send_command(priv, CMD_802_11_DEAUTHENTICATE,
-                                    0, CMD_OPTION_WAITFORRSP, 0, NULL);
-}
-
 /**
  *  @brief This function prepares command of authenticate.
  *
@@ -1353,26 +1343,37 @@ out:
        return ret;
 }
 
-int lbs_cmd_80211_deauthenticate(struct lbs_private *priv,
-                                  struct cmd_ds_command *cmd)
+/**
+ *  @brief Deauthenticate from a specific BSS
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *  @param bssid       The specific BSS to deauthenticate from
+ *  @param reason      The 802.11 sec. 7.3.1.7 Reason Code for deauthenticating
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_cmd_80211_deauthenticate(struct lbs_private *priv, u8 bssid[ETH_ALEN],
+                                u16 reason)
 {
-       struct cmd_ds_802_11_deauthenticate *dauth = &cmd->params.deauth;
+       struct cmd_ds_802_11_deauthenticate cmd;
+       int ret;
 
        lbs_deb_enter(LBS_DEB_JOIN);
 
-       cmd->command = cpu_to_le16(CMD_802_11_DEAUTHENTICATE);
-       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_deauthenticate) +
-                            S_DS_GEN);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       memcpy(cmd.macaddr, &bssid[0], ETH_ALEN);
+       cmd.reasoncode = cpu_to_le16(reason);
 
-       /* set AP MAC address */
-       memmove(dauth->macaddr, priv->curbssparams.bssid, ETH_ALEN);
+       ret = lbs_cmd_with_response(priv, CMD_802_11_DEAUTHENTICATE, &cmd);
 
-       /* Reason code 3 = Station is leaving */
-#define REASON_CODE_STA_LEAVING 3
-       dauth->reasoncode = cpu_to_le16(REASON_CODE_STA_LEAVING);
+       /* Clean up everything even if there was an error; can't assume that
+        * we're still authenticated to the AP after trying to deauth.
+        */
+       lbs_mac_event_disconnected(priv);
 
        lbs_deb_leave(LBS_DEB_JOIN);
-       return 0;
+       return ret;
 }
 
 int lbs_cmd_80211_associate(struct lbs_private *priv,
@@ -1815,16 +1816,6 @@ done:
        return ret;
 }
 
-int lbs_ret_80211_disassociate(struct lbs_private *priv)
-{
-       lbs_deb_enter(LBS_DEB_JOIN);
-
-       lbs_mac_event_disconnected(priv);
-
-       lbs_deb_leave(LBS_DEB_JOIN);
-       return 0;
-}
-
 int lbs_ret_80211_ad_hoc_start(struct lbs_private *priv,
                                 struct cmd_ds_command *resp)
 {