From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org, users@rt2x00.serialmonkey.com
Subject: [PATCH 7/9] rt2x00: Fix rt2800 USB TX Path DMA issue
Date: Sat, 13 Nov 2010 19:11:46 +0100 [thread overview]
Message-ID: <201011131911.47346.IvDoorn@gmail.com> (raw)
In-Reply-To: <201011131911.22874.IvDoorn@gmail.com>
From: RA-Jay Hung <Jay_Hung@ralinktech.com>
rt2800usb chips need to add 1~3 bytes zero padding after each 802.11 header & payload,
and at the end need to add 4 bytes zero padding whether doing TX bulk aggregation or not,
TXINFO_W0_USB_DMA_TX_PKT_LEN in TXINFO must include 1-3 bytes padding after 802.11 header & payload
but do not include 4 bytes end zero padding.
In rt2800usb_get_tx_data_len do not consider multiple of the USB packet size case, sometimes this will
cause USB DMA problem.
Signed-off-by: RA-Jay Hung <jay_hung@ralinktech.com>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
drivers/net/wireless/rt2x00/rt2800usb.c | 39 ++++++++++++++++++++----------
1 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 2933bf1..935b76d 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -307,8 +307,14 @@ static void rt2800usb_write_tx_desc(struct queue_entry *entry,
* Initialize TXINFO descriptor
*/
rt2x00_desc_read(txi, 0, &word);
+
+ /*
+ * The size of TXINFO_W0_USB_DMA_TX_PKT_LEN is
+ * TXWI + 802.11 header + L2 pad + payload + pad,
+ * so need to decrease size of TXINFO and USB end pad.
+ */
rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
- entry->skb->len - TXINFO_DESC_SIZE);
+ entry->skb->len - TXINFO_DESC_SIZE - 4);
rt2x00_set_field32(&word, TXINFO_W0_WIV,
!test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
@@ -326,22 +332,29 @@ static void rt2800usb_write_tx_desc(struct queue_entry *entry,
skbdesc->desc_len = TXINFO_DESC_SIZE + TXWI_DESC_SIZE;
}
-/*
- * TX data initialization
- */
-static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
+static void rt2800usb_write_tx_data(struct queue_entry *entry,
+ struct txentry_desc *txdesc)
{
- int length;
+ u8 padding_len;
/*
- * The length _must_ include 4 bytes padding,
- * it should always be multiple of 4,
- * but it must _not_ be a multiple of the USB packet size.
+ * pad(1~3 bytes) is added after each 802.11 payload.
+ * USB end pad(4 bytes) is added at each USB bulk out packet end.
+ * TX frame format is :
+ * | TXINFO | TXWI | 802.11 header | L2 pad | payload | pad | USB end pad |
+ * |<------------- tx_pkt_len ------------->|
*/
- length = roundup(entry->skb->len + 4, 4);
- length += (4 * !(length % entry->queue->usb_maxpacket));
+ rt2800_write_tx_data(entry, txdesc);
+ padding_len = roundup(entry->skb->len + 4, 4) - entry->skb->len;
+ memset(skb_put(entry->skb, padding_len), 0, padding_len);
+}
- return length;
+/*
+ * TX data initialization
+ */
+static int rt2800usb_get_tx_data_len(struct queue_entry *entry)
+{
+ return entry->skb->len;
}
/*
@@ -579,7 +592,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
.link_tuner = rt2800_link_tuner,
.watchdog = rt2800usb_watchdog,
.write_tx_desc = rt2800usb_write_tx_desc,
- .write_tx_data = rt2800_write_tx_data,
+ .write_tx_data = rt2800usb_write_tx_data,
.write_beacon = rt2800_write_beacon,
.get_tx_data_len = rt2800usb_get_tx_data_len,
.kick_tx_queue = rt2x00usb_kick_tx_queue,
--
1.7.2.3
next prev parent reply other threads:[~2010-11-13 18:14 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-13 18:08 [PATCH 1/9] rt2x00: Increase REGISTER_BUSY_COUNT Ivo van Doorn
2010-11-13 18:09 ` [PATCH 2/9] rt2x00: Add initial support for RT3370/RT3390 devices Ivo van Doorn
2010-11-13 18:10 ` [PATCH 3/9] rt2x00: Clean up Kconfig for RT2800 devices Ivo van Doorn
2010-11-13 18:10 ` [PATCH 4/9] rt2x00: Remove RT30XX Kconfig variables Ivo van Doorn
2010-11-13 18:10 ` [PATCH 5/9] rt2x00: Remove unneccessary internal Kconfig symbols Ivo van Doorn
2010-11-13 18:11 ` [PATCH 6/9] rt2x00: Use ioremap for SoC devices instead of KSEG1ADDR Ivo van Doorn
2010-11-13 18:11 ` Ivo van Doorn [this message]
2010-11-13 18:12 ` [PATCH 8/9] rt2x00: Fix header_length in rt2x00lib_txdone Ivo van Doorn
2010-11-13 18:13 ` [PATCH 9/9] rt2x00: Modify rt2x00queue_remove_l2pad to make skb->data two-byte alignment Ivo van Doorn
2010-11-16 15:45 ` Helmut Schaa
2010-11-17 8:46 ` Helmut Schaa
2010-11-17 10:16 ` RA-Jay Hung
2010-11-17 10:48 ` Helmut Schaa
2010-11-17 15:07 ` John W. Linville
2010-11-17 15:34 ` Gertjan van Wingerde
2010-11-17 16:41 ` Helmut Schaa
2010-11-18 1:47 ` [rt2x00-users] " David Ellingsworth
2010-11-22 7:00 ` Gertjan van Wingerde
2010-11-22 8:14 ` RA-Jay Hung
2010-11-22 10:05 ` Gertjan van Wingerde
2010-11-22 10:22 ` Helmut Schaa
2010-11-16 15:36 ` [PATCH 8/9] rt2x00: Fix header_length in rt2x00lib_txdone Helmut Schaa
2010-11-15 9:45 ` [PATCH 7/9] rt2x00: Fix rt2800 USB TX Path DMA issue Walter Goldens
2010-11-16 1:59 ` RA-Jay Hung
2010-11-16 15:59 ` Johannes Stezenbach
2010-11-16 16:11 ` Helmut Schaa
2010-11-16 16:34 ` Johannes Stezenbach
2010-11-16 16:42 ` Helmut Schaa
2010-11-16 16:53 ` Johannes Stezenbach
2010-11-16 17:00 ` Helmut Schaa
[not found] ` <AANLkTi=ANfE3s8RUmS5=qyofqHM2geRnatK-eCUjovEc@mail.gmail.com>
2010-11-16 19:06 ` Johannes Stezenbach
2010-11-16 19:23 ` Ivo Van Doorn
2010-11-16 19:26 ` Johannes Berg
2010-11-16 19:33 ` Ivo Van Doorn
2010-11-14 8:59 ` [PATCH 3/9] rt2x00: Clean up Kconfig for RT2800 devices Julian Calaby
2010-11-14 9:00 ` Julian Calaby
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201011131911.47346.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=users@rt2x00.serialmonkey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.