Commit f7a7e7ae authored by Vasanthakumar Thiagarajan's avatar Vasanthakumar Thiagarajan Committed by Kalle Valo

ath6kl: Avoid rolling back of entire scatter setup in case of failure

Current tx scatter gather implementation rolls back the entire
scatter setup in case of a failure in setting up just one packet
into the bundle. Instead of dopping the whole scatter setup,
send the packets available just before the failure one using
scatter gather I/O.
Signed-off-by: default avatarVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 3ce6ff50
...@@ -381,13 +381,7 @@ static int htc_setup_send_scat_list(struct htc_target *target, ...@@ -381,13 +381,7 @@ static int htc_setup_send_scat_list(struct htc_target *target,
cred_pad = htc_get_credit_padding(target->tgt_cred_sz, cred_pad = htc_get_credit_padding(target->tgt_cred_sz,
&len, endpoint); &len, endpoint);
if (cred_pad < 0) { if (cred_pad < 0 || rem_scat < len) {
status = -EINVAL;
break;
}
if (rem_scat < len) {
/* exceeds what we can transfer */
status = -ENOSPC; status = -ENOSPC;
break; break;
} }
...@@ -416,7 +410,7 @@ static int htc_setup_send_scat_list(struct htc_target *target, ...@@ -416,7 +410,7 @@ static int htc_setup_send_scat_list(struct htc_target *target,
} }
/* Roll back scatter setup in case of any failure */ /* Roll back scatter setup in case of any failure */
if (status || (scat_req->scat_entries < HTC_MIN_HTC_MSGS_TO_BUNDLE)) { if (scat_req->scat_entries < HTC_MIN_HTC_MSGS_TO_BUNDLE) {
for (i = scat_req->scat_entries - 1; i >= 0; i--) { for (i = scat_req->scat_entries - 1; i >= 0; i--) {
packet = scat_req->scat_list[i].packet; packet = scat_req->scat_list[i].packet;
if (packet) { if (packet) {
...@@ -424,10 +418,10 @@ static int htc_setup_send_scat_list(struct htc_target *target, ...@@ -424,10 +418,10 @@ static int htc_setup_send_scat_list(struct htc_target *target,
list_add(&packet->list, queue); list_add(&packet->list, queue);
} }
} }
return -EINVAL; return -EAGAIN;
} }
return 0; return status;
} }
/* /*
...@@ -447,8 +441,10 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint, ...@@ -447,8 +441,10 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint,
struct htc_target *target = endpoint->target; struct htc_target *target = endpoint->target;
struct hif_scatter_req *scat_req = NULL; struct hif_scatter_req *scat_req = NULL;
int n_scat, n_sent_bundle = 0, tot_pkts_bundle = 0; int n_scat, n_sent_bundle = 0, tot_pkts_bundle = 0;
int status;
while (true) { while (true) {
status = 0;
n_scat = get_queue_depth(queue); n_scat = get_queue_depth(queue);
n_scat = min(n_scat, target->msg_per_bndl_max); n_scat = min(n_scat, target->msg_per_bndl_max);
...@@ -471,8 +467,9 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint, ...@@ -471,8 +467,9 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint,
scat_req->len = 0; scat_req->len = 0;
scat_req->scat_entries = 0; scat_req->scat_entries = 0;
if (htc_setup_send_scat_list(target, endpoint, scat_req, status = htc_setup_send_scat_list(target, endpoint,
n_scat, queue)) { scat_req, n_scat, queue);
if (status == -EAGAIN) {
hif_scatter_req_add(target->dev->ar, scat_req); hif_scatter_req_add(target->dev->ar, scat_req);
break; break;
} }
...@@ -486,6 +483,9 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint, ...@@ -486,6 +483,9 @@ static void htc_issue_send_bundle(struct htc_endpoint *endpoint,
"send scatter total bytes: %d , entries: %d\n", "send scatter total bytes: %d , entries: %d\n",
scat_req->len, scat_req->scat_entries); scat_req->len, scat_req->scat_entries);
ath6kldev_submit_scat_req(target->dev, scat_req, false); ath6kldev_submit_scat_req(target->dev, scat_req, false);
if (status)
break;
} }
*sent_bundle = n_sent_bundle; *sent_bundle = n_sent_bundle;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment