{
        struct brcmf_cfg80211_vif *vif = ifp->vif;
        struct brcmf_rssi_be *info = data;
-       s32 rssi, snr, noise;
+       s32 rssi, snr = 0, noise = 0;
        s32 low, high, last;
 
-       if (e->datalen < sizeof(*info)) {
+       if (e->datalen >= sizeof(*info)) {
+               rssi = be32_to_cpu(info->rssi);
+               snr = be32_to_cpu(info->snr);
+               noise = be32_to_cpu(info->noise);
+       } else if (e->datalen >= sizeof(rssi)) {
+               rssi = be32_to_cpu(*(__be32 *)data);
+       } else {
                brcmf_err("insufficient RSSI event data\n");
                return 0;
        }
 
-       rssi = be32_to_cpu(info->rssi);
-       snr = be32_to_cpu(info->snr);
-       noise = be32_to_cpu(info->noise);
-
        low = vif->cqm_rssi_low;
        high = vif->cqm_rssi_high;
        last = vif->cqm_rssi_last;