|
@@ -80,6 +80,43 @@ rel_lock:
|
|
|
|
|
|
#if defined(CFG80211_DISCONNECTED_V2) || \
|
|
#if defined(CFG80211_DISCONNECTED_V2) || \
|
|
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
|
|
(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
|
|
|
|
+#ifdef CONN_MGR_ADV_FEATURE
|
|
|
|
+static void
|
|
|
|
+osif_cm_indicate_disconnect_result(struct net_device *dev,
|
|
|
|
+ enum ieee80211_reasoncode reason,
|
|
|
|
+ const u8 *ie, size_t ie_len,
|
|
|
|
+ bool locally_generated, int link_id,
|
|
|
|
+ gfp_t gfp)
|
|
|
|
+{
|
|
|
|
+ cfg80211_disconnected(dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated, gfp);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+#ifdef WLAN_SUPPORT_CFG80211_DISCONNECT_LINK_PARAM
|
|
|
|
+static void
|
|
|
|
+osif_cm_indicate_disconnect_result(struct net_device *dev,
|
|
|
|
+ enum ieee80211_reasoncode reason,
|
|
|
|
+ const u8 *ie, size_t ie_len,
|
|
|
|
+ bool locally_generated, int link_id,
|
|
|
|
+ gfp_t gfp)
|
|
|
|
+{
|
|
|
|
+ cfg80211_disconnected(dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated, link_id, gfp);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static void
|
|
|
|
+osif_cm_indicate_disconnect_result(struct net_device *dev,
|
|
|
|
+ enum ieee80211_reasoncode reason,
|
|
|
|
+ const u8 *ie, size_t ie_len,
|
|
|
|
+ bool locally_generated, int link_id,
|
|
|
|
+ gfp_t gfp)
|
|
|
|
+{
|
|
|
|
+ cfg80211_disconnected(dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated, gfp);
|
|
|
|
+}
|
|
|
|
+#endif /* WLAN_SUPPORT_CFG80211_DISCONNECT_LINK_PARAM */
|
|
|
|
+#endif
|
|
|
|
+
|
|
#ifdef WLAN_FEATURE_11BE_MLO
|
|
#ifdef WLAN_FEATURE_11BE_MLO
|
|
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
|
#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
|
|
void
|
|
void
|
|
@@ -87,15 +124,19 @@ osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
|
struct net_device *dev,
|
|
struct net_device *dev,
|
|
enum ieee80211_reasoncode reason,
|
|
enum ieee80211_reasoncode reason,
|
|
bool locally_generated, const u8 *ie,
|
|
bool locally_generated, const u8 *ie,
|
|
- size_t ie_len, gfp_t gfp)
|
|
|
|
|
|
+ size_t ie_len, int link_id, gfp_t gfp)
|
|
{
|
|
{
|
|
if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
|
if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
|
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
|
|
if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
|
|
- cfg80211_disconnected(dev, reason, ie,
|
|
|
|
- ie_len, locally_generated, gfp);
|
|
|
|
|
|
+ osif_cm_indicate_disconnect_result(
|
|
|
|
+ dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated,
|
|
|
|
+ link_id, gfp);
|
|
} else {
|
|
} else {
|
|
- cfg80211_disconnected(dev, reason, ie,
|
|
|
|
- ie_len, locally_generated, gfp);
|
|
|
|
|
|
+ osif_cm_indicate_disconnect_result(
|
|
|
|
+ dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated,
|
|
|
|
+ link_id, gfp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#else /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
|
#else /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
|
@@ -104,15 +145,16 @@ osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
|
struct net_device *dev,
|
|
struct net_device *dev,
|
|
enum ieee80211_reasoncode reason,
|
|
enum ieee80211_reasoncode reason,
|
|
bool locally_generated, const u8 *ie,
|
|
bool locally_generated, const u8 *ie,
|
|
- size_t ie_len, gfp_t gfp)
|
|
|
|
|
|
+ size_t ie_len, int link_id, gfp_t gfp)
|
|
{
|
|
{
|
|
struct net_device *netdev = dev;
|
|
struct net_device *netdev = dev;
|
|
struct vdev_osif_priv *osif_priv = NULL;
|
|
struct vdev_osif_priv *osif_priv = NULL;
|
|
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
|
struct wlan_objmgr_vdev *assoc_vdev = NULL;
|
|
|
|
|
|
if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
|
if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) {
|
|
- cfg80211_disconnected(netdev, reason, ie, ie_len,
|
|
|
|
- locally_generated, gfp);
|
|
|
|
|
|
+ osif_cm_indicate_disconnect_result(
|
|
|
|
+ netdev, reason, ie, ie_len,
|
|
|
|
+ locally_generated, link_id, gfp);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -122,9 +164,10 @@ osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
|
return;
|
|
return;
|
|
osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
|
|
osif_priv = wlan_vdev_get_ospriv(assoc_vdev);
|
|
netdev = osif_priv->wdev->netdev;
|
|
netdev = osif_priv->wdev->netdev;
|
|
- cfg80211_disconnected(netdev, reason,
|
|
|
|
- ie, ie_len,
|
|
|
|
- locally_generated, gfp);
|
|
|
|
|
|
+ osif_cm_indicate_disconnect_result(
|
|
|
|
+ netdev, reason,
|
|
|
|
+ ie, ie_len,
|
|
|
|
+ locally_generated, link_id, gfp);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
|
#endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE */
|
|
@@ -134,9 +177,11 @@ osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
|
struct net_device *dev,
|
|
struct net_device *dev,
|
|
enum ieee80211_reasoncode reason,
|
|
enum ieee80211_reasoncode reason,
|
|
bool locally_generated, const u8 *ie,
|
|
bool locally_generated, const u8 *ie,
|
|
- size_t ie_len, gfp_t gfp)
|
|
|
|
|
|
+ size_t ie_len, int link_id, gfp_t gfp)
|
|
{
|
|
{
|
|
- cfg80211_disconnected(dev, reason, ie, ie_len, locally_generated, gfp);
|
|
|
|
|
|
+ osif_cm_indicate_disconnect_result(dev, reason, ie,
|
|
|
|
+ ie_len, locally_generated,
|
|
|
|
+ link_id, gfp);
|
|
}
|
|
}
|
|
#endif /* WLAN_FEATURE_11BE_MLO */
|
|
#endif /* WLAN_FEATURE_11BE_MLO */
|
|
#else
|
|
#else
|
|
@@ -145,7 +190,7 @@ osif_cm_indicate_disconnect(struct wlan_objmgr_vdev *vdev,
|
|
struct net_device *dev,
|
|
struct net_device *dev,
|
|
enum ieee80211_reasoncode reason,
|
|
enum ieee80211_reasoncode reason,
|
|
bool locally_generated, const u8 *ie,
|
|
bool locally_generated, const u8 *ie,
|
|
- size_t ie_len, gfp_t gfp)
|
|
|
|
|
|
+ size_t ie_len, int link_id, gfp_t gfp)
|
|
{
|
|
{
|
|
cfg80211_disconnected(dev, reason, ie, ie_len, gfp);
|
|
cfg80211_disconnected(dev, reason, ie, ie_len, gfp);
|
|
}
|
|
}
|
|
@@ -197,6 +242,7 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
|
bool locally_generated = true;
|
|
bool locally_generated = true;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
enum qca_disconnect_reason_codes qca_reason;
|
|
enum qca_disconnect_reason_codes qca_reason;
|
|
|
|
+ int link_id = -1;
|
|
|
|
|
|
qca_reason = osif_cm_mac_to_qca_reason(rsp->req.req.reason_code);
|
|
qca_reason = osif_cm_mac_to_qca_reason(rsp->req.req.reason_code);
|
|
ieee80211_reason =
|
|
ieee80211_reason =
|
|
@@ -233,6 +279,7 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
|
|
ieee80211_reason,
|
|
ieee80211_reason,
|
|
locally_generated, rsp->ap_discon_ie.ptr,
|
|
locally_generated, rsp->ap_discon_ie.ptr,
|
|
rsp->ap_discon_ie.len,
|
|
rsp->ap_discon_ie.len,
|
|
|
|
+ link_id,
|
|
qdf_mem_malloc_flags());
|
|
qdf_mem_malloc_flags());
|
|
|
|
|
|
osif_cm_disconnect_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
|
|
osif_cm_disconnect_comp_ind(vdev, rsp, OSIF_POST_USERSPACE_UPDATE);
|