From 0b2c42ced21a7bc053e0d729f85041f1e3b54fbc Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 7 Jul 2019 00:08:20 +0200 Subject: mac80211: Update to version 5.2-rc7 This updates mac80211 to version 5.2-rc7, this contains all the changes to the wireless subsystem up to Linux 5.2-rc7. * The removed patches are applied upstream * b43 now uses kmod-lib-cordic * Update the nl80211.h file in iw to match backports version. * Remove the two backports from kernel 4.9, they were needed for mt76, but that can use the version from backports now, otherwise they collide and cause compile errors. Signed-off-by: Hauke Mehrtens --- .../001-rt2x00-use-simple_read_from_buffer.patch | 59 -- ...-usb-specific-txdone-txstatus-routines-to.patch | 357 -------- ...mio-use-txdone-txstatus-routines-from-lib.patch | 244 ------ ...ot-check-for-txstatus-timeout-every-time-.patch | 72 -- ...different-txstatus-timeouts-when-flushing.patch | 112 --- ...-flush-and-txstatus-rework-for-rt2800mmio.patch | 238 ----- ...2400pci-mark-expected-switch-fall-through.patch | 25 - ...2500pci-mark-expected-switch-fall-through.patch | 25 - ...800lib-mark-expected-switch-fall-throughs.patch | 44 - ...rt61pci-mark-expected-switch-fall-through.patch | 25 - ...-cross-tree-phase-out-dma_zalloc_coherent.patch | 40 - ...educe-tx-power-to-nominal-level-on-RT6352.patch | 32 - ...rk-around-a-firmware-bug-with-shared-keys.patch | 143 --- ...eed-to-check-return-value-of-debugfs_crea.patch | 107 --- .../rt2x00/015-rt2x00-remove-unneeded-check.patch | 137 --- .../016-rt2x00-remove-confusing-AGC-register.patch | 34 - ...0-enable-TX_PIN_CFG_LNA_PE_-bits-per-band.patch | 47 - ...enable-TX_PIN_CFG_RFRX_EN-only-for-MT7620.patch | 41 - ...-comment-and-simplify-AGC-init-for-RT6352.patch | 33 - ...-add-ratelimited-variants-of-err-and-warn.patch | 39 - ...use-ratelimited-variants-dev_warn-dev_err.patch | 42 - .../022-rt2x00-check-number-of-EPROTO-errors.patch | 96 --- ...x00-do-not-print-error-when-queue-is-full.patch | 43 - ...ially-restore-old-mmio-txstatus-behaviour.patch | 128 --- ...-new-flush-implementation-for-SoC-devices.patch | 27 - .../026-rt2800-move-txstatus-pending-routine.patch | 106 --- .../027-rt2800mmio-fetch-tx-status-changes.patch | 61 -- ...use-timer-and-work-for-handling-tx-status.patch | 194 ----- .../029-rt2x00-remove-last_nostatus_check.patch | 57 -- .../030-rt2x00-remove-not-used-entry-field.patch | 34 - .../031-rt2x00mmio-remove-legacy-comment.patch | 26 - ...ot-increment-sequence-number-while-re-tra.patch | 94 -- .../rt2x00/050-rt2x00-add-RT3883-support.patch | 959 --------------------- .../patches/rt2x00/100-rt2x00_options.patch | 2 +- ...llow-to-build-rt2800soc-module-for-RT3883.patch | 4 +- .../601-rt2x00-introduce-rt2x00_platform_h.patch | 2 +- .../rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch | 28 +- ...-eeprom-on-SoC-from-a-mtd-device-defines-.patch | 2 +- ...low_disabling_bands_through_platform_data.patch | 4 +- .../607-rt2x00-add_platform_data_mac_addr.patch | 4 +- ...-rt2x00-allow_disabling_bands_through_dts.patch | 2 +- ...e-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch | 2 +- .../610-rt2x00-change-led-polarity-from-OF.patch | 6 +- .../rt2x00/611-rt2x00-add-AP+STA-support.patch | 2 +- ...x00-add-support-for-external-PA-on-MT7620.patch | 8 +- .../982-rt2x00-add-rf-self-txdc-calibration.patch | 8 +- .../rt2x00/983-rt2x00-add-r-calibration.patch | 8 +- .../rt2x00/984-rt2x00-add-rxdcoc-calibration.patch | 8 +- .../rt2x00/985-rt2x00-add-rxiq-calibration.patch | 8 +- .../986-rt2x00-add-TX-LOFT-calibration.patch | 10 +- 50 files changed, 54 insertions(+), 3775 deletions(-) delete mode 100644 package/kernel/mac80211/patches/rt2x00/001-rt2x00-use-simple_read_from_buffer.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/002-rt2800-move-usb-specific-txdone-txstatus-routines-to.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/003-rt2800mmio-use-txdone-txstatus-routines-from-lib.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/004-rt2x00-do-not-check-for-txstatus-timeout-every-time-.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/006-rt2800-flush-and-txstatus-rework-for-rt2800mmio.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/007-rt2x00-rt2400pci-mark-expected-switch-fall-through.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/008-rt2x00-rt2500pci-mark-expected-switch-fall-through.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/009-rt2x00-rt2800lib-mark-expected-switch-fall-throughs.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/010-rt2x00-rt61pci-mark-expected-switch-fall-through.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/011-cross-tree-phase-out-dma_zalloc_coherent.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/012-rt2x00-reduce-tx-power-to-nominal-level-on-RT6352.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/013-rt2x00-Work-around-a-firmware-bug-with-shared-keys.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/014-rt2x00-no-need-to-check-return-value-of-debugfs_crea.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/015-rt2x00-remove-unneeded-check.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/016-rt2x00-remove-confusing-AGC-register.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/017-rt2800-enable-TX_PIN_CFG_LNA_PE_-bits-per-band.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/018-rt2800-enable-TX_PIN_CFG_RFRX_EN-only-for-MT7620.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/019-rt2800-comment-and-simplify-AGC-init-for-RT6352.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/020-cfg80211-add-ratelimited-variants-of-err-and-warn.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/021-rt2x00-use-ratelimited-variants-dev_warn-dev_err.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/022-rt2x00-check-number-of-EPROTO-errors.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/023-rt2x00-do-not-print-error-when-queue-is-full.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/024-rt2800-partially-restore-old-mmio-txstatus-behaviour.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/025-rt2800-new-flush-implementation-for-SoC-devices.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/026-rt2800-move-txstatus-pending-routine.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/027-rt2800mmio-fetch-tx-status-changes.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/028-rt2800mmio-use-timer-and-work-for-handling-tx-status.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/029-rt2x00-remove-last_nostatus_check.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/030-rt2x00-remove-not-used-entry-field.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/031-rt2x00mmio-remove-legacy-comment.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/032-rt2x00-do-not-increment-sequence-number-while-re-tra.patch delete mode 100644 package/kernel/mac80211/patches/rt2x00/050-rt2x00-add-RT3883-support.patch (limited to 'package/kernel/mac80211/patches/rt2x00') diff --git a/package/kernel/mac80211/patches/rt2x00/001-rt2x00-use-simple_read_from_buffer.patch b/package/kernel/mac80211/patches/rt2x00/001-rt2x00-use-simple_read_from_buffer.patch deleted file mode 100644 index 1319cc244c..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/001-rt2x00-use-simple_read_from_buffer.patch +++ /dev/null @@ -1,59 +0,0 @@ -From f483039cf51acf30494cd754194562c22cf98764 Mon Sep 17 00:00:00 2001 -From: Dan Carpenter -Date: Wed, 22 Aug 2018 13:41:26 +0300 -Subject: [PATCH 01/28] rt2x00: use simple_read_from_buffer() - -The problem with this copy_to_user() calls is that they don't ensure -that "size" is less than the "length" which the user provided. - -Obviously, this is debugfs and "size" is normally going to be very small -so it probably doesn't matter, but this is the correct thing to do. - -Signed-off-by: Dan Carpenter -Acked-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2x00debug.c | 18 +++--------------- - 1 file changed, 3 insertions(+), 15 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -@@ -464,11 +464,7 @@ static ssize_t rt2x00debug_read_##__name - \ - size = sprintf(line, __format, value); \ - \ -- if (copy_to_user(buf, line, size)) \ -- return -EFAULT; \ -- \ -- *offset += size; \ -- return size; \ -+ return simple_read_from_buffer(buf, length, offset, line, size); \ - } - - #define RT2X00DEBUGFS_OPS_WRITE(__name, __type) \ -@@ -545,11 +541,7 @@ static ssize_t rt2x00debug_read_dev_flag - - size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->flags); - -- if (copy_to_user(buf, line, size)) -- return -EFAULT; -- -- *offset += size; -- return size; -+ return simple_read_from_buffer(buf, length, offset, line, size); - } - - static const struct file_operations rt2x00debug_fop_dev_flags = { -@@ -574,11 +566,7 @@ static ssize_t rt2x00debug_read_cap_flag - - size = sprintf(line, "0x%.8x\n", (unsigned int)intf->rt2x00dev->cap_flags); - -- if (copy_to_user(buf, line, size)) -- return -EFAULT; -- -- *offset += size; -- return size; -+ return simple_read_from_buffer(buf, length, offset, line, size); - } - - static const struct file_operations rt2x00debug_fop_cap_flags = { diff --git a/package/kernel/mac80211/patches/rt2x00/002-rt2800-move-usb-specific-txdone-txstatus-routines-to.patch b/package/kernel/mac80211/patches/rt2x00/002-rt2800-move-usb-specific-txdone-txstatus-routines-to.patch deleted file mode 100644 index a883258a4c..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/002-rt2800-move-usb-specific-txdone-txstatus-routines-to.patch +++ /dev/null @@ -1,357 +0,0 @@ -From 5c656c71b1bf5611ce8262bab338104e04d10b8d Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 26 Sep 2018 12:24:53 +0200 -Subject: [PATCH 02/28] rt2800: move usb specific txdone/txstatus routines to - rt2800lib - -In order to reuse usb txdone/txstatus routines for mmio, move them -to common rt2800lib.c file. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 138 +++++++++++++++++ - .../net/wireless/ralink/rt2x00/rt2800lib.h | 3 + - .../net/wireless/ralink/rt2x00/rt2800usb.c | 143 +----------------- - 3 files changed, 145 insertions(+), 139 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -957,6 +957,47 @@ static void rt2800_rate_from_status(stru - skbdesc->tx_rate_flags = flags; - } - -+static bool rt2800_txdone_entry_check(struct queue_entry *entry, u32 reg) -+{ -+ __le32 *txwi; -+ u32 word; -+ int wcid, ack, pid; -+ int tx_wcid, tx_ack, tx_pid, is_agg; -+ -+ /* -+ * This frames has returned with an IO error, -+ * so the status report is not intended for this -+ * frame. -+ */ -+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) -+ return false; -+ -+ wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID); -+ ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED); -+ pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE); -+ is_agg = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE); -+ -+ /* -+ * Validate if this TX status report is intended for -+ * this entry by comparing the WCID/ACK/PID fields. -+ */ -+ txwi = rt2800_drv_get_txwi(entry); -+ -+ word = rt2x00_desc_read(txwi, 1); -+ tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID); -+ tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK); -+ tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID); -+ -+ if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) { -+ rt2x00_dbg(entry->queue->rt2x00dev, -+ "TX status report missed for queue %d entry %d\n", -+ entry->queue->qid, entry->entry_idx); -+ return false; -+ } -+ -+ return true; -+} -+ - void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, - bool match) - { -@@ -1059,6 +1100,103 @@ void rt2800_txdone_entry(struct queue_en - } - EXPORT_SYMBOL_GPL(rt2800_txdone_entry); - -+void rt2800_txdone(struct rt2x00_dev *rt2x00dev) -+{ -+ struct data_queue *queue; -+ struct queue_entry *entry; -+ u32 reg; -+ u8 qid; -+ bool match; -+ -+ while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { -+ /* -+ * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is -+ * guaranteed to be one of the TX QIDs . -+ */ -+ qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE); -+ queue = rt2x00queue_get_tx_queue(rt2x00dev, qid); -+ -+ if (unlikely(rt2x00queue_empty(queue))) { -+ rt2x00_dbg(rt2x00dev, "Got TX status for an empty queue %u, dropping\n", -+ qid); -+ break; -+ } -+ -+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -+ -+ if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || -+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) { -+ rt2x00_warn(rt2x00dev, "Data pending for entry %u in queue %u\n", -+ entry->entry_idx, qid); -+ break; -+ } -+ -+ match = rt2800_txdone_entry_check(entry, reg); -+ rt2800_txdone_entry(entry, reg, rt2800_drv_get_txwi(entry), match); -+ } -+} -+EXPORT_SYMBOL_GPL(rt2800_txdone); -+ -+static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry) -+{ -+ bool tout; -+ -+ if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) -+ return false; -+ -+ tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500)); -+ if (unlikely(tout)) -+ rt2x00_dbg(entry->queue->rt2x00dev, -+ "TX status timeout for entry %d in queue %d\n", -+ entry->entry_idx, entry->queue->qid); -+ return tout; -+ -+} -+ -+bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev) -+{ -+ struct data_queue *queue; -+ struct queue_entry *entry; -+ -+ tx_queue_for_each(rt2x00dev, queue) { -+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -+ if (rt2800_entry_txstatus_timeout(entry)) -+ return true; -+ } -+ return false; -+} -+EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout); -+ -+void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev) -+{ -+ struct data_queue *queue; -+ struct queue_entry *entry; -+ -+ /* -+ * Process any trailing TX status reports for IO failures, -+ * we loop until we find the first non-IO error entry. This -+ * can either be a frame which is free, is being uploaded, -+ * or has completed the upload but didn't have an entry -+ * in the TX_STAT_FIFO register yet. -+ */ -+ tx_queue_for_each(rt2x00dev, queue) { -+ while (!rt2x00queue_empty(queue)) { -+ entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -+ -+ if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || -+ !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) -+ break; -+ -+ if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) || -+ rt2800_entry_txstatus_timeout(entry)) -+ rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); -+ else -+ break; -+ } -+ } -+} -+EXPORT_SYMBOL_GPL(rt2800_txdone_nostatus); -+ - static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev, - unsigned int index) - { ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -195,6 +195,9 @@ void rt2800_process_rxwi(struct queue_en - - void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, - bool match); -+void rt2800_txdone(struct rt2x00_dev *rt2x00dev); -+void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev); -+bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev); - - void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); - void rt2800_clear_beacon(struct queue_entry *entry); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -116,35 +116,6 @@ static bool rt2800usb_txstatus_pending(s - return false; - } - --static inline bool rt2800usb_entry_txstatus_timeout(struct queue_entry *entry) --{ -- bool tout; -- -- if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) -- return false; -- -- tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500)); -- if (unlikely(tout)) -- rt2x00_dbg(entry->queue->rt2x00dev, -- "TX status timeout for entry %d in queue %d\n", -- entry->entry_idx, entry->queue->qid); -- return tout; -- --} -- --static bool rt2800usb_txstatus_timeout(struct rt2x00_dev *rt2x00dev) --{ -- struct data_queue *queue; -- struct queue_entry *entry; -- -- tx_queue_for_each(rt2x00dev, queue) { -- entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -- if (rt2800usb_entry_txstatus_timeout(entry)) -- return true; -- } -- return false; --} -- - #define TXSTATUS_READ_INTERVAL 1000000 - - static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, -@@ -171,7 +142,7 @@ static bool rt2800usb_tx_sta_fifo_read_c - } - - /* Check if there is any entry that timedout waiting on TX status */ -- if (rt2800usb_txstatus_timeout(rt2x00dev)) -+ if (rt2800_txstatus_timeout(rt2x00dev)) - queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); - - if (rt2800usb_txstatus_pending(rt2x00dev)) { -@@ -501,123 +472,17 @@ static int rt2800usb_get_tx_data_len(str - /* - * TX control handlers - */ --static bool rt2800usb_txdone_entry_check(struct queue_entry *entry, u32 reg) --{ -- __le32 *txwi; -- u32 word; -- int wcid, ack, pid; -- int tx_wcid, tx_ack, tx_pid, is_agg; -- -- /* -- * This frames has returned with an IO error, -- * so the status report is not intended for this -- * frame. -- */ -- if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) -- return false; -- -- wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID); -- ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED); -- pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE); -- is_agg = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE); -- -- /* -- * Validate if this TX status report is intended for -- * this entry by comparing the WCID/ACK/PID fields. -- */ -- txwi = rt2800usb_get_txwi(entry); -- -- word = rt2x00_desc_read(txwi, 1); -- tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID); -- tx_ack = rt2x00_get_field32(word, TXWI_W1_ACK); -- tx_pid = rt2x00_get_field32(word, TXWI_W1_PACKETID); -- -- if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) { -- rt2x00_dbg(entry->queue->rt2x00dev, -- "TX status report missed for queue %d entry %d\n", -- entry->queue->qid, entry->entry_idx); -- return false; -- } -- -- return true; --} -- --static void rt2800usb_txdone(struct rt2x00_dev *rt2x00dev) --{ -- struct data_queue *queue; -- struct queue_entry *entry; -- u32 reg; -- u8 qid; -- bool match; -- -- while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { -- /* -- * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is -- * guaranteed to be one of the TX QIDs . -- */ -- qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE); -- queue = rt2x00queue_get_tx_queue(rt2x00dev, qid); -- -- if (unlikely(rt2x00queue_empty(queue))) { -- rt2x00_dbg(rt2x00dev, "Got TX status for an empty queue %u, dropping\n", -- qid); -- break; -- } -- -- entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -- -- if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || -- !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) { -- rt2x00_warn(rt2x00dev, "Data pending for entry %u in queue %u\n", -- entry->entry_idx, qid); -- break; -- } -- -- match = rt2800usb_txdone_entry_check(entry, reg); -- rt2800_txdone_entry(entry, reg, rt2800usb_get_txwi(entry), match); -- } --} -- --static void rt2800usb_txdone_nostatus(struct rt2x00_dev *rt2x00dev) --{ -- struct data_queue *queue; -- struct queue_entry *entry; -- -- /* -- * Process any trailing TX status reports for IO failures, -- * we loop until we find the first non-IO error entry. This -- * can either be a frame which is free, is being uploaded, -- * or has completed the upload but didn't have an entry -- * in the TX_STAT_FIFO register yet. -- */ -- tx_queue_for_each(rt2x00dev, queue) { -- while (!rt2x00queue_empty(queue)) { -- entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -- -- if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || -- !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) -- break; -- -- if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) || -- rt2800usb_entry_txstatus_timeout(entry)) -- rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); -- else -- break; -- } -- } --} -- - static void rt2800usb_work_txdone(struct work_struct *work) - { - struct rt2x00_dev *rt2x00dev = - container_of(work, struct rt2x00_dev, txdone_work); - - while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || -- rt2800usb_txstatus_timeout(rt2x00dev)) { -+ rt2800_txstatus_timeout(rt2x00dev)) { - -- rt2800usb_txdone(rt2x00dev); -+ rt2800_txdone(rt2x00dev); - -- rt2800usb_txdone_nostatus(rt2x00dev); -+ rt2800_txdone_nostatus(rt2x00dev); - - /* - * The hw may delay sending the packet after DMA complete diff --git a/package/kernel/mac80211/patches/rt2x00/003-rt2800mmio-use-txdone-txstatus-routines-from-lib.patch b/package/kernel/mac80211/patches/rt2x00/003-rt2800mmio-use-txdone-txstatus-routines-from-lib.patch deleted file mode 100644 index 48f0c27011..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/003-rt2800mmio-use-txdone-txstatus-routines-from-lib.patch +++ /dev/null @@ -1,244 +0,0 @@ -From 0b0d556e0ebb6c966bc993e21a22a156812d8fdf Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 26 Sep 2018 12:24:54 +0200 -Subject: [PATCH 03/28] rt2800mmio: use txdone/txstatus routines from lib - -Use usb txdone/txstatus routines (now in rt2800libc) for mmio devices. - -Note this also change how we handle INT_SOURCE_CSR_TX_FIFO_STATUS -interrupt. Now it is disabled since IRQ routine till end of the txstatus -tasklet (the same behaviour like others interrupts). Reason to do not -disable this interrupt was not to miss any tx status from 16 entries -FIFO register. Now, since we check for tx status timeout, we can -allow to miss some tx statuses. However this will be improved in further -patch where I also implement read status FIFO register in the tasklet. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2800mmio.c | 180 +----------------- - .../net/wireless/ralink/rt2x00/rt2x00queue.c | 1 + - 2 files changed, 9 insertions(+), 172 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -175,161 +175,6 @@ static void rt2800mmio_wakeup(struct rt2 - rt2800_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS); - } - --static bool rt2800mmio_txdone_entry_check(struct queue_entry *entry, u32 status) --{ -- __le32 *txwi; -- u32 word; -- int wcid, tx_wcid; -- -- wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID); -- -- txwi = rt2800_drv_get_txwi(entry); -- word = rt2x00_desc_read(txwi, 1); -- tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID); -- -- return (tx_wcid == wcid); --} -- --static bool rt2800mmio_txdone_find_entry(struct queue_entry *entry, void *data) --{ -- u32 status = *(u32 *)data; -- -- /* -- * rt2800pci hardware might reorder frames when exchanging traffic -- * with multiple BA enabled STAs. -- * -- * For example, a tx queue -- * [ STA1 | STA2 | STA1 | STA2 ] -- * can result in tx status reports -- * [ STA1 | STA1 | STA2 | STA2 ] -- * when the hw decides to aggregate the frames for STA1 into one AMPDU. -- * -- * To mitigate this effect, associate the tx status to the first frame -- * in the tx queue with a matching wcid. -- */ -- if (rt2800mmio_txdone_entry_check(entry, status) && -- !test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) { -- /* -- * Got a matching frame, associate the tx status with -- * the frame -- */ -- entry->status = status; -- set_bit(ENTRY_DATA_STATUS_SET, &entry->flags); -- return true; -- } -- -- /* Check the next frame */ -- return false; --} -- --static bool rt2800mmio_txdone_match_first(struct queue_entry *entry, void *data) --{ -- u32 status = *(u32 *)data; -- -- /* -- * Find the first frame without tx status and assign this status to it -- * regardless if it matches or not. -- */ -- if (!test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) { -- /* -- * Got a matching frame, associate the tx status with -- * the frame -- */ -- entry->status = status; -- set_bit(ENTRY_DATA_STATUS_SET, &entry->flags); -- return true; -- } -- -- /* Check the next frame */ -- return false; --} --static bool rt2800mmio_txdone_release_entries(struct queue_entry *entry, -- void *data) --{ -- if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) { -- rt2800_txdone_entry(entry, entry->status, -- rt2800mmio_get_txwi(entry), true); -- return false; -- } -- -- /* No more frames to release */ -- return true; --} -- --static bool rt2800mmio_txdone(struct rt2x00_dev *rt2x00dev) --{ -- struct data_queue *queue; -- u32 status; -- u8 qid; -- int max_tx_done = 16; -- -- while (kfifo_get(&rt2x00dev->txstatus_fifo, &status)) { -- qid = rt2x00_get_field32(status, TX_STA_FIFO_PID_QUEUE); -- if (unlikely(qid >= QID_RX)) { -- /* -- * Unknown queue, this shouldn't happen. Just drop -- * this tx status. -- */ -- rt2x00_warn(rt2x00dev, "Got TX status report with unexpected pid %u, dropping\n", -- qid); -- break; -- } -- -- queue = rt2x00queue_get_tx_queue(rt2x00dev, qid); -- if (unlikely(queue == NULL)) { -- /* -- * The queue is NULL, this shouldn't happen. Stop -- * processing here and drop the tx status -- */ -- rt2x00_warn(rt2x00dev, "Got TX status for an unavailable queue %u, dropping\n", -- qid); -- break; -- } -- -- if (unlikely(rt2x00queue_empty(queue))) { -- /* -- * The queue is empty. Stop processing here -- * and drop the tx status. -- */ -- rt2x00_warn(rt2x00dev, "Got TX status for an empty queue %u, dropping\n", -- qid); -- break; -- } -- -- /* -- * Let's associate this tx status with the first -- * matching frame. -- */ -- if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, -- Q_INDEX, &status, -- rt2800mmio_txdone_find_entry)) { -- /* -- * We cannot match the tx status to any frame, so just -- * use the first one. -- */ -- if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, -- Q_INDEX, &status, -- rt2800mmio_txdone_match_first)) { -- rt2x00_warn(rt2x00dev, "No frame found for TX status on queue %u, dropping\n", -- qid); -- break; -- } -- } -- -- /* -- * Release all frames with a valid tx status. -- */ -- rt2x00queue_for_each_entry(queue, Q_INDEX_DONE, -- Q_INDEX, NULL, -- rt2800mmio_txdone_release_entries); -- -- if (--max_tx_done == 0) -- break; -- } -- -- return !max_tx_done; --} -- - static inline void rt2800mmio_enable_interrupt(struct rt2x00_dev *rt2x00dev, - struct rt2x00_field32 irq_field) - { -@@ -349,14 +194,14 @@ static inline void rt2800mmio_enable_int - void rt2800mmio_txstatus_tasklet(unsigned long data) - { - struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; -- if (rt2800mmio_txdone(rt2x00dev)) -- tasklet_schedule(&rt2x00dev->txstatus_tasklet); - -- /* -- * No need to enable the tx status interrupt here as we always -- * leave it enabled to minimize the possibility of a tx status -- * register overflow. See comment in interrupt handler. -- */ -+ rt2800_txdone(rt2x00dev); -+ -+ rt2800_txdone_nostatus(rt2x00dev); -+ -+ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -+ rt2800mmio_enable_interrupt(rt2x00dev, -+ INT_SOURCE_CSR_TX_FIFO_STATUS); - } - EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet); - -@@ -440,10 +285,6 @@ static void rt2800mmio_txstatus_interrup - * because we can schedule the tasklet multiple times (when the - * interrupt fires again during tx status processing). - * -- * Furthermore we don't disable the TX_FIFO_STATUS -- * interrupt here but leave it enabled so that the TX_STA_FIFO -- * can also be read while the tx status tasklet gets executed. -- * - * Since we have only one producer and one consumer we don't - * need to lock the kfifo. - */ -@@ -485,13 +326,8 @@ irqreturn_t rt2800mmio_interrupt(int irq - */ - mask = ~reg; - -- if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { -+ if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) - rt2800mmio_txstatus_interrupt(rt2x00dev); -- /* -- * Never disable the TX_FIFO_STATUS interrupt. -- */ -- rt2x00_set_field32(&mask, INT_MASK_CSR_TX_FIFO_STATUS, 1); -- } - - if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT)) - tasklet_hi_schedule(&rt2x00dev->pretbtt_tasklet); ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -113,6 +113,7 @@ int rt2x00queue_map_txskb(struct queue_e - return -ENOMEM; - - skbdesc->flags |= SKBDESC_DMA_MAPPED_TX; -+ rt2x00lib_dmadone(entry); - return 0; - } - EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb); diff --git a/package/kernel/mac80211/patches/rt2x00/004-rt2x00-do-not-check-for-txstatus-timeout-every-time-.patch b/package/kernel/mac80211/patches/rt2x00/004-rt2x00-do-not-check-for-txstatus-timeout-every-time-.patch deleted file mode 100644 index 832768d042..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/004-rt2x00-do-not-check-for-txstatus-timeout-every-time-.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 5022efb50f625d11fdf18b1fee0f64ebb1863664 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 26 Sep 2018 12:24:55 +0200 -Subject: [PATCH 04/28] rt2x00: do not check for txstatus timeout every time on - tasklet - -Do not check for tx status timeout everytime we perform txstatus tasklet. -Perform check once per half a second. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 7 +++++++ - drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 3 ++- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 ++ - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 1 + - 4 files changed, 12 insertions(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1158,11 +1158,18 @@ bool rt2800_txstatus_timeout(struct rt2x - struct data_queue *queue; - struct queue_entry *entry; - -+ if (time_before(jiffies, -+ rt2x00dev->last_nostatus_check + msecs_to_jiffies(500))) -+ return false; -+ -+ rt2x00dev->last_nostatus_check = jiffies; -+ - tx_queue_for_each(rt2x00dev, queue) { - entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); - if (rt2800_entry_txstatus_timeout(entry)) - return true; - } -+ - return false; - } - EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -197,7 +197,8 @@ void rt2800mmio_txstatus_tasklet(unsigne - - rt2800_txdone(rt2x00dev); - -- rt2800_txdone_nostatus(rt2x00dev); -+ if (rt2800_txstatus_timeout(rt2x00dev)) -+ rt2800_txdone_nostatus(rt2x00dev); - - if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) - rt2800mmio_enable_interrupt(rt2x00dev, ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -980,6 +980,8 @@ struct rt2x00_dev { - */ - DECLARE_KFIFO_PTR(txstatus_fifo, u32); - -+ unsigned long last_nostatus_check; -+ - /* - * Timer to ensure tx status reports are read (rt2800usb). - */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -1039,6 +1039,7 @@ void rt2x00queue_start_queues(struct rt2 - */ - tx_queue_for_each(rt2x00dev, queue) - rt2x00queue_start_queue(queue); -+ rt2x00dev->last_nostatus_check = jiffies; - - rt2x00queue_start_queue(rt2x00dev->rx); - } diff --git a/package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch b/package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch deleted file mode 100644 index 0f29026373..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/005-rt2x00-use-different-txstatus-timeouts-when-flushing.patch +++ /dev/null @@ -1,112 +0,0 @@ -From adf26a356f132e35093585521ea3e36cd185af83 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 26 Sep 2018 12:24:56 +0200 -Subject: [PATCH 05/28] rt2x00: use different txstatus timeouts when flushing - -Use different tx status timeouts for normal operation and when flushing. -This increase timeout to 2s for normal operation as when there are bad -radio conditions and frames are reposted many times device can not provide -the status for quite long. With new timeout we can still get valid status -on such bad conditions. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 31 +++++++++++++------ - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 + - .../net/wireless/ralink/rt2x00/rt2x00mac.c | 4 +++ - 3 files changed, 26 insertions(+), 10 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1137,36 +1137,47 @@ void rt2800_txdone(struct rt2x00_dev *rt - } - EXPORT_SYMBOL_GPL(rt2800_txdone); - --static inline bool rt2800_entry_txstatus_timeout(struct queue_entry *entry) -+static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev, -+ struct queue_entry *entry) - { -- bool tout; -+ bool ret; -+ unsigned long tout; - - if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags)) - return false; - -- tout = time_after(jiffies, entry->last_action + msecs_to_jiffies(500)); -- if (unlikely(tout)) -+ if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) -+ tout = msecs_to_jiffies(100); -+ else -+ tout = msecs_to_jiffies(2000); -+ -+ ret = time_after(jiffies, entry->last_action + tout); -+ if (unlikely(ret)) - rt2x00_dbg(entry->queue->rt2x00dev, - "TX status timeout for entry %d in queue %d\n", - entry->entry_idx, entry->queue->qid); -- return tout; -- -+ return ret; - } - - bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev) - { - struct data_queue *queue; - struct queue_entry *entry; -+ unsigned long tout; -+ -+ if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) -+ tout = msecs_to_jiffies(50); -+ else -+ tout = msecs_to_jiffies(1000); - -- if (time_before(jiffies, -- rt2x00dev->last_nostatus_check + msecs_to_jiffies(500))) -+ if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout)) - return false; - - rt2x00dev->last_nostatus_check = jiffies; - - tx_queue_for_each(rt2x00dev, queue) { - entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); -- if (rt2800_entry_txstatus_timeout(entry)) -+ if (rt2800_entry_txstatus_timeout(rt2x00dev, entry)) - return true; - } - -@@ -1195,7 +1206,7 @@ void rt2800_txdone_nostatus(struct rt2x0 - break; - - if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) || -- rt2800_entry_txstatus_timeout(entry)) -+ rt2800_entry_txstatus_timeout(rt2x00dev, entry)) - rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE); - else - break; ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -665,6 +665,7 @@ enum rt2x00_state_flags { - DEVICE_STATE_STARTED, - DEVICE_STATE_ENABLED_RADIO, - DEVICE_STATE_SCANNING, -+ DEVICE_STATE_FLUSHING, - - /* - * Driver configuration ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c -@@ -720,8 +720,12 @@ void rt2x00mac_flush(struct ieee80211_hw - if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) - return; - -+ set_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags); -+ - tx_queue_for_each(rt2x00dev, queue) - rt2x00queue_flush_queue(queue, drop); -+ -+ clear_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags); - } - EXPORT_SYMBOL_GPL(rt2x00mac_flush); - diff --git a/package/kernel/mac80211/patches/rt2x00/006-rt2800-flush-and-txstatus-rework-for-rt2800mmio.patch b/package/kernel/mac80211/patches/rt2x00/006-rt2800-flush-and-txstatus-rework-for-rt2800mmio.patch deleted file mode 100644 index 784fbb16f1..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/006-rt2800-flush-and-txstatus-rework-for-rt2800mmio.patch +++ /dev/null @@ -1,238 +0,0 @@ -From 0240564430c0697d8fde3743d70346a922466b36 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 26 Sep 2018 12:24:57 +0200 -Subject: [PATCH 06/28] rt2800: flush and txstatus rework for rt2800mmio - -Implement custom rt2800mmio flush routine and change txstatus -routine to read TX_STA_FIFO also in the tasklet. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 14 +-- - .../net/wireless/ralink/rt2x00/rt2800mmio.c | 118 +++++++++++++----- - .../net/wireless/ralink/rt2x00/rt2800mmio.h | 1 + - .../net/wireless/ralink/rt2x00/rt2800pci.c | 2 +- - 4 files changed, 97 insertions(+), 38 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1147,7 +1147,7 @@ static inline bool rt2800_entry_txstatus - return false; - - if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) -- tout = msecs_to_jiffies(100); -+ tout = msecs_to_jiffies(50); - else - tout = msecs_to_jiffies(2000); - -@@ -1163,15 +1163,13 @@ bool rt2800_txstatus_timeout(struct rt2x - { - struct data_queue *queue; - struct queue_entry *entry; -- unsigned long tout; - -- if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) -- tout = msecs_to_jiffies(50); -- else -- tout = msecs_to_jiffies(1000); -+ if (!test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) { -+ unsigned long tout = msecs_to_jiffies(1000); - -- if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout)) -- return false; -+ if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout)) -+ return false; -+ } - - rt2x00dev->last_nostatus_check = jiffies; - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -191,21 +191,6 @@ static inline void rt2800mmio_enable_int - spin_unlock_irq(&rt2x00dev->irqmask_lock); - } - --void rt2800mmio_txstatus_tasklet(unsigned long data) --{ -- struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; -- -- rt2800_txdone(rt2x00dev); -- -- if (rt2800_txstatus_timeout(rt2x00dev)) -- rt2800_txdone_nostatus(rt2x00dev); -- -- if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -- rt2800mmio_enable_interrupt(rt2x00dev, -- INT_SOURCE_CSR_TX_FIFO_STATUS); --} --EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet); -- - void rt2800mmio_pretbtt_tasklet(unsigned long data) - { - struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; -@@ -270,12 +255,26 @@ void rt2800mmio_autowake_tasklet(unsigne - } - EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet); - --static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev) -+static void rt2800mmio_txdone(struct rt2x00_dev *rt2x00dev) -+{ -+ bool timeout = false; -+ -+ while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || -+ (timeout = rt2800_txstatus_timeout(rt2x00dev))) { -+ -+ rt2800_txdone(rt2x00dev); -+ -+ if (timeout) -+ rt2800_txdone_nostatus(rt2x00dev); -+ } -+} -+ -+static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev) - { - u32 status; -- int i; -+ bool more = false; - -- /* -+ /* FIXEME: rewrite this comment - * The TX_FIFO_STATUS interrupt needs special care. We should - * read TX_STA_FIFO but we should do it immediately as otherwise - * the register can overflow and we would lose status reports. -@@ -286,25 +285,37 @@ static void rt2800mmio_txstatus_interrup - * because we can schedule the tasklet multiple times (when the - * interrupt fires again during tx status processing). - * -- * Since we have only one producer and one consumer we don't -+ * txstatus tasklet is called with INT_SOURCE_CSR_TX_FIFO_STATUS -+ * disabled so have only one producer and one consumer - we don't - * need to lock the kfifo. - */ -- for (i = 0; i < rt2x00dev->tx->limit; i++) { -+ while (!kfifo_is_full(&rt2x00dev->txstatus_fifo)) { - status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); -- - if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) - break; - -- if (!kfifo_put(&rt2x00dev->txstatus_fifo, status)) { -- rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx status report\n"); -- break; -- } -+ kfifo_put(&rt2x00dev->txstatus_fifo, status); -+ more = true; - } - -- /* Schedule the tasklet for processing the tx status. */ -- tasklet_schedule(&rt2x00dev->txstatus_tasklet); -+ return more; - } - -+void rt2800mmio_txstatus_tasklet(unsigned long data) -+{ -+ struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; -+ -+ do { -+ rt2800mmio_txdone(rt2x00dev); -+ -+ } while (rt2800mmio_fetch_txstatus(rt2x00dev)); -+ -+ if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -+ rt2800mmio_enable_interrupt(rt2x00dev, -+ INT_SOURCE_CSR_TX_FIFO_STATUS); -+} -+EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet); -+ - irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance) - { - struct rt2x00_dev *rt2x00dev = dev_instance; -@@ -327,8 +338,10 @@ irqreturn_t rt2800mmio_interrupt(int irq - */ - mask = ~reg; - -- if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) -- rt2800mmio_txstatus_interrupt(rt2x00dev); -+ if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { -+ rt2800mmio_fetch_txstatus(rt2x00dev); -+ tasklet_schedule(&rt2x00dev->txstatus_tasklet); -+ } - - if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT)) - tasklet_hi_schedule(&rt2x00dev->pretbtt_tasklet); -@@ -453,6 +466,53 @@ void rt2800mmio_kick_queue(struct data_q - } - EXPORT_SYMBOL_GPL(rt2800mmio_kick_queue); - -+void rt2800mmio_flush_queue(struct data_queue *queue, bool drop) -+{ -+ struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; -+ bool tx_queue = false; -+ unsigned int i; -+ -+ switch (queue->qid) { -+ case QID_AC_VO: -+ case QID_AC_VI: -+ case QID_AC_BE: -+ case QID_AC_BK: -+ tx_queue = true; -+ break; -+ case QID_RX: -+ break; -+ default: -+ return; -+ } -+ -+ for (i = 0; i < 5; i++) { -+ /* -+ * Check if the driver is already done, otherwise we -+ * have to sleep a little while to give the driver/hw -+ * the oppurtunity to complete interrupt process itself. -+ */ -+ if (rt2x00queue_empty(queue)) -+ break; -+ -+ /* -+ * For TX queues schedule completion tasklet to catch -+ * tx status timeouts, othewise just wait. -+ */ -+ if (tx_queue) { -+ tasklet_disable(&rt2x00dev->txstatus_tasklet); -+ rt2800mmio_txdone(rt2x00dev); -+ tasklet_enable(&rt2x00dev->txstatus_tasklet); -+ } -+ -+ /* -+ * Wait for a little while to give the driver -+ * the oppurtunity to recover itself. -+ */ -+ msleep(50); -+ } -+} -+EXPORT_SYMBOL_GPL(rt2800mmio_flush_queue); -+ - void rt2800mmio_stop_queue(struct data_queue *queue) - { - struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h -@@ -148,6 +148,7 @@ void rt2800mmio_toggle_irq(struct rt2x00 - /* Queue handlers */ - void rt2800mmio_start_queue(struct data_queue *queue); - void rt2800mmio_kick_queue(struct data_queue *queue); -+void rt2800mmio_flush_queue(struct data_queue *queue, bool drop); - void rt2800mmio_stop_queue(struct data_queue *queue); - void rt2800mmio_queue_init(struct data_queue *queue); - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -@@ -364,7 +364,7 @@ static const struct rt2x00lib_ops rt2800 - .start_queue = rt2800mmio_start_queue, - .kick_queue = rt2800mmio_kick_queue, - .stop_queue = rt2800mmio_stop_queue, -- .flush_queue = rt2x00mmio_flush_queue, -+ .flush_queue = rt2800mmio_flush_queue, - .write_tx_desc = rt2800mmio_write_tx_desc, - .write_tx_data = rt2800_write_tx_data, - .write_beacon = rt2800_write_beacon, diff --git a/package/kernel/mac80211/patches/rt2x00/007-rt2x00-rt2400pci-mark-expected-switch-fall-through.patch b/package/kernel/mac80211/patches/rt2x00/007-rt2x00-rt2400pci-mark-expected-switch-fall-through.patch deleted file mode 100644 index 2161ad9ef3..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/007-rt2x00-rt2400pci-mark-expected-switch-fall-through.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 6eba8fd2235237784dfd01da55c3210d493aebdb Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" -Date: Mon, 22 Oct 2018 22:44:34 +0200 -Subject: [PATCH 07/28] rt2x00: rt2400pci: mark expected switch fall-through - -In preparation to enabling -Wimplicit-fallthrough, mark switch cases -where we are expecting to fall through. - -Signed-off-by: Gustavo A. R. Silva -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2400pci.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c -@@ -1302,7 +1302,7 @@ static void rt2400pci_txdone(struct rt2x - break; - case 2: /* Failure, excessive retries */ - __set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags); -- /* Don't break, this is a failed frame! */ -+ /* Fall through - this is a failed frame! */ - default: /* Failure */ - __set_bit(TXDONE_FAILURE, &txdesc.flags); - } diff --git a/package/kernel/mac80211/patches/rt2x00/008-rt2x00-rt2500pci-mark-expected-switch-fall-through.patch b/package/kernel/mac80211/patches/rt2x00/008-rt2x00-rt2500pci-mark-expected-switch-fall-through.patch deleted file mode 100644 index d10de6b0e5..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/008-rt2x00-rt2500pci-mark-expected-switch-fall-through.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 10bb92217747c3384a01ebec005faa2f5e72bbd8 Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" -Date: Mon, 22 Oct 2018 22:45:19 +0200 -Subject: [PATCH 08/28] rt2x00: rt2500pci: mark expected switch fall-through - -In preparation to enabling -Wimplicit-fallthrough, mark switch cases -where we are expecting to fall through. - -Signed-off-by: Gustavo A. R. Silva -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2500pci.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c -@@ -1430,7 +1430,7 @@ static void rt2500pci_txdone(struct rt2x - break; - case 2: /* Failure, excessive retries */ - __set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags); -- /* Don't break, this is a failed frame! */ -+ /* Fall through - this is a failed frame! */ - default: /* Failure */ - __set_bit(TXDONE_FAILURE, &txdesc.flags); - } diff --git a/package/kernel/mac80211/patches/rt2x00/009-rt2x00-rt2800lib-mark-expected-switch-fall-throughs.patch b/package/kernel/mac80211/patches/rt2x00/009-rt2x00-rt2800lib-mark-expected-switch-fall-throughs.patch deleted file mode 100644 index 99f971b95f..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/009-rt2x00-rt2800lib-mark-expected-switch-fall-throughs.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 916e6bbcfcff6cc5d7d33bba8557a30f3af50326 Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" -Date: Mon, 22 Oct 2018 22:46:03 +0200 -Subject: [PATCH 09/28] rt2x00: rt2800lib: mark expected switch fall-throughs - -In preparation to enabling -Wimplicit-fallthrough, mark switch cases -where we are expecting to fall through. - -Addresses-Coverity-ID: 145198 ("Missing break in switch") -Signed-off-by: Gustavo A. R. Silva -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2482,6 +2482,7 @@ static void rt2800_config_channel_rf3052 - switch (rt2x00dev->default_ant.tx_chain_num) { - case 1: - rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); -+ /* fall through */ - case 2: - rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); - break; -@@ -2490,6 +2491,7 @@ static void rt2800_config_channel_rf3052 - switch (rt2x00dev->default_ant.rx_chain_num) { - case 1: - rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); -+ /* fall through */ - case 2: - rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); - break; -@@ -9457,8 +9459,10 @@ static int rt2800_probe_hw_mode(struct r - switch (rx_chains) { - case 3: - spec->ht.mcs.rx_mask[2] = 0xff; -+ /* fall through */ - case 2: - spec->ht.mcs.rx_mask[1] = 0xff; -+ /* fall through */ - case 1: - spec->ht.mcs.rx_mask[0] = 0xff; - spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */ diff --git a/package/kernel/mac80211/patches/rt2x00/010-rt2x00-rt61pci-mark-expected-switch-fall-through.patch b/package/kernel/mac80211/patches/rt2x00/010-rt2x00-rt61pci-mark-expected-switch-fall-through.patch deleted file mode 100644 index 5b0f96d293..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/010-rt2x00-rt61pci-mark-expected-switch-fall-through.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 641dd8068ecb078e7d12efe465df202bc16ca5eb Mon Sep 17 00:00:00 2001 -From: "Gustavo A. R. Silva" -Date: Mon, 22 Oct 2018 22:46:47 +0200 -Subject: [PATCH 10/28] rt2x00: rt61pci: mark expected switch fall-through - -In preparation to enabling -Wimplicit-fallthrough, mark switch cases -where we are expecting to fall through. - -Signed-off-by: Gustavo A. R. Silva -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt61pci.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -@@ -2226,7 +2226,7 @@ static void rt61pci_txdone(struct rt2x00 - break; - case 6: /* Failure, excessive retries */ - __set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags); -- /* Don't break, this is a failed frame! */ -+ /* Fall through - this is a failed frame! */ - default: /* Failure */ - __set_bit(TXDONE_FAILURE, &txdesc.flags); - } diff --git a/package/kernel/mac80211/patches/rt2x00/011-cross-tree-phase-out-dma_zalloc_coherent.patch b/package/kernel/mac80211/patches/rt2x00/011-cross-tree-phase-out-dma_zalloc_coherent.patch deleted file mode 100644 index 8100eb063b..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/011-cross-tree-phase-out-dma_zalloc_coherent.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 750afb08ca71310fcf0c4e2cb1565c63b8235b60 Mon Sep 17 00:00:00 2001 -From: Luis Chamberlain -Date: Fri, 4 Jan 2019 09:23:09 +0100 -Subject: [PATCH 11/28] cross-tree: phase out dma_zalloc_coherent() - -We already need to zero out memory for dma_alloc_coherent(), as such -using dma_zalloc_coherent() is superflous. Phase it out. - -This change was generated with the following Coccinelle SmPL patch: - -@ replace_dma_zalloc_coherent @ -expression dev, size, data, handle, flags; -@@ - --dma_zalloc_coherent(dev, size, handle, flags) -+dma_alloc_coherent(dev, size, handle, flags) - -Suggested-by: Christoph Hellwig -Signed-off-by: Luis Chamberlain -[hch: re-ran the script on the latest tree] -Signed-off-by: Christoph Hellwig ---- - drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.c -@@ -119,9 +119,9 @@ static int rt2x00mmio_alloc_queue_dma(st - /* - * Allocate DMA memory for descriptor and buffer. - */ -- addr = dma_zalloc_coherent(rt2x00dev->dev, -- queue->limit * queue->desc_size, &dma, -- GFP_KERNEL); -+ addr = dma_alloc_coherent(rt2x00dev->dev, -+ queue->limit * queue->desc_size, &dma, -+ GFP_KERNEL); - if (!addr) - return -ENOMEM; - diff --git a/package/kernel/mac80211/patches/rt2x00/012-rt2x00-reduce-tx-power-to-nominal-level-on-RT6352.patch b/package/kernel/mac80211/patches/rt2x00/012-rt2x00-reduce-tx-power-to-nominal-level-on-RT6352.patch deleted file mode 100644 index a07832e97c..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/012-rt2x00-reduce-tx-power-to-nominal-level-on-RT6352.patch +++ /dev/null @@ -1,32 +0,0 @@ -From c2e28ef7711ffcb083474ee5f154264c6ec1ec07 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= -Date: Thu, 27 Dec 2018 15:05:25 +0100 -Subject: [PATCH 12/28] rt2x00: reduce tx power to nominal level on RT6352 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Current implementation of RT6352 support provides too high tx power -at least on iPA/eLNA devices. Reduce amplification of variable gain -amplifier by 6dB to match board target power of 17dBm. -Transmited signal strength with this patch is similar to that of -stock firmware or pandorabox firmware. Throughput measured with iperf -improves. Device tested: Xiaomi Miwifi Mini. - -Signed-off-by: Tomislav Požega -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -5477,7 +5477,7 @@ static int rt2800_init_registers(struct - rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000); - rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002); - rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F); -- rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x06060606); -+ rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000); - rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0); - rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0); - rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C); diff --git a/package/kernel/mac80211/patches/rt2x00/013-rt2x00-Work-around-a-firmware-bug-with-shared-keys.patch b/package/kernel/mac80211/patches/rt2x00/013-rt2x00-Work-around-a-firmware-bug-with-shared-keys.patch deleted file mode 100644 index dc884c17d2..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/013-rt2x00-Work-around-a-firmware-bug-with-shared-keys.patch +++ /dev/null @@ -1,143 +0,0 @@ -From a4296994eb8061ee3455721a296c387c639bf635 Mon Sep 17 00:00:00 2001 -From: Bernd Edlinger -Date: Tue, 15 Jan 2019 14:01:29 +0000 -Subject: [PATCH 13/28] rt2x00: Work around a firmware bug with shared keys - -Apparently the rt2x61 firmware fails temporarily to decode -broadcast packets if the shared keys are not assigned -in the "correct" sequence. At the same time unicast -packets work fine, since they are encrypted with the -pairwise key. - -At least with WPA2 CCMP mode the shared keys are -set in the following sequence: keyidx=1, 2, 1, 2. -After a while only keyidx 2 gets decrypted, and -keyidx 1 is ignored, probably because there is never -a keyidx 3. - -Symptoms are arping -b works for 10 minutes, since -keyidx=2 is used for broadcast, and then it stops -working for 10 minutes, because keyidx=1 is used. -That failure mode repeats forever. - -Note, the firmware does not even know which keyidx -corresponds to which hw_key_idx so the firmware is -trying to be smarter than the driver, which is bound -to fail. - -As workaround the function rt61pci_config_shared_key -requests software decryption of the shared keys, -by returning EOPNOTSUPP. However, pairwise keys are -still handled by hardware which works just fine. - -Signed-off-by: Bernd Edlinger -Acked-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt61pci.c | 93 +------------------- - 1 file changed, 4 insertions(+), 89 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c -@@ -321,97 +321,12 @@ static int rt61pci_config_shared_key(str - struct rt2x00lib_crypto *crypto, - struct ieee80211_key_conf *key) - { -- struct hw_key_entry key_entry; -- struct rt2x00_field32 field; -- u32 mask; -- u32 reg; -- -- if (crypto->cmd == SET_KEY) { -- /* -- * rt2x00lib can't determine the correct free -- * key_idx for shared keys. We have 1 register -- * with key valid bits. The goal is simple, read -- * the register, if that is full we have no slots -- * left. -- * Note that each BSS is allowed to have up to 4 -- * shared keys, so put a mask over the allowed -- * entries. -- */ -- mask = (0xf << crypto->bssidx); -- -- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR0); -- reg &= mask; -- -- if (reg && reg == mask) -- return -ENOSPC; -- -- key->hw_key_idx += reg ? ffz(reg) : 0; -- -- /* -- * Upload key to hardware -- */ -- memcpy(key_entry.key, crypto->key, -- sizeof(key_entry.key)); -- memcpy(key_entry.tx_mic, crypto->tx_mic, -- sizeof(key_entry.tx_mic)); -- memcpy(key_entry.rx_mic, crypto->rx_mic, -- sizeof(key_entry.rx_mic)); -- -- reg = SHARED_KEY_ENTRY(key->hw_key_idx); -- rt2x00mmio_register_multiwrite(rt2x00dev, reg, -- &key_entry, sizeof(key_entry)); -- -- /* -- * The cipher types are stored over 2 registers. -- * bssidx 0 and 1 keys are stored in SEC_CSR1 and -- * bssidx 1 and 2 keys are stored in SEC_CSR5. -- * Using the correct defines correctly will cause overhead, -- * so just calculate the correct offset. -- */ -- if (key->hw_key_idx < 8) { -- field.bit_offset = (3 * key->hw_key_idx); -- field.bit_mask = 0x7 << field.bit_offset; -- -- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR1); -- rt2x00_set_field32(®, field, crypto->cipher); -- rt2x00mmio_register_write(rt2x00dev, SEC_CSR1, reg); -- } else { -- field.bit_offset = (3 * (key->hw_key_idx - 8)); -- field.bit_mask = 0x7 << field.bit_offset; -- -- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR5); -- rt2x00_set_field32(®, field, crypto->cipher); -- rt2x00mmio_register_write(rt2x00dev, SEC_CSR5, reg); -- } -- -- /* -- * The driver does not support the IV/EIV generation -- * in hardware. However it doesn't support the IV/EIV -- * inside the ieee80211 frame either, but requires it -- * to be provided separately for the descriptor. -- * rt2x00lib will cut the IV/EIV data out of all frames -- * given to us by mac80211, but we must tell mac80211 -- * to generate the IV/EIV data. -- */ -- key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; -- } -- - /* -- * SEC_CSR0 contains only single-bit fields to indicate -- * a particular key is valid. Because using the FIELD32() -- * defines directly will cause a lot of overhead, we use -- * a calculation to determine the correct bit directly. -+ * Let the software handle the shared keys, -+ * since the hardware decryption does not work reliably, -+ * because the firmware does not know the key's keyidx. - */ -- mask = 1 << key->hw_key_idx; -- -- reg = rt2x00mmio_register_read(rt2x00dev, SEC_CSR0); -- if (crypto->cmd == SET_KEY) -- reg |= mask; -- else if (crypto->cmd == DISABLE_KEY) -- reg &= ~mask; -- rt2x00mmio_register_write(rt2x00dev, SEC_CSR0, reg); -- -- return 0; -+ return -EOPNOTSUPP; - } - - static int rt61pci_config_pairwise_key(struct rt2x00_dev *rt2x00dev, diff --git a/package/kernel/mac80211/patches/rt2x00/014-rt2x00-no-need-to-check-return-value-of-debugfs_crea.patch b/package/kernel/mac80211/patches/rt2x00/014-rt2x00-no-need-to-check-return-value-of-debugfs_crea.patch deleted file mode 100644 index 26f2df10e0..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/014-rt2x00-no-need-to-check-return-value-of-debugfs_crea.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 2587791d57588562c21e5ef7e678f02ab2f3eb82 Mon Sep 17 00:00:00 2001 -From: Greg Kroah-Hartman -Date: Tue, 22 Jan 2019 16:21:34 +0100 -Subject: [PATCH 14/28] rt2x00: no need to check return value of debugfs_create - functions - -When calling debugfs functions, there is no need to ever check the -return value. The function can work or not, but the code logic should -never do something different based on this. - -Cc: Stanislaw Gruszka -Cc: Helmut Schaa -Cc: Kalle Valo -Cc: linux-wireless@vger.kernel.org -Signed-off-by: Greg Kroah-Hartman -Acked-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2x00debug.c | 27 ------------------- - 1 file changed, 27 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00debug.c -@@ -656,36 +656,24 @@ void rt2x00debug_register(struct rt2x00_ - intf->driver_folder = - debugfs_create_dir(intf->rt2x00dev->ops->name, - rt2x00dev->hw->wiphy->debugfsdir); -- if (IS_ERR(intf->driver_folder) || !intf->driver_folder) -- goto exit; - - intf->driver_entry = - rt2x00debug_create_file_driver("driver", intf, &intf->driver_blob); -- if (IS_ERR(intf->driver_entry) || !intf->driver_entry) -- goto exit; - - intf->chipset_entry = - rt2x00debug_create_file_chipset("chipset", - intf, &intf->chipset_blob); -- if (IS_ERR(intf->chipset_entry) || !intf->chipset_entry) -- goto exit; - - intf->dev_flags = debugfs_create_file("dev_flags", 0400, - intf->driver_folder, intf, - &rt2x00debug_fop_dev_flags); -- if (IS_ERR(intf->dev_flags) || !intf->dev_flags) -- goto exit; - - intf->cap_flags = debugfs_create_file("cap_flags", 0400, - intf->driver_folder, intf, - &rt2x00debug_fop_cap_flags); -- if (IS_ERR(intf->cap_flags) || !intf->cap_flags) -- goto exit; - - intf->register_folder = - debugfs_create_dir("register", intf->driver_folder); -- if (IS_ERR(intf->register_folder) || !intf->register_folder) -- goto exit; - - #define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name) \ - ({ \ -@@ -695,9 +683,6 @@ void rt2x00debug_register(struct rt2x00_ - 0600, \ - (__intf)->register_folder, \ - &(__intf)->offset_##__name); \ -- if (IS_ERR((__intf)->__name##_off_entry) || \ -- !(__intf)->__name##_off_entry) \ -- goto exit; \ - \ - (__intf)->__name##_val_entry = \ - debugfs_create_file(__stringify(__name) "_value", \ -@@ -705,9 +690,6 @@ void rt2x00debug_register(struct rt2x00_ - (__intf)->register_folder, \ - (__intf), \ - &rt2x00debug_fop_##__name); \ -- if (IS_ERR((__intf)->__name##_val_entry) || \ -- !(__intf)->__name##_val_entry) \ -- goto exit; \ - } \ - }) - -@@ -721,15 +703,10 @@ void rt2x00debug_register(struct rt2x00_ - - intf->queue_folder = - debugfs_create_dir("queue", intf->driver_folder); -- if (IS_ERR(intf->queue_folder) || !intf->queue_folder) -- goto exit; - - intf->queue_frame_dump_entry = - debugfs_create_file("dump", 0400, intf->queue_folder, - intf, &rt2x00debug_fop_queue_dump); -- if (IS_ERR(intf->queue_frame_dump_entry) -- || !intf->queue_frame_dump_entry) -- goto exit; - - skb_queue_head_init(&intf->frame_dump_skbqueue); - init_waitqueue_head(&intf->frame_dump_waitqueue); -@@ -747,10 +724,6 @@ void rt2x00debug_register(struct rt2x00_ - #endif - - return; -- --exit: -- rt2x00debug_deregister(rt2x00dev); -- rt2x00_err(rt2x00dev, "Failed to register debug handler\n"); - } - - void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev) diff --git a/package/kernel/mac80211/patches/rt2x00/015-rt2x00-remove-unneeded-check.patch b/package/kernel/mac80211/patches/rt2x00/015-rt2x00-remove-unneeded-check.patch deleted file mode 100644 index 50e7de0855..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/015-rt2x00-remove-unneeded-check.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 17ae2acd1a6f5148edd80d84194e5d7c80be360e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= -Date: Wed, 13 Feb 2019 11:09:12 +0100 -Subject: [PATCH 15/28] rt2x00: remove unneeded check -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Remove band check from rf53xx channel config routine since all chips -using it are single band. - -Signed-off-by: Tomislav Požega -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 103 +++++++++--------- - 1 file changed, 50 insertions(+), 53 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -2966,6 +2966,7 @@ static void rt2800_config_channel_rf53xx - struct channel_info *info) - { - u8 rfcsr; -+ int idx = rf->channel-1; - - rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); - rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); -@@ -3003,60 +3004,56 @@ static void rt2800_config_channel_rf53xx - - rt2800_freq_cal_mode1(rt2x00dev); - -- if (rf->channel <= 14) { -- int idx = rf->channel-1; -+ if (rt2x00_has_cap_bt_coexist(rt2x00dev)) { -+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { -+ /* r55/r59 value array of channel 1~14 */ -+ static const char r55_bt_rev[] = {0x83, 0x83, -+ 0x83, 0x73, 0x73, 0x63, 0x53, 0x53, -+ 0x53, 0x43, 0x43, 0x43, 0x43, 0x43}; -+ static const char r59_bt_rev[] = {0x0e, 0x0e, -+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09, -+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07}; -+ -+ rt2800_rfcsr_write(rt2x00dev, 55, -+ r55_bt_rev[idx]); -+ rt2800_rfcsr_write(rt2x00dev, 59, -+ r59_bt_rev[idx]); -+ } else { -+ static const char r59_bt[] = {0x8b, 0x8b, 0x8b, -+ 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89, -+ 0x88, 0x88, 0x86, 0x85, 0x84}; - -- if (rt2x00_has_cap_bt_coexist(rt2x00dev)) { -- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { -- /* r55/r59 value array of channel 1~14 */ -- static const char r55_bt_rev[] = {0x83, 0x83, -- 0x83, 0x73, 0x73, 0x63, 0x53, 0x53, -- 0x53, 0x43, 0x43, 0x43, 0x43, 0x43}; -- static const char r59_bt_rev[] = {0x0e, 0x0e, -- 0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09, -- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07}; -- -- rt2800_rfcsr_write(rt2x00dev, 55, -- r55_bt_rev[idx]); -- rt2800_rfcsr_write(rt2x00dev, 59, -- r59_bt_rev[idx]); -- } else { -- static const char r59_bt[] = {0x8b, 0x8b, 0x8b, -- 0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89, -- 0x88, 0x88, 0x86, 0x85, 0x84}; -+ rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]); -+ } -+ } else { -+ if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { -+ static const char r55_nonbt_rev[] = {0x23, 0x23, -+ 0x23, 0x23, 0x13, 0x13, 0x03, 0x03, -+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}; -+ static const char r59_nonbt_rev[] = {0x07, 0x07, -+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -+ 0x07, 0x07, 0x06, 0x05, 0x04, 0x04}; -+ -+ rt2800_rfcsr_write(rt2x00dev, 55, -+ r55_nonbt_rev[idx]); -+ rt2800_rfcsr_write(rt2x00dev, 59, -+ r59_nonbt_rev[idx]); -+ } else if (rt2x00_rt(rt2x00dev, RT5390) || -+ rt2x00_rt(rt2x00dev, RT5392) || -+ rt2x00_rt(rt2x00dev, RT6352)) { -+ static const char r59_non_bt[] = {0x8f, 0x8f, -+ 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d, -+ 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86}; -+ -+ rt2800_rfcsr_write(rt2x00dev, 59, -+ r59_non_bt[idx]); -+ } else if (rt2x00_rt(rt2x00dev, RT5350)) { -+ static const char r59_non_bt[] = {0x0b, 0x0b, -+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, -+ 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06}; - -- rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]); -- } -- } else { -- if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) { -- static const char r55_nonbt_rev[] = {0x23, 0x23, -- 0x23, 0x23, 0x13, 0x13, 0x03, 0x03, -- 0x03, 0x03, 0x03, 0x03, 0x03, 0x03}; -- static const char r59_nonbt_rev[] = {0x07, 0x07, -- 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, -- 0x07, 0x07, 0x06, 0x05, 0x04, 0x04}; -- -- rt2800_rfcsr_write(rt2x00dev, 55, -- r55_nonbt_rev[idx]); -- rt2800_rfcsr_write(rt2x00dev, 59, -- r59_nonbt_rev[idx]); -- } else if (rt2x00_rt(rt2x00dev, RT5390) || -- rt2x00_rt(rt2x00dev, RT5392) || -- rt2x00_rt(rt2x00dev, RT6352)) { -- static const char r59_non_bt[] = {0x8f, 0x8f, -- 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d, -- 0x8a, 0x88, 0x88, 0x87, 0x87, 0x86}; -- -- rt2800_rfcsr_write(rt2x00dev, 59, -- r59_non_bt[idx]); -- } else if (rt2x00_rt(rt2x00dev, RT5350)) { -- static const char r59_non_bt[] = {0x0b, 0x0b, -- 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, -- 0x0a, 0x09, 0x08, 0x07, 0x07, 0x06}; -- -- rt2800_rfcsr_write(rt2x00dev, 59, -- r59_non_bt[idx]); -- } -+ rt2800_rfcsr_write(rt2x00dev, 59, -+ r59_non_bt[idx]); - } - } - } diff --git a/package/kernel/mac80211/patches/rt2x00/016-rt2x00-remove-confusing-AGC-register.patch b/package/kernel/mac80211/patches/rt2x00/016-rt2x00-remove-confusing-AGC-register.patch deleted file mode 100644 index 8f3791d2ce..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/016-rt2x00-remove-confusing-AGC-register.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 5991a2ecd070ce5ef646b4e8e0bc8d99110604ed Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Tomislav=20Po=C5=BEega?= -Date: Wed, 13 Feb 2019 11:09:13 +0100 -Subject: [PATCH 16/28] rt2x00: remove confusing AGC register -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Register 66 was causing issues on RT6352 if set to the same value as -in MTK driver. With 1c reg value device was working fine in both HT20 -and HT40 modes. - -Signed-off-by: Tomislav Požega -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3983,11 +3983,7 @@ static void rt2800_config_channel(struct - rt2800_bbp_write(rt2x00dev, 196, reg); - - /* AGC init */ -- if (rt2x00_rt(rt2x00dev, RT6352)) -- reg = 0x04; -- else -- reg = rf->channel <= 14 ? 0x1c : 0x24; -- -+ reg = rf->channel <= 14 ? 0x1c : 0x24; - reg += 2 * rt2x00dev->lna_gain; - rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); - diff --git a/package/kernel/mac80211/patches/rt2x00/017-rt2800-enable-TX_PIN_CFG_LNA_PE_-bits-per-band.patch b/package/kernel/mac80211/patches/rt2x00/017-rt2800-enable-TX_PIN_CFG_LNA_PE_-bits-per-band.patch deleted file mode 100644 index eb82d6275b..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/017-rt2800-enable-TX_PIN_CFG_LNA_PE_-bits-per-band.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 9ad3b55654455258a9463384edb40077439d879f Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 13 Feb 2019 11:09:14 +0100 -Subject: [PATCH 17/28] rt2800: enable TX_PIN_CFG_LNA_PE_ bits per band - -Do not enable TX_PIN_CFG_LNA_PE_A* bits for 2.4GHz band and -vice versa TX_PIN_CFG_LNA_PE_G* bits for 5GHz. - -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 18 ++++++++++++------ - 1 file changed, 12 insertions(+), 6 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3893,18 +3893,24 @@ static void rt2800_config_channel(struct - switch (rt2x00dev->default_ant.rx_chain_num) { - case 3: - /* Turn on tertiary LNAs */ -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1); -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, -+ rf->channel > 14); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, -+ rf->channel <= 14); - /* fall-through */ - case 2: - /* Turn on secondary LNAs */ -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1); -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, -+ rf->channel > 14); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, -+ rf->channel <= 14); - /* fall-through */ - case 1: - /* Turn on primary LNAs */ -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1); -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, -+ rf->channel > 14); -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, -+ rf->channel <= 14); - break; - } - diff --git a/package/kernel/mac80211/patches/rt2x00/018-rt2800-enable-TX_PIN_CFG_RFRX_EN-only-for-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/018-rt2800-enable-TX_PIN_CFG_RFRX_EN-only-for-MT7620.patch deleted file mode 100644 index 3a4c2cd8e5..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/018-rt2800-enable-TX_PIN_CFG_RFRX_EN-only-for-MT7620.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 7aca14885edeab536a8cbe1e7cfeadd4c3310b9b Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 13 Feb 2019 11:09:15 +0100 -Subject: [PATCH 18/28] rt2800: enable TX_PIN_CFG_RFRX_EN only for MT7620 - -The TX_PIN_CFG_RFRX_EN bit was not set on other devices than MT7620, -restore old behavaviour since setting this bit maight not be -correct for older devices. - -Fixes: 41977e86c984 ("rt2x00: add support for MT7620") -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3858,10 +3858,12 @@ static void rt2800_config_channel(struct - if (rt2x00_rt(rt2x00dev, RT3572)) - rt2800_rfcsr_write(rt2x00dev, 8, 0); - -- if (rt2x00_rt(rt2x00dev, RT6352)) -+ if (rt2x00_rt(rt2x00dev, RT6352)) { - tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG); -- else -+ rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); -+ } else { - tx_pin = 0; -+ } - - switch (rt2x00dev->default_ant.tx_chain_num) { - case 3: -@@ -3916,7 +3918,6 @@ static void rt2800_config_channel(struct - - rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1); - rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1); -- rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1); /* mt7620 */ - - rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin); - diff --git a/package/kernel/mac80211/patches/rt2x00/019-rt2800-comment-and-simplify-AGC-init-for-RT6352.patch b/package/kernel/mac80211/patches/rt2x00/019-rt2800-comment-and-simplify-AGC-init-for-RT6352.patch deleted file mode 100644 index 4d0beb263d..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/019-rt2800-comment-and-simplify-AGC-init-for-RT6352.patch +++ /dev/null @@ -1,33 +0,0 @@ -From c7ff1bfeaf1ca69e3e401be211b55d1738d0c5fc Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Wed, 13 Feb 2019 11:09:16 +0100 -Subject: [PATCH 19/28] rt2800: comment and simplify AGC init for RT6352 - -We do not need separate lines for calculating register values. -Also add comment that value is different than in vendor driver. - -Suggested-by: Daniel Golle -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -3989,9 +3989,12 @@ static void rt2800_config_channel(struct - rt2800_bbp_write(rt2x00dev, 195, 141); - rt2800_bbp_write(rt2x00dev, 196, reg); - -- /* AGC init */ -- reg = rf->channel <= 14 ? 0x1c : 0x24; -- reg += 2 * rt2x00dev->lna_gain; -+ /* AGC init. -+ * Despite the vendor driver using different values here for -+ * RT6352 chip, we use 0x1c for now. This may have to be changed -+ * once TSSI got implemented. -+ */ -+ reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain; - rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); - - rt2800_iq_calibrate(rt2x00dev, rf->channel); diff --git a/package/kernel/mac80211/patches/rt2x00/020-cfg80211-add-ratelimited-variants-of-err-and-warn.patch b/package/kernel/mac80211/patches/rt2x00/020-cfg80211-add-ratelimited-variants-of-err-and-warn.patch deleted file mode 100644 index bea1884489..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/020-cfg80211-add-ratelimited-variants-of-err-and-warn.patch +++ /dev/null @@ -1,39 +0,0 @@ -From patchwork Tue Mar 12 09:51:40 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10848957 -X-Patchwork-Delegate: johannes@sipsolutions.net -From: Stanislaw Gruszka -To: linux-wireless@vger.kernel.org -Cc: =?utf-8?q?Tomislav_Po=C5=BEega?= , - Daniel Golle , Felix Fietkau , - Mathias Kresin -Subject: [PATCH v3 1/4] cfg80211: add ratelimited variants of err and warn -Date: Tue, 12 Mar 2019 10:51:40 +0100 -Message-Id: <1552384303-29529-2-git-send-email-sgruszka@redhat.com> -In-Reply-To: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> -References: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> - -wiphy_{err,warn}_ratelimited will be used by rt2x00 - -Signed-off-by: Stanislaw Gruszka ---- - include/net/cfg80211.h | 5 +++++ - 1 file changed, 5 insertions(+) - ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -6597,6 +6597,11 @@ int cfg80211_external_auth_request(struc - #define wiphy_info(wiphy, format, args...) \ - dev_info(&(wiphy)->dev, format, ##args) - -+#define wiphy_err_ratelimited(wiphy, format, args...) \ -+ dev_err_ratelimited(&(wiphy)->dev, format, ##args) -+#define wiphy_warn_ratelimited(wiphy, format, args...) \ -+ dev_warn_ratelimited(&(wiphy)->dev, format, ##args) -+ - #define wiphy_debug(wiphy, format, args...) \ - wiphy_printk(KERN_DEBUG, wiphy, format, ##args) - diff --git a/package/kernel/mac80211/patches/rt2x00/021-rt2x00-use-ratelimited-variants-dev_warn-dev_err.patch b/package/kernel/mac80211/patches/rt2x00/021-rt2x00-use-ratelimited-variants-dev_warn-dev_err.patch deleted file mode 100644 index 2d74a71e1f..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/021-rt2x00-use-ratelimited-variants-dev_warn-dev_err.patch +++ /dev/null @@ -1,42 +0,0 @@ -From patchwork Tue Mar 12 09:51:41 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10848959 -X-Patchwork-Delegate: kvalo@adurom.com -From: Stanislaw Gruszka -To: linux-wireless@vger.kernel.org -Cc: =?utf-8?q?Tomislav_Po=C5=BEega?= , - Daniel Golle , Felix Fietkau , - Mathias Kresin -Subject: [PATCH v3 2/4] rt2x00: use ratelimited variants dev_warn/dev_err -Date: Tue, 12 Mar 2019 10:51:41 +0100 -Message-Id: <1552384303-29529-3-git-send-email-sgruszka@redhat.com> -In-Reply-To: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> -References: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> - -As reported by Randy we can overwhelm logs on some USB error conditions. -To avoid that use dev_warn_ratelimited() and dev_err_ratelimitd(). - -Reported-and-tested-by: Randy Oostdyk -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -69,10 +69,10 @@ - printk(KERN_ERR KBUILD_MODNAME ": %s: Error - " fmt, \ - __func__, ##__VA_ARGS__) - #define rt2x00_err(dev, fmt, ...) \ -- wiphy_err((dev)->hw->wiphy, "%s: Error - " fmt, \ -+ wiphy_err_ratelimited((dev)->hw->wiphy, "%s: Error - " fmt, \ - __func__, ##__VA_ARGS__) - #define rt2x00_warn(dev, fmt, ...) \ -- wiphy_warn((dev)->hw->wiphy, "%s: Warning - " fmt, \ -+ wiphy_warn_ratelimited((dev)->hw->wiphy, "%s: Warning - " fmt, \ - __func__, ##__VA_ARGS__) - #define rt2x00_info(dev, fmt, ...) \ - wiphy_info((dev)->hw->wiphy, "%s: Info - " fmt, \ diff --git a/package/kernel/mac80211/patches/rt2x00/022-rt2x00-check-number-of-EPROTO-errors.patch b/package/kernel/mac80211/patches/rt2x00/022-rt2x00-check-number-of-EPROTO-errors.patch deleted file mode 100644 index 251ac287bf..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/022-rt2x00-check-number-of-EPROTO-errors.patch +++ /dev/null @@ -1,96 +0,0 @@ -From patchwork Tue Mar 12 09:51:42 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10848961 -X-Patchwork-Delegate: kvalo@adurom.com -From: Stanislaw Gruszka -To: linux-wireless@vger.kernel.org -Cc: =?utf-8?q?Tomislav_Po=C5=BEega?= , - Daniel Golle , Felix Fietkau , - Mathias Kresin -Subject: [PATCH v3 3/4] rt2x00: check number of EPROTO errors -Date: Tue, 12 Mar 2019 10:51:42 +0100 -Message-Id: <1552384303-29529-4-git-send-email-sgruszka@redhat.com> -In-Reply-To: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> -References: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> - -Some USB host devices/drivers on some conditions can always return -EPROTO error on submitted URBs. That can cause infinity loop in the -rt2x00 driver. - -Since we can have single EPROTO errors we can not mark as device as -removed to avoid infinity loop. However we can count consecutive -EPROTO errors and mark device as removed if get lot of it. -I choose number 10 as threshold. - -Reported-and-tested-by: Randy Oostdyk -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 + - drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 22 +++++++++++++++++++--- - 2 files changed, 20 insertions(+), 3 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -1017,6 +1017,7 @@ struct rt2x00_dev { - unsigned int extra_tx_headroom; - - struct usb_anchor *anchor; -+ unsigned int num_proto_errs; - - /* Clock for System On Chip devices. */ - struct clk *clk; ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -@@ -31,6 +31,22 @@ - #include "rt2x00.h" - #include "rt2x00usb.h" - -+static bool rt2x00usb_check_usb_error(struct rt2x00_dev *rt2x00dev, int status) -+{ -+ if (status == -ENODEV || status == -ENOENT) -+ return true; -+ -+ if (status == -EPROTO || status == -ETIMEDOUT) -+ rt2x00dev->num_proto_errs++; -+ else -+ rt2x00dev->num_proto_errs = 0; -+ -+ if (rt2x00dev->num_proto_errs > 3) -+ return true; -+ -+ return false; -+} -+ - /* - * Interfacing with the HW. - */ -@@ -57,7 +73,7 @@ int rt2x00usb_vendor_request(struct rt2x - if (status >= 0) - return 0; - -- if (status == -ENODEV || status == -ENOENT) { -+ if (rt2x00usb_check_usb_error(rt2x00dev, status)) { - /* Device has disappeared. */ - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - break; -@@ -321,7 +337,7 @@ static bool rt2x00usb_kick_tx_entry(stru - - status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); - if (status) { -- if (status == -ENODEV || status == -ENOENT) -+ if (rt2x00usb_check_usb_error(rt2x00dev, status)) - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); - rt2x00lib_dmadone(entry); -@@ -410,7 +426,7 @@ static bool rt2x00usb_kick_rx_entry(stru - - status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC); - if (status) { -- if (status == -ENODEV || status == -ENOENT) -+ if (rt2x00usb_check_usb_error(rt2x00dev, status)) - clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); - rt2x00lib_dmadone(entry); diff --git a/package/kernel/mac80211/patches/rt2x00/023-rt2x00-do-not-print-error-when-queue-is-full.patch b/package/kernel/mac80211/patches/rt2x00/023-rt2x00-do-not-print-error-when-queue-is-full.patch deleted file mode 100644 index 7e2f2193be..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/023-rt2x00-do-not-print-error-when-queue-is-full.patch +++ /dev/null @@ -1,43 +0,0 @@ -From patchwork Tue Mar 12 09:51:43 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10848963 -X-Patchwork-Delegate: kvalo@adurom.com -From: Stanislaw Gruszka -To: linux-wireless@vger.kernel.org -Cc: =?utf-8?q?Tomislav_Po=C5=BEega?= , - Daniel Golle , Felix Fietkau , - Mathias Kresin -Subject: [PATCH v3 4/4] rt2x00: do not print error when queue is full -Date: Tue, 12 Mar 2019 10:51:43 +0100 -Message-Id: <1552384303-29529-5-git-send-email-sgruszka@redhat.com> -In-Reply-To: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> -References: <1552384303-29529-1-git-send-email-sgruszka@redhat.com> - -For unknown reasons printk() on some context can cause CPU hung on -embedded MT7620 AP/router MIPS platforms. What can result on wifi -disconnects. - -This patch move queue full messages to debug level what is consistent -with other mac80211 drivers which drop packet silently if tx queue is -full. This make MT7620 OpenWRT routers more stable, what was reported -by various users. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -671,7 +671,7 @@ int rt2x00queue_write_tx_frame(struct da - spin_lock(&queue->tx_lock); - - if (unlikely(rt2x00queue_full(queue))) { -- rt2x00_err(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n", -+ rt2x00_dbg(queue->rt2x00dev, "Dropping frame due to full tx queue %d\n", - queue->qid); - ret = -ENOBUFS; - goto out; diff --git a/package/kernel/mac80211/patches/rt2x00/024-rt2800-partially-restore-old-mmio-txstatus-behaviour.patch b/package/kernel/mac80211/patches/rt2x00/024-rt2800-partially-restore-old-mmio-txstatus-behaviour.patch deleted file mode 100644 index 52314a79ae..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/024-rt2800-partially-restore-old-mmio-txstatus-behaviour.patch +++ /dev/null @@ -1,128 +0,0 @@ -From 91a5340db0526b7263bc8da14b120ea3129b5f28 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:31 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804437 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 21/28] rt2800: partially restore old mmio txstatus behaviour - -Do not disable txstatus interrupt and add quota of processed tx statuses in -one tasklet. Quota is needed to allow to fed device with new frames during -processing of tx statuses. - -Patch fixes about 15% performance degradation on some scenarios coused by -0b0d556e0ebb ("rt2800mmio: use txdone/txstatus routines from lib"). - -Signed-off-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 4 +-- - .../net/wireless/ralink/rt2x00/rt2800lib.h | 2 +- - .../net/wireless/ralink/rt2x00/rt2800mmio.c | 30 +++++-------------- - .../net/wireless/ralink/rt2x00/rt2800usb.c | 2 +- - 4 files changed, 12 insertions(+), 26 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1100,7 +1100,7 @@ void rt2800_txdone_entry(struct queue_en - } - EXPORT_SYMBOL_GPL(rt2800_txdone_entry); - --void rt2800_txdone(struct rt2x00_dev *rt2x00dev) -+void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota) - { - struct data_queue *queue; - struct queue_entry *entry; -@@ -1108,7 +1108,7 @@ void rt2800_txdone(struct rt2x00_dev *rt - u8 qid; - bool match; - -- while (kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { -+ while (quota-- > 0 && kfifo_get(&rt2x00dev->txstatus_fifo, ®)) { - /* - * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is - * guaranteed to be one of the TX QIDs . ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -195,7 +195,7 @@ void rt2800_process_rxwi(struct queue_en - - void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi, - bool match); --void rt2800_txdone(struct rt2x00_dev *rt2x00dev); -+void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota); - void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev); - bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev); - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -255,20 +255,6 @@ void rt2800mmio_autowake_tasklet(unsigne - } - EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet); - --static void rt2800mmio_txdone(struct rt2x00_dev *rt2x00dev) --{ -- bool timeout = false; -- -- while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || -- (timeout = rt2800_txstatus_timeout(rt2x00dev))) { -- -- rt2800_txdone(rt2x00dev); -- -- if (timeout) -- rt2800_txdone_nostatus(rt2x00dev); -- } --} -- - static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev) - { - u32 status; -@@ -305,14 +291,11 @@ void rt2800mmio_txstatus_tasklet(unsigne - { - struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data; - -- do { -- rt2800mmio_txdone(rt2x00dev); -+ rt2800_txdone(rt2x00dev, 16); - -- } while (rt2800mmio_fetch_txstatus(rt2x00dev)); -+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo)) -+ tasklet_schedule(&rt2x00dev->txstatus_tasklet); - -- if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -- rt2800mmio_enable_interrupt(rt2x00dev, -- INT_SOURCE_CSR_TX_FIFO_STATUS); - } - EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet); - -@@ -339,8 +322,10 @@ irqreturn_t rt2800mmio_interrupt(int irq - mask = ~reg; - - if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) { -+ rt2x00_set_field32(&mask, INT_MASK_CSR_TX_FIFO_STATUS, 1); - rt2800mmio_fetch_txstatus(rt2x00dev); -- tasklet_schedule(&rt2x00dev->txstatus_tasklet); -+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo)) -+ tasklet_schedule(&rt2x00dev->txstatus_tasklet); - } - - if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT)) -@@ -500,7 +485,8 @@ void rt2800mmio_flush_queue(struct data_ - */ - if (tx_queue) { - tasklet_disable(&rt2x00dev->txstatus_tasklet); -- rt2800mmio_txdone(rt2x00dev); -+ rt2800_txdone(rt2x00dev, UINT_MAX); -+ rt2800_txdone_nostatus(rt2x00dev); - tasklet_enable(&rt2x00dev->txstatus_tasklet); - } - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -480,7 +480,7 @@ static void rt2800usb_work_txdone(struct - while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || - rt2800_txstatus_timeout(rt2x00dev)) { - -- rt2800_txdone(rt2x00dev); -+ rt2800_txdone(rt2x00dev, UINT_MAX); - - rt2800_txdone_nostatus(rt2x00dev); - diff --git a/package/kernel/mac80211/patches/rt2x00/025-rt2800-new-flush-implementation-for-SoC-devices.patch b/package/kernel/mac80211/patches/rt2x00/025-rt2800-new-flush-implementation-for-SoC-devices.patch deleted file mode 100644 index e3a914a0fa..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/025-rt2800-new-flush-implementation-for-SoC-devices.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 11f8ad1656035176bad9d89de7ea0e7fe6d82c32 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:32 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804439 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 22/28] rt2800: new flush implementation for SoC devices - -Use new flush_queue() calback for SoC devices, what was already done for -PCIe devices. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800soc.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -203,7 +203,7 @@ static const struct rt2x00lib_ops rt2800 - .start_queue = rt2800mmio_start_queue, - .kick_queue = rt2800mmio_kick_queue, - .stop_queue = rt2800mmio_stop_queue, -- .flush_queue = rt2x00mmio_flush_queue, -+ .flush_queue = rt2800mmio_flush_queue, - .write_tx_desc = rt2800mmio_write_tx_desc, - .write_tx_data = rt2800_write_tx_data, - .write_beacon = rt2800_write_beacon, diff --git a/package/kernel/mac80211/patches/rt2x00/026-rt2800-move-txstatus-pending-routine.patch b/package/kernel/mac80211/patches/rt2x00/026-rt2800-move-txstatus-pending-routine.patch deleted file mode 100644 index e5bfbecd1e..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/026-rt2800-move-txstatus-pending-routine.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 2bbea7645c3d095014a080db170941818650e141 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:33 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804441 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 23/28] rt2800: move txstatus pending routine - -Move rt2800usb_txstatus_pending routine to rt2800lib. It will be reused -by rt2800mmio code. - -Signed-off-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 17 ++++++++++++++ - .../net/wireless/ralink/rt2x00/rt2800lib.h | 1 + - .../net/wireless/ralink/rt2x00/rt2800usb.c | 22 +++---------------- - 3 files changed, 21 insertions(+), 19 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1183,6 +1183,23 @@ bool rt2800_txstatus_timeout(struct rt2x - } - EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout); - -+/* -+ * test if there is an entry in any TX queue for which DMA is done -+ * but the TX status has not been returned yet -+ */ -+bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev) -+{ -+ struct data_queue *queue; -+ -+ tx_queue_for_each(rt2x00dev, queue) { -+ if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) != -+ rt2x00queue_get_entry(queue, Q_INDEX_DONE)) -+ return true; -+ } -+ return false; -+} -+EXPORT_SYMBOL_GPL(rt2800_txstatus_pending); -+ - void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev) - { - struct data_queue *queue; ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -198,6 +198,7 @@ void rt2800_txdone_entry(struct queue_en - void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota); - void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev); - bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev); -+bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev); - - void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc); - void rt2800_clear_beacon(struct queue_entry *entry); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800usb.c -@@ -100,22 +100,6 @@ static void rt2800usb_stop_queue(struct - } - } - --/* -- * test if there is an entry in any TX queue for which DMA is done -- * but the TX status has not been returned yet -- */ --static bool rt2800usb_txstatus_pending(struct rt2x00_dev *rt2x00dev) --{ -- struct data_queue *queue; -- -- tx_queue_for_each(rt2x00dev, queue) { -- if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) != -- rt2x00queue_get_entry(queue, Q_INDEX_DONE)) -- return true; -- } -- return false; --} -- - #define TXSTATUS_READ_INTERVAL 1000000 - - static bool rt2800usb_tx_sta_fifo_read_completed(struct rt2x00_dev *rt2x00dev, -@@ -145,7 +129,7 @@ static bool rt2800usb_tx_sta_fifo_read_c - if (rt2800_txstatus_timeout(rt2x00dev)) - queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); - -- if (rt2800usb_txstatus_pending(rt2x00dev)) { -+ if (rt2800_txstatus_pending(rt2x00dev)) { - /* Read register after 1 ms */ - hrtimer_start(&rt2x00dev->txstatus_timer, - TXSTATUS_READ_INTERVAL, -@@ -160,7 +144,7 @@ stop_reading: - * clear_bit someone could do rt2x00usb_interrupt_txdone, so recheck - * here again if status reading is needed. - */ -- if (rt2800usb_txstatus_pending(rt2x00dev) && -+ if (rt2800_txstatus_pending(rt2x00dev) && - !test_and_set_bit(TX_STATUS_READING, &rt2x00dev->flags)) - return true; - else -@@ -489,7 +473,7 @@ static void rt2800usb_work_txdone(struct - * if the medium is busy, thus the TX_STA_FIFO entry is - * also delayed -> use a timer to retrieve it. - */ -- if (rt2800usb_txstatus_pending(rt2x00dev)) -+ if (rt2800_txstatus_pending(rt2x00dev)) - rt2800usb_async_read_tx_status(rt2x00dev); - } - } diff --git a/package/kernel/mac80211/patches/rt2x00/027-rt2800mmio-fetch-tx-status-changes.patch b/package/kernel/mac80211/patches/rt2x00/027-rt2800mmio-fetch-tx-status-changes.patch deleted file mode 100644 index 4bb62c2288..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/027-rt2800mmio-fetch-tx-status-changes.patch +++ /dev/null @@ -1,61 +0,0 @@ -From f6a9618198e190a2ba09ce3f0aa8e9ee1763bd38 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:34 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804443 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 24/28] rt2800mmio: fetch tx status changes - -Prepare to use rt2800mmio_fetch_txstatus() in concurrent manner and drop -return value since is not longer needed. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800mmio.c | 17 +++++++++-------- - 1 file changed, 9 insertions(+), 8 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -255,12 +255,12 @@ void rt2800mmio_autowake_tasklet(unsigne - } - EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet); - --static bool rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev) -+static void rt2800mmio_fetch_txstatus(struct rt2x00_dev *rt2x00dev) - { - u32 status; -- bool more = false; -+ unsigned long flags; - -- /* FIXEME: rewrite this comment -+ /* - * The TX_FIFO_STATUS interrupt needs special care. We should - * read TX_STA_FIFO but we should do it immediately as otherwise - * the register can overflow and we would lose status reports. -@@ -271,20 +271,21 @@ static bool rt2800mmio_fetch_txstatus(st - * because we can schedule the tasklet multiple times (when the - * interrupt fires again during tx status processing). - * -- * txstatus tasklet is called with INT_SOURCE_CSR_TX_FIFO_STATUS -- * disabled so have only one producer and one consumer - we don't -- * need to lock the kfifo. -+ * We also read statuses from tx status timeout timer, use -+ * lock to prevent concurent writes to fifo. - */ -+ -+ spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags); -+ - while (!kfifo_is_full(&rt2x00dev->txstatus_fifo)) { - status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO); - if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) - break; - - kfifo_put(&rt2x00dev->txstatus_fifo, status); -- more = true; - } - -- return more; -+ spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags); - } - - void rt2800mmio_txstatus_tasklet(unsigned long data) diff --git a/package/kernel/mac80211/patches/rt2x00/028-rt2800mmio-use-timer-and-work-for-handling-tx-status.patch b/package/kernel/mac80211/patches/rt2x00/028-rt2800mmio-use-timer-and-work-for-handling-tx-status.patch deleted file mode 100644 index bf038a5991..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/028-rt2800mmio-use-timer-and-work-for-handling-tx-status.patch +++ /dev/null @@ -1,194 +0,0 @@ -From 175c2548332b45b144af673e70fdbb1a947d7aba Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:35 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804445 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 25/28] rt2800mmio: use timer and work for handling tx statuses - timeouts - -Sometimes we can get into situation when there are pending statuses, -but we do not get INT_SOURCE_CSR_TX_FIFO_STATUS. Handle this situation -by arming timeout timer and read statuses (it will fix case when -we just do not have irq) and queue work to handle case we missed -statues from hardware FIFO. - -Signed-off-by: Stanislaw Gruszka ---- - .../net/wireless/ralink/rt2x00/rt2800mmio.c | 81 +++++++++++++++++-- - .../net/wireless/ralink/rt2x00/rt2800mmio.h | 1 + - .../net/wireless/ralink/rt2x00/rt2800pci.c | 2 +- - .../net/wireless/ralink/rt2x00/rt2800soc.c | 2 +- - .../net/wireless/ralink/rt2x00/rt2x00dev.c | 4 + - 5 files changed, 82 insertions(+), 8 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.c -@@ -426,6 +426,9 @@ void rt2800mmio_start_queue(struct data_ - } - EXPORT_SYMBOL_GPL(rt2800mmio_start_queue); - -+/* 200 ms */ -+#define TXSTATUS_TIMEOUT 200000000 -+ - void rt2800mmio_kick_queue(struct data_queue *queue) - { - struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; -@@ -440,6 +443,8 @@ void rt2800mmio_kick_queue(struct data_q - entry = rt2x00queue_get_entry(queue, Q_INDEX); - rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid), - entry->entry_idx); -+ hrtimer_start(&rt2x00dev->txstatus_timer, -+ TXSTATUS_TIMEOUT, HRTIMER_MODE_REL); - break; - case QID_MGMT: - entry = rt2x00queue_get_entry(queue, Q_INDEX); -@@ -484,12 +489,8 @@ void rt2800mmio_flush_queue(struct data_ - * For TX queues schedule completion tasklet to catch - * tx status timeouts, othewise just wait. - */ -- if (tx_queue) { -- tasklet_disable(&rt2x00dev->txstatus_tasklet); -- rt2800_txdone(rt2x00dev, UINT_MAX); -- rt2800_txdone_nostatus(rt2x00dev); -- tasklet_enable(&rt2x00dev->txstatus_tasklet); -- } -+ if (tx_queue) -+ queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); - - /* - * Wait for a little while to give the driver -@@ -627,6 +628,10 @@ void rt2800mmio_clear_entry(struct queue - word = rt2x00_desc_read(entry_priv->desc, 1); - rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1); - rt2x00_desc_write(entry_priv->desc, 1, word); -+ -+ /* If last entry stop txstatus timer */ -+ if (entry->queue->length == 1) -+ hrtimer_cancel(&rt2x00dev->txstatus_timer); - } - } - EXPORT_SYMBOL_GPL(rt2800mmio_clear_entry); -@@ -759,6 +764,70 @@ int rt2800mmio_enable_radio(struct rt2x0 - } - EXPORT_SYMBOL_GPL(rt2800mmio_enable_radio); - -+static void rt2800mmio_work_txdone(struct work_struct *work) -+{ -+ struct rt2x00_dev *rt2x00dev = -+ container_of(work, struct rt2x00_dev, txdone_work); -+ -+ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -+ return; -+ -+ while (!kfifo_is_empty(&rt2x00dev->txstatus_fifo) || -+ rt2800_txstatus_timeout(rt2x00dev)) { -+ -+ tasklet_disable(&rt2x00dev->txstatus_tasklet); -+ rt2800_txdone(rt2x00dev, UINT_MAX); -+ rt2800_txdone_nostatus(rt2x00dev); -+ tasklet_enable(&rt2x00dev->txstatus_tasklet); -+ } -+ -+ if (rt2800_txstatus_pending(rt2x00dev)) -+ hrtimer_start(&rt2x00dev->txstatus_timer, -+ TXSTATUS_TIMEOUT, HRTIMER_MODE_REL); -+} -+ -+static enum hrtimer_restart rt2800mmio_tx_sta_fifo_timeout(struct hrtimer *timer) -+{ -+ struct rt2x00_dev *rt2x00dev = -+ container_of(timer, struct rt2x00_dev, txstatus_timer); -+ -+ if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) -+ goto out; -+ -+ if (!rt2800_txstatus_pending(rt2x00dev)) -+ goto out; -+ -+ rt2800mmio_fetch_txstatus(rt2x00dev); -+ if (!kfifo_is_empty(&rt2x00dev->txstatus_fifo)) -+ tasklet_schedule(&rt2x00dev->txstatus_tasklet); -+ else -+ queue_work(rt2x00dev->workqueue, &rt2x00dev->txdone_work); -+out: -+ return HRTIMER_NORESTART; -+} -+ -+int rt2800mmio_probe_hw(struct rt2x00_dev *rt2x00dev) -+{ -+ int retval; -+ -+ retval = rt2800_probe_hw(rt2x00dev); -+ if (retval) -+ return retval; -+ -+ /* -+ * Set txstatus timer function. -+ */ -+ rt2x00dev->txstatus_timer.function = rt2800mmio_tx_sta_fifo_timeout; -+ -+ /* -+ * Overwrite TX done handler -+ */ -+ INIT_WORK(&rt2x00dev->txdone_work, rt2800mmio_work_txdone); -+ -+ return 0; -+} -+EXPORT_SYMBOL_GPL(rt2800mmio_probe_hw); -+ - MODULE_AUTHOR(DRV_PROJECT); - MODULE_VERSION(DRV_VERSION); - MODULE_DESCRIPTION("rt2800 MMIO library"); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800mmio.h -@@ -153,6 +153,7 @@ void rt2800mmio_stop_queue(struct data_q - void rt2800mmio_queue_init(struct data_queue *queue); - - /* Initialization functions */ -+int rt2800mmio_probe_hw(struct rt2x00_dev *rt2x00dev); - bool rt2800mmio_get_entry_state(struct queue_entry *entry); - void rt2800mmio_clear_entry(struct queue_entry *entry); - int rt2800mmio_init_queues(struct rt2x00_dev *rt2x00dev); ---- a/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800pci.c -@@ -346,7 +346,7 @@ static const struct rt2x00lib_ops rt2800 - .tbtt_tasklet = rt2800mmio_tbtt_tasklet, - .rxdone_tasklet = rt2800mmio_rxdone_tasklet, - .autowake_tasklet = rt2800mmio_autowake_tasklet, -- .probe_hw = rt2800_probe_hw, -+ .probe_hw = rt2800mmio_probe_hw, - .get_firmware_name = rt2800pci_get_firmware_name, - .check_firmware = rt2800_check_firmware, - .load_firmware = rt2800_load_firmware, ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -185,7 +185,7 @@ static const struct rt2x00lib_ops rt2800 - .tbtt_tasklet = rt2800mmio_tbtt_tasklet, - .rxdone_tasklet = rt2800mmio_rxdone_tasklet, - .autowake_tasklet = rt2800mmio_autowake_tasklet, -- .probe_hw = rt2800_probe_hw, -+ .probe_hw = rt2800mmio_probe_hw, - .get_firmware_name = rt2800soc_get_firmware_name, - .check_firmware = rt2800soc_check_firmware, - .load_firmware = rt2800soc_load_firmware, ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1391,6 +1391,8 @@ int rt2x00lib_probe_dev(struct rt2x00_de - mutex_init(&rt2x00dev->conf_mutex); - INIT_LIST_HEAD(&rt2x00dev->bar_list); - spin_lock_init(&rt2x00dev->bar_list_lock); -+ hrtimer_init(&rt2x00dev->txstatus_timer, CLOCK_MONOTONIC, -+ HRTIMER_MODE_REL); - - set_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags); - -@@ -1515,6 +1517,8 @@ void rt2x00lib_remove_dev(struct rt2x00_ - cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); - cancel_work_sync(&rt2x00dev->sleep_work); - -+ hrtimer_cancel(&rt2x00dev->txstatus_timer); -+ - /* - * Kill the tx status tasklet. - */ diff --git a/package/kernel/mac80211/patches/rt2x00/029-rt2x00-remove-last_nostatus_check.patch b/package/kernel/mac80211/patches/rt2x00/029-rt2x00-remove-last_nostatus_check.patch deleted file mode 100644 index 0daaef5e8b..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/029-rt2x00-remove-last_nostatus_check.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 6013a91f15c9dabd668d5736652b9bcfb0ef0378 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:36 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804447 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 26/28] rt2x00: remove last_nostatus_check - -We do not any longer check txstatus timeout from tasklet, so do not need -this optimization. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2800lib.c | 9 --------- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 2 -- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 1 - - 3 files changed, 12 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -1164,15 +1164,6 @@ bool rt2800_txstatus_timeout(struct rt2x - struct data_queue *queue; - struct queue_entry *entry; - -- if (!test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags)) { -- unsigned long tout = msecs_to_jiffies(1000); -- -- if (time_before(jiffies, rt2x00dev->last_nostatus_check + tout)) -- return false; -- } -- -- rt2x00dev->last_nostatus_check = jiffies; -- - tx_queue_for_each(rt2x00dev, queue) { - entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE); - if (rt2800_entry_txstatus_timeout(rt2x00dev, entry)) ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -981,8 +981,6 @@ struct rt2x00_dev { - */ - DECLARE_KFIFO_PTR(txstatus_fifo, u32); - -- unsigned long last_nostatus_check; -- - /* - * Timer to ensure tx status reports are read (rt2800usb). - */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -1039,7 +1039,6 @@ void rt2x00queue_start_queues(struct rt2 - */ - tx_queue_for_each(rt2x00dev, queue) - rt2x00queue_start_queue(queue); -- rt2x00dev->last_nostatus_check = jiffies; - - rt2x00queue_start_queue(rt2x00dev->rx); - } diff --git a/package/kernel/mac80211/patches/rt2x00/030-rt2x00-remove-not-used-entry-field.patch b/package/kernel/mac80211/patches/rt2x00/030-rt2x00-remove-not-used-entry-field.patch deleted file mode 100644 index 53134a5bc3..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/030-rt2x00-remove-not-used-entry-field.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 2758f09b22bc08e89e0391486b2d707ad2479599 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:37 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804449 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 27/28] rt2x00: remove not used entry field - -Remove not used any longer queue_entry field and flag. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.h | 3 --- - 1 file changed, 3 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.h -@@ -361,7 +361,6 @@ enum queue_entry_flags { - ENTRY_DATA_PENDING, - ENTRY_DATA_IO_FAILED, - ENTRY_DATA_STATUS_PENDING, -- ENTRY_DATA_STATUS_SET, - }; - - /** -@@ -387,8 +386,6 @@ struct queue_entry { - - unsigned int entry_idx; - -- u32 status; -- - void *priv_data; - }; - diff --git a/package/kernel/mac80211/patches/rt2x00/031-rt2x00mmio-remove-legacy-comment.patch b/package/kernel/mac80211/patches/rt2x00/031-rt2x00mmio-remove-legacy-comment.patch deleted file mode 100644 index 199a6e3255..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/031-rt2x00mmio-remove-legacy-comment.patch +++ /dev/null @@ -1,26 +0,0 @@ -From f44e145869bb517460648e4ed71b7e9001964d06 Mon Sep 17 00:00:00 2001 -From: Stanislaw Gruszka -Date: Sat, 9 Feb 2019 12:08:38 +0100 -X-Patchwork-Submitter: Stanislaw Gruszka -X-Patchwork-Id: 10804451 -X-Patchwork-Delegate: kvalo@adurom.com -Subject: [PATCH 28/28] rt2x00mmio: remove legacy comment - -Remove comment about fields that ware removed. - -Signed-off-by: Stanislaw Gruszka ---- - drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h | 2 -- - 1 file changed, 2 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mmio.h -@@ -80,8 +80,6 @@ int rt2x00mmio_regbusy_read(struct rt2x0 - * - * @desc: Pointer to device descriptor - * @desc_dma: DMA pointer to &desc. -- * @data: Pointer to device's entry memory. -- * @data_dma: DMA pointer to &data. - */ - struct queue_entry_priv_mmio { - __le32 *desc; diff --git a/package/kernel/mac80211/patches/rt2x00/032-rt2x00-do-not-increment-sequence-number-while-re-tra.patch b/package/kernel/mac80211/patches/rt2x00/032-rt2x00-do-not-increment-sequence-number-while-re-tra.patch deleted file mode 100644 index c1f3815998..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/032-rt2x00-do-not-increment-sequence-number-while-re-tra.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 746ba11f170603bf1eaade817553a6c2e9135bbe Mon Sep 17 00:00:00 2001 -From: Vijayakumar Durai -Date: Wed, 27 Mar 2019 11:03:17 +0100 -Subject: [PATCH] rt2x00: do not increment sequence number while - re-transmitting - -Currently rt2x00 devices retransmit the management frames with -incremented sequence number if hardware is assigning the sequence. - -This is HW bug fixed already for non-QOS data frames, but it should -be fixed for management frames except beacon. - -Without fix retransmitted frames have wrong SN: - - AlphaNet_e8:fb:36 Vivotek_52:31:51 Authentication, SN=1648, FN=0, Flags=........C Frame is not being retransmitted 1648 1 - AlphaNet_e8:fb:36 Vivotek_52:31:51 Authentication, SN=1649, FN=0, Flags=....R...C Frame is being retransmitted 1649 1 - AlphaNet_e8:fb:36 Vivotek_52:31:51 Authentication, SN=1650, FN=0, Flags=....R...C Frame is being retransmitted 1650 1 - -With the fix SN stays correctly the same: - - 88:6a:e3:e8:f9:a2 8c:f5:a3:88:76:87 Authentication, SN=1450, FN=0, Flags=........C - 88:6a:e3:e8:f9:a2 8c:f5:a3:88:76:87 Authentication, SN=1450, FN=0, Flags=....R...C - 88:6a:e3:e8:f9:a2 8c:f5:a3:88:76:87 Authentication, SN=1450, FN=0, Flags=....R...C - -Cc: stable@vger.kernel.org -Signed-off-by: Vijayakumar Durai -[sgruszka: simplify code, change comments and changelog] -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2x00.h | 1 - - drivers/net/wireless/ralink/rt2x00/rt2x00mac.c | 10 ---------- - drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 15 +++++++++------ - 3 files changed, 9 insertions(+), 17 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -673,7 +673,6 @@ enum rt2x00_state_flags { - CONFIG_CHANNEL_HT40, - CONFIG_POWERSAVING, - CONFIG_HT_DISABLED, -- CONFIG_QOS_DISABLED, - CONFIG_MONITORING, - - /* ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c -@@ -642,19 +642,9 @@ void rt2x00mac_bss_info_changed(struct i - rt2x00dev->intf_associated--; - - rt2x00leds_led_assoc(rt2x00dev, !!rt2x00dev->intf_associated); -- -- clear_bit(CONFIG_QOS_DISABLED, &rt2x00dev->flags); - } - - /* -- * Check for access point which do not support 802.11e . We have to -- * generate data frames sequence number in S/W for such AP, because -- * of H/W bug. -- */ -- if (changes & BSS_CHANGED_QOS && !bss_conf->qos) -- set_bit(CONFIG_QOS_DISABLED, &rt2x00dev->flags); -- -- /* - * When the erp information has changed, we should perform - * additional configuration steps. For all other changes we are done. - */ ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c -@@ -201,15 +201,18 @@ static void rt2x00queue_create_tx_descri - if (!rt2x00_has_cap_flag(rt2x00dev, REQUIRE_SW_SEQNO)) { - /* - * rt2800 has a H/W (or F/W) bug, device incorrectly increase -- * seqno on retransmited data (non-QOS) frames. To workaround -- * the problem let's generate seqno in software if QOS is -- * disabled. -+ * seqno on retransmitted data (non-QOS) and management frames. -+ * To workaround the problem let's generate seqno in software. -+ * Except for beacons which are transmitted periodically by H/W -+ * hence hardware has to assign seqno for them. - */ -- if (test_bit(CONFIG_QOS_DISABLED, &rt2x00dev->flags)) -- __clear_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); -- else -+ if (ieee80211_is_beacon(hdr->frame_control)) { -+ __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); - /* H/W will generate sequence number */ - return; -+ } -+ -+ __clear_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); - } - - /* diff --git a/package/kernel/mac80211/patches/rt2x00/050-rt2x00-add-RT3883-support.patch b/package/kernel/mac80211/patches/rt2x00/050-rt2x00-add-RT3883-support.patch deleted file mode 100644 index 162a20155d..0000000000 --- a/package/kernel/mac80211/patches/rt2x00/050-rt2x00-add-RT3883-support.patch +++ /dev/null @@ -1,959 +0,0 @@ -From d0e61a0f7cca51ce340a5a73595189972122ff25 Mon Sep 17 00:00:00 2001 -From: Gabor Juhos -Date: Wed, 24 Apr 2019 09:49:24 +0200 -Subject: [PATCH] rt2x00: add RT3883 support - -Patch add support for RT3883 chip. Code was taken direclty -from openwrt project and merge into one patch. - -Signed-off-by: Gabor Juhos -Signed-off-by: Stanislaw Gruszka -Signed-off-by: Kalle Valo ---- - drivers/net/wireless/ralink/rt2x00/rt2800.h | 19 +- - .../net/wireless/ralink/rt2x00/rt2800lib.c | 598 +++++++++++++++++- - .../net/wireless/ralink/rt2x00/rt2800soc.c | 9 +- - 3 files changed, 607 insertions(+), 19 deletions(-) - ---- a/drivers/net/wireless/ralink/rt2x00/rt2800.h -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -48,7 +48,8 @@ - * RF2853 2.4G/5G 3T3R - * RF3320 2.4G 1T1R(RT3350/RT3370/RT3390) - * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392) -- * RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662) -+ * RF3053 2.4G/5G 3T3R(RT3563/RT3573/RT3593) -+ * RF3853 2.4G/5G 3T3R(RT3883/RT3662) - * RF5592 2.4G/5G 2T2R - * RF3070 2.4G 1T1R - * RF5360 2.4G 1T1R -@@ -72,6 +73,7 @@ - #define RF5592 0x000f - #define RF3070 0x3070 - #define RF3290 0x3290 -+#define RF3853 0x3853 - #define RF5350 0x5350 - #define RF5360 0x5360 - #define RF5362 0x5362 -@@ -1726,6 +1728,20 @@ - #define TX_PWR_CFG_9B_STBC_MCS7 FIELD32(0x000000ff) - - /* -+ * TX_TXBF_CFG: -+ */ -+#define TX_TXBF_CFG_0 0x138c -+#define TX_TXBF_CFG_1 0x13a4 -+#define TX_TXBF_CFG_2 0x13a8 -+#define TX_TXBF_CFG_3 0x13ac -+ -+/* -+ * TX_FBK_CFG_3S: -+ */ -+#define TX_FBK_CFG_3S_0 0x13c4 -+#define TX_FBK_CFG_3S_1 0x13c8 -+ -+/* - * RX_FILTER_CFG: RX configuration register. - */ - #define RX_FILTER_CFG 0x1400 -@@ -2296,6 +2312,7 @@ struct mac_iveiv_entry { - /* - * RFCSR 2: - */ -+#define RFCSR2_RESCAL_BP FIELD8(0x40) - #define RFCSR2_RESCAL_EN FIELD8(0x80) - #define RFCSR2_RX2_EN_MT7620 FIELD8(0x02) - #define RFCSR2_TX2_EN_MT7620 FIELD8(0x20) ---- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -381,7 +381,8 @@ static unsigned int rt2800_eeprom_word_i - wiphy_name(rt2x00dev->hw->wiphy), word)) - return 0; - -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - map = rt2800_eeprom_map_ext; - else - map = rt2800_eeprom_map; -@@ -590,6 +591,7 @@ void rt2800_get_txwi_rxwi_size(struct rt - { - switch (rt2x00dev->chip.rt) { - case RT3593: -+ case RT3883: - *txwi_size = TXWI_DESC_SIZE_4WORDS; - *rxwi_size = RXWI_DESC_SIZE_5WORDS; - break; -@@ -2180,7 +2182,8 @@ void rt2800_config_ant(struct rt2x00_dev - rt2800_bbp_write(rt2x00dev, 3, r3); - rt2800_bbp_write(rt2x00dev, 1, r1); - -- if (rt2x00_rt(rt2x00dev, RT3593)) { -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) { - if (ant->rx_chain_num == 1) - rt2800_bbp_write(rt2x00dev, 86, 0x00); - else -@@ -2202,7 +2205,8 @@ static void rt2800_config_lna_gain(struc - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA); - lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0); - } else if (libconf->rf.channel <= 128) { -- if (rt2x00_rt(rt2x00dev, RT3593)) { -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) { - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); - lna_gain = rt2x00_get_field16(eeprom, - EEPROM_EXT_LNA2_A1); -@@ -2212,7 +2216,8 @@ static void rt2800_config_lna_gain(struc - EEPROM_RSSI_BG2_LNA_A1); - } - } else { -- if (rt2x00_rt(rt2x00dev, RT3593)) { -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) { - eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); - lna_gain = rt2x00_get_field16(eeprom, - EEPROM_EXT_LNA2_A2); -@@ -2880,6 +2885,211 @@ static void rt2800_config_channel_rf3053 - } - } - -+static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev, -+ struct ieee80211_conf *conf, -+ struct rf_channel *rf, -+ struct channel_info *info) -+{ -+ u8 rfcsr; -+ u8 bbp; -+ u8 pwr1, pwr2, pwr3; -+ -+ const bool txbf_enabled = false; /* TODO */ -+ -+ /* TODO: add band selection */ -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40); -+ else if (rf->channel < 132) -+ rt2800_rfcsr_write(rt2x00dev, 6, 0x80); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40); -+ -+ rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1); -+ rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3); -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x46); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x48); -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 12, 0x52); -+ -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x12); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1); -+ -+ switch (rt2x00dev->default_ant.tx_chain_num) { -+ case 3: -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1); -+ /* fallthrough */ -+ case 2: -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1); -+ /* fallthrough */ -+ case 1: -+ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1); -+ break; -+ } -+ -+ switch (rt2x00dev->default_ant.rx_chain_num) { -+ case 3: -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1); -+ /* fallthrough */ -+ case 2: -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1); -+ /* fallthrough */ -+ case 1: -+ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1); -+ break; -+ } -+ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); -+ -+ rt2800_freq_cal_mode1(rt2x00dev); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 30); -+ if (!conf_is_ht40(conf)) -+ rfcsr &= ~(0x06); -+ else -+ rfcsr |= 0x06; -+ rt2800_rfcsr_write(rt2x00dev, 30, rfcsr); -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 31, 0xa0); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 31, 0x80); -+ -+ if (conf_is_ht40(conf)) -+ rt2800_rfcsr_write(rt2x00dev, 32, 0x80); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8); -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 34, 0x3c); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 34, 0x20); -+ -+ /* loopback RF_BS */ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 36); -+ if (rf->channel <= 14) -+ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1); -+ else -+ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0); -+ rt2800_rfcsr_write(rt2x00dev, 36, rfcsr); -+ -+ if (rf->channel <= 14) -+ rfcsr = 0x23; -+ else if (rf->channel < 100) -+ rfcsr = 0x36; -+ else if (rf->channel < 132) -+ rfcsr = 0x32; -+ else -+ rfcsr = 0x30; -+ -+ if (txbf_enabled) -+ rfcsr |= 0x40; -+ -+ rt2800_rfcsr_write(rt2x00dev, 39, rfcsr); -+ -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 44, 0x93); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 44, 0x9b); -+ -+ if (rf->channel <= 14) -+ rfcsr = 0xbb; -+ else if (rf->channel < 100) -+ rfcsr = 0xeb; -+ else if (rf->channel < 132) -+ rfcsr = 0xb3; -+ else -+ rfcsr = 0x9b; -+ rt2800_rfcsr_write(rt2x00dev, 45, rfcsr); -+ -+ if (rf->channel <= 14) -+ rfcsr = 0x8e; -+ else -+ rfcsr = 0x8a; -+ -+ if (txbf_enabled) -+ rfcsr |= 0x20; -+ -+ rt2800_rfcsr_write(rt2x00dev, 49, rfcsr); -+ -+ rt2800_rfcsr_write(rt2x00dev, 50, 0x86); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 51); -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 51, 0x75); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 51, 0x51); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 52); -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 52, 0x45); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 52, 0x05); -+ -+ if (rf->channel <= 14) { -+ pwr1 = info->default_power1 & 0x1f; -+ pwr2 = info->default_power2 & 0x1f; -+ pwr3 = info->default_power3 & 0x1f; -+ } else { -+ pwr1 = 0x48 | ((info->default_power1 & 0x18) << 1) | -+ (info->default_power1 & 0x7); -+ pwr2 = 0x48 | ((info->default_power2 & 0x18) << 1) | -+ (info->default_power2 & 0x7); -+ pwr3 = 0x48 | ((info->default_power3 & 0x18) << 1) | -+ (info->default_power3 & 0x7); -+ } -+ -+ rt2800_rfcsr_write(rt2x00dev, 53, pwr1); -+ rt2800_rfcsr_write(rt2x00dev, 54, pwr2); -+ rt2800_rfcsr_write(rt2x00dev, 55, pwr3); -+ -+ rt2x00_dbg(rt2x00dev, "Channel:%d, pwr1:%02x, pwr2:%02x, pwr3:%02x\n", -+ rf->channel, pwr1, pwr2, pwr3); -+ -+ bbp = (info->default_power1 >> 5) | -+ ((info->default_power2 & 0xe0) >> 1); -+ rt2800_bbp_write(rt2x00dev, 109, bbp); -+ -+ bbp = rt2800_bbp_read(rt2x00dev, 110); -+ bbp &= 0x0f; -+ bbp |= (info->default_power3 & 0xe0) >> 1; -+ rt2800_bbp_write(rt2x00dev, 110, bbp); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 57); -+ if (rf->channel <= 14) -+ rt2800_rfcsr_write(rt2x00dev, 57, 0x6e); -+ else -+ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); -+ -+ /* Enable RF tuning */ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 3); -+ rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1); -+ rt2800_rfcsr_write(rt2x00dev, 3, rfcsr); -+ -+ udelay(2000); -+ -+ bbp = rt2800_bbp_read(rt2x00dev, 49); -+ /* clear update flag */ -+ rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe); -+ rt2800_bbp_write(rt2x00dev, 49, bbp); -+ -+ /* TODO: add calibration for TxBF */ -+} -+ - #define POWER_BOUND 0x27 - #define POWER_BOUND_5G 0x2b - -@@ -3683,19 +3893,51 @@ static char rt2800_txpower_to_dev(struct - unsigned int channel, - char txpower) - { -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC); - - if (channel <= 14) - return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER); - -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - return clamp_t(char, txpower, MIN_A_TXPOWER_3593, - MAX_A_TXPOWER_3593); - else - return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER); - } - -+static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev, -+ struct rf_channel *rf) -+{ -+ u8 bbp; -+ -+ bbp = (rf->channel > 14) ? 0x48 : 0x38; -+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp); -+ -+ rt2800_bbp_write(rt2x00dev, 69, 0x12); -+ -+ if (rf->channel <= 14) { -+ rt2800_bbp_write(rt2x00dev, 70, 0x0a); -+ } else { -+ /* Disable CCK packet detection */ -+ rt2800_bbp_write(rt2x00dev, 70, 0x00); -+ } -+ -+ rt2800_bbp_write(rt2x00dev, 73, 0x10); -+ -+ if (rf->channel > 14) { -+ rt2800_bbp_write(rt2x00dev, 62, 0x1d); -+ rt2800_bbp_write(rt2x00dev, 63, 0x1d); -+ rt2800_bbp_write(rt2x00dev, 64, 0x1d); -+ } else { -+ rt2800_bbp_write(rt2x00dev, 62, 0x2d); -+ rt2800_bbp_write(rt2x00dev, 63, 0x2d); -+ rt2800_bbp_write(rt2x00dev, 64, 0x2d); -+ } -+} -+ - static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, - struct ieee80211_conf *conf, - struct rf_channel *rf, -@@ -3714,6 +3956,12 @@ static void rt2800_config_channel(struct - rt2800_txpower_to_dev(rt2x00dev, rf->channel, - info->default_power3); - -+ switch (rt2x00dev->chip.rt) { -+ case RT3883: -+ rt3883_bbp_adjust(rt2x00dev, rf); -+ break; -+ } -+ - switch (rt2x00dev->chip.rf) { - case RF2020: - case RF3020: -@@ -3734,6 +3982,9 @@ static void rt2800_config_channel(struct - case RF3322: - rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info); - break; -+ case RF3853: -+ rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info); -+ break; - case RF3070: - case RF5350: - case RF5360: -@@ -3815,6 +4066,15 @@ static void rt2800_config_channel(struct - rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); - rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); - rt2800_bbp_write(rt2x00dev, 77, 0x98); -+ } else if (rt2x00_rt(rt2x00dev, RT3883)) { -+ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); -+ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); -+ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain); -+ -+ if (rt2x00dev->default_ant.rx_chain_num > 1) -+ rt2800_bbp_write(rt2x00dev, 86, 0x46); -+ else -+ rt2800_bbp_write(rt2x00dev, 86, 0); - } else { - rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); - rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); -@@ -3828,6 +4088,7 @@ static void rt2800_config_channel(struct - !rt2x00_rt(rt2x00dev, RT6352)) { - if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) { - rt2800_bbp_write(rt2x00dev, 82, 0x62); -+ rt2800_bbp_write(rt2x00dev, 82, 0x62); - rt2800_bbp_write(rt2x00dev, 75, 0x46); - } else { - if (rt2x00_rt(rt2x00dev, RT3593)) -@@ -3836,19 +4097,22 @@ static void rt2800_config_channel(struct - rt2800_bbp_write(rt2x00dev, 82, 0x84); - rt2800_bbp_write(rt2x00dev, 75, 0x50); - } -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - rt2800_bbp_write(rt2x00dev, 83, 0x8a); - } - - } else { - if (rt2x00_rt(rt2x00dev, RT3572)) - rt2800_bbp_write(rt2x00dev, 82, 0x94); -- else if (rt2x00_rt(rt2x00dev, RT3593)) -+ else if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - rt2800_bbp_write(rt2x00dev, 82, 0x82); - else if (!rt2x00_rt(rt2x00dev, RT6352)) - rt2800_bbp_write(rt2x00dev, 82, 0xf2); - -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - rt2800_bbp_write(rt2x00dev, 83, 0x9a); - - if (rt2x00_has_cap_external_lna_a(rt2x00dev)) -@@ -3984,6 +4248,23 @@ static void rt2800_config_channel(struct - usleep_range(1000, 1500); - } - -+ if (rt2x00_rt(rt2x00dev, RT3883)) { -+ if (!conf_is_ht40(conf)) -+ rt2800_bbp_write(rt2x00dev, 105, 0x34); -+ else -+ rt2800_bbp_write(rt2x00dev, 105, 0x04); -+ -+ /* AGC init */ -+ if (rf->channel <= 14) -+ reg = 0x2e + rt2x00dev->lna_gain; -+ else -+ reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3); -+ -+ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg); -+ -+ usleep_range(1000, 1500); -+ } -+ - if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) { - reg = 0x10; - if (!conf_is_ht40(conf)) { -@@ -4243,6 +4524,9 @@ static u8 rt2800_compensate_txpower(stru - if (rt2x00_rt(rt2x00dev, RT3593)) - return min_t(u8, txpower, 0xc); - -+ if (rt2x00_rt(rt2x00dev, RT3883)) -+ return min_t(u8, txpower, 0xf); -+ - if (rt2x00_has_cap_power_limit(rt2x00dev)) { - /* - * Check if eirp txpower exceed txpower_limit. -@@ -5004,7 +5288,8 @@ static void rt2800_config_txpower(struct - struct ieee80211_channel *chan, - int power_level) - { -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level); - else if (rt2x00_rt(rt2x00dev, RT6352)) - rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level); -@@ -5051,6 +5336,7 @@ void rt2800_vco_calibration(struct rt2x0 - case RF3053: - case RF3070: - case RF3290: -+ case RF3853: - case RF5350: - case RF5360: - case RF5362: -@@ -5251,7 +5537,8 @@ static u8 rt2800_get_default_vgc(struct - else - vgc = 0x2e + rt2x00dev->lna_gain; - } else { /* 5GHZ band */ -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3; - else if (rt2x00_rt(rt2x00dev, RT5592)) - vgc = 0x24 + (2 * rt2x00dev->lna_gain); -@@ -5271,7 +5558,8 @@ static inline void rt2800_set_vgc(struct - { - if (qual->vgc_level != vgc_level) { - if (rt2x00_rt(rt2x00dev, RT3572) || -- rt2x00_rt(rt2x00dev, RT3593)) { -+ rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) { - rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, - vgc_level); - } else if (rt2x00_rt(rt2x00dev, RT5592)) { -@@ -5318,6 +5606,11 @@ void rt2800_link_tuner(struct rt2x00_dev - } - break; - -+ case RT3883: -+ if (qual->rssi > -65) -+ vgc += 0x10; -+ break; -+ - case RT5592: - if (qual->rssi > -65) - vgc += 0x20; -@@ -5470,6 +5763,12 @@ static int rt2800_init_registers(struct - rt2800_register_write(rt2x00dev, TX_SW_CFG2, - 0x00000000); - } -+ } else if (rt2x00_rt(rt2x00dev, RT3883)) { -+ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000); -+ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00040000); -+ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21); -+ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40); - } else if (rt2x00_rt(rt2x00dev, RT5390) || - rt2x00_rt(rt2x00dev, RT5392) || - rt2x00_rt(rt2x00dev, RT6352)) { -@@ -5683,6 +5982,11 @@ static int rt2800_init_registers(struct - reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002; - rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg); - -+ if (rt2x00_rt(rt2x00dev, RT3883)) { -+ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008); -+ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413); -+ } -+ - reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG); - rt2x00_set_field32(®, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7); - rt2x00_set_field32(®, TX_RTS_CFG_RTS_THRES, -@@ -6299,6 +6603,47 @@ static void rt2800_init_bbp_3593(struct - rt2800_bbp_write(rt2x00dev, 103, 0xc0); - } - -+static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev) -+{ -+ rt2800_init_bbp_early(rt2x00dev); -+ -+ rt2800_bbp_write(rt2x00dev, 4, 0x50); -+ rt2800_bbp_write(rt2x00dev, 47, 0x48); -+ -+ rt2800_bbp_write(rt2x00dev, 86, 0x46); -+ rt2800_bbp_write(rt2x00dev, 88, 0x90); -+ -+ rt2800_bbp_write(rt2x00dev, 92, 0x02); -+ -+ rt2800_bbp_write(rt2x00dev, 103, 0xc0); -+ rt2800_bbp_write(rt2x00dev, 104, 0x92); -+ rt2800_bbp_write(rt2x00dev, 105, 0x34); -+ rt2800_bbp_write(rt2x00dev, 106, 0x12); -+ rt2800_bbp_write(rt2x00dev, 120, 0x50); -+ rt2800_bbp_write(rt2x00dev, 137, 0x0f); -+ rt2800_bbp_write(rt2x00dev, 163, 0x9d); -+ -+ /* Set ITxBF timeout to 0x9C40=1000msec */ -+ rt2800_bbp_write(rt2x00dev, 179, 0x02); -+ rt2800_bbp_write(rt2x00dev, 180, 0x00); -+ rt2800_bbp_write(rt2x00dev, 182, 0x40); -+ rt2800_bbp_write(rt2x00dev, 180, 0x01); -+ rt2800_bbp_write(rt2x00dev, 182, 0x9c); -+ -+ rt2800_bbp_write(rt2x00dev, 179, 0x00); -+ -+ /* Reprogram the inband interface to put right values in RXWI */ -+ rt2800_bbp_write(rt2x00dev, 142, 0x04); -+ rt2800_bbp_write(rt2x00dev, 143, 0x3b); -+ rt2800_bbp_write(rt2x00dev, 142, 0x06); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa0); -+ rt2800_bbp_write(rt2x00dev, 142, 0x07); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa1); -+ rt2800_bbp_write(rt2x00dev, 142, 0x08); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa2); -+ rt2800_bbp_write(rt2x00dev, 148, 0xc8); -+} -+ - static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev) - { - int ant, div_mode; -@@ -6743,6 +7088,9 @@ static void rt2800_init_bbp(struct rt2x0 - case RT3593: - rt2800_init_bbp_3593(rt2x00dev); - return; -+ case RT3883: -+ rt2800_init_bbp_3883(rt2x00dev); -+ return; - case RT5390: - case RT5392: - rt2800_init_bbp_53xx(rt2x00dev); -@@ -7614,6 +7962,144 @@ static void rt2800_init_rfcsr_5350(struc - rt2800_rfcsr_write(rt2x00dev, 63, 0x00); - } - -+static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev) -+{ -+ u8 rfcsr; -+ -+ /* TODO: get the actual ECO value from the SoC */ -+ const unsigned int eco = 5; -+ -+ rt2800_rf_init_calibration(rt2x00dev, 2); -+ -+ rt2800_rfcsr_write(rt2x00dev, 0, 0xe0); -+ rt2800_rfcsr_write(rt2x00dev, 1, 0x03); -+ rt2800_rfcsr_write(rt2x00dev, 2, 0x50); -+ rt2800_rfcsr_write(rt2x00dev, 3, 0x20); -+ rt2800_rfcsr_write(rt2x00dev, 4, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 5, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 6, 0x40); -+ rt2800_rfcsr_write(rt2x00dev, 7, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 8, 0x5b); -+ rt2800_rfcsr_write(rt2x00dev, 9, 0x08); -+ rt2800_rfcsr_write(rt2x00dev, 10, 0xd3); -+ rt2800_rfcsr_write(rt2x00dev, 11, 0x48); -+ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a); -+ rt2800_rfcsr_write(rt2x00dev, 13, 0x12); -+ rt2800_rfcsr_write(rt2x00dev, 14, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 15, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 16, 0x00); -+ -+ /* RFCSR 17 will be initialized later based on the -+ * frequency offset stored in the EEPROM -+ */ -+ -+ rt2800_rfcsr_write(rt2x00dev, 18, 0x40); -+ rt2800_rfcsr_write(rt2x00dev, 19, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 20, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 21, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 22, 0x20); -+ rt2800_rfcsr_write(rt2x00dev, 23, 0xc0); -+ rt2800_rfcsr_write(rt2x00dev, 24, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 25, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 26, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 27, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 28, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 29, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 30, 0x10); -+ rt2800_rfcsr_write(rt2x00dev, 31, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 32, 0x80); -+ rt2800_rfcsr_write(rt2x00dev, 33, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 34, 0x20); -+ rt2800_rfcsr_write(rt2x00dev, 35, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 36, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 37, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 38, 0x86); -+ rt2800_rfcsr_write(rt2x00dev, 39, 0x23); -+ rt2800_rfcsr_write(rt2x00dev, 40, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 41, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 42, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 43, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 44, 0x93); -+ rt2800_rfcsr_write(rt2x00dev, 45, 0xbb); -+ rt2800_rfcsr_write(rt2x00dev, 46, 0x60); -+ rt2800_rfcsr_write(rt2x00dev, 47, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 48, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 49, 0x8e); -+ rt2800_rfcsr_write(rt2x00dev, 50, 0x86); -+ rt2800_rfcsr_write(rt2x00dev, 51, 0x51); -+ rt2800_rfcsr_write(rt2x00dev, 52, 0x05); -+ rt2800_rfcsr_write(rt2x00dev, 53, 0x76); -+ rt2800_rfcsr_write(rt2x00dev, 54, 0x76); -+ rt2800_rfcsr_write(rt2x00dev, 55, 0x76); -+ rt2800_rfcsr_write(rt2x00dev, 56, 0xdb); -+ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e); -+ rt2800_rfcsr_write(rt2x00dev, 58, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 59, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 60, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 61, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 62, 0x00); -+ rt2800_rfcsr_write(rt2x00dev, 63, 0x00); -+ -+ /* TODO: rx filter calibration? */ -+ -+ rt2800_bbp_write(rt2x00dev, 137, 0x0f); -+ -+ rt2800_bbp_write(rt2x00dev, 163, 0x9d); -+ -+ rt2800_bbp_write(rt2x00dev, 105, 0x05); -+ -+ rt2800_bbp_write(rt2x00dev, 179, 0x02); -+ rt2800_bbp_write(rt2x00dev, 180, 0x00); -+ rt2800_bbp_write(rt2x00dev, 182, 0x40); -+ rt2800_bbp_write(rt2x00dev, 180, 0x01); -+ rt2800_bbp_write(rt2x00dev, 182, 0x9c); -+ -+ rt2800_bbp_write(rt2x00dev, 179, 0x00); -+ -+ rt2800_bbp_write(rt2x00dev, 142, 0x04); -+ rt2800_bbp_write(rt2x00dev, 143, 0x3b); -+ rt2800_bbp_write(rt2x00dev, 142, 0x06); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa0); -+ rt2800_bbp_write(rt2x00dev, 142, 0x07); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa1); -+ rt2800_bbp_write(rt2x00dev, 142, 0x08); -+ rt2800_bbp_write(rt2x00dev, 143, 0xa2); -+ rt2800_bbp_write(rt2x00dev, 148, 0xc8); -+ -+ if (eco == 5) { -+ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8); -+ rt2800_rfcsr_write(rt2x00dev, 33, 0x32); -+ } -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 2); -+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0); -+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1); -+ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); -+ msleep(1); -+ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0); -+ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 1); -+ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1); -+ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 6); -+ rfcsr |= 0xc0; -+ rt2800_rfcsr_write(rt2x00dev, 6, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 22); -+ rfcsr |= 0x20; -+ rt2800_rfcsr_write(rt2x00dev, 22, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 46); -+ rfcsr |= 0x20; -+ rt2800_rfcsr_write(rt2x00dev, 46, rfcsr); -+ -+ rfcsr = rt2800_rfcsr_read(rt2x00dev, 20); -+ rfcsr &= ~0xee; -+ rt2800_rfcsr_write(rt2x00dev, 20, rfcsr); -+} -+ - static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev) - { - rt2800_rf_init_calibration(rt2x00dev, 2); -@@ -8456,6 +8942,9 @@ static void rt2800_init_rfcsr(struct rt2 - case RT3390: - rt2800_init_rfcsr_3390(rt2x00dev); - break; -+ case RT3883: -+ rt2800_init_rfcsr_3883(rt2x00dev); -+ break; - case RT3572: - rt2800_init_rfcsr_3572(rt2x00dev); - break; -@@ -8661,7 +9150,8 @@ static u8 rt2800_get_txmixer_gain_24g(st - { - u16 word; - -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - return 0; - - word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG); -@@ -8675,7 +9165,8 @@ static u8 rt2800_get_txmixer_gain_5g(str - { - u16 word; - -- if (rt2x00_rt(rt2x00dev, RT3593)) -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) - return 0; - - word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A); -@@ -8781,7 +9272,8 @@ static int rt2800_validate_eeprom(struct - word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2); - if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) - rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); -- if (!rt2x00_rt(rt2x00dev, RT3593)) { -+ if (!rt2x00_rt(rt2x00dev, RT3593) && -+ !rt2x00_rt(rt2x00dev, RT3883)) { - if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 || - rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff) - rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1, -@@ -8801,7 +9293,8 @@ static int rt2800_validate_eeprom(struct - word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2); - if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10) - rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0); -- if (!rt2x00_rt(rt2x00dev, RT3593)) { -+ if (!rt2x00_rt(rt2x00dev, RT3593) && -+ !rt2x00_rt(rt2x00dev, RT3883)) { - if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 || - rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff) - rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2, -@@ -8809,7 +9302,8 @@ static int rt2800_validate_eeprom(struct - } - rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word); - -- if (rt2x00_rt(rt2x00dev, RT3593)) { -+ if (rt2x00_rt(rt2x00dev, RT3593) || -+ rt2x00_rt(rt2x00dev, RT3883)) { - word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2); - if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 || - rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff) -@@ -8848,6 +9342,8 @@ static int rt2800_init_eeprom(struct rt2 - rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID); - else if (rt2x00_rt(rt2x00dev, RT3352)) - rf = RF3322; -+ else if (rt2x00_rt(rt2x00dev, RT3883)) -+ rf = RF3853; - else if (rt2x00_rt(rt2x00dev, RT5350)) - rf = RF5350; - else -@@ -8868,6 +9364,7 @@ static int rt2800_init_eeprom(struct rt2 - case RF3290: - case RF3320: - case RF3322: -+ case RF3853: - case RF5350: - case RF5360: - case RF5362: -@@ -9154,6 +9651,66 @@ static const struct rf_channel rf_vals_3 - {14, 0xF0, 2, 0x18}, - }; - -+static const struct rf_channel rf_vals_3853[] = { -+ {1, 241, 6, 2}, -+ {2, 241, 6, 7}, -+ {3, 242, 6, 2}, -+ {4, 242, 6, 7}, -+ {5, 243, 6, 2}, -+ {6, 243, 6, 7}, -+ {7, 244, 6, 2}, -+ {8, 244, 6, 7}, -+ {9, 245, 6, 2}, -+ {10, 245, 6, 7}, -+ {11, 246, 6, 2}, -+ {12, 246, 6, 7}, -+ {13, 247, 6, 2}, -+ {14, 248, 6, 4}, -+ -+ {36, 0x56, 8, 4}, -+ {38, 0x56, 8, 6}, -+ {40, 0x56, 8, 8}, -+ {44, 0x57, 8, 0}, -+ {46, 0x57, 8, 2}, -+ {48, 0x57, 8, 4}, -+ {52, 0x57, 8, 8}, -+ {54, 0x57, 8, 10}, -+ {56, 0x58, 8, 0}, -+ {60, 0x58, 8, 4}, -+ {62, 0x58, 8, 6}, -+ {64, 0x58, 8, 8}, -+ -+ {100, 0x5b, 8, 8}, -+ {102, 0x5b, 8, 10}, -+ {104, 0x5c, 8, 0}, -+ {108, 0x5c, 8, 4}, -+ {110, 0x5c, 8, 6}, -+ {112, 0x5c, 8, 8}, -+ {114, 0x5c, 8, 10}, -+ {116, 0x5d, 8, 0}, -+ {118, 0x5d, 8, 2}, -+ {120, 0x5d, 8, 4}, -+ {124, 0x5d, 8, 8}, -+ {126, 0x5d, 8, 10}, -+ {128, 0x5e, 8, 0}, -+ {132, 0x5e, 8, 4}, -+ {134, 0x5e, 8, 6}, -+ {136, 0x5e, 8, 8}, -+ {140, 0x5f, 8, 0}, -+ -+ {149, 0x5f, 8, 9}, -+ {151, 0x5f, 8, 11}, -+ {153, 0x60, 8, 1}, -+ {157, 0x60, 8, 5}, -+ {159, 0x60, 8, 7}, -+ {161, 0x60, 8, 9}, -+ {165, 0x61, 8, 1}, -+ {167, 0x61, 8, 3}, -+ {169, 0x61, 8, 5}, -+ {171, 0x61, 8, 7}, -+ {173, 0x61, 8, 9}, -+}; -+ - static const struct rf_channel rf_vals_5592_xtal20[] = { - /* Channel, N, K, mod, R */ - {1, 482, 4, 10, 3}, -@@ -9417,6 +9974,11 @@ static int rt2800_probe_hw_mode(struct r - spec->channels = rf_vals_3x; - break; - -+ case RF3853: -+ spec->num_channels = ARRAY_SIZE(rf_vals_3853); -+ spec->channels = rf_vals_3853; -+ break; -+ - case RF5592: - reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX); - if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) { -@@ -9536,6 +10098,7 @@ static int rt2800_probe_hw_mode(struct r - case RF3053: - case RF3070: - case RF3290: -+ case RF3853: - case RF5350: - case RF5360: - case RF5362: -@@ -9578,6 +10141,7 @@ static int rt2800_probe_rt(struct rt2x00 - case RT3390: - case RT3572: - case RT3593: -+ case RT3883: - case RT5350: - case RT5390: - case RT5392: ---- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -51,9 +51,16 @@ static bool rt2800soc_hwcrypt_disabled(s - - static void rt2800soc_disable_radio(struct rt2x00_dev *rt2x00dev) - { -+ u32 reg; -+ - rt2800_disable_radio(rt2x00dev); - rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0); -- rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, 0); -+ -+ reg = 0; -+ if (rt2x00_rt(rt2x00dev, RT3883)) -+ rt2x00_set_field32(®, TX_PIN_CFG_RFTR_EN, 1); -+ -+ rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, reg); - } - - static int rt2800soc_set_device_state(struct rt2x00_dev *rt2x00dev, diff --git a/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch b/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch index 9dd348151c..295904c64e 100644 --- a/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch +++ b/package/kernel/mac80211/patches/rt2x00/100-rt2x00_options.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/Kconfig +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -225,36 +225,37 @@ config RT2800SOC +@@ -226,36 +226,37 @@ config RT2800SOC config RT2800_LIB diff --git a/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch b/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch index 699989baa0..b4106b0197 100644 --- a/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch +++ b/package/kernel/mac80211/patches/rt2x00/501-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos --- a/drivers/net/wireless/ralink/rt2x00/Kconfig +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -210,7 +210,7 @@ endif +@@ -211,7 +211,7 @@ endif config RT2800SOC tristate "Ralink WiSoC support" depends on m @@ -19,7 +19,7 @@ Signed-off-by: Gabor Juhos select RT2X00_LIB_SOC select RT2X00_LIB_MMIO select RT2X00_LIB_CRYPTO -@@ -245,7 +245,7 @@ config RT2X00_LIB_PCI +@@ -246,7 +246,7 @@ config RT2X00_LIB_PCI config RT2X00_LIB_SOC tristate "RT2x00 SoC support" diff --git a/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch b/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch index 9d47076ff6..f9d48b2b31 100644 --- a/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch +++ b/package/kernel/mac80211/patches/rt2x00/601-rt2x00-introduce-rt2x00_platform_h.patch @@ -22,7 +22,7 @@ +#endif /* _RT2X00_PLATFORM_H */ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -40,6 +40,7 @@ +@@ -29,6 +29,7 @@ #include #include #include diff --git a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch index 697d8188f0..417ef32b3d 100644 --- a/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/kernel/mac80211/patches/rt2x00/602-rt2x00-introduce-rt2x00eeprom.patch @@ -1,6 +1,6 @@ --- a/local-symbols +++ b/local-symbols -@@ -305,6 +305,7 @@ RT2X00_LIB_FIRMWARE= +@@ -311,6 +311,7 @@ RT2X00_LIB_FIRMWARE= RT2X00_LIB_CRYPTO= RT2X00_LIB_LEDS= RT2X00_LIB_DEBUGFS= @@ -10,7 +10,7 @@ RTL8180= --- a/drivers/net/wireless/ralink/rt2x00/Kconfig +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -69,6 +69,7 @@ config RT2800PCI +@@ -70,6 +70,7 @@ config RT2800PCI select RT2X00_LIB_MMIO select RT2X00_LIB_PCI select RT2X00_LIB_FIRMWARE @@ -18,7 +18,7 @@ select RT2X00_LIB_CRYPTO depends on CRC_CCITT depends on EEPROM_93CX6 -@@ -215,6 +216,7 @@ config RT2800SOC +@@ -216,6 +217,7 @@ config RT2800SOC select RT2X00_LIB_MMIO select RT2X00_LIB_CRYPTO select RT2X00_LIB_FIRMWARE @@ -26,7 +26,7 @@ select RT2800_LIB select RT2800_LIB_MMIO ---help--- -@@ -265,6 +267,9 @@ config RT2X00_LIB_FIRMWARE +@@ -266,6 +268,9 @@ config RT2X00_LIB_FIRMWARE config RT2X00_LIB_CRYPTO bool @@ -48,7 +48,7 @@ obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -48,6 +48,8 @@ struct rt2800_drv_data { +@@ -37,6 +37,8 @@ struct rt2800_drv_data { struct ieee80211_sta *wcid_to_sta[STA_IDS_SIZE]; }; @@ -57,7 +57,7 @@ struct rt2800_ops { u32 (*register_read)(struct rt2x00_dev *rt2x00dev, const unsigned int offset); -@@ -145,6 +147,15 @@ static inline int rt2800_read_eeprom(str +@@ -134,6 +136,15 @@ static inline int rt2800_read_eeprom(str { const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv; @@ -75,7 +75,7 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -102,19 +102,6 @@ static int rt2800soc_set_device_state(st +@@ -90,19 +90,6 @@ static int rt2800soc_set_device_state(st return retval; } @@ -95,7 +95,7 @@ /* Firmware functions */ static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev) { -@@ -178,7 +165,6 @@ static const struct rt2800_ops rt2800soc +@@ -166,7 +153,6 @@ static const struct rt2800_ops rt2800soc .register_multiread = rt2x00mmio_register_multiread, .register_multiwrite = rt2x00mmio_register_multiwrite, .regbusy_read = rt2x00mmio_regbusy_read, @@ -105,7 +105,7 @@ .drv_init_registers = rt2800mmio_init_registers, --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -702,6 +702,7 @@ enum rt2x00_capability_flags { +@@ -691,6 +691,7 @@ enum rt2x00_capability_flags { REQUIRE_HT_TX_DESC, REQUIRE_PS_AUTOWAKE, REQUIRE_DELAYED_RFKILL, @@ -113,7 +113,7 @@ /* * Capabilities -@@ -977,6 +978,11 @@ struct rt2x00_dev { +@@ -966,6 +967,11 @@ struct rt2x00_dev { const struct firmware *fw; /* @@ -127,7 +127,7 @@ DECLARE_KFIFO_PTR(txstatus_fifo, u32); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1423,6 +1423,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de +@@ -1412,6 +1412,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep); @@ -138,7 +138,7 @@ /* * Let the driver probe the device to detect the capabilities. */ -@@ -1566,6 +1570,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ +@@ -1555,6 +1559,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ * Free the driver data. */ kfree(rt2x00dev->drv_data); @@ -261,7 +261,7 @@ +} --- a/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00lib.h -@@ -297,6 +297,22 @@ static inline void rt2x00lib_free_firmwa +@@ -286,6 +286,22 @@ static inline void rt2x00lib_free_firmwa #endif /* CPTCFG_RT2X00_LIB_FIRMWARE */ /* @@ -286,7 +286,7 @@ #ifdef CPTCFG_RT2X00_LIB_DEBUGFS --- a/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00soc.c -@@ -97,6 +97,7 @@ int rt2x00soc_probe(struct platform_devi +@@ -86,6 +86,7 @@ int rt2x00soc_probe(struct platform_devi if (IS_ERR(rt2x00dev->clk)) rt2x00dev->clk = NULL; diff --git a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch b/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch index b3e1220b60..08ca7c96fd 100644 --- a/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch +++ b/package/kernel/mac80211/patches/rt2x00/604-rt2x00-load-eeprom-on-SoC-from-a-mtd-device-defines-.patch @@ -12,7 +12,7 @@ Signed-off-by: John Crispin --- a/drivers/net/wireless/ralink/rt2x00/Kconfig +++ b/drivers/net/wireless/ralink/rt2x00/Kconfig -@@ -219,6 +219,7 @@ config RT2800SOC +@@ -220,6 +220,7 @@ config RT2800SOC select RT2X00_LIB_EEPROM select RT2800_LIB select RT2800_LIB_MMIO diff --git a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch index 202dfc0b89..3372e0b3ab 100644 --- a/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch +++ b/package/kernel/mac80211/patches/rt2x00/606-rt2x00-allow_disabling_bands_through_platform_data.patch @@ -12,7 +12,7 @@ #endif /* _RT2X00_PLATFORM_H */ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1026,6 +1026,22 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1015,6 +1015,22 @@ static int rt2x00lib_probe_hw_modes(stru unsigned int num_rates; unsigned int i; @@ -37,7 +37,7 @@ num_rates += 4; --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -409,6 +409,7 @@ struct hw_mode_spec { +@@ -398,6 +398,7 @@ struct hw_mode_spec { unsigned int supported_bands; #define SUPPORT_BAND_2GHZ 0x00000001 #define SUPPORT_BAND_5GHZ 0x00000002 diff --git a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch index b8b0188040..f694b061d8 100644 --- a/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch +++ b/package/kernel/mac80211/patches/rt2x00/607-rt2x00-add_platform_data_mac_addr.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1004,8 +1004,13 @@ static void rt2x00lib_rate(struct ieee80 +@@ -993,8 +993,13 @@ static void rt2x00lib_rate(struct ieee80 void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr) { @@ -12,7 +12,7 @@ + ether_addr_copy(eeprom_mac_addr, pdata->mac_address); + mac_addr = of_get_mac_address(rt2x00dev->dev->of_node); - if (mac_addr) + if (!IS_ERR(mac_addr)) ether_addr_copy(eeprom_mac_addr, mac_addr); --- a/include/linux/rt2x00_platform.h +++ b/include/linux/rt2x00_platform.h diff --git a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch index ca66aa8e3b..07f7d34941 100644 --- a/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch +++ b/package/kernel/mac80211/patches/rt2x00/608-rt2x00-allow_disabling_bands_through_dts.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1030,6 +1030,16 @@ static int rt2x00lib_probe_hw_modes(stru +@@ -1019,6 +1019,16 @@ static int rt2x00lib_probe_hw_modes(stru struct ieee80211_rate *rates; unsigned int num_rates; unsigned int i; diff --git a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch index ed219c801e..4cb892b3df 100644 --- a/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch +++ b/package/kernel/mac80211/patches/rt2x00/609-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch @@ -13,7 +13,7 @@ Signed-off-by: John Crispin --- a/drivers/net/wireless/ralink/rt2x00/rt2800soc.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800soc.c -@@ -232,10 +232,17 @@ static int rt2800soc_probe(struct platfo +@@ -220,10 +220,17 @@ static int rt2800soc_probe(struct platfo return rt2x00soc_probe(pdev, &rt2800soc_ops); } diff --git a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch index f0c079b62b..5ea402f5da 100644 --- a/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch +++ b/package/kernel/mac80211/patches/rt2x00/610-rt2x00-change-led-polarity-from-OF.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -36,6 +36,7 @@ +@@ -25,6 +25,7 @@ #include #include #include @@ -8,7 +8,7 @@ #include "rt2x00.h" #include "rt2800lib.h" -@@ -9458,6 +9459,17 @@ static int rt2800_init_eeprom(struct rt2 +@@ -9447,6 +9448,17 @@ static int rt2800_init_eeprom(struct rt2 rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC); rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY); @@ -28,7 +28,7 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00leds.c -@@ -109,6 +109,9 @@ static int rt2x00leds_register_led(struc +@@ -98,6 +98,9 @@ static int rt2x00leds_register_led(struc led->led_dev.name = name; led->led_dev.brightness = LED_OFF; diff --git a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch index 062b18a63b..453129d66a 100644 --- a/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch +++ b/package/kernel/mac80211/patches/rt2x00/611-rt2x00-add-AP+STA-support.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c -@@ -1361,7 +1361,7 @@ static inline void rt2x00lib_set_if_comb +@@ -1350,7 +1350,7 @@ static inline void rt2x00lib_set_if_comb */ if_limit = &rt2x00dev->if_limits_ap; if_limit->max = rt2x00dev->ops->max_ap_intf; diff --git a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch b/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch index 2b6aa43c2d..98eb8c0b7e 100644 --- a/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch +++ b/package/kernel/mac80211/patches/rt2x00/650-rt2x00-add-support-for-external-PA-on-MT7620.patch @@ -20,7 +20,7 @@ Signed-off-by: Tomislav Po=C5=BEega --- a/drivers/net/wireless/ralink/rt2x00/rt2800.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800.h -@@ -2750,6 +2750,7 @@ enum rt2800_eeprom_word { +@@ -2739,6 +2739,7 @@ enum rt2800_eeprom_word { #define EEPROM_NIC_CONF2_RX_STREAM FIELD16(0x000f) #define EEPROM_NIC_CONF2_TX_STREAM FIELD16(0x00f0) #define EEPROM_NIC_CONF2_CRYSTAL FIELD16(0x0600) @@ -30,7 +30,7 @@ Signed-off-by: Tomislav Po=C5=BEega * EEPROM LNA --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -4290,6 +4290,45 @@ static void rt2800_config_channel(struct +@@ -4279,6 +4279,45 @@ static void rt2800_config_channel(struct rt2800_iq_calibrate(rt2x00dev, rf->channel); } @@ -76,7 +76,7 @@ Signed-off-by: Tomislav Po=C5=BEega bbp = rt2800_bbp_read(rt2x00dev, 4); rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf)); rt2800_bbp_write(rt2x00dev, 4, bbp); -@@ -9487,7 +9526,8 @@ static int rt2800_init_eeprom(struct rt2 +@@ -9476,7 +9515,8 @@ static int rt2800_init_eeprom(struct rt2 */ eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1); @@ -86,7 +86,7 @@ Signed-off-by: Tomislav Po=C5=BEega if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352)) __set_bit(CAPABILITY_EXTERNAL_PA_TX0, -@@ -9498,6 +9538,18 @@ static int rt2800_init_eeprom(struct rt2 +@@ -9487,6 +9527,18 @@ static int rt2800_init_eeprom(struct rt2 &rt2x00dev->cap_flags); } diff --git a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch index 454f55b1cf..ceec92d928 100644 --- a/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch +++ b/package/kernel/mac80211/patches/rt2x00/982-rt2x00-add-rf-self-txdc-calibration.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8349,6 +8349,58 @@ static void rt2800_init_rfcsr_5592(struc +@@ -8338,6 +8338,58 @@ static void rt2800_init_rfcsr_5592(struc rt2800_led_open_drain_enable(rt2x00dev); } @@ -59,7 +59,7 @@ static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, bool set_bw, bool is_ht40) { -@@ -8956,6 +9008,7 @@ static void rt2800_init_rfcsr_6352(struc +@@ -8945,6 +8997,7 @@ static void rt2800_init_rfcsr_6352(struc rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); @@ -69,7 +69,7 @@ } --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -243,6 +243,7 @@ void rt2800_link_tuner(struct rt2x00_dev +@@ -232,6 +232,7 @@ void rt2800_link_tuner(struct rt2x00_dev const u32 count); void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev); @@ -79,7 +79,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -572,6 +572,7 @@ struct rt2x00lib_ops { +@@ -561,6 +561,7 @@ struct rt2x00lib_ops { struct link_qual *qual, const u32 count); void (*gain_calibration) (struct rt2x00_dev *rt2x00dev); void (*vco_calibration) (struct rt2x00_dev *rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch b/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch index 6f0d5b577f..45edee8644 100644 --- a/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch +++ b/package/kernel/mac80211/patches/rt2x00/983-rt2x00-add-r-calibration.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8401,6 +8401,160 @@ void rt2800_rf_self_txdc_cal(struct rt2x +@@ -8390,6 +8390,160 @@ void rt2800_rf_self_txdc_cal(struct rt2x } EXPORT_SYMBOL_GPL(rt2800_rf_self_txdc_cal); @@ -161,7 +161,7 @@ static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, bool set_bw, bool is_ht40) { -@@ -9008,6 +9162,7 @@ static void rt2800_init_rfcsr_6352(struc +@@ -8997,6 +9151,7 @@ static void rt2800_init_rfcsr_6352(struc rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00); rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C); @@ -171,7 +171,7 @@ rt2800_bw_filter_calibration(rt2x00dev, false); --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -244,6 +244,8 @@ void rt2800_link_tuner(struct rt2x00_dev +@@ -233,6 +233,8 @@ void rt2800_link_tuner(struct rt2x00_dev void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_rf_self_txdc_cal(struct rt2x00_dev *rt2x00dev); @@ -182,7 +182,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -573,6 +573,8 @@ struct rt2x00lib_ops { +@@ -562,6 +562,8 @@ struct rt2x00lib_ops { void (*gain_calibration) (struct rt2x00_dev *rt2x00dev); void (*vco_calibration) (struct rt2x00_dev *rt2x00dev); void (*rf_self_txdc_cal) (struct rt2x00_dev *rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch b/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch index fbeace27da..c6b996782c 100644 --- a/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch +++ b/package/kernel/mac80211/patches/rt2x00/984-rt2x00-add-rxdcoc-calibration.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8555,6 +8555,71 @@ void rt2800_r_calibration(struct rt2x00_ +@@ -8544,6 +8544,71 @@ void rt2800_r_calibration(struct rt2x00_ } EXPORT_SYMBOL_GPL(rt2800_r_calibration); @@ -72,7 +72,7 @@ static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, bool set_bw, bool is_ht40) { -@@ -9164,6 +9229,7 @@ static void rt2800_init_rfcsr_6352(struc +@@ -9153,6 +9218,7 @@ static void rt2800_init_rfcsr_6352(struc rt2800_r_calibration(rt2x00dev); rt2800_rf_self_txdc_cal(rt2x00dev); @@ -82,7 +82,7 @@ } --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -246,6 +246,7 @@ void rt2800_vco_calibration(struct rt2x0 +@@ -235,6 +235,7 @@ void rt2800_vco_calibration(struct rt2x0 void rt2800_rf_self_txdc_cal(struct rt2x00_dev *rt2x00dev); int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2); void rt2800_r_calibration(struct rt2x00_dev *rt2x00dev); @@ -92,7 +92,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -575,6 +575,7 @@ struct rt2x00lib_ops { +@@ -564,6 +564,7 @@ struct rt2x00lib_ops { void (*rf_self_txdc_cal) (struct rt2x00_dev *rt2x00dev); int (*calcrcalibrationcode) (struct rt2x00_dev *rt2x00dev, int d1, int d2); void (*r_calibration) (struct rt2x00_dev *rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch b/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch index f469c4ebc7..9881469d99 100644 --- a/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch +++ b/package/kernel/mac80211/patches/rt2x00/985-rt2x00-add-rxiq-calibration.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -8620,6 +8620,386 @@ void rt2800_rxdcoc_calibration(struct rt +@@ -8609,6 +8609,386 @@ void rt2800_rxdcoc_calibration(struct rt } EXPORT_SYMBOL_GPL(rt2800_rxdcoc_calibration); @@ -387,7 +387,7 @@ static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, bool set_bw, bool is_ht40) { -@@ -9232,6 +9612,7 @@ static void rt2800_init_rfcsr_6352(struc +@@ -9221,6 +9601,7 @@ static void rt2800_init_rfcsr_6352(struc rt2800_rxdcoc_calibration(rt2x00dev); rt2800_bw_filter_calibration(rt2x00dev, true); rt2800_bw_filter_calibration(rt2x00dev, false); @@ -397,7 +397,7 @@ static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -247,6 +247,7 @@ void rt2800_rf_self_txdc_cal(struct rt2x +@@ -236,6 +236,7 @@ void rt2800_rf_self_txdc_cal(struct rt2x int rt2800_calcrcalibrationcode(struct rt2x00_dev *rt2x00dev, int d1, int d2); void rt2800_r_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_rxdcoc_calibration(struct rt2x00_dev *rt2x00dev); @@ -407,7 +407,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -576,6 +576,7 @@ struct rt2x00lib_ops { +@@ -565,6 +565,7 @@ struct rt2x00lib_ops { int (*calcrcalibrationcode) (struct rt2x00_dev *rt2x00dev, int d1, int d2); void (*r_calibration) (struct rt2x00_dev *rt2x00dev); void (*rxdcoc_calibration) (struct rt2x00_dev *rt2x00dev); diff --git a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch b/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch index 31a860c1a7..d3118ebb3b 100644 --- a/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch +++ b/package/kernel/mac80211/patches/rt2x00/986-rt2x00-add-TX-LOFT-calibration.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c -@@ -9000,6 +9000,954 @@ restore_value: +@@ -8989,6 +8989,954 @@ restore_value: } EXPORT_SYMBOL_GPL(rt2800_rxiq_calibration); @@ -955,7 +955,7 @@ static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev, bool set_bw, bool is_ht40) { -@@ -9612,6 +10560,7 @@ static void rt2800_init_rfcsr_6352(struc +@@ -9601,6 +10549,7 @@ static void rt2800_init_rfcsr_6352(struc rt2800_rxdcoc_calibration(rt2x00dev); rt2800_bw_filter_calibration(rt2x00dev, true); rt2800_bw_filter_calibration(rt2x00dev, false); @@ -965,7 +965,7 @@ --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.h -@@ -28,6 +28,16 @@ +@@ -17,6 +17,16 @@ #define WCID_START 33 #define WCID_END 222 #define STA_IDS_SIZE (WCID_END - WCID_START + 2) @@ -982,7 +982,7 @@ /* RT2800 driver data structure */ struct rt2800_drv_data { -@@ -248,6 +258,7 @@ int rt2800_calcrcalibrationcode(struct r +@@ -237,6 +247,7 @@ int rt2800_calcrcalibrationcode(struct r void rt2800_r_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_rxdcoc_calibration(struct rt2x00_dev *rt2x00dev); void rt2800_rxiq_calibration(struct rt2x00_dev *rt2x00dev); @@ -992,7 +992,7 @@ void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev); --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h -@@ -577,6 +577,7 @@ struct rt2x00lib_ops { +@@ -566,6 +566,7 @@ struct rt2x00lib_ops { void (*r_calibration) (struct rt2x00_dev *rt2x00dev); void (*rxdcoc_calibration) (struct rt2x00_dev *rt2x00dev); void (*rxiq_calibration) (struct rt2x00_dev *rt2x00dev); -- cgit v1.2.3