ath10k: htc: ready_ext msg support
authorErik Stromdahl <erik.stromdahl@gmail.com>
Wed, 26 Apr 2017 09:17:58 +0000 (12:17 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Thu, 4 May 2017 12:55:45 +0000 (15:55 +0300)
Added support for extended ready message.
The extended ready message contains the maximum bundle
count supported by SDIO chipsets.

It is transmitted by SDIO chipset only and replaces the
"standard" ready message in this case.

Signed-off-by: Erik Stromdahl <erik.stromdahl@gmail.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/htc.c
drivers/net/wireless/ath/ath10k/htc.h

index 15b80562933660467d8590af85abcb36f4d734e5..e5c80f582ff51692233b0775f6ee4f0e0624f1f1 100644 (file)
@@ -586,8 +586,6 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
        unsigned long time_left;
        struct ath10k_htc_msg *msg;
        u16 message_id;
-       u16 credit_count;
-       u16 credit_size;
 
        time_left = wait_for_completion_timeout(&htc->ctl_resp,
                                                ATH10K_HTC_WAIT_TIMEOUT_HZ);
@@ -624,16 +622,14 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
 
        msg = (struct ath10k_htc_msg *)htc->control_resp_buffer;
        message_id   = __le16_to_cpu(msg->hdr.message_id);
-       credit_count = __le16_to_cpu(msg->ready.credit_count);
-       credit_size  = __le16_to_cpu(msg->ready.credit_size);
 
        if (message_id != ATH10K_HTC_MSG_READY_ID) {
                ath10k_err(ar, "Invalid HTC ready msg: 0x%x\n", message_id);
                return -ECOMM;
        }
 
-       htc->total_transmit_credits = credit_count;
-       htc->target_credit_size = credit_size;
+       htc->total_transmit_credits = __le16_to_cpu(msg->ready.credit_count);
+       htc->target_credit_size = __le16_to_cpu(msg->ready.credit_size);
 
        ath10k_dbg(ar, ATH10K_DBG_HTC,
                   "Target ready! transmit resources: %d size:%d\n",
@@ -646,6 +642,19 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
                return -ECOMM;
        }
 
+       /* The only way to determine if the ready message is an extended
+        * message is from the size.
+        */
+       if (htc->control_resp_len >=
+           sizeof(msg->hdr) + sizeof(msg->ready_ext)) {
+               htc->max_msgs_per_htc_bundle =
+                       min_t(u8, msg->ready_ext.max_msgs_per_htc_bundle,
+                             HTC_HOST_MAX_MSG_PER_BUNDLE);
+               ath10k_dbg(ar, ATH10K_DBG_HTC,
+                          "Extended ready message. RX bundle size: %d\n",
+                          htc->max_msgs_per_htc_bundle);
+       }
+
        return 0;
 }
 
@@ -841,6 +850,13 @@ int ath10k_htc_start(struct ath10k_htc *htc)
        msg->hdr.message_id =
                __cpu_to_le16(ATH10K_HTC_MSG_SETUP_COMPLETE_EX_ID);
 
+       if (ar->hif.bus == ATH10K_BUS_SDIO) {
+               /* Extra setup params used by SDIO */
+               msg->setup_complete_ext.flags =
+                       __cpu_to_le32(ATH10K_HTC_SETUP_COMPLETE_FLAGS_RX_BNDL_EN);
+               msg->setup_complete_ext.max_msgs_per_bundled_recv =
+                       htc->max_msgs_per_htc_bundle;
+       }
        ath10k_dbg(ar, ATH10K_DBG_HTC, "HTC is using TX credit flow control\n");
 
        status = ath10k_htc_send(htc, ATH10K_HTC_EP_0, skb);
index ae6003495649b95e5ddae425fe517a76793d15be..24663b07eeaca733b99cc324e78919c1de8f0875 100644 (file)
@@ -112,6 +112,10 @@ enum ath10k_htc_conn_svc_status {
        ATH10K_HTC_CONN_SVC_STATUS_NO_MORE_EP   = 4
 };
 
+enum ath10k_htc_setup_complete_flags {
+       ATH10K_HTC_SETUP_COMPLETE_FLAGS_RX_BNDL_EN = 1
+};
+
 struct ath10k_ath10k_htc_msg_hdr {
        __le16 message_id; /* @enum htc_message_id */
 } __packed;
@@ -360,6 +364,7 @@ struct ath10k_htc {
 
        int total_transmit_credits;
        int target_credit_size;
+       u8 max_msgs_per_htc_bundle;
 };
 
 int ath10k_htc_init(struct ath10k *ar);