qcacmn: Handle link active_inactive command

Add code to handle new set link state command -
MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE.

Change-Id: I4fad93e9e09309f7e8ac07f2e3c43a0aa6472a3a
CRs-Fixed: 3352970
This commit is contained in:
Liangwei Dong
2022-11-24 18:42:49 +08:00
committad av Madan Koyyalamudi
förälder 060f2a7ebc
incheckning 91f844bfce
2 ändrade filer med 53 tillägg och 4 borttagningar

Visa fil

@@ -745,6 +745,8 @@ struct mlo_mlme_ext_ops {
* Force inactive a number of links, firmware to decide which links to inactive
* @MLO_LINK_FORCE_MODE_NO_FORCE:
* Cancel the force operation of specific links, allow firmware to decide
* @MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE: Force specific links active and
* force specific links inactive
*/
enum mlo_link_force_mode {
MLO_LINK_FORCE_MODE_ACTIVE = 1,
@@ -752,6 +754,7 @@ enum mlo_link_force_mode {
MLO_LINK_FORCE_MODE_ACTIVE_NUM = 3,
MLO_LINK_FORCE_MODE_INACTIVE_NUM = 4,
MLO_LINK_FORCE_MODE_NO_FORCE = 5,
MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE = 6,
};
/**
@@ -760,10 +763,13 @@ enum mlo_link_force_mode {
* Set force specific links because of new connection
* @MLO_LINK_FORCE_REASON_DISCONNECT:
* Set force specific links because of new dis-connection
* @MLO_LINK_FORCE_REASON_LINK_REMOVAL:
* Set force specific links because of AP side link removal
*/
enum mlo_link_force_reason {
MLO_LINK_FORCE_REASON_CONNECT = 1,
MLO_LINK_FORCE_REASON_DISCONNECT = 2,
MLO_LINK_FORCE_REASON_LINK_REMOVAL = 3,
};
/**
@@ -802,21 +808,31 @@ struct mlo_link_num_param {
* @reason: reason for the operation (enum mlo_link_force_reason)
* @num_link_entry: number of the valid entries for link_num
* @num_vdev_bitmap: number of the valid entries for vdev_bitmap
* @num_inactive_vdev_bitmap: number of the valid entries for
* inactive_vdev_bitmap
* @link_num: link number param array
* It's present only when force_mode is MLO_LINK_FORCE_MODE_ACTIVE_NUM or
* MLO_LINK_FORCE_MODE_INACTIVE_NUM
* @vdev_bitmap: active/inactive vdev bitmap array
* It will be present when force_mode is MLO_LINK_FORCE_MODE_ACTIVE,
* MLO_LINK_FORCE_MODE_INACTIVE, MLO_LINK_FORCE_MODE_NO_FORCE,
* MLO_LINK_FORCE_MODE_ACTIVE_NUM or MLO_LINK_FORCE_MODE_INACTIVE_NUM
* MLO_LINK_FORCE_MODE_ACTIVE_NUM or MLO_LINK_FORCE_MODE_INACTIVE_NUM,
* and MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE.
* For MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE, it includes the active vdev
* bitmaps
* @inactive_vdev_bitmap: inactive vdev bitmap array
* It will be present when force_mode is MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE,
* it includes the inactive vdev bitmaps
*/
struct mlo_link_set_active_param {
uint32_t force_mode;
uint32_t reason;
uint32_t num_link_entry;
uint32_t num_vdev_bitmap;
uint32_t num_inactive_vdev_bitmap;
struct mlo_link_num_param link_num[MLO_LINK_NUM_SZ];
uint32_t vdev_bitmap[MLO_VDEV_BITMAP_SZ];
uint32_t inactive_vdev_bitmap[MLO_VDEV_BITMAP_SZ];
};
/**

Visa fil

@@ -1,6 +1,6 @@
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -376,6 +376,9 @@ force_mode_host_to_fw(enum mlo_link_force_mode host_mode,
case MLO_LINK_FORCE_MODE_INACTIVE:
*fw_mode = WMI_MLO_LINK_FORCE_INACTIVE;
break;
case MLO_LINK_FORCE_MODE_ACTIVE_INACTIVE:
*fw_mode = WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE;
break;
case MLO_LINK_FORCE_MODE_ACTIVE_NUM:
*fw_mode = WMI_MLO_LINK_FORCE_ACTIVE_LINK_NUM;
break;
@@ -412,6 +415,9 @@ force_reason_host_to_fw(enum mlo_link_force_reason host_reason,
case MLO_LINK_FORCE_REASON_DISCONNECT:
*fw_reason = WMI_MLO_LINK_FORCE_REASON_NEW_DISCONNECT;
break;
case MLO_LINK_FORCE_REASON_LINK_REMOVAL:
*fw_reason = WMI_MLO_LINK_FORCE_REASON_LINK_REMOVAL;
break;
default:
wmi_err("Invalid force reason: %d", host_reason);
return QDF_STATUS_E_INVAL;
@@ -436,6 +442,7 @@ send_mlo_link_set_active_cmd_tlv(wmi_unified_t wmi_handle,
wmi_mlo_set_active_link_number_param *link_num_param;
uint32_t *vdev_bitmap;
uint32_t num_link_num_param = 0, num_vdev_bitmap = 0, tlv_len;
uint32_t num_inactive_vdev_bitmap = 0;
wmi_buf_t buf;
uint8_t *buf_ptr;
uint32_t len;
@@ -469,6 +476,10 @@ send_mlo_link_set_active_cmd_tlv(wmi_unified_t wmi_handle,
case WMI_MLO_LINK_NO_FORCE:
num_vdev_bitmap = param->num_vdev_bitmap;
break;
case WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE:
num_vdev_bitmap = param->num_vdev_bitmap;
num_inactive_vdev_bitmap = param->num_inactive_vdev_bitmap;
break;
default:
wmi_err("Invalid force reason: %d", force_mode);
return QDF_STATUS_E_INVAL;
@@ -477,6 +488,9 @@ send_mlo_link_set_active_cmd_tlv(wmi_unified_t wmi_handle,
len = sizeof(*cmd) +
WMI_TLV_HDR_SIZE + sizeof(*link_num_param) * num_link_num_param +
WMI_TLV_HDR_SIZE + sizeof(*vdev_bitmap) * num_vdev_bitmap;
if (force_mode == WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE)
len += WMI_TLV_HDR_SIZE +
sizeof(*vdev_bitmap) * num_inactive_vdev_bitmap;
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
@@ -491,9 +505,9 @@ send_mlo_link_set_active_cmd_tlv(wmi_unified_t wmi_handle,
WMITLV_SET_HDR(&cmd->tlv_header, tag_id, tlv_len);
cmd->force_mode = force_mode;
cmd->reason = force_reason;
wmi_debug("mode %d reason %d num_link_num_param %d num_vdev_bitmap %d",
wmi_debug("mode %d reason %d num_link_num_param %d num_vdev_bitmap %d inactive %d",
cmd->force_mode, cmd->reason, num_link_num_param,
num_vdev_bitmap);
num_vdev_bitmap, num_inactive_vdev_bitmap);
buf_ptr += sizeof(*cmd);
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
@@ -540,6 +554,25 @@ send_mlo_link_set_active_cmd_tlv(wmi_unified_t wmi_handle,
buf_ptr += sizeof(*vdev_bitmap) * num_vdev_bitmap;
}
if (force_mode == WMI_MLO_LINK_FORCE_ACTIVE_INACTIVE) {
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_UINT32,
sizeof(*vdev_bitmap) *
num_inactive_vdev_bitmap);
buf_ptr += WMI_TLV_HDR_SIZE;
if (num_inactive_vdev_bitmap) {
vdev_bitmap = (A_UINT32 *)(buf_ptr);
for (i = 0; i < num_inactive_vdev_bitmap; i++) {
vdev_bitmap[i] =
param->inactive_vdev_bitmap[i];
wmi_debug("entry[%d]: inactive_vdev_id_bitmap 0x%x ",
i, vdev_bitmap[i]);
}
buf_ptr += sizeof(*vdev_bitmap) *
num_inactive_vdev_bitmap;
}
}
wmi_mtrace(WMI_MLO_LINK_SET_ACTIVE_CMDID, 0, cmd->force_mode);
status = wmi_unified_cmd_send(wmi_handle, buf, len,