iwlwifi: mvm: support new Coex firmware API
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 23 Jul 2017 10:59:47 +0000 (13:59 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 18 Aug 2017 13:03:40 +0000 (16:03 +0300)
The firmware now adds more information about time sharing
with the Bluetooth core.
Adapt the API structures and add the new fields in the
debugfs hooks.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/coex.h
drivers/net/wireless/intel/iwlwifi/fw/file.h
drivers/net/wireless/intel/iwlwifi/mvm/coex.c
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

index 2ba3ea4fa9994421cb2290efe726982d8804fbd3..d9a74db01f90b34ae1d4b5f7cd8c42413942a6db 100644 (file)
@@ -178,6 +178,7 @@ enum iwl_bt_mxbox_dw3 {
        BT_MBOX(3, ACL_STATE, 3, 1),
        BT_MBOX(3, MSTR_STATE, 4, 1),
        BT_MBOX(3, OBX_STATE, 5, 1),
+       BT_MBOX(3, A2DP_SRC, 6, 1),
        BT_MBOX(3, OPEN_CON_2, 8, 2),
        BT_MBOX(3, TRAFFIC_LOAD, 10, 2),
        BT_MBOX(3, CHL_SEQN_LSB, 12, 1),
@@ -187,6 +188,11 @@ enum iwl_bt_mxbox_dw3 {
        BT_MBOX(3, UPDATE_REQUEST, 21, 1),
 };
 
+enum iwl_bt_mxbox_dw4 {
+       BT_MBOX(4, ATS_BT_INTERVAL, 0, 7),
+       BT_MBOX(4, ATS_BT_ACTIVE_MAX_TH, 7, 7),
+};
+
 #define BT_MBOX_MSG(_notif, _num, _field)                                   \
        ((le32_to_cpu((_notif)->mbox_msg[(_num)]) & BT_MBOX##_num##_##_field)\
        >> BT_MBOX##_num##_##_field##_POS)
@@ -220,6 +226,31 @@ enum iwl_bt_ci_compliance {
  * @reserved: reserved
  */
 struct iwl_bt_coex_profile_notif {
+       __le32 mbox_msg[8];
+       __le32 msg_idx;
+       __le32 bt_ci_compliance;
+
+       __le32 primary_ch_lut;
+       __le32 secondary_ch_lut;
+       __le32 bt_activity_grading;
+       u8 ttc_status;
+       u8 rrc_status;
+       __le16 reserved;
+} __packed; /* BT_COEX_PROFILE_NTFY_API_S_VER_5 */
+
+/**
+ * struct iwl_bt_coex_profile_notif - notification about BT coex
+ * @mbox_msg: message from BT to WiFi
+ * @msg_idx: the index of the message
+ * @bt_ci_compliance: enum %iwl_bt_ci_compliance
+ * @primary_ch_lut: LUT used for primary channel &enum iwl_bt_coex_lut_type
+ * @secondary_ch_lut: LUT used for secondary channel &enum iwl_bt_coex_lut_type
+ * @bt_activity_grading: the activity of BT &enum iwl_bt_activity_grading
+ * @ttc_status: is TTC enabled - one bit per PHY
+ * @rrc_status: is RRC enabled - one bit per PHY
+ * @reserved: reserved
+ */
+struct iwl_bt_coex_profile_notif_v4 {
        __le32 mbox_msg[4];
        __le32 msg_idx;
        __le32 bt_ci_compliance;
index d933aa324ffe627321ca2894e4843dc222d82451..a1cd2f41b0267d7e293ca4b9b582089e02026487 100644 (file)
@@ -246,6 +246,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t;
  * @IWL_UCODE_TLV_API_STA_TYPE: This ucode supports station type assignement.
  * @IWL_UCODE_TLV_API_NAN2_VER2: This ucode supports NAN API version 2
  * @IWL_UCODE_TLV_API_NEW_RX_STATS: should new RX STATISTICS API be used
+ * @IWL_UCODE_TLV_API_ATS_COEX_EXTERNAL: the coex notification is enlared to
+ *     include information about ACL time sharing.
  *
  * @NUM_IWL_UCODE_TLV_API: number of bits used
  */
@@ -262,6 +264,7 @@ enum iwl_ucode_tlv_api {
        /* API Set 1 */
        IWL_UCODE_TLV_API_NEW_BEACON_TEMPLATE   = (__force iwl_ucode_tlv_api_t)34,
        IWL_UCODE_TLV_API_NEW_RX_STATS          = (__force iwl_ucode_tlv_api_t)35,
+       IWL_UCODE_TLV_API_COEX_ATS_EXTERNAL     = (__force iwl_ucode_tlv_api_t)37,
 
        NUM_IWL_UCODE_TLV_API
 #ifdef __CHECKER__
index 890dbfff3a068a835e5f3050ac708a00da588de7..79c80f181f7d55031d5a5bc1cb3b3ae7291586f6 100644 (file)
@@ -7,6 +7,7 @@
  *
  * Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2017        Intel Deutschland GmbH
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -33,6 +34,7 @@
  *
  * Copyright(c) 2013 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2017        Intel Deutschland GmbH
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -512,17 +514,36 @@ void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
        struct iwl_rx_packet *pkt = rxb_addr(rxb);
        struct iwl_bt_coex_profile_notif *notif = (void *)pkt->data;
 
+       if (!iwl_mvm_has_new_ats_coex_api(mvm)) {
+               struct iwl_bt_coex_profile_notif_v4 *v4 = (void *)pkt->data;
+
+               mvm->last_bt_notif.mbox_msg[0] = v4->mbox_msg[0];
+               mvm->last_bt_notif.mbox_msg[1] = v4->mbox_msg[1];
+               mvm->last_bt_notif.mbox_msg[2] = v4->mbox_msg[2];
+               mvm->last_bt_notif.mbox_msg[3] = v4->mbox_msg[3];
+               mvm->last_bt_notif.msg_idx = v4->msg_idx;
+               mvm->last_bt_notif.bt_ci_compliance = v4->bt_ci_compliance;
+               mvm->last_bt_notif.primary_ch_lut = v4->primary_ch_lut;
+               mvm->last_bt_notif.secondary_ch_lut = v4->secondary_ch_lut;
+               mvm->last_bt_notif.bt_activity_grading =
+                       v4->bt_activity_grading;
+               mvm->last_bt_notif.ttc_status = v4->ttc_status;
+               mvm->last_bt_notif.rrc_status = v4->rrc_status;
+       } else {
+               /* save this notification for future use: rssi fluctuations */
+               memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));
+       }
+
        IWL_DEBUG_COEX(mvm, "BT Coex Notification received\n");
-       IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n", notif->bt_ci_compliance);
+       IWL_DEBUG_COEX(mvm, "\tBT ci compliance %d\n",
+                      mvm->last_bt_notif.bt_ci_compliance);
        IWL_DEBUG_COEX(mvm, "\tBT primary_ch_lut %d\n",
-                      le32_to_cpu(notif->primary_ch_lut));
+                      le32_to_cpu(mvm->last_bt_notif.primary_ch_lut));
        IWL_DEBUG_COEX(mvm, "\tBT secondary_ch_lut %d\n",
-                      le32_to_cpu(notif->secondary_ch_lut));
+                      le32_to_cpu(mvm->last_bt_notif.secondary_ch_lut));
        IWL_DEBUG_COEX(mvm, "\tBT activity grading %d\n",
-                      le32_to_cpu(notif->bt_activity_grading));
+                      le32_to_cpu(mvm->last_bt_notif.bt_activity_grading));
 
-       /* remember this notification for future use: rssi fluctuations */
-       memcpy(&mvm->last_bt_notif, notif, sizeof(mvm->last_bt_notif));
 
        iwl_mvm_bt_coex_notif_handle(mvm);
 }
index 3d7b5bd7a6b79d52675618c2a68444cd18e96e8b..c88a37397075e0f961ff74fbbcfbaa8a04640341 100644 (file)
@@ -482,7 +482,8 @@ static ssize_t iwl_dbgfs_disable_power_off_write(struct iwl_mvm *mvm, char *buf,
                                         true ? "\n" : ", ");
 
 static
-int iwl_mvm_coex_dump_mbox(struct iwl_bt_coex_profile_notif *notif, char *buf,
+int iwl_mvm_coex_dump_mbox(struct iwl_mvm *mvm,
+                          struct iwl_bt_coex_profile_notif *notif, char *buf,
                           int pos, int bufsz)
 {
        pos += scnprintf(buf+pos, bufsz-pos, "MBOX dw0:\n");
@@ -526,6 +527,7 @@ int iwl_mvm_coex_dump_mbox(struct iwl_bt_coex_profile_notif *notif, char *buf,
        BT_MBOX_PRINT(3, SCO_STATE, false);
        BT_MBOX_PRINT(3, SNIFF_STATE, false);
        BT_MBOX_PRINT(3, A2DP_STATE, false);
+       BT_MBOX_PRINT(3, A2DP_SRC, false);
        BT_MBOX_PRINT(3, ACL_STATE, false);
        BT_MBOX_PRINT(3, MSTR_STATE, false);
        BT_MBOX_PRINT(3, OBX_STATE, false);
@@ -535,7 +537,12 @@ int iwl_mvm_coex_dump_mbox(struct iwl_bt_coex_profile_notif *notif, char *buf,
        BT_MBOX_PRINT(3, INBAND_P, false);
        BT_MBOX_PRINT(3, MSG_TYPE_2, false);
        BT_MBOX_PRINT(3, SSN_2, false);
-       BT_MBOX_PRINT(3, UPDATE_REQUEST, true);
+       BT_MBOX_PRINT(3, UPDATE_REQUEST, !iwl_mvm_has_new_ats_coex_api(mvm));
+
+       if (iwl_mvm_has_new_ats_coex_api(mvm)) {
+               BT_MBOX_PRINT(4, ATS_BT_INTERVAL, false);
+               BT_MBOX_PRINT(4, ATS_BT_ACTIVE_MAX_TH, true);
+       }
 
        return pos;
 }
@@ -554,7 +561,7 @@ static ssize_t iwl_dbgfs_bt_notif_read(struct file *file, char __user *user_buf,
 
        mutex_lock(&mvm->mutex);
 
-       pos += iwl_mvm_coex_dump_mbox(notif, buf, pos, bufsz);
+       pos += iwl_mvm_coex_dump_mbox(mvm, notif, buf, pos, bufsz);
 
        pos += scnprintf(buf + pos, bufsz - pos, "bt_ci_compliance = %d\n",
                         notif->bt_ci_compliance);
index 54e5c8c6736bbd055371c81a625d310d1c0eaf50..d58de9b80886c69633b72838e53aab73773283dc 100644 (file)
@@ -1242,6 +1242,12 @@ static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
                          IWL_UCODE_TLV_API_NEW_RX_STATS);
 }
 
+static inline bool iwl_mvm_has_new_ats_coex_api(struct iwl_mvm *mvm)
+{
+       return fw_has_api(&mvm->fw->ucode_capa,
+                         IWL_UCODE_TLV_API_COEX_ATS_EXTERNAL);
+}
+
 static inline struct agg_tx_status *
 iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
 {