ath6kl: Complete failed tx packet in ath6kl_htc_tx_from_queue()
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Thu, 26 Apr 2012 14:56:14 +0000 (20:26 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 30 Apr 2012 07:56:24 +0000 (10:56 +0300)
Return status of ath6kl_htc_tx_issue() is ignored in
ath6kl_htc_tx_from_queue(), but failed tx packet is
is not cleaned up. To fix memory leak in this case, call
completion with error. Also, throw an error debug message
when tx fails in ath6kl_sdio_write_async() due to shortage
in bus request buffer.

kvalo: change the error message to WARN_ON_ONCE()

Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/htc_mbox.c
drivers/net/wireless/ath/ath6kl/sdio.c

index 89eccadd53862455b93c864b6caa495f36965878..2798624d3a9d28f9d3873cdbc8a52fa9bff68f44 100644 (file)
@@ -854,6 +854,7 @@ static void ath6kl_htc_tx_from_queue(struct htc_target *target,
        int bundle_sent;
        int n_pkts_bundle;
        u8 ac = WMM_NUM_AC;
+       int status;
 
        spin_lock_bh(&target->tx_lock);
 
@@ -915,7 +916,12 @@ static void ath6kl_htc_tx_from_queue(struct htc_target *target,
 
                        ath6kl_htc_tx_prep_pkt(packet, packet->info.tx.flags,
                                               0, packet->info.tx.seqno);
-                       ath6kl_htc_tx_issue(target, packet);
+                       status = ath6kl_htc_tx_issue(target, packet);
+
+                       if (status) {
+                               packet->status = status;
+                               packet->completion(packet->context, packet);
+                       }
                }
 
                spin_lock_bh(&target->tx_lock);
index 0384a0fb654f8608f249e95dc5649c9f84f349ad..05b95405f7b56131b4cbf49a66d165a8f661861e 100644 (file)
@@ -552,7 +552,7 @@ static int ath6kl_sdio_write_async(struct ath6kl *ar, u32 address, u8 *buffer,
 
        bus_req = ath6kl_sdio_alloc_busreq(ar_sdio);
 
-       if (!bus_req)
+       if (WARN_ON_ONCE(!bus_req))
                return -ENOMEM;
 
        bus_req->address = address;