Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98b6d238 authored by Vipin Mehta's avatar Vipin Mehta Committed by Greg Kroah-Hartman
Browse files

staging: ath6kl: Adding state in driver to track the sme state



Adding state in driver to track the sme state. The connect/disconnect
events from the driver were messing up the state maintained within the
cfg80211 module.

Signed-off-by: default avatarVipin Mehta <vmehta@atheros.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 9ea979d3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1670,6 +1670,7 @@ ar6000_avail_ev(void *context, void *hif_handle)
    SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy));
    wdev->netdev = dev;
    ar->arNetworkType = INFRA_NETWORK;
    ar->smeState = SME_DISCONNECTED;
#endif /* ATH6K_CONFIG_CFG80211 */

    init_netdev(dev, ifname);
+20 −8
Original line number Diff line number Diff line
@@ -248,6 +248,7 @@ ar6k_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
    int status;

    AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
    ar->smeState = SME_CONNECTING;

    if(ar->arWmiReady == false) {
        AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready yet\n", __func__));
@@ -562,6 +563,7 @@ ar6k_cfg80211_connect_event(AR_SOFTC_T *ar, u16 channel,

    if (false == ar->arConnected) {
        /* inform connect result to cfg80211 */
        ar->smeState = SME_DISCONNECTED;
        cfg80211_connect_result(ar->arNetDev, bssid,
                                assocReqIe, assocReqLen,
                                assocRespIe, assocRespLen,
@@ -644,19 +646,29 @@ ar6k_cfg80211_disconnect_event(AR_SOFTC_T *ar, u8 reason,
        }
    }

    if(false == ar->arConnected) {
    if(true == ar->arConnectPending) {
        if(NO_NETWORK_AVAIL == reason) {
            /* connect cmd failed */
            wmi_disconnect_cmd(ar->arWmi);
        } else if (reason == DISCONNECT_CMD) {
            /* connection loss due to disconnect cmd or low rssi */
            ar->arConnectPending = false;   
            if (ar->smeState == SME_CONNECTING) {
                cfg80211_connect_result(ar->arNetDev, bssid,
                                        NULL, 0,
                                        NULL, 0,
                                        WLAN_STATUS_UNSPECIFIED_FAILURE,
                                        GFP_KERNEL);
        }
            } else {
        /* connection loss due to disconnect cmd or low rssi */
                cfg80211_disconnected(ar->arNetDev, reason, NULL, 0, GFP_KERNEL);
            }
            ar->smeState = SME_DISCONNECTED;
        }
    } else {
        if (reason != DISCONNECT_CMD) {
            wmi_disconnect_cmd(ar->arWmi);
        }
    }
}

void
+7 −0
Original line number Diff line number Diff line
@@ -393,6 +393,12 @@ struct ar_key {
    u8 seq_len;
    u32 cipher;
};

enum {
    SME_DISCONNECTED,
    SME_CONNECTING,
    SME_CONNECTED
};
#endif /* ATH6K_CONFIG_CFG80211 */


@@ -595,6 +601,7 @@ typedef struct ar6_softc {
    struct wireless_dev *wdev;
    struct cfg80211_scan_request    *scan_request;
    struct ar_key   keys[WMI_MAX_KEY_INDEX + 1];
    u32 smeState;
#endif /* ATH6K_CONFIG_CFG80211 */
    u16 arWlanPowerState;
    bool                  arWlanOff;