|
@@ -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);
|