diff for duplicates of <20190218135247.GA9602@redhat.com> diff --git a/a/1.txt b/N1/1.txt index 57b285e..b2bd0e2 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -42,121 +42,3 @@ It's possible that without this vco calibration fix, MT7610U device does not see AP if it's signal is weak. Stanislaw -From d420961afd1ae2ca8590ee2c79defc0a48fa8e73 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka <sgruszka@redhat.com> -Date: Mon, 18 Feb 2019 14:39:38 +0100 -Subject: [PATCH] mt76x02: make sure probe request skb's are 4 bytes aligned - -We add 2 bytes header pad if header length is not multiple of 4 bytes, -this assure most tx skb buffers are 4 bytes aligned. But this is not -true for probe request frames which have n*4 bytes header length and -are not aligned. - -I think is ok to assume that frames have to be 4 bytes aligned -for DMA purpose, so mt76 driver should take care of that. - -Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> ---- - drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +- - drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c | 5 +--- - .../net/wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- - drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 32 +++++++++++++++------- - 4 files changed, 25 insertions(+), 16 deletions(-) - -diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02.h b/drivers/net/wireless/mediatek/mt76/mt76x02.h -index 6d96766a6ed3..ad329db7de4e 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76x02.h -+++ b/drivers/net/wireless/mediatek/mt76/mt76x02.h -@@ -155,7 +155,7 @@ void mt76x02_set_tx_ackto(struct mt76x02_dev *dev); - void mt76x02_set_coverage_class(struct ieee80211_hw *hw, - s16 coverage_class); - int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val); --int mt76x02_insert_hdr_pad(struct sk_buff *skb); -+void mt76x02_align_skb(struct sk_buff *skb); - void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len); - bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update); - void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, -diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c b/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c -index a5413a309a0a..63c5520a65ca 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c -+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c -@@ -163,7 +163,6 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, - struct mt76x02_txwi *txwi = txwi_ptr; - int qsel = MT_QSEL_EDCA; - int pid; -- int ret; - - if (q == &dev->mt76.q_tx[MT_TXQ_PSD] && wcid && wcid->idx < 128) - mt76x02_mac_wcid_set_drop(dev, wcid->idx, false); -@@ -173,9 +172,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, - pid = mt76_tx_status_skb_add(mdev, wcid, skb); - txwi->pktid = pid; - -- ret = mt76x02_insert_hdr_pad(skb); -- if (ret < 0) -- return ret; -+ mt76x02_align_skb(skb); - - if (pid >= MT_PACKET_ID_FIRST) - qsel = MT_QSEL_MGMT; -diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c -index 098d05e109e7..bd5838c26f43 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c -+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c -@@ -79,7 +79,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data, - u32 flags; - int pid; - -- mt76x02_insert_hdr_pad(skb); -+ mt76x02_align_skb(skb); - - txwi = skb_push(skb, sizeof(struct mt76x02_txwi)); - mt76x02_mac_write_txwi(dev, txwi, skb, wcid, sta, len); -diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c -index 062614ad0d51..08425b1d2c30 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c -+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c -@@ -550,21 +550,33 @@ void mt76x02_sta_rate_tbl_update(struct ieee80211_hw *hw, - } - EXPORT_SYMBOL_GPL(mt76x02_sta_rate_tbl_update); - --int mt76x02_insert_hdr_pad(struct sk_buff *skb) -+void mt76x02_align_skb(struct sk_buff *skb) - { -- int len = ieee80211_get_hdrlen_from_skb(skb); -+ int align = ((unsigned long) skb->data) & 3; -+ int hdrlen, skblen; - -- if (len % 4 == 0) -- return 0; -+ hdrlen = ieee80211_get_hdrlen_from_skb(skb); -+ WARN_ON_ONCE(align == 0 && (hdrlen & 3)); -+ -+ if (align == 0) -+ return; - -- skb_push(skb, 2); -- memmove(skb->data, skb->data + 2, len); -+ if (hdrlen & 3) { -+ /* Align frame and add 2 bytes pad after header. */ -+ skb_push(skb, 2); -+ memmove(skb->data, skb->data + 2, hdrlen); - -- skb->data[len] = 0; -- skb->data[len + 1] = 0; -- return 2; -+ skb->data[hdrlen] = 0; -+ skb->data[hdrlen + 1] = 0; -+ } else { -+ /* Only for probe request frames. */ -+ skblen = skb->len; -+ skb_push(skb, 2); -+ memmove(skb->data, skb->data + 2, skblen); -+ skb_trim(skb, skblen); -+ } - } --EXPORT_SYMBOL_GPL(mt76x02_insert_hdr_pad); -+EXPORT_SYMBOL_GPL(mt76x02_align_skb); - - void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len) - { diff --git a/N1/2.hdr b/N1/2.hdr new file mode 100644 index 0000000..4860a7e --- /dev/null +++ b/N1/2.hdr @@ -0,0 +1,2 @@ +Content-Type: text/plain; charset=us-ascii +Content-Disposition: attachment; filename="0005-mt76x02-make-sure-probe-request-skb-s-are-4-bytes-al.patch" diff --git a/N1/2.txt b/N1/2.txt new file mode 100644 index 0000000..266d287 --- /dev/null +++ b/N1/2.txt @@ -0,0 +1,120 @@ +From d420961afd1ae2ca8590ee2c79defc0a48fa8e73 Mon Sep 17 00:00:00 2001 +From: Stanislaw Gruszka <sgruszka@redhat.com> +Date: Mon, 18 Feb 2019 14:39:38 +0100 +Subject: [PATCH] mt76x02: make sure probe request skb's are 4 bytes aligned + +We add 2 bytes header pad if header length is not multiple of 4 bytes, +this assure most tx skb buffers are 4 bytes aligned. But this is not +true for probe request frames which have n*4 bytes header length and +are not aligned. + +I think is ok to assume that frames have to be 4 bytes aligned +for DMA purpose, so mt76 driver should take care of that. + +Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> +--- + drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +- + drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c | 5 +--- + .../net/wireless/mediatek/mt76/mt76x02_usb_core.c | 2 +- + drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 32 +++++++++++++++------- + 4 files changed, 25 insertions(+), 16 deletions(-) + +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02.h b/drivers/net/wireless/mediatek/mt76/mt76x02.h +index 6d96766a6ed3..ad329db7de4e 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02.h ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02.h +@@ -155,7 +155,7 @@ void mt76x02_set_tx_ackto(struct mt76x02_dev *dev); + void mt76x02_set_coverage_class(struct ieee80211_hw *hw, + s16 coverage_class); + int mt76x02_set_rts_threshold(struct ieee80211_hw *hw, u32 val); +-int mt76x02_insert_hdr_pad(struct sk_buff *skb); ++void mt76x02_align_skb(struct sk_buff *skb); + void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len); + bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update); + void mt76x02_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c b/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +index a5413a309a0a..63c5520a65ca 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c +@@ -163,7 +163,6 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, + struct mt76x02_txwi *txwi = txwi_ptr; + int qsel = MT_QSEL_EDCA; + int pid; +- int ret; + + if (q == &dev->mt76.q_tx[MT_TXQ_PSD] && wcid && wcid->idx < 128) + mt76x02_mac_wcid_set_drop(dev, wcid->idx, false); +@@ -173,9 +172,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, + pid = mt76_tx_status_skb_add(mdev, wcid, skb); + txwi->pktid = pid; + +- ret = mt76x02_insert_hdr_pad(skb); +- if (ret < 0) +- return ret; ++ mt76x02_align_skb(skb); + + if (pid >= MT_PACKET_ID_FIRST) + qsel = MT_QSEL_MGMT; +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +index 098d05e109e7..bd5838c26f43 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +@@ -79,7 +79,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data, + u32 flags; + int pid; + +- mt76x02_insert_hdr_pad(skb); ++ mt76x02_align_skb(skb); + + txwi = skb_push(skb, sizeof(struct mt76x02_txwi)); + mt76x02_mac_write_txwi(dev, txwi, skb, wcid, sta, len); +diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c +index 062614ad0d51..08425b1d2c30 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt76x02_util.c ++++ b/drivers/net/wireless/mediatek/mt76/mt76x02_util.c +@@ -550,21 +550,33 @@ void mt76x02_sta_rate_tbl_update(struct ieee80211_hw *hw, + } + EXPORT_SYMBOL_GPL(mt76x02_sta_rate_tbl_update); + +-int mt76x02_insert_hdr_pad(struct sk_buff *skb) ++void mt76x02_align_skb(struct sk_buff *skb) + { +- int len = ieee80211_get_hdrlen_from_skb(skb); ++ int align = ((unsigned long) skb->data) & 3; ++ int hdrlen, skblen; + +- if (len % 4 == 0) +- return 0; ++ hdrlen = ieee80211_get_hdrlen_from_skb(skb); ++ WARN_ON_ONCE(align == 0 && (hdrlen & 3)); ++ ++ if (align == 0) ++ return; + +- skb_push(skb, 2); +- memmove(skb->data, skb->data + 2, len); ++ if (hdrlen & 3) { ++ /* Align frame and add 2 bytes pad after header. */ ++ skb_push(skb, 2); ++ memmove(skb->data, skb->data + 2, hdrlen); + +- skb->data[len] = 0; +- skb->data[len + 1] = 0; +- return 2; ++ skb->data[hdrlen] = 0; ++ skb->data[hdrlen + 1] = 0; ++ } else { ++ /* Only for probe request frames. */ ++ skblen = skb->len; ++ skb_push(skb, 2); ++ memmove(skb->data, skb->data + 2, skblen); ++ skb_trim(skb, skblen); ++ } + } +-EXPORT_SYMBOL_GPL(mt76x02_insert_hdr_pad); ++EXPORT_SYMBOL_GPL(mt76x02_align_skb); + + void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len) + { +-- +2.7.5 diff --git a/a/content_digest b/N1/content_digest index 31ce378..facac91 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,5 +1,15 @@ + "ref\0Pine.LNX.4.44L0.1902111246410.1543-100000@iolanthe.rowland.org\0" + "ref\0CAJ0CqmVFVBXi5E07-ZsYojC7mP4ogpwbcDkDTeebHwX+ayz2DQ@mail.gmail.com\0" + "ref\020190212093035.GB12906@redhat.com\0" + "ref\0404607590.373282.1550126997144@email.ionos.de\0" + "ref\020190214092530.GA17273@redhat.com\0" + "ref\0878a7160-2e91-d057-6d27-c6b9d85f700e@i2se.com\0" + "ref\020190215071226.GA2372@redhat.com\0" + "ref\01411983628.668277.1550315118443@email.ionos.de\0" + "ref\020190216140739.GA2236@redhat.com\0" + "ref\02009016263.528260.1550344627996@email.ionos.de\0" "From\0Stanislaw Gruszka <sgruszka@redhat.com>\0" - "Subject\0[BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+\0" + "Subject\0Re: [BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+\0" "Date\0Mon, 18 Feb 2019 14:52:47 +0100\0" "To\0Stefan Wahren <stefan.wahren@i2se.com>\0" "Cc\0Lorenzo Bianconi <lorenzo.bianconi@redhat.com>" @@ -9,7 +19,7 @@ Minas Harutyunyan <hminas@synopsys.com> USB list <linux-usb@vger.kernel.org> " linux-wireless <linux-wireless@vger.kernel.org>\0" - "\00:1\0" + "\01:1\0" "b\0" "On Sat, Feb 16, 2019 at 08:17:07PM +0100, Stefan Wahren wrote:\n" "> this is a misunderstanding. The warning is about memory alignment to 32 bit addresses, not about page alignment. This is a typical ARM restriction. Maybe we need to make sure in mt76 that the DMA buffer needs to be aligned. But it's also possible that the warning isn't the root cause of our problem.\n" @@ -54,7 +64,10 @@ "It's possible that without this vco calibration fix, MT7610U device\n" "does not see AP if it's signal is weak.\n" "\n" - "Stanislaw\n" + Stanislaw + "\01:2\0" + "fn\00005-mt76x02-make-sure-probe-request-skb-s-are-4-bytes-al.patch\0" + "b\0" "From d420961afd1ae2ca8590ee2c79defc0a48fa8e73 Mon Sep 17 00:00:00 2001\n" "From: Stanislaw Gruszka <sgruszka@redhat.com>\n" "Date: Mon, 18 Feb 2019 14:39:38 +0100\n" @@ -172,6 +185,8 @@ "+EXPORT_SYMBOL_GPL(mt76x02_align_skb);\n" " \n" " void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len)\n" - { + " {\n" + "-- \n" + 2.7.5 -49113b06110c00889a328b2f2f66a38c515c3e16d5079c50cfc123dbc6423364 +6e41cb435119a8699f7610931a142ab182529a5e446ed7beb2db07d283775d13
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.