|
@@ -104,6 +104,8 @@
|
|
|
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_RETRY_COUNT
|
|
|
#define REMOTE_RX_BC_MC_COUNT \
|
|
|
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BC_MC_COUNT
|
|
|
+#define DISCONNECT_REASON \
|
|
|
+ QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_DRIVER_DISCONNECT_REASON
|
|
|
|
|
|
/*
|
|
|
* MSB of rx_mc_bc_cnt indicates whether FW supports rx_mc_bc_cnt
|
|
@@ -575,6 +577,81 @@ fail:
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * wlan_hdd_sir_mac_to_qca_reason() - Convert to qca internal disconnect reason
|
|
|
+ * @internal_reason: Mac reason code of type @enum eSirMacReasonCodes
|
|
|
+ *
|
|
|
+ * Check if it is internal reason code and convert it to the
|
|
|
+ * enum qca_disconnect_reason_codes.
|
|
|
+ *
|
|
|
+ * Return: Reason code of type enum qca_disconnect_reason_codes
|
|
|
+ */
|
|
|
+static enum qca_disconnect_reason_codes
|
|
|
+wlan_hdd_sir_mac_to_qca_reason(enum eSirMacReasonCodes internal_reason)
|
|
|
+{
|
|
|
+ enum qca_disconnect_reason_codes reason =
|
|
|
+ QCA_DISCONNECT_REASON_UNSPECIFIED;
|
|
|
+ switch (internal_reason) {
|
|
|
+ case eSIR_MAC_HOST_TRIGGERED_ROAM_FAILURE:
|
|
|
+ reason = QCA_DISCONNECT_REASON_INTERNAL_ROAM_FAILURE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_FW_TRIGGERED_ROAM_FAILURE:
|
|
|
+ reason = QCA_DISCONNECT_REASON_EXTERNAL_ROAM_FAILURE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_GATEWAY_REACHABILITY_FAILURE:
|
|
|
+ reason =
|
|
|
+ QCA_DISCONNECT_REASON_GATEWAY_REACHABILITY_FAILURE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_UNSUPPORTED_CHANNEL_CSA:
|
|
|
+ reason = QCA_DISCONNECT_REASON_UNSUPPORTED_CHANNEL_CSA;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_OPER_CHANNEL_DISABLED_INDOOR:
|
|
|
+ reason =
|
|
|
+ QCA_DISCONNECT_REASON_OPER_CHANNEL_DISABLED_INDOOR;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_OPER_CHANNEL_USER_DISABLED:
|
|
|
+ reason =
|
|
|
+ QCA_DISCONNECT_REASON_OPER_CHANNEL_USER_DISABLED;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_DEVICE_RECOVERY:
|
|
|
+ reason = QCA_DISCONNECT_REASON_DEVICE_RECOVERY;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_KEY_TIMEOUT:
|
|
|
+ reason = QCA_DISCONNECT_REASON_KEY_TIMEOUT;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_OPER_CHANNEL_BAND_CHANGE:
|
|
|
+ reason = QCA_DISCONNECT_REASON_OPER_CHANNEL_BAND_CHANGE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_IFACE_DOWN:
|
|
|
+ reason = QCA_DISCONNECT_REASON_IFACE_DOWN;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_PEER_XRETRY_FAIL:
|
|
|
+ reason = QCA_DISCONNECT_REASON_PEER_XRETRY_FAIL;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_PEER_INACTIVITY:
|
|
|
+ reason = QCA_DISCONNECT_REASON_PEER_INACTIVITY;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_SA_QUERY_TIMEOUT:
|
|
|
+ reason = QCA_DISCONNECT_REASON_SA_QUERY_TIMEOUT;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_CHANNEL_SWITCH_FAILED:
|
|
|
+ reason = QCA_DISCONNECT_REASON_CHANNEL_SWITCH_FAILURE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_BEACON_MISSED:
|
|
|
+ reason = QCA_DISCONNECT_REASON_BEACON_MISS_FAILURE;
|
|
|
+ break;
|
|
|
+ case eSIR_MAC_USER_TRIGGERED_ROAM_FAILURE:
|
|
|
+ reason = QCA_DISCONNECT_REASON_USER_TRIGGERED;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ hdd_debug("No QCA reason code for mac reason: %u",
|
|
|
+ internal_reason);
|
|
|
+ /* Unspecified reason by default */
|
|
|
+ }
|
|
|
+
|
|
|
+ return reason;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* hdd_get_station_info() - send BSS information to supplicant
|
|
|
* @hdd_ctx: pointer to hdd context
|
|
@@ -589,6 +666,8 @@ static int hdd_get_station_info(struct hdd_context *hdd_ctx,
|
|
|
uint8_t *tmp_hs20 = NULL;
|
|
|
uint32_t nl_buf_len;
|
|
|
struct hdd_station_ctx *hdd_sta_ctx;
|
|
|
+ enum qca_disconnect_reason_codes disconnect_reason =
|
|
|
+ QCA_DISCONNECT_REASON_UNSPECIFIED;
|
|
|
|
|
|
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
|
|
|
|
|
@@ -603,7 +682,8 @@ static int hdd_get_station_info(struct hdd_context *hdd_ctx,
|
|
|
sizeof(hdd_sta_ctx->cache_conn_info.txrate.nss) +
|
|
|
sizeof(hdd_sta_ctx->cache_conn_info.roam_count) +
|
|
|
sizeof(hdd_sta_ctx->cache_conn_info.last_auth_type) +
|
|
|
- sizeof(hdd_sta_ctx->cache_conn_info.dot11mode);
|
|
|
+ sizeof(hdd_sta_ctx->cache_conn_info.dot11mode) +
|
|
|
+ sizeof(adapter->last_disconnect_reason);
|
|
|
if (hdd_sta_ctx->cache_conn_info.conn_flag.vht_present)
|
|
|
nl_buf_len += sizeof(hdd_sta_ctx->cache_conn_info.vht_caps);
|
|
|
if (hdd_sta_ctx->cache_conn_info.conn_flag.ht_present)
|
|
@@ -671,6 +751,19 @@ static int hdd_get_station_info(struct hdd_context *hdd_ctx,
|
|
|
hdd_err("put fail");
|
|
|
goto fail;
|
|
|
}
|
|
|
+ /*
|
|
|
+ * adapter->last_disconnect_reason maintains the reason code of type
|
|
|
+ * enum eSirMacReasonCodes and internal reason codes are defined from
|
|
|
+ * eSIR_MAC_REASON_PROP_START. Check if it is internal reason code and
|
|
|
+ * convert it to the enum qca_disconnect_reason_codes.
|
|
|
+ */
|
|
|
+ if (adapter->last_disconnect_reason >= eSIR_MAC_REASON_PROP_START)
|
|
|
+ disconnect_reason =
|
|
|
+ wlan_hdd_sir_mac_to_qca_reason(adapter->last_disconnect_reason);
|
|
|
+ if (nla_put_u32(skb, DISCONNECT_REASON, disconnect_reason)) {
|
|
|
+ hdd_err("Failed to put disconect reason");
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
|
|
|
return cfg80211_vendor_cmd_reply(skb);
|
|
|
fail:
|