From patchwork Tue Aug 23 08:16:46 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kalle Valo X-Patchwork-Id: 1087652 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p7N8HERn008421 for ; Tue, 23 Aug 2011 08:17:26 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754765Ab1HWIRU (ORCPT ); Tue, 23 Aug 2011 04:17:20 -0400 Received: from wolverine01.qualcomm.com ([199.106.114.254]:64395 "EHLO wolverine01.qualcomm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754760Ab1HWIRO (ORCPT ); Tue, 23 Aug 2011 04:17:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=qca.qualcomm.com; i=kvalo@qca.qualcomm.com; q=dns/txt; s=qcdkim; t=1314087433; x=1345623433; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; z=From:=20Kalle=20Valo=20|To:=20|CC:=20Vasanthakumar=20Thia garajan=20|Subject:=20[PATCH =207/7]=20ath6kl:=20Fix=20system=20freeze=20under=20heavy =20data=20load|Date:=20Tue,=2023=20Aug=202011=2011:16:46 =20+0300|Message-ID:=20<1314087406-29188-8-git-send-email -kvalo@qca.qualcomm.com>|In-Reply-To:=20<1314087406-29188 -1-git-send-email-kvalo@qca.qualcomm.com>|References:=20< 1314087406-29188-1-git-send-email-kvalo@qca.qualcomm.com> |MIME-Version:=201.0; bh=r71ohQ2czFLx0pmOMWJ8L583RLI7vzfHK/3y9YphYjs=; b=RVoIo0sRxqOP70YHUn3b07A/7x5o1GFyYo4jAMVwlWkCfcaLSQMakaLk KpAZIeema5GhDc4932w8D64xaNxQwKjy4GRDI9Bt8H2oJ8HB0S2JWhOFx PaO3a0QsMr8M3IkT6yK6zIxLpEoMUU+lqDXCpZbDn4NfTbPyb/JtM8RNg o=; X-IronPort-AV: E=McAfee;i="5400,1158,6446"; a="112232577" Received: from ironmsg03-r.qualcomm.com ([172.30.46.17]) by wolverine01.qualcomm.com with ESMTP; 23 Aug 2011 01:17:13 -0700 X-IronPort-AV: E=Sophos;i="4.68,266,1312182000"; d="scan'208";a="101698668" Received: from nasanexhub04.qualcomm.com (HELO nasanexhub04.na.qualcomm.com) ([129.46.134.222]) by Ironmsg03-R.qualcomm.com with ESMTP/TLS/RC4-MD5; 23 Aug 2011 01:17:13 -0700 Received: from NASANEXHC14.na.qualcomm.com (172.30.48.23) by nasanexhub04.na.qualcomm.com (129.46.134.222) with Microsoft SMTP Server (TLS) id 8.3.83.0; Tue, 23 Aug 2011 01:17:12 -0700 Received: from NASJOEXHC01.na.qualcomm.com (10.234.56.15) by nasanexhc14.na.qualcomm.com (172.30.48.23) with Microsoft SMTP Server (TLS) id 14.1.323.3; Tue, 23 Aug 2011 01:17:12 -0700 Received: from localhost.localdomain (10.234.11.59) by qcamail1.atheros.com (10.234.56.15) with Microsoft SMTP Server (TLS) id 14.1.323.3; Tue, 23 Aug 2011 01:17:11 -0700 From: Kalle Valo To: CC: Vasanthakumar Thiagarajan Subject: [PATCH 7/7] ath6kl: Fix system freeze under heavy data load Date: Tue, 23 Aug 2011 11:16:46 +0300 Message-ID: <1314087406-29188-8-git-send-email-kvalo@qca.qualcomm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1314087406-29188-1-git-send-email-kvalo@qca.qualcomm.com> References: <1314087406-29188-1-git-send-email-kvalo@qca.qualcomm.com> MIME-Version: 1.0 X-Originating-IP: [10.234.11.59] Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Tue, 23 Aug 2011 08:17:27 +0000 (UTC) From: Vasanthakumar Thiagarajan Patch "ath6kl: Fix buffer alignment for scatter-gather write" does memmove for a length (scat_req->scat_list[i].len) which is not the actual length of data that is suppossed to be moved. The right lengh is packet->act_len + HTC_HDR_LENGTH. Using wrong length for data move during buffer alignment causes system freeze after the following WARN_ON and sometimes target assert. WARNING: at drivers/net/wireless/ath/ath6kl/main.c:771 ath6k_credit_distribute+0x196/0x1a0 [] ath6kl_htc_rxmsg_pending_handler+0x83f/0xe00 [ath6kl] [] ? __wake_up+0x53/0x70 [] ath6kldev_intr_bh_handler+0x188/0x650 [ath6kl] [] ath6kl_sdio_irq_handler+0x36/0x80 [ath6kl] [] sdio_irq_thread+0xfc/0x360 [] ? default_wake_function+0x12/0x20 [] ? sdio_claim_irq+0x220/0x220 [] kthread+0x96/0xa0 [] kernel_thread_helper+0x4/0x10 [] ? kthread_worker_fn+0x190/0x190 [] ? gs_change+0x13/0x13 Signed-off-by: Vasanthakumar Thiagarajan Signed-off-by: Kalle Valo --- drivers/net/wireless/ath/ath6kl/htc.c | 14 ++++++++++++++ drivers/net/wireless/ath/ath6kl/sdio.c | 15 --------------- drivers/net/wireless/ath/ath6kl/txrx.c | 6 ++++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/drivers/net/wireless/ath/ath6kl/htc.c b/drivers/net/wireless/ath/ath6kl/htc.c index 2001660..dc575a8 100644 --- a/drivers/net/wireless/ath/ath6kl/htc.c +++ b/drivers/net/wireless/ath/ath6kl/htc.c @@ -22,6 +22,17 @@ #define CALC_TXRX_PADDED_LEN(dev, len) (__ALIGN_MASK((len), (dev)->block_mask)) +static void ath6kl_htc_buf_align(u8 **buf, unsigned long len) +{ + u8 *align_addr; + + if (!IS_ALIGNED((unsigned long) *buf, 4)) { + align_addr = PTR_ALIGN(*buf - 4, 4); + memmove(align_addr, *buf, len); + *buf = align_addr; + } +} + static void htc_prep_send_pkt(struct htc_packet *packet, u8 flags, int ctrl0, int ctrl1) { @@ -391,6 +402,9 @@ static int htc_setup_send_scat_list(struct htc_target *target, htc_prep_send_pkt(packet, packet->info.tx.flags | HTC_FLAGS_SEND_BUNDLE, cred_pad, packet->info.tx.seqno); + /* Make sure the buffer is 4-byte aligned */ + ath6kl_htc_buf_align(&packet->buf, + packet->act_len + HTC_HDR_LENGTH); scat_req->scat_list[i].buf = packet->buf; scat_req->scat_list[i].len = len; diff --git a/drivers/net/wireless/ath/ath6kl/sdio.c b/drivers/net/wireless/ath/ath6kl/sdio.c index 852a0cc..0cce801 100644 --- a/drivers/net/wireless/ath/ath6kl/sdio.c +++ b/drivers/net/wireless/ath/ath6kl/sdio.c @@ -128,17 +128,6 @@ static int ath6kl_sdio_func0_cmd52_wr_byte(struct mmc_card *card, return mmc_wait_for_cmd(card->host, &io_cmd, 0); } -static void ath6kl_sdio_buf_align(u8 **buf, unsigned long len) -{ - u8 *align_addr; - - if (!IS_ALIGNED((unsigned long) *buf, 4)) { - align_addr = PTR_ALIGN(*buf - 4, 4); - memmove(align_addr, *buf, len); - *buf = align_addr; - } -} - static int ath6kl_sdio_io(struct sdio_func *func, u32 request, u32 addr, u8 *buf, u32 len) { @@ -224,10 +213,6 @@ static void ath6kl_sdio_setup_scat_data(struct hif_scatter_req *scat_req, /* assemble SG list */ for (i = 0; i < scat_req->scat_entries; i++, sg++) { - /* No header is added to rx buf, so it shoule be aligned */ - if (data->flags == MMC_DATA_WRITE) - ath6kl_sdio_buf_align(&scat_req->scat_list[i].buf, - scat_req->scat_list[i].len); ath6kl_dbg(ATH6KL_DBG_SCATTER, "%d: addr:0x%p, len:%d\n", i, scat_req->scat_list[i].buf, scat_req->scat_list[i].len); diff --git a/drivers/net/wireless/ath/ath6kl/txrx.c b/drivers/net/wireless/ath/ath6kl/txrx.c index ba1350d..ba33370 100644 --- a/drivers/net/wireless/ath/ath6kl/txrx.c +++ b/drivers/net/wireless/ath/ath6kl/txrx.c @@ -689,7 +689,8 @@ void ath6kl_rx_refill(struct htc_target *target, enum htc_endpoint_id endpoint) break; packet = (struct htc_packet *) skb->head; - skb->data = PTR_ALIGN(skb->data - 4, 4); + if (!IS_ALIGNED((unsigned long) skb->data, 4)) + skb->data = PTR_ALIGN(skb->data - 4, 4); set_htc_rxpkt_info(packet, skb, skb->data, ATH6KL_BUFFER_SIZE, endpoint); list_add_tail(&packet->list, &queue); @@ -710,7 +711,8 @@ void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count) return; packet = (struct htc_packet *) skb->head; - skb->data = PTR_ALIGN(skb->data - 4, 4); + if (!IS_ALIGNED((unsigned long) skb->data, 4)) + skb->data = PTR_ALIGN(skb->data - 4, 4); set_htc_rxpkt_info(packet, skb, skb->data, ATH6KL_AMSDU_BUFFER_SIZE, 0); spin_lock_bh(&ar->lock);