فهرست منبع

ath6kl: Complete failed tx packet in ath6kl_htc_tx_from_queue()

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>
Vasanthakumar Thiagarajan 13 سال پیش
والد
کامیت
93b42cae16
2فایلهای تغییر یافته به همراه8 افزوده شده و 2 حذف شده
  1. 7 1
      drivers/net/wireless/ath/ath6kl/htc_mbox.c
  2. 1 1
      drivers/net/wireless/ath/ath6kl/sdio.c

+ 7 - 1
drivers/net/wireless/ath/ath6kl/htc_mbox.c

@@ -854,6 +854,7 @@ static void ath6kl_htc_tx_from_queue(struct htc_target *target,
 	int bundle_sent;
 	int bundle_sent;
 	int n_pkts_bundle;
 	int n_pkts_bundle;
 	u8 ac = WMM_NUM_AC;
 	u8 ac = WMM_NUM_AC;
+	int status;
 
 
 	spin_lock_bh(&target->tx_lock);
 	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,
 			ath6kl_htc_tx_prep_pkt(packet, packet->info.tx.flags,
 					       0, packet->info.tx.seqno);
 					       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);
 		spin_lock_bh(&target->tx_lock);

+ 1 - 1
drivers/net/wireless/ath/ath6kl/sdio.c

@@ -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);
 	bus_req = ath6kl_sdio_alloc_busreq(ar_sdio);
 
 
-	if (!bus_req)
+	if (WARN_ON_ONCE(!bus_req))
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	bus_req->address = address;
 	bus_req->address = address;