[PATCH 2/3] Add the feature capability exchange function
Eugene Krasnikov
k.eugene.e at gmail.com
Tue Jul 9 04:48:33 EDT 2013
> @@ -4263,7 +4263,7 @@ struct wlan_feat_caps_msg {
> struct wcn36xx_hal_msg_header header;
>
> u32 feat_caps[4];
> -};
> +} __packed;
the name wlan_feat_caps_msg must be change to something like
wcn36xx_hal_wlan_feat_caps_msg
> +int wcn36xx_smd_feature_caps_exchange_req(struct wcn36xx *wcn)
> +{
> + struct wlan_feat_caps_msg msg_body;
> +
> + INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ);
> +
> + /* Fixme theres features should be get from config */
> + memset(msg_body.feat_caps, 0, sizeof(msg_body.feat_caps));
> + set_feat_caps(msg_body.feat_caps, STA_POWERSAVE);
> +
> + PREPARE_HAL_BUF(wcn->smd_buf, msg_body);
> +
> + return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
> +}
the name wcn36xx_smd_feature_caps_exchange_req must be
wcn36xx_smd_feature_caps_exchange without "req" in the end.
also memset(msg_body.feat_caps, 0, sizeof(msg_body.feat_caps)); is not
needed because INIT_HAL_MSG will do that as well.
2013/7/9 <dreamfly281 at gmail.com>:
> From: Yanbo Li <yanbol at qti.qualcomm.com>
>
> The function can be used to exchange the capability between
> Host and Firmware.
>
> Signed-off-by: Yanbo Li <yanbol at qti.qualcomm.com>
> ---
> hal.h | 2 +-
> main.c | 5 +++++
> smd.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> smd.h | 2 +-
> 4 files changed, 79 insertions(+), 2 deletions(-)
>
> diff --git a/hal.h b/hal.h
> index 69b3702..bdfeb46 100644
> --- a/hal.h
> +++ b/hal.h
> @@ -4263,7 +4263,7 @@ struct wlan_feat_caps_msg {
> struct wcn36xx_hal_msg_header header;
>
> u32 feat_caps[4];
> -};
> +} __packed;
>
> /* status codes to help debug rekey failures */
> enum gtk_rekey_status {
> diff --git a/main.c b/main.c
> index 9699356..b59a885 100644
> --- a/main.c
> +++ b/main.c
> @@ -243,6 +243,11 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
> }
> wcn36xx_pmc_init(wcn);
> wcn36xx_debugfs_init(wcn);
> + ret = wcn36xx_smd_feature_caps_exchange_req(wcn);
> + if (ret) {
> + wcn36xx_warn("Exchange feature caps failed");
> + }
> +
> return 0;
>
> out_smd_stop:
> diff --git a/smd.c b/smd.c
> index 9fa2f0f..a594ffd 100644
> --- a/smd.c
> +++ b/smd.c
> @@ -1110,6 +1110,75 @@ int wcn36xx_smd_dump_cmd_req(struct wcn36xx *wcn, u32 arg1, u32 arg2,
> return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
> }
>
> +static inline void set_feat_caps(u32 *bitmap,
> + enum place_holder_in_cap_bitmap cap)
> +{
> + int arr_idx, bit_idx;
> + if (cap < 0 || cap > 127) {
> + wcn36xx_warn("error cap idx %d", cap);
> + } else {
> + arr_idx = cap / 32;
> + bit_idx = cap % 32;
> + bitmap[arr_idx] |= (1 << bit_idx);
> + }
> +}
> +
> +static inline int get_feat_caps(u32 *bitmap,
> + enum place_holder_in_cap_bitmap cap)
> +{
> + int arr_idx, bit_idx;
> + int ret = 0;
> +
> + if (cap < 0 || cap > 127) {
> + wcn36xx_warn("error cap idx %d", cap);
> + return -1;
> + } else {
> + arr_idx = cap / 32;
> + bit_idx = cap % 32;
> + ret = (bitmap[arr_idx] & (1 << bit_idx)) ? 1 : 0;
> + return ret;
> + }
> +}
> +
> +static inline void clear_feat_caps(u32 *bitmap,
> + enum place_holder_in_cap_bitmap cap)
> +{
> + int arr_idx, bit_idx;
> +
> + if (cap < 0 || cap > 127) {
> + wcn36xx_warn("error cap idx %d", cap);
> + } else {
> + arr_idx = cap / 32;
> + bit_idx = cap % 32;
> + bitmap[arr_idx] &= ~(1 << bit_idx);
> + }
> +}
> +
> +int wcn36xx_smd_feature_caps_exchange_req(struct wcn36xx *wcn)
> +{
> + struct wlan_feat_caps_msg msg_body;
> +
> + INIT_HAL_MSG(msg_body, WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_REQ);
> +
> + /* Fixme theres features should be get from config */
> + memset(msg_body.feat_caps, 0, sizeof(msg_body.feat_caps));
> + set_feat_caps(msg_body.feat_caps, STA_POWERSAVE);
> +
> + PREPARE_HAL_BUF(wcn->smd_buf, msg_body);
> +
> + return wcn36xx_smd_send_and_wait(wcn, msg_body.header.len);
> +}
> +
> +/* FW sends its capability bitmap as a response */
> +int wcn36xx_smd_feature_caps_exchange_rsp(void *buf, size_t len)
> +{
> + /* TODO: print the caps of rsp for comapre */
> + if (wcn36xx_smd_rsp_status_check(buf, len)) {
> + wcn36xx_warn("error response for caps exchange");
> + }
> + return 0;
> +}
> +
> static void wcn36xx_smd_notify(void *data, unsigned event)
> {
> struct wcn36xx *wcn = (struct wcn36xx *)data;
> @@ -1230,6 +1299,9 @@ static void wcn36xx_smd_rsp_process(struct wcn36xx *wcn, void *buf, size_t len)
> case WCN36XX_HAL_MISSED_BEACON_IND:
> wcn36xx_smd_missed_beacon_ind(wcn, buf, len);
> break;
> + case WCN36XX_HAL_FEATURE_CAPS_EXCHANGE_RSP:
> + wcn36xx_smd_feature_caps_exchange_rsp(buf, len);
> + break;
> default:
> wcn36xx_error("SMD_EVENT (%d) not supported", msg_header->msg_type);
> }
> diff --git a/smd.h b/smd.h
> index 964e3c2..089c69a 100644
> --- a/smd.h
> +++ b/smd.h
> @@ -92,7 +92,7 @@ int wcn36xx_smd_exit_bmps(struct wcn36xx *wcn);
> int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn, int packet_type);
> int wcn36xx_smd_dump_cmd_req(struct wcn36xx *wcn, u32 arg1, u32 arg2,
> u32 arg3, u32 arg4, u32 arg5);
> -
> +int wcn36xx_smd_feature_caps_exchange_req(struct wcn36xx *wcn);
> /* WCN36XX configuration parameters */
> struct wcn36xx_fw_cfg {
> u16 id;
> --
> 1.7.9.5
>
>
> _______________________________________________
> wcn36xx mailing list
> wcn36xx at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/wcn36xx
--
Best regards,
Eugene
More information about the wcn36xx
mailing list