2015-12-21 20:49:47

by Grumbach, Emmanuel

[permalink] [raw]
Subject: pull request: iwlwifi-next-2015-12-21

Hi Kalle,

here is a pull request for 4.5. I guess there will be one more after that depending on when Linus will open the merge window I guess.
The diffstat look awful and I have no clue why. It looks as if I had done the whole code reorganisation...
So we have a pretty large pull request here. We are facing big new things: a new device family with lots of work in the data path and such.
Details in the tag.
Let me know if you have issues.
Note that as I said, I needed to merge Johannes's tree to get the new uAPSD helper I added and I merge iwlwifi-fixes.git to avoid conflicts.

The following changes since commit 1b894521e60c1b91db1e8ba1278660e5c89f1b5f:

mac80211: handle HW ROC expired properly (2015-12-07 11:06:37 +0100)

are available in the git repository at:

https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git tags/iwlwifi-next-for-kalle-2015-12-21

for you to fetch changes up to e5d15cb530082cc13a6c9457eddd6f75b0f4de65:

iwlwifi: bail out in case of bad trans state (2015-12-21 19:35:41 +0200)

----------------------------------------------------------------
* Make scan parameters low latency aware (Avi Stern)
* Fix in the NL80211_FEATURE_FULL_AP_CLIENT_STATE state case (Ayala)
* Fix enable injection mode (Chaya Rachel)
* Various cleanups (Dan / Julia / myself)
* Allow to stay more time on popular channels (David Spinadel)
* Bug fixes for D0i3 (Eliad / Luca)
* Fixes for GO uAPSD (myself)
* Start of TSO support (myself)
* Rate control bug fixes (Eyal / Gregory)
* Start the work on 9000 devices (Johannes / Sara / Oren)
* Start the work on a new Tx queue allocation model (Liad)
* Debug infrastructure enhancements (Golan)

----------------------------------------------------------------
Avraham Stern (1):
iwlwifi: mvm: configure scheduled scan according to traffic conditions

Ayala Beker (1):
iwlwifi: mvm: Change number of associated stations when station becomes associated

Chaya Rachel Ivgi (1):
iwlwifi: mvm: Add a station in monitor mode

Dan Carpenter (1):
iwlwifi: mvm: remove an extra tab

David Spinadel (1):
iwlwifi: mvm: add extended dwell time

Eliad Peller (6):
iwlwifi: mvm: cleanup roc te on restart cleanup
iwlwifi: mvm: check iwl_mvm_wowlan_config_key_params() return value
iwlwifi: avoid d0i3 commands when no/init ucode is loaded
iwlwifi: mvm: remove the vif parameter of iwl_mvm_configure_bcast_filter()
iwlwifi: update key params on d0i3 entrance/exit
iwlwifi: bail out in case of bad trans state

Emmanuel Grumbach (18):
iwlwifi: pcie: allow the op_mode to block the tx queues
iwlwifi: trans: support a callback for ASYNC commands
iwlwifi: block the queues when we send ADD_STA for uAPSD
iwlwifi: uninline iwl_trans_send_cmd
Merge tag 'mac80211-next-for-davem-2015-12-07' into next
iwlwifi: mvm: close the SP if we send fewer frames than expected in SP
Merge tag 'iwlwifi-for-kalle-2015-12-16' into next
iwlwifi: change the Intel Wireless email address
iwlwifi: pcie: allow to pretend to have Tx CSUM for debug
iwlwifi: mvm: prepare the code towards TSO implementation
iwlwifi: pcie: re-organize code towards TSO
iwlwifi: clear ieee80211_tx_info->driver_data in the op_mode
iwlwifi: pcie: build an A-MSDU using TSO core
iwlwifi: 9000: increase the number of queues
iwlwifi: mvm: small update in the firmware API
iwlwifi: mvm: dump more registers upon error
iwlwifi: remove unused parameter from grab_nic_access
iwlwifi: fix printf specifier

Eyal Shapira (1):
iwlwifi: mvm: rs: fix a potential out of bounds access

Golan Ben-Ami (2):
iwlwifi: expose fw usniffer mode to more utilities
iwlwifi: mvm: support description for user triggered fw dbg collection

Gregory Greenman (1):
iwlwifi: mvm: add an option to start rs from HT/VHT rates

Johannes Berg (6):
iwlwifi: mvm: advertise NETIF_F_SG
iwlwifi: dvm: advertise NETIF_F_SG
iwlwifi: separate firmware version for 7260 devices
iwlwifi: mvm: protect RCU dereference in iwl_mvm_get_key_sta_id
iwlwifi: mvm: change iwl_mvm_get_key_sta_id() to return the station
iwlwifi: mvm: add 9000 series RX processing

Julia Lawall (1):
iwlwifi: dvm: fix compare_const_fl.cocci warnings

Liad Kaufman (1):
iwlwifi: mvm: set default new STA as non-aggregated

Luca Coelho (3):
iwlwifi: mvm: don't keep an mvm ref when the interface is down
iwlwifi: replace d0i3_mode and wowlan_d0i3 with more generic variables
iwlwifi: mvm: refactor the way fw_key_table is handled

Oren Givon (1):
iwlwifi: Update PCI IDs for 8000 and 9000 series

Sara Sharon (3):
iwlwifi: mvm: change protocol offload flows
iwlwifi: mvm: enable L3 filtering
iwlwifi: mvm: infrastructure for frame-release message

Sharon Dvir (1):
iwlwifi: update host command messages to new format

MAINTAINERS | 46 +-
drivers/net/wireless/Kconfig | 238 +----
drivers/net/wireless/Makefile | 65 +-
drivers/net/wireless/admtek/Kconfig | 41 +
drivers/net/wireless/admtek/Makefile | 1 +
drivers/net/wireless/{ => admtek}/adm8211.c | 0
drivers/net/wireless/{ => admtek}/adm8211.h | 0
drivers/net/wireless/ath/Kconfig | 17 +-
drivers/net/wireless/atmel/Kconfig | 57 ++
drivers/net/wireless/atmel/Makefile | 5 +
.../net/wireless/{ => atmel}/at76c50x-usb.c | 0
.../net/wireless/{ => atmel}/at76c50x-usb.h | 0
drivers/net/wireless/{ => atmel}/atmel.c | 0
drivers/net/wireless/{ => atmel}/atmel.h | 0
drivers/net/wireless/{ => atmel}/atmel_cs.c | 0
drivers/net/wireless/{ => atmel}/atmel_pci.c | 0
drivers/net/wireless/broadcom/Kconfig | 18 +
drivers/net/wireless/broadcom/Makefile | 5 +
.../net/wireless/{ => broadcom}/b43/Kconfig | 0
.../net/wireless/{ => broadcom}/b43/Makefile | 0
drivers/net/wireless/{ => broadcom}/b43/b43.h | 0
drivers/net/wireless/{ => broadcom}/b43/bus.c | 0
drivers/net/wireless/{ => broadcom}/b43/bus.h | 0
.../net/wireless/{ => broadcom}/b43/debugfs.c | 0
.../net/wireless/{ => broadcom}/b43/debugfs.h | 0
drivers/net/wireless/{ => broadcom}/b43/dma.c | 0
drivers/net/wireless/{ => broadcom}/b43/dma.h | 0
.../net/wireless/{ => broadcom}/b43/leds.c | 0
.../net/wireless/{ => broadcom}/b43/leds.h | 0
drivers/net/wireless/{ => broadcom}/b43/lo.c | 0
drivers/net/wireless/{ => broadcom}/b43/lo.h | 0
.../net/wireless/{ => broadcom}/b43/main.c | 0
.../net/wireless/{ => broadcom}/b43/main.h | 0
.../net/wireless/{ => broadcom}/b43/phy_a.c | 0
.../net/wireless/{ => broadcom}/b43/phy_a.h | 0
.../net/wireless/{ => broadcom}/b43/phy_ac.c | 0
.../net/wireless/{ => broadcom}/b43/phy_ac.h | 0
.../wireless/{ => broadcom}/b43/phy_common.c | 0
.../wireless/{ => broadcom}/b43/phy_common.h | 0
.../net/wireless/{ => broadcom}/b43/phy_g.c | 0
.../net/wireless/{ => broadcom}/b43/phy_g.h | 0
.../net/wireless/{ => broadcom}/b43/phy_ht.c | 0
.../net/wireless/{ => broadcom}/b43/phy_ht.h | 0
.../net/wireless/{ => broadcom}/b43/phy_lcn.c | 0
.../net/wireless/{ => broadcom}/b43/phy_lcn.h | 0
.../net/wireless/{ => broadcom}/b43/phy_lp.c | 0
.../net/wireless/{ => broadcom}/b43/phy_lp.h | 0
.../net/wireless/{ => broadcom}/b43/phy_n.c | 0
.../net/wireless/{ => broadcom}/b43/phy_n.h | 0
drivers/net/wireless/{ => broadcom}/b43/pio.c | 0
drivers/net/wireless/{ => broadcom}/b43/pio.h | 0
drivers/net/wireless/{ => broadcom}/b43/ppr.c | 0
drivers/net/wireless/{ => broadcom}/b43/ppr.h | 0
.../wireless/{ => broadcom}/b43/radio_2055.c | 0
.../wireless/{ => broadcom}/b43/radio_2055.h | 0
.../wireless/{ => broadcom}/b43/radio_2056.c | 0
.../wireless/{ => broadcom}/b43/radio_2056.h | 0
.../wireless/{ => broadcom}/b43/radio_2057.c | 0
.../wireless/{ => broadcom}/b43/radio_2057.h | 0
.../wireless/{ => broadcom}/b43/radio_2059.c | 0
.../wireless/{ => broadcom}/b43/radio_2059.h | 0
.../net/wireless/{ => broadcom}/b43/rfkill.c | 0
.../net/wireless/{ => broadcom}/b43/rfkill.h | 0
.../net/wireless/{ => broadcom}/b43/sdio.c | 0
.../net/wireless/{ => broadcom}/b43/sdio.h | 0
.../net/wireless/{ => broadcom}/b43/sysfs.c | 0
.../net/wireless/{ => broadcom}/b43/sysfs.h | 0
.../net/wireless/{ => broadcom}/b43/tables.c | 0
.../net/wireless/{ => broadcom}/b43/tables.h | 0
.../{ => broadcom}/b43/tables_lpphy.c | 0
.../{ => broadcom}/b43/tables_lpphy.h | 0
.../wireless/{ => broadcom}/b43/tables_nphy.c | 0
.../wireless/{ => broadcom}/b43/tables_nphy.h | 0
.../{ => broadcom}/b43/tables_phy_ht.c | 0
.../{ => broadcom}/b43/tables_phy_ht.h | 0
.../{ => broadcom}/b43/tables_phy_lcn.c | 0
.../{ => broadcom}/b43/tables_phy_lcn.h | 0
drivers/net/wireless/{ => broadcom}/b43/wa.c | 0
drivers/net/wireless/{ => broadcom}/b43/wa.h | 0
.../net/wireless/{ => broadcom}/b43/xmit.c | 0
.../net/wireless/{ => broadcom}/b43/xmit.h | 0
.../wireless/{ => broadcom}/b43legacy/Kconfig | 0
.../{ => broadcom}/b43legacy/Makefile | 0
.../{ => broadcom}/b43legacy/b43legacy.h | 0
.../{ => broadcom}/b43legacy/debugfs.c | 0
.../{ => broadcom}/b43legacy/debugfs.h | 0
.../wireless/{ => broadcom}/b43legacy/dma.c | 0
.../wireless/{ => broadcom}/b43legacy/dma.h | 0
.../wireless/{ => broadcom}/b43legacy/ilt.c | 0
.../wireless/{ => broadcom}/b43legacy/ilt.h | 0
.../wireless/{ => broadcom}/b43legacy/leds.c | 0
.../wireless/{ => broadcom}/b43legacy/leds.h | 0
.../wireless/{ => broadcom}/b43legacy/main.c | 0
.../wireless/{ => broadcom}/b43legacy/main.h | 0
.../wireless/{ => broadcom}/b43legacy/phy.c | 0
.../wireless/{ => broadcom}/b43legacy/phy.h | 0
.../wireless/{ => broadcom}/b43legacy/pio.c | 0
.../wireless/{ => broadcom}/b43legacy/pio.h | 0
.../wireless/{ => broadcom}/b43legacy/radio.c | 0
.../wireless/{ => broadcom}/b43legacy/radio.h | 0
.../{ => broadcom}/b43legacy/rfkill.c | 0
.../{ => broadcom}/b43legacy/rfkill.h | 0
.../wireless/{ => broadcom}/b43legacy/sysfs.c | 0
.../wireless/{ => broadcom}/b43legacy/sysfs.h | 0
.../wireless/{ => broadcom}/b43legacy/xmit.c | 0
.../wireless/{ => broadcom}/b43legacy/xmit.h | 0
.../wireless/{ => broadcom}/brcm80211/Kconfig | 0
.../{ => broadcom}/brcm80211/Makefile | 0
.../brcm80211/brcmfmac/Makefile | 4 +-
.../{ => broadcom}/brcm80211/brcmfmac/bcdc.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/bcdc.h | 0
.../brcm80211/brcmfmac/bcmsdh.c | 0
.../brcm80211/brcmfmac/btcoex.c | 0
.../brcm80211/brcmfmac/btcoex.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/bus.h | 0
.../brcm80211/brcmfmac/cfg80211.c | 0
.../brcm80211/brcmfmac/cfg80211.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/chip.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/chip.h | 0
.../brcm80211/brcmfmac/common.c | 0
.../brcm80211/brcmfmac/common.h | 0
.../brcm80211/brcmfmac/commonring.c | 0
.../brcm80211/brcmfmac/commonring.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/core.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/core.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/debug.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/debug.h | 0
.../brcm80211/brcmfmac/feature.c | 0
.../brcm80211/brcmfmac/feature.h | 0
.../brcm80211/brcmfmac/firmware.c | 0
.../brcm80211/brcmfmac/firmware.h | 0
.../brcm80211/brcmfmac/flowring.c | 0
.../brcm80211/brcmfmac/flowring.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/fweh.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/fweh.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/fwil.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/fwil.h | 0
.../brcm80211/brcmfmac/fwil_types.h | 0
.../brcm80211/brcmfmac/fwsignal.c | 0
.../brcm80211/brcmfmac/fwsignal.h | 0
.../brcm80211/brcmfmac/msgbuf.c | 0
.../brcm80211/brcmfmac/msgbuf.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/of.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/of.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/p2p.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/p2p.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/pcie.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/pcie.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/proto.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/proto.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/sdio.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/sdio.h | 0
.../brcm80211/brcmfmac/tracepoint.c | 0
.../brcm80211/brcmfmac/tracepoint.h | 0
.../{ => broadcom}/brcm80211/brcmfmac/usb.c | 0
.../{ => broadcom}/brcm80211/brcmfmac/usb.h | 0
.../brcm80211/brcmfmac/vendor.c | 0
.../brcm80211/brcmfmac/vendor.h | 0
.../brcm80211/brcmsmac/Makefile | 6 +-
.../brcm80211/brcmsmac/aiutils.c | 0
.../brcm80211/brcmsmac/aiutils.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/ampdu.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/ampdu.h | 0
.../brcm80211/brcmsmac/antsel.c | 0
.../brcm80211/brcmsmac/antsel.h | 0
.../brcm80211/brcmsmac/brcms_trace_brcmsmac.h | 0
.../brcmsmac/brcms_trace_brcmsmac_msg.h | 0
.../brcmsmac/brcms_trace_brcmsmac_tx.h | 0
.../brcm80211/brcmsmac/brcms_trace_events.c | 0
.../brcm80211/brcmsmac/brcms_trace_events.h | 0
.../brcm80211/brcmsmac/channel.c | 0
.../brcm80211/brcmsmac/channel.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/d11.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/debug.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/debug.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/dma.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/dma.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/led.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/led.h | 0
.../brcm80211/brcmsmac/mac80211_if.c | 0
.../brcm80211/brcmsmac/mac80211_if.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/main.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/main.h | 0
.../brcm80211/brcmsmac/phy/phy_cmn.c | 0
.../brcm80211/brcmsmac/phy/phy_hal.h | 0
.../brcm80211/brcmsmac/phy/phy_int.h | 0
.../brcm80211/brcmsmac/phy/phy_lcn.c | 0
.../brcm80211/brcmsmac/phy/phy_lcn.h | 0
.../brcm80211/brcmsmac/phy/phy_n.c | 0
.../brcm80211/brcmsmac/phy/phy_qmath.c | 0
.../brcm80211/brcmsmac/phy/phy_qmath.h | 0
.../brcm80211/brcmsmac/phy/phy_radio.h | 0
.../brcm80211/brcmsmac/phy/phyreg_n.h | 0
.../brcm80211/brcmsmac/phy/phytbl_lcn.c | 0
.../brcm80211/brcmsmac/phy/phytbl_lcn.h | 0
.../brcm80211/brcmsmac/phy/phytbl_n.c | 0
.../brcm80211/brcmsmac/phy/phytbl_n.h | 0
.../brcm80211/brcmsmac/phy_shim.c | 0
.../brcm80211/brcmsmac/phy_shim.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/pmu.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/pmu.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/pub.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/rate.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/rate.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/scb.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/stf.c | 0
.../{ => broadcom}/brcm80211/brcmsmac/stf.h | 0
.../{ => broadcom}/brcm80211/brcmsmac/types.h | 0
.../brcm80211/brcmsmac/ucode_loader.c | 0
.../brcm80211/brcmsmac/ucode_loader.h | 0
.../brcm80211/brcmutil/Makefile | 4 +-
.../{ => broadcom}/brcm80211/brcmutil/d11.c | 0
.../{ => broadcom}/brcm80211/brcmutil/utils.c | 0
.../brcm80211/include/brcm_hw_ids.h | 0
.../brcm80211/include/brcmu_d11.h | 0
.../brcm80211/include/brcmu_utils.h | 0
.../brcm80211/include/brcmu_wifi.h | 0
.../brcm80211/include/chipcommon.h | 0
.../{ => broadcom}/brcm80211/include/defs.h | 0
.../{ => broadcom}/brcm80211/include/soc.h | 0
drivers/net/wireless/cisco/Kconfig | 56 ++
drivers/net/wireless/cisco/Makefile | 2 +
drivers/net/wireless/{ => cisco}/airo.c | 0
drivers/net/wireless/{ => cisco}/airo.h | 0
drivers/net/wireless/{ => cisco}/airo_cs.c | 0
drivers/net/wireless/intel/Kconfig | 18 +
drivers/net/wireless/intel/Makefile | 6 +
.../net/wireless/{ => intel}/ipw2x00/Kconfig | 0
.../net/wireless/{ => intel}/ipw2x00/Makefile | 0
.../net/wireless/{ => intel}/ipw2x00/ipw.h | 0
.../wireless/{ => intel}/ipw2x00/ipw2100.c | 0
.../wireless/{ => intel}/ipw2x00/ipw2100.h | 0
.../wireless/{ => intel}/ipw2x00/ipw2200.c | 0
.../wireless/{ => intel}/ipw2x00/ipw2200.h | 0
.../net/wireless/{ => intel}/ipw2x00/libipw.h | 0
.../wireless/{ => intel}/ipw2x00/libipw_geo.c | 0
.../{ => intel}/ipw2x00/libipw_module.c | 0
.../wireless/{ => intel}/ipw2x00/libipw_rx.c | 0
.../wireless/{ => intel}/ipw2x00/libipw_tx.c | 0
.../wireless/{ => intel}/ipw2x00/libipw_wx.c | 0
.../{ => intel}/iwlegacy/3945-debug.c | 0
.../wireless/{ => intel}/iwlegacy/3945-mac.c | 0
.../wireless/{ => intel}/iwlegacy/3945-rs.c | 0
.../net/wireless/{ => intel}/iwlegacy/3945.c | 0
.../net/wireless/{ => intel}/iwlegacy/3945.h | 0
.../{ => intel}/iwlegacy/4965-calib.c | 0
.../{ => intel}/iwlegacy/4965-debug.c | 0
.../wireless/{ => intel}/iwlegacy/4965-mac.c | 0
.../wireless/{ => intel}/iwlegacy/4965-rs.c | 0
.../net/wireless/{ => intel}/iwlegacy/4965.c | 0
.../net/wireless/{ => intel}/iwlegacy/4965.h | 0
.../net/wireless/{ => intel}/iwlegacy/Kconfig | 0
.../wireless/{ => intel}/iwlegacy/Makefile | 0
.../wireless/{ => intel}/iwlegacy/commands.h | 0
.../wireless/{ => intel}/iwlegacy/common.c | 0
.../wireless/{ => intel}/iwlegacy/common.h | 0
.../net/wireless/{ => intel}/iwlegacy/csr.h | 0
.../net/wireless/{ => intel}/iwlegacy/debug.c | 0
.../{ => intel}/iwlegacy/iwl-spectrum.h | 0
.../net/wireless/{ => intel}/iwlegacy/prph.h | 0
.../net/wireless/{ => intel}/iwlwifi/Kconfig | 2 +-
.../net/wireless/{ => intel}/iwlwifi/Makefile | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/Makefile | 0
.../wireless/{ => intel}/iwlwifi/dvm/agn.h | 11 +-
.../wireless/{ => intel}/iwlwifi/dvm/calib.c | 4 +-
.../wireless/{ => intel}/iwlwifi/dvm/calib.h | 2 +-
.../{ => intel}/iwlwifi/dvm/commands.h | 2 +-
.../{ => intel}/iwlwifi/dvm/debugfs.c | 6 +-
.../wireless/{ => intel}/iwlwifi/dvm/dev.h | 2 +-
.../{ => intel}/iwlwifi/dvm/devices.c | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/led.c | 4 +-
.../wireless/{ => intel}/iwlwifi/dvm/led.h | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/lib.c | 4 +-
.../{ => intel}/iwlwifi/dvm/mac80211.c | 13 +-
.../wireless/{ => intel}/iwlwifi/dvm/main.c | 116 ++-
.../wireless/{ => intel}/iwlwifi/dvm/power.c | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/power.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/rs.c | 2 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/rs.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/rx.c | 89 +-
.../wireless/{ => intel}/iwlwifi/dvm/rxon.c | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/scan.c | 2 +-
.../wireless/{ => intel}/iwlwifi/dvm/sta.c | 2 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/tt.c | 4 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/tt.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/dvm/tx.c | 3 +-
.../wireless/{ => intel}/iwlwifi/dvm/ucode.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-1000.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-2000.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-5000.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-6000.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-7000.c | 60 +-
.../wireless/{ => intel}/iwlwifi/iwl-8000.c | 15 +-
drivers/net/wireless/intel/iwlwifi/iwl-9000.c | 163 ++++
.../wireless/{ => intel}/iwlwifi/iwl-agn-hw.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-config.h | 9 +-
.../wireless/{ => intel}/iwlwifi/iwl-csr.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-debug.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-debug.h | 4 +-
.../{ => intel}/iwlwifi/iwl-devtrace-data.h | 19 +-
.../{ => intel}/iwlwifi/iwl-devtrace-io.h | 2 +-
.../iwlwifi/iwl-devtrace-iwlwifi.h | 2 +-
.../{ => intel}/iwlwifi/iwl-devtrace-msg.h | 2 +-
.../{ => intel}/iwlwifi/iwl-devtrace-ucode.h | 2 +-
.../{ => intel}/iwlwifi/iwl-devtrace.c | 2 +-
.../{ => intel}/iwlwifi/iwl-devtrace.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-drv.c | 32 +-
.../wireless/{ => intel}/iwlwifi/iwl-drv.h | 4 +-
.../{ => intel}/iwlwifi/iwl-eeprom-parse.c | 8 +-
.../{ => intel}/iwlwifi/iwl-eeprom-parse.h | 2 +-
.../{ => intel}/iwlwifi/iwl-eeprom-read.c | 2 +-
.../{ => intel}/iwlwifi/iwl-eeprom-read.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/iwl-fh.h | 2 +-
.../{ => intel}/iwlwifi/iwl-fw-error-dump.h | 7 +-
.../{ => intel}/iwlwifi/iwl-fw-file.h | 17 +-
.../net/wireless/{ => intel}/iwlwifi/iwl-fw.h | 16 +-
.../net/wireless/{ => intel}/iwlwifi/iwl-io.c | 41 +-
.../net/wireless/{ => intel}/iwlwifi/iwl-io.h | 6 +-
.../{ => intel}/iwlwifi/iwl-modparams.h | 15 +-
.../{ => intel}/iwlwifi/iwl-notif-wait.c | 2 +-
.../{ => intel}/iwlwifi/iwl-notif-wait.h | 2 +-
.../{ => intel}/iwlwifi/iwl-nvm-parse.c | 30 +-
.../{ => intel}/iwlwifi/iwl-nvm-parse.h | 4 +-
.../{ => intel}/iwlwifi/iwl-op-mode.h | 13 +-
.../wireless/{ => intel}/iwlwifi/iwl-phy-db.c | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-phy-db.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-prph.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-scd.h | 2 +-
.../wireless/{ => intel}/iwlwifi/iwl-trans.c | 93 +-
.../wireless/{ => intel}/iwlwifi/iwl-trans.h | 230 +++--
.../wireless/{ => intel}/iwlwifi/mvm/Makefile | 6 +-
.../{ => intel}/iwlwifi/mvm/binding.c | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/coex.c | 43 +-
.../{ => intel}/iwlwifi/mvm/coex_legacy.c | 2 +-
.../{ => intel}/iwlwifi/mvm/constants.h | 3 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/d3.c | 341 ++++---
.../{ => intel}/iwlwifi/mvm/debugfs-vif.c | 2 +-
.../{ => intel}/iwlwifi/mvm/debugfs.c | 68 +-
.../{ => intel}/iwlwifi/mvm/debugfs.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-coex.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-d3.h | 19 +-
.../{ => intel}/iwlwifi/mvm/fw-api-mac.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-power.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-rs.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-rx.h | 136 ++-
.../{ => intel}/iwlwifi/mvm/fw-api-scan.h | 24 +-
.../{ => intel}/iwlwifi/mvm/fw-api-sta.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-stats.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-tof.h | 2 +-
.../{ => intel}/iwlwifi/mvm/fw-api-tx.h | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/fw-api.h | 29 +-
.../net/wireless/intel/iwlwifi/mvm/fw-dbg.c | 783 +++++++++++++++++
.../net/wireless/intel/iwlwifi/mvm/fw-dbg.h | 150 ++++
.../net/wireless/{ => intel}/iwlwifi/mvm/fw.c | 134 +--
.../wireless/{ => intel}/iwlwifi/mvm/led.c | 2 +-
.../{ => intel}/iwlwifi/mvm/mac-ctxt.c | 19 +-
.../{ => intel}/iwlwifi/mvm/mac80211.c | 606 +++----------
.../wireless/{ => intel}/iwlwifi/mvm/mvm.h | 145 +--
.../wireless/{ => intel}/iwlwifi/mvm/nvm.c | 55 +-
.../{ => intel}/iwlwifi/mvm/offloading.c | 76 +-
.../wireless/{ => intel}/iwlwifi/mvm/ops.c | 359 +++++---
.../{ => intel}/iwlwifi/mvm/phy-ctxt.c | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/power.c | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/quota.c | 2 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/rs.c | 84 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/rs.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/rx.c | 46 +-
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 378 ++++++++
.../wireless/{ => intel}/iwlwifi/mvm/scan.c | 96 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/sf.c | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/sta.c | 193 ++--
.../wireless/{ => intel}/iwlwifi/mvm/sta.h | 18 +-
.../wireless/{ => intel}/iwlwifi/mvm/tdls.c | 2 +-
.../{ => intel}/iwlwifi/mvm/testmode.h | 2 +-
.../{ => intel}/iwlwifi/mvm/time-event.c | 41 +-
.../{ => intel}/iwlwifi/mvm/time-event.h | 3 +-
.../wireless/{ => intel}/iwlwifi/mvm/tof.c | 2 +-
.../wireless/{ => intel}/iwlwifi/mvm/tof.h | 2 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/tt.c | 2 +-
.../net/wireless/{ => intel}/iwlwifi/mvm/tx.c | 113 ++-
.../wireless/{ => intel}/iwlwifi/mvm/utils.c | 4 +-
.../wireless/{ => intel}/iwlwifi/pcie/drv.c | 43 +-
.../{ => intel}/iwlwifi/pcie/internal.h | 43 +-
.../wireless/{ => intel}/iwlwifi/pcie/rx.c | 30 +-
.../wireless/{ => intel}/iwlwifi/pcie/trans.c | 273 ++----
.../wireless/{ => intel}/iwlwifi/pcie/tx.c | 447 ++++++++--
drivers/net/wireless/intersil/Kconfig | 38 +
drivers/net/wireless/intersil/Makefile | 4 +
.../wireless/{ => intersil}/hostap/Kconfig | 0
.../wireless/{ => intersil}/hostap/Makefile | 0
.../wireless/{ => intersil}/hostap/hostap.h | 0
.../{ => intersil}/hostap/hostap_80211.h | 0
.../{ => intersil}/hostap/hostap_80211_rx.c | 0
.../{ => intersil}/hostap/hostap_80211_tx.c | 0
.../{ => intersil}/hostap/hostap_ap.c | 0
.../{ => intersil}/hostap/hostap_ap.h | 0
.../{ => intersil}/hostap/hostap_common.h | 0
.../{ => intersil}/hostap/hostap_config.h | 0
.../{ => intersil}/hostap/hostap_cs.c | 0
.../{ => intersil}/hostap/hostap_download.c | 0
.../{ => intersil}/hostap/hostap_hw.c | 0
.../{ => intersil}/hostap/hostap_info.c | 0
.../{ => intersil}/hostap/hostap_ioctl.c | 0
.../{ => intersil}/hostap/hostap_main.c | 0
.../{ => intersil}/hostap/hostap_pci.c | 0
.../{ => intersil}/hostap/hostap_plx.c | 0
.../{ => intersil}/hostap/hostap_proc.c | 0
.../{ => intersil}/hostap/hostap_wlan.h | 0
.../wireless/{ => intersil}/orinoco/Kconfig | 0
.../wireless/{ => intersil}/orinoco/Makefile | 0
.../wireless/{ => intersil}/orinoco/airport.c | 0
.../net/wireless/{ => intersil}/orinoco/cfg.c | 0
.../net/wireless/{ => intersil}/orinoco/cfg.h | 0
.../net/wireless/{ => intersil}/orinoco/fw.c | 0
.../net/wireless/{ => intersil}/orinoco/fw.h | 0
.../wireless/{ => intersil}/orinoco/hermes.c | 0
.../wireless/{ => intersil}/orinoco/hermes.h | 0
.../{ => intersil}/orinoco/hermes_dld.c | 0
.../{ => intersil}/orinoco/hermes_dld.h | 0
.../{ => intersil}/orinoco/hermes_rid.h | 0
.../net/wireless/{ => intersil}/orinoco/hw.c | 0
.../net/wireless/{ => intersil}/orinoco/hw.h | 0
.../wireless/{ => intersil}/orinoco/main.c | 0
.../wireless/{ => intersil}/orinoco/main.h | 0
.../net/wireless/{ => intersil}/orinoco/mic.c | 0
.../net/wireless/{ => intersil}/orinoco/mic.h | 0
.../wireless/{ => intersil}/orinoco/orinoco.h | 0
.../{ => intersil}/orinoco/orinoco_cs.c | 0
.../{ => intersil}/orinoco/orinoco_nortel.c | 0
.../{ => intersil}/orinoco/orinoco_pci.c | 0
.../{ => intersil}/orinoco/orinoco_pci.h | 0
.../{ => intersil}/orinoco/orinoco_plx.c | 0
.../{ => intersil}/orinoco/orinoco_tmd.c | 0
.../{ => intersil}/orinoco/orinoco_usb.c | 0
.../wireless/{ => intersil}/orinoco/scan.c | 0
.../wireless/{ => intersil}/orinoco/scan.h | 0
.../{ => intersil}/orinoco/spectrum_cs.c | 0
.../wireless/{ => intersil}/orinoco/wext.c | 0
.../wireless/{ => intersil}/orinoco/wext.h | 0
.../net/wireless/{ => intersil}/p54/Kconfig | 0
.../net/wireless/{ => intersil}/p54/Makefile | 0
.../net/wireless/{ => intersil}/p54/eeprom.c | 0
.../net/wireless/{ => intersil}/p54/eeprom.h | 0
.../net/wireless/{ => intersil}/p54/fwio.c | 0
drivers/net/wireless/{ => intersil}/p54/led.c | 0
.../net/wireless/{ => intersil}/p54/lmac.h | 0
.../net/wireless/{ => intersil}/p54/main.c | 0
drivers/net/wireless/{ => intersil}/p54/p54.h | 0
.../net/wireless/{ => intersil}/p54/p54pci.c | 0
.../net/wireless/{ => intersil}/p54/p54pci.h | 0
.../net/wireless/{ => intersil}/p54/p54spi.c | 0
.../net/wireless/{ => intersil}/p54/p54spi.h | 0
.../{ => intersil}/p54/p54spi_eeprom.h | 0
.../net/wireless/{ => intersil}/p54/p54usb.c | 0
.../net/wireless/{ => intersil}/p54/p54usb.h | 0
.../net/wireless/{ => intersil}/p54/txrx.c | 0
.../wireless/{ => intersil}/prism54/Makefile | 0
.../{ => intersil}/prism54/isl_38xx.c | 0
.../{ => intersil}/prism54/isl_38xx.h | 0
.../{ => intersil}/prism54/isl_ioctl.c | 0
.../{ => intersil}/prism54/isl_ioctl.h | 0
.../wireless/{ => intersil}/prism54/isl_oid.h | 0
.../{ => intersil}/prism54/islpci_dev.c | 0
.../{ => intersil}/prism54/islpci_dev.h | 0
.../{ => intersil}/prism54/islpci_eth.c | 0
.../{ => intersil}/prism54/islpci_eth.h | 0
.../{ => intersil}/prism54/islpci_hotplug.c | 0
.../{ => intersil}/prism54/islpci_mgt.c | 0
.../{ => intersil}/prism54/islpci_mgt.h | 0
.../wireless/{ => intersil}/prism54/oid_mgt.c | 0
.../wireless/{ => intersil}/prism54/oid_mgt.h | 0
.../{ => intersil}/prism54/prismcompat.h | 0
drivers/net/wireless/marvell/Kconfig | 27 +
drivers/net/wireless/marvell/Makefile | 6 +
.../wireless/{ => marvell}/libertas/Kconfig | 0
.../wireless/{ => marvell}/libertas/LICENSE | 0
.../wireless/{ => marvell}/libertas/Makefile | 0
.../wireless/{ => marvell}/libertas/README | 0
.../net/wireless/{ => marvell}/libertas/cfg.c | 0
.../net/wireless/{ => marvell}/libertas/cfg.h | 0
.../net/wireless/{ => marvell}/libertas/cmd.c | 0
.../net/wireless/{ => marvell}/libertas/cmd.h | 0
.../wireless/{ => marvell}/libertas/cmdresp.c | 0
.../wireless/{ => marvell}/libertas/debugfs.c | 0
.../wireless/{ => marvell}/libertas/debugfs.h | 0
.../wireless/{ => marvell}/libertas/decl.h | 0
.../wireless/{ => marvell}/libertas/defs.h | 0
.../net/wireless/{ => marvell}/libertas/dev.h | 0
.../wireless/{ => marvell}/libertas/ethtool.c | 0
.../{ => marvell}/libertas/firmware.c | 0
.../wireless/{ => marvell}/libertas/host.h | 0
.../wireless/{ => marvell}/libertas/if_cs.c | 0
.../wireless/{ => marvell}/libertas/if_sdio.c | 0
.../wireless/{ => marvell}/libertas/if_sdio.h | 0
.../wireless/{ => marvell}/libertas/if_spi.c | 0
.../wireless/{ => marvell}/libertas/if_spi.h | 0
.../wireless/{ => marvell}/libertas/if_usb.c | 0
.../wireless/{ => marvell}/libertas/if_usb.h | 0
.../wireless/{ => marvell}/libertas/main.c | 0
.../wireless/{ => marvell}/libertas/mesh.c | 0
.../wireless/{ => marvell}/libertas/mesh.h | 0
.../{ => marvell}/libertas/radiotap.h | 0
.../net/wireless/{ => marvell}/libertas/rx.c | 0
.../net/wireless/{ => marvell}/libertas/tx.c | 0
.../wireless/{ => marvell}/libertas/types.h | 0
.../net/wireless/marvell/libertas_tf/Kconfig | 18 +
.../{ => marvell}/libertas_tf/Makefile | 0
.../wireless/{ => marvell}/libertas_tf/cmd.c | 0
.../{ => marvell}/libertas_tf/deb_defs.h | 0
.../{ => marvell}/libertas_tf/if_usb.c | 0
.../{ => marvell}/libertas_tf/if_usb.h | 0
.../{ => marvell}/libertas_tf/libertas_tf.h | 0
.../wireless/{ => marvell}/libertas_tf/main.c | 0
.../net/wireless/{ => marvell}/mwifiex/11ac.c | 0
.../net/wireless/{ => marvell}/mwifiex/11ac.h | 0
.../net/wireless/{ => marvell}/mwifiex/11h.c | 0
.../net/wireless/{ => marvell}/mwifiex/11n.c | 0
.../net/wireless/{ => marvell}/mwifiex/11n.h | 0
.../wireless/{ => marvell}/mwifiex/11n_aggr.c | 0
.../wireless/{ => marvell}/mwifiex/11n_aggr.h | 0
.../{ => marvell}/mwifiex/11n_rxreorder.c | 0
.../{ => marvell}/mwifiex/11n_rxreorder.h | 0
.../wireless/{ => marvell}/mwifiex/Kconfig | 0
.../wireless/{ => marvell}/mwifiex/Makefile | 0
.../net/wireless/{ => marvell}/mwifiex/README | 0
.../wireless/{ => marvell}/mwifiex/cfg80211.c | 0
.../wireless/{ => marvell}/mwifiex/cfg80211.h | 0
.../net/wireless/{ => marvell}/mwifiex/cfp.c | 0
.../wireless/{ => marvell}/mwifiex/cmdevt.c | 0
.../wireless/{ => marvell}/mwifiex/debugfs.c | 0
.../net/wireless/{ => marvell}/mwifiex/decl.h | 0
.../wireless/{ => marvell}/mwifiex/ethtool.c | 0
.../net/wireless/{ => marvell}/mwifiex/fw.h | 0
.../net/wireless/{ => marvell}/mwifiex/ie.c | 0
.../net/wireless/{ => marvell}/mwifiex/init.c | 0
.../wireless/{ => marvell}/mwifiex/ioctl.h | 0
.../net/wireless/{ => marvell}/mwifiex/join.c | 0
.../net/wireless/{ => marvell}/mwifiex/main.c | 0
.../net/wireless/{ => marvell}/mwifiex/main.h | 0
.../net/wireless/{ => marvell}/mwifiex/pcie.c | 0
.../net/wireless/{ => marvell}/mwifiex/pcie.h | 0
.../net/wireless/{ => marvell}/mwifiex/scan.c | 0
.../net/wireless/{ => marvell}/mwifiex/sdio.c | 0
.../net/wireless/{ => marvell}/mwifiex/sdio.h | 0
.../wireless/{ => marvell}/mwifiex/sta_cmd.c | 0
.../{ => marvell}/mwifiex/sta_cmdresp.c | 0
.../{ => marvell}/mwifiex/sta_event.c | 0
.../{ => marvell}/mwifiex/sta_ioctl.c | 0
.../wireless/{ => marvell}/mwifiex/sta_rx.c | 0
.../wireless/{ => marvell}/mwifiex/sta_tx.c | 0
.../net/wireless/{ => marvell}/mwifiex/tdls.c | 0
.../net/wireless/{ => marvell}/mwifiex/txrx.c | 0
.../wireless/{ => marvell}/mwifiex/uap_cmd.c | 0
.../{ => marvell}/mwifiex/uap_event.c | 0
.../wireless/{ => marvell}/mwifiex/uap_txrx.c | 0
.../net/wireless/{ => marvell}/mwifiex/usb.c | 0
.../net/wireless/{ => marvell}/mwifiex/usb.h | 0
.../net/wireless/{ => marvell}/mwifiex/util.c | 0
.../net/wireless/{ => marvell}/mwifiex/util.h | 0
.../net/wireless/{ => marvell}/mwifiex/wmm.c | 0
.../net/wireless/{ => marvell}/mwifiex/wmm.h | 0
drivers/net/wireless/{ => marvell}/mwl8k.c | 0
drivers/net/wireless/mediatek/Kconfig | 16 +-
drivers/net/wireless/ralink/Kconfig | 16 +
drivers/net/wireless/ralink/Makefile | 1 +
.../net/wireless/{ => ralink}/rt2x00/Kconfig | 0
.../net/wireless/{ => ralink}/rt2x00/Makefile | 0
.../wireless/{ => ralink}/rt2x00/rt2400pci.c | 0
.../wireless/{ => ralink}/rt2x00/rt2400pci.h | 0
.../wireless/{ => ralink}/rt2x00/rt2500pci.c | 0
.../wireless/{ => ralink}/rt2x00/rt2500pci.h | 0
.../wireless/{ => ralink}/rt2x00/rt2500usb.c | 0
.../wireless/{ => ralink}/rt2x00/rt2500usb.h | 0
.../net/wireless/{ => ralink}/rt2x00/rt2800.h | 0
.../wireless/{ => ralink}/rt2x00/rt2800lib.c | 0
.../wireless/{ => ralink}/rt2x00/rt2800lib.h | 0
.../wireless/{ => ralink}/rt2x00/rt2800mmio.c | 0
.../wireless/{ => ralink}/rt2x00/rt2800mmio.h | 0
.../wireless/{ => ralink}/rt2x00/rt2800pci.c | 0
.../wireless/{ => ralink}/rt2x00/rt2800pci.h | 0
.../wireless/{ => ralink}/rt2x00/rt2800soc.c | 0
.../wireless/{ => ralink}/rt2x00/rt2800usb.c | 0
.../wireless/{ => ralink}/rt2x00/rt2800usb.h | 0
.../net/wireless/{ => ralink}/rt2x00/rt2x00.h | 0
.../{ => ralink}/rt2x00/rt2x00config.c | 0
.../{ => ralink}/rt2x00/rt2x00crypto.c | 0
.../{ => ralink}/rt2x00/rt2x00debug.c | 0
.../{ => ralink}/rt2x00/rt2x00debug.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00dev.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00dump.h | 0
.../{ => ralink}/rt2x00/rt2x00firmware.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00leds.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00leds.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00lib.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00link.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00mac.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00mmio.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00mmio.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00pci.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00pci.h | 0
.../{ => ralink}/rt2x00/rt2x00queue.c | 0
.../{ => ralink}/rt2x00/rt2x00queue.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00reg.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00soc.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00soc.h | 0
.../wireless/{ => ralink}/rt2x00/rt2x00usb.c | 0
.../wireless/{ => ralink}/rt2x00/rt2x00usb.h | 0
.../wireless/{ => ralink}/rt2x00/rt61pci.c | 0
.../wireless/{ => ralink}/rt2x00/rt61pci.h | 0
.../wireless/{ => ralink}/rt2x00/rt73usb.c | 0
.../wireless/{ => ralink}/rt2x00/rt73usb.h | 0
drivers/net/wireless/realtek/Kconfig | 18 +
drivers/net/wireless/rsi/Kconfig | 15 +
drivers/net/wireless/st/Kconfig | 16 +
drivers/net/wireless/st/Makefile | 1 +
drivers/net/wireless/{ => st}/cw1200/Kconfig | 0
drivers/net/wireless/{ => st}/cw1200/Makefile | 0
drivers/net/wireless/{ => st}/cw1200/bh.c | 0
drivers/net/wireless/{ => st}/cw1200/bh.h | 0
drivers/net/wireless/{ => st}/cw1200/cw1200.h | 0
.../wireless/{ => st}/cw1200/cw1200_sdio.c | 0
.../net/wireless/{ => st}/cw1200/cw1200_spi.c | 0
drivers/net/wireless/{ => st}/cw1200/debug.c | 0
drivers/net/wireless/{ => st}/cw1200/debug.h | 0
drivers/net/wireless/{ => st}/cw1200/fwio.c | 0
drivers/net/wireless/{ => st}/cw1200/fwio.h | 0
drivers/net/wireless/{ => st}/cw1200/hwbus.h | 0
drivers/net/wireless/{ => st}/cw1200/hwio.c | 0
drivers/net/wireless/{ => st}/cw1200/hwio.h | 0
drivers/net/wireless/{ => st}/cw1200/main.c | 0
drivers/net/wireless/{ => st}/cw1200/pm.c | 0
drivers/net/wireless/{ => st}/cw1200/pm.h | 0
drivers/net/wireless/{ => st}/cw1200/queue.c | 0
drivers/net/wireless/{ => st}/cw1200/queue.h | 0
drivers/net/wireless/{ => st}/cw1200/scan.c | 0
drivers/net/wireless/{ => st}/cw1200/scan.h | 0
drivers/net/wireless/{ => st}/cw1200/sta.c | 0
drivers/net/wireless/{ => st}/cw1200/sta.h | 0
drivers/net/wireless/{ => st}/cw1200/txrx.c | 0
drivers/net/wireless/{ => st}/cw1200/txrx.h | 0
drivers/net/wireless/{ => st}/cw1200/wsm.c | 0
drivers/net/wireless/{ => st}/cw1200/wsm.h | 0
drivers/net/wireless/ti/Kconfig | 18 +-
drivers/net/wireless/ti/wl1251/Kconfig | 2 +-
drivers/net/wireless/ti/wlcore/Kconfig | 2 +-
drivers/net/wireless/zydas/Kconfig | 35 +
drivers/net/wireless/zydas/Makefile | 3 +
drivers/net/wireless/{ => zydas}/zd1201.c | 0
drivers/net/wireless/{ => zydas}/zd1201.h | 0
.../net/wireless/{ => zydas}/zd1211rw/Kconfig | 0
.../wireless/{ => zydas}/zd1211rw/Makefile | 0
.../wireless/{ => zydas}/zd1211rw/zd_chip.c | 0
.../wireless/{ => zydas}/zd1211rw/zd_chip.h | 0
.../wireless/{ => zydas}/zd1211rw/zd_def.h | 0
.../wireless/{ => zydas}/zd1211rw/zd_mac.c | 0
.../wireless/{ => zydas}/zd1211rw/zd_mac.h | 0
.../net/wireless/{ => zydas}/zd1211rw/zd_rf.c | 0
.../net/wireless/{ => zydas}/zd1211rw/zd_rf.h | 0
.../{ => zydas}/zd1211rw/zd_rf_al2230.c | 0
.../{ => zydas}/zd1211rw/zd_rf_al7230b.c | 0
.../{ => zydas}/zd1211rw/zd_rf_rf2959.c | 0
.../{ => zydas}/zd1211rw/zd_rf_uw2453.c | 0
.../wireless/{ => zydas}/zd1211rw/zd_usb.c | 0
.../wireless/{ => zydas}/zd1211rw/zd_usb.h | 0
664 files changed, 4665 insertions(+), 2132 deletions(-)
create mode 100644 drivers/net/wireless/admtek/Kconfig
create mode 100644 drivers/net/wireless/admtek/Makefile
rename drivers/net/wireless/{ => admtek}/adm8211.c (100%)
rename drivers/net/wireless/{ => admtek}/adm8211.h (100%)
create mode 100644 drivers/net/wireless/atmel/Kconfig
create mode 100644 drivers/net/wireless/atmel/Makefile
rename drivers/net/wireless/{ => atmel}/at76c50x-usb.c (100%)
rename drivers/net/wireless/{ => atmel}/at76c50x-usb.h (100%)
rename drivers/net/wireless/{ => atmel}/atmel.c (100%)
rename drivers/net/wireless/{ => atmel}/atmel.h (100%)
rename drivers/net/wireless/{ => atmel}/atmel_cs.c (100%)
rename drivers/net/wireless/{ => atmel}/atmel_pci.c (100%)
create mode 100644 drivers/net/wireless/broadcom/Kconfig
create mode 100644 drivers/net/wireless/broadcom/Makefile
rename drivers/net/wireless/{ => broadcom}/b43/Kconfig (100%)
rename drivers/net/wireless/{ => broadcom}/b43/Makefile (100%)
rename drivers/net/wireless/{ => broadcom}/b43/b43.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/bus.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/bus.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/debugfs.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/debugfs.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/dma.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/dma.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/leds.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/leds.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/lo.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/lo.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/main.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/main.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_a.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_a.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_ac.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_ac.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_common.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_common.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_g.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_g.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_ht.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_ht.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_lcn.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_lcn.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_lp.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_lp.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_n.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/phy_n.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/pio.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/pio.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/ppr.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/ppr.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2055.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2055.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2056.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2056.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2057.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2057.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2059.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/radio_2059.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/rfkill.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/rfkill.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/sdio.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/sdio.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/sysfs.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/sysfs.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_lpphy.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_lpphy.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_nphy.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_nphy.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_phy_ht.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_phy_ht.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_phy_lcn.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/tables_phy_lcn.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/wa.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/wa.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43/xmit.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43/xmit.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/Kconfig (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/Makefile (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/b43legacy.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/debugfs.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/debugfs.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/dma.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/dma.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/ilt.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/ilt.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/leds.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/leds.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/main.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/main.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/phy.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/phy.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/pio.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/pio.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/radio.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/radio.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/rfkill.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/rfkill.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/sysfs.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/sysfs.h (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/xmit.c (100%)
rename drivers/net/wireless/{ => broadcom}/b43legacy/xmit.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/Kconfig (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/Makefile (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/Makefile (93%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/bcdc.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/bcdc.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/bcmsdh.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/btcoex.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/btcoex.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/bus.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/cfg80211.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/cfg80211.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/chip.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/chip.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/common.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/common.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/commonring.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/commonring.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/core.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/core.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/debug.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/debug.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/feature.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/feature.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/firmware.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/firmware.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/flowring.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/flowring.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fweh.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fweh.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fwil.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fwil.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fwil_types.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fwsignal.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/fwsignal.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/msgbuf.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/msgbuf.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/of.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/of.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/p2p.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/p2p.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/pcie.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/pcie.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/proto.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/proto.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/sdio.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/sdio.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/tracepoint.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/tracepoint.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/usb.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/usb.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/vendor.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmfmac/vendor.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/Makefile (88%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/aiutils.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/aiutils.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/ampdu.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/ampdu.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/antsel.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/antsel.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/brcms_trace_brcmsmac.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/brcms_trace_brcmsmac_msg.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/brcms_trace_brcmsmac_tx.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/brcms_trace_events.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/brcms_trace_events.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/channel.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/channel.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/d11.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/debug.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/debug.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/dma.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/dma.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/led.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/led.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/mac80211_if.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/mac80211_if.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/main.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/main.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_cmn.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_hal.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_int.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_lcn.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_lcn.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_n.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_qmath.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_qmath.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phy_radio.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phyreg_n.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phytbl_lcn.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phytbl_lcn.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phytbl_n.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy/phytbl_n.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy_shim.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/phy_shim.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/pmu.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/pmu.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/pub.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/rate.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/rate.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/scb.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/stf.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/stf.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/types.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/ucode_loader.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmsmac/ucode_loader.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmutil/Makefile (89%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmutil/d11.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/brcmutil/utils.c (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/brcm_hw_ids.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/brcmu_d11.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/brcmu_utils.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/brcmu_wifi.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/chipcommon.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/defs.h (100%)
rename drivers/net/wireless/{ => broadcom}/brcm80211/include/soc.h (100%)
create mode 100644 drivers/net/wireless/cisco/Kconfig
create mode 100644 drivers/net/wireless/cisco/Makefile
rename drivers/net/wireless/{ => cisco}/airo.c (100%)
rename drivers/net/wireless/{ => cisco}/airo.h (100%)
rename drivers/net/wireless/{ => cisco}/airo_cs.c (100%)
create mode 100644 drivers/net/wireless/intel/Kconfig
create mode 100644 drivers/net/wireless/intel/Makefile
rename drivers/net/wireless/{ => intel}/ipw2x00/Kconfig (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/Makefile (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/ipw.h (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/ipw2100.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/ipw2100.h (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/ipw2200.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/ipw2200.h (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw.h (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw_geo.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw_module.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw_rx.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw_tx.c (100%)
rename drivers/net/wireless/{ => intel}/ipw2x00/libipw_wx.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/3945-debug.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/3945-mac.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/3945-rs.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/3945.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/3945.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965-calib.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965-debug.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965-mac.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965-rs.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/4965.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/Kconfig (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/Makefile (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/commands.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/common.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/common.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/csr.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/debug.c (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/iwl-spectrum.h (100%)
rename drivers/net/wireless/{ => intel}/iwlegacy/prph.h (100%)
rename drivers/net/wireless/{ => intel}/iwlwifi/Kconfig (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/Makefile (91%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/Makefile (100%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/agn.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/calib.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/calib.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/commands.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/debugfs.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/dev.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/devices.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/led.c (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/led.h (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/lib.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/mac80211.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/main.c (94%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/power.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/power.h (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/rs.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/rs.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/rx.c (91%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/rxon.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/scan.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/sta.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/tt.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/tt.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/tx.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/dvm/ucode.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-1000.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-2000.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-5000.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-6000.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-7000.c (89%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-8000.c (95%)
create mode 100644 drivers/net/wireless/intel/iwlwifi/iwl-9000.c
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-agn-hw.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-config.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-csr.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-debug.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-debug.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace-data.h (84%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace-io.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace-iwlwifi.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace-msg.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace-ucode.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace.c (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-devtrace.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-drv.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-drv.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-eeprom-parse.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-eeprom-parse.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-eeprom-read.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-eeprom-read.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-fh.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-fw-error-dump.h (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-fw-file.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-fw.h (96%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-io.c (86%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-io.h (93%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-modparams.h (92%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-notif-wait.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-notif-wait.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-nvm-parse.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-nvm-parse.h (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-op-mode.h (95%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-phy-db.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-phy-db.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-prph.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-scd.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-trans.c (63%)
rename drivers/net/wireless/{ => intel}/iwlwifi/iwl-trans.h (84%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/Makefile (74%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/binding.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/coex.c (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/coex_legacy.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/constants.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/d3.c (90%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/debugfs-vif.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/debugfs.c (95%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/debugfs.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-coex.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-d3.h (96%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-mac.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-power.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-rs.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-rx.h (71%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-scan.h (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-sta.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-stats.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-tof.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api-tx.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw-api.h (98%)
create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.h
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/fw.c (90%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/led.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/mac-ctxt.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/mac80211.c (87%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/mvm.h (95%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/nvm.c (94%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/offloading.c (83%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/ops.c (84%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/phy-ctxt.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/power.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/quota.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/rs.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/rs.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/rx.c (95%)
create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/scan.c (95%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/sf.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/sta.c (92%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/sta.h (95%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/tdls.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/testmode.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/time-event.c (97%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/time-event.h (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/tof.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/tof.h (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/tt.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/tx.c (92%)
rename drivers/net/wireless/{ => intel}/iwlwifi/mvm/utils.c (99%)
rename drivers/net/wireless/{ => intel}/iwlwifi/pcie/drv.c (93%)
rename drivers/net/wireless/{ => intel}/iwlwifi/pcie/internal.h (96%)
rename drivers/net/wireless/{ => intel}/iwlwifi/pcie/rx.c (98%)
rename drivers/net/wireless/{ => intel}/iwlwifi/pcie/trans.c (91%)
rename drivers/net/wireless/{ => intel}/iwlwifi/pcie/tx.c (85%)
create mode 100644 drivers/net/wireless/intersil/Kconfig
create mode 100644 drivers/net/wireless/intersil/Makefile
rename drivers/net/wireless/{ => intersil}/hostap/Kconfig (100%)
rename drivers/net/wireless/{ => intersil}/hostap/Makefile (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap.h (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_80211.h (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_80211_rx.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_80211_tx.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_ap.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_ap.h (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_common.h (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_config.h (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_cs.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_download.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_hw.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_info.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_ioctl.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_main.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_pci.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_plx.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_proc.c (100%)
rename drivers/net/wireless/{ => intersil}/hostap/hostap_wlan.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/Kconfig (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/Makefile (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/airport.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/cfg.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/cfg.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/fw.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/fw.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hermes.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hermes.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hermes_dld.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hermes_dld.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hermes_rid.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hw.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/hw.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/main.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/main.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/mic.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/mic.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_cs.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_nortel.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_pci.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_pci.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_plx.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_tmd.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/orinoco_usb.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/scan.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/scan.h (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/spectrum_cs.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/wext.c (100%)
rename drivers/net/wireless/{ => intersil}/orinoco/wext.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/Kconfig (100%)
rename drivers/net/wireless/{ => intersil}/p54/Makefile (100%)
rename drivers/net/wireless/{ => intersil}/p54/eeprom.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/eeprom.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/fwio.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/led.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/lmac.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/main.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54pci.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54pci.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54spi.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54spi.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54spi_eeprom.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54usb.c (100%)
rename drivers/net/wireless/{ => intersil}/p54/p54usb.h (100%)
rename drivers/net/wireless/{ => intersil}/p54/txrx.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/Makefile (100%)
rename drivers/net/wireless/{ => intersil}/prism54/isl_38xx.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/isl_38xx.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/isl_ioctl.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/isl_ioctl.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/isl_oid.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_dev.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_dev.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_eth.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_eth.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_hotplug.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_mgt.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/islpci_mgt.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/oid_mgt.c (100%)
rename drivers/net/wireless/{ => intersil}/prism54/oid_mgt.h (100%)
rename drivers/net/wireless/{ => intersil}/prism54/prismcompat.h (100%)
create mode 100644 drivers/net/wireless/marvell/Kconfig
create mode 100644 drivers/net/wireless/marvell/Makefile
rename drivers/net/wireless/{ => marvell}/libertas/Kconfig (100%)
rename drivers/net/wireless/{ => marvell}/libertas/LICENSE (100%)
rename drivers/net/wireless/{ => marvell}/libertas/Makefile (100%)
rename drivers/net/wireless/{ => marvell}/libertas/README (100%)
rename drivers/net/wireless/{ => marvell}/libertas/cfg.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/cfg.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/cmd.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/cmd.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/cmdresp.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/debugfs.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/debugfs.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/decl.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/defs.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/dev.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/ethtool.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/firmware.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/host.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_cs.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_sdio.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_sdio.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_spi.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_spi.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_usb.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/if_usb.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/main.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/mesh.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/mesh.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/radiotap.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas/rx.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/tx.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas/types.h (100%)
create mode 100644 drivers/net/wireless/marvell/libertas_tf/Kconfig
rename drivers/net/wireless/{ => marvell}/libertas_tf/Makefile (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/cmd.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/deb_defs.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/if_usb.c (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/if_usb.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/libertas_tf.h (100%)
rename drivers/net/wireless/{ => marvell}/libertas_tf/main.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11ac.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11ac.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11h.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n_aggr.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n_aggr.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n_rxreorder.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/11n_rxreorder.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/Kconfig (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/Makefile (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/README (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/cfg80211.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/cfg80211.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/cfp.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/cmdevt.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/debugfs.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/decl.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/ethtool.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/fw.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/ie.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/init.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/ioctl.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/join.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/main.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/main.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/pcie.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/pcie.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/scan.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sdio.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sdio.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_cmd.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_cmdresp.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_event.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_ioctl.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_rx.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/sta_tx.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/tdls.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/txrx.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/uap_cmd.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/uap_event.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/uap_txrx.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/usb.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/usb.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/util.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/util.h (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/wmm.c (100%)
rename drivers/net/wireless/{ => marvell}/mwifiex/wmm.h (100%)
rename drivers/net/wireless/{ => marvell}/mwl8k.c (100%)
create mode 100644 drivers/net/wireless/ralink/Kconfig
create mode 100644 drivers/net/wireless/ralink/Makefile
rename drivers/net/wireless/{ => ralink}/rt2x00/Kconfig (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/Makefile (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2400pci.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2400pci.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2500pci.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2500pci.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2500usb.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2500usb.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800lib.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800lib.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800mmio.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800mmio.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800pci.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800pci.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800soc.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800usb.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2800usb.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00config.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00crypto.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00debug.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00debug.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00dev.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00dump.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00firmware.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00leds.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00leds.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00lib.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00link.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00mac.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00mmio.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00mmio.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00pci.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00pci.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00queue.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00queue.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00reg.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00soc.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00soc.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00usb.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt2x00usb.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt61pci.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt61pci.h (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt73usb.c (100%)
rename drivers/net/wireless/{ => ralink}/rt2x00/rt73usb.h (100%)
create mode 100644 drivers/net/wireless/realtek/Kconfig
create mode 100644 drivers/net/wireless/st/Kconfig
create mode 100644 drivers/net/wireless/st/Makefile
rename drivers/net/wireless/{ => st}/cw1200/Kconfig (100%)
rename drivers/net/wireless/{ => st}/cw1200/Makefile (100%)
rename drivers/net/wireless/{ => st}/cw1200/bh.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/bh.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/cw1200.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/cw1200_sdio.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/cw1200_spi.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/debug.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/debug.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/fwio.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/fwio.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/hwbus.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/hwio.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/hwio.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/main.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/pm.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/pm.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/queue.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/queue.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/scan.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/scan.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/sta.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/sta.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/txrx.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/txrx.h (100%)
rename drivers/net/wireless/{ => st}/cw1200/wsm.c (100%)
rename drivers/net/wireless/{ => st}/cw1200/wsm.h (100%)
create mode 100644 drivers/net/wireless/zydas/Kconfig
create mode 100644 drivers/net/wireless/zydas/Makefile
rename drivers/net/wireless/{ => zydas}/zd1201.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1201.h (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/Kconfig (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/Makefile (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_chip.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_chip.h (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_def.h (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_mac.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_mac.h (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf.h (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf_al2230.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf_al7230b.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf_rf2959.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_rf_uw2453.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_usb.c (100%)
rename drivers/net/wireless/{ => zydas}/zd1211rw/zd_usb.h (100%)



2015-12-21 20:50:55

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 02/45] iwlwifi: mvm: add an option to start rs from HT/VHT rates

From: Gregory Greenman <[email protected]>

Extend the configurable option of setting initial rate to RSSI based.
Make the initial rate to be set to VHT/HT SISO or legacy depending on
the AP capabilities.

Signed-off-by: Gregory Greenman <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 67 ++++++++++++++++++++++-------
1 file changed, 52 insertions(+), 15 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
index 54789bd..feb775a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
@@ -2550,6 +2550,8 @@ static const struct rs_init_rate_info rs_optimal_rates_vht_40_80mhz[] = {
{ S8_MIN, IWL_RATE_MCS_0_INDEX },
};

+#define IWL_RS_LOW_RSSI_THRESHOLD (-76) /* dBm */
+
/* Init the optimal rate based on STA caps
* This combined with rssi is used to report the last tx rate
* to userspace when we haven't transmitted enough frames.
@@ -2635,11 +2637,13 @@ static struct rs_rate *rs_get_optimal_rate(struct iwl_mvm *mvm,
* of last Rx
*/
static void rs_get_initial_rate(struct iwl_mvm *mvm,
+ struct ieee80211_sta *sta,
struct iwl_lq_sta *lq_sta,
enum ieee80211_band band,
struct rs_rate *rate)
{
int i, nentries;
+ unsigned long active_rate;
s8 best_rssi = S8_MIN;
u8 best_ant = ANT_NONE;
u8 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm);
@@ -2680,19 +2684,55 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
nentries = ARRAY_SIZE(rs_optimal_rates_24ghz_legacy);
}

- if (IWL_MVM_RS_RSSI_BASED_INIT_RATE) {
- for (i = 0; i < nentries; i++) {
- int rate_idx = initial_rates[i].rate_idx;
- if ((best_rssi >= initial_rates[i].rssi) &&
- (BIT(rate_idx) & lq_sta->active_legacy_rate)) {
- rate->index = rate_idx;
- break;
- }
+ if (!IWL_MVM_RS_RSSI_BASED_INIT_RATE)
+ goto out;
+
+ /* Start from a higher rate if the corresponding debug capability
+ * is enabled. The rate is chosen according to AP capabilities.
+ * In case of VHT/HT when the rssi is low fallback to the case of
+ * legacy rates.
+ */
+ if (sta->vht_cap.vht_supported &&
+ best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
+ if (sta->bandwidth >= IEEE80211_STA_RX_BW_40) {
+ initial_rates = rs_optimal_rates_vht_40_80mhz;
+ nentries = ARRAY_SIZE(rs_optimal_rates_vht_40_80mhz);
+ if (sta->bandwidth >= IEEE80211_STA_RX_BW_80)
+ rate->bw = RATE_MCS_CHAN_WIDTH_80;
+ else
+ rate->bw = RATE_MCS_CHAN_WIDTH_40;
+ } else if (sta->bandwidth == IEEE80211_STA_RX_BW_20) {
+ initial_rates = rs_optimal_rates_vht_20mhz;
+ nentries = ARRAY_SIZE(rs_optimal_rates_vht_20mhz);
+ rate->bw = RATE_MCS_CHAN_WIDTH_20;
+ } else {
+ IWL_ERR(mvm, "Invalid BW %d\n", sta->bandwidth);
+ goto out;
}
+ active_rate = lq_sta->active_siso_rate;
+ rate->type = LQ_VHT_SISO;
+ } else if (sta->ht_cap.ht_supported &&
+ best_rssi > IWL_RS_LOW_RSSI_THRESHOLD) {
+ initial_rates = rs_optimal_rates_ht;
+ nentries = ARRAY_SIZE(rs_optimal_rates_ht);
+ active_rate = lq_sta->active_siso_rate;
+ rate->type = LQ_HT_SISO;
+ } else {
+ active_rate = lq_sta->active_legacy_rate;
}

- IWL_DEBUG_RATE(mvm, "rate_idx %d ANT %s\n", rate->index,
- rs_pretty_ant(rate->ant));
+ for (i = 0; i < nentries; i++) {
+ int rate_idx = initial_rates[i].rate_idx;
+
+ if ((best_rssi >= initial_rates[i].rssi) &&
+ (BIT(rate_idx) & active_rate)) {
+ rate->index = rate_idx;
+ break;
+ }
+ }
+
+out:
+ rs_dump_rate(mvm, rate, "INITIAL");
}

/* Save info about RSSI of last Rx */
@@ -2752,14 +2792,11 @@ static void rs_initialize_lq(struct iwl_mvm *mvm,
tbl = &(lq_sta->lq_info[active_tbl]);
rate = &tbl->rate;

- rs_get_initial_rate(mvm, lq_sta, band, rate);
+ rs_get_initial_rate(mvm, sta, lq_sta, band, rate);
rs_init_optimal_rate(mvm, sta, lq_sta);

WARN_ON_ONCE(rate->ant != ANT_A && rate->ant != ANT_B);
- if (rate->ant == ANT_A)
- tbl->column = RS_COLUMN_LEGACY_ANT_A;
- else
- tbl->column = RS_COLUMN_LEGACY_ANT_B;
+ tbl->column = rs_get_column_from_rate(rate);

rs_set_expected_tpt_table(lq_sta, tbl);
rs_fill_lq_cmd(mvm, sta, lq_sta, rate);
--
2.5.0


2015-12-21 20:52:24

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 32/45] iwlwifi: mvm: support description for user triggered fw dbg collection

From: Golan Ben-Ami <[email protected]>

Add to the user triggered fw debug collection support for describing
the reason of the trigger.
This could be useful for identifying a dump by a unique id, passed as
a description.

Signed-off-by: Golan Ben-Ami <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
index 2acf9ff..90500e2 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
@@ -1029,7 +1029,8 @@ static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm,
if (ret)
return ret;

- iwl_mvm_fw_dbg_collect(mvm, FW_DBG_TRIGGER_USER, NULL, 0, NULL);
+ iwl_mvm_fw_dbg_collect(mvm, FW_DBG_TRIGGER_USER, buf,
+ (count - 1), NULL);

iwl_mvm_unref(mvm, IWL_MVM_REF_PRPH_WRITE);

@@ -1451,7 +1452,7 @@ MVM_DEBUGFS_WRITE_FILE_OPS(bt_force_ant, 10);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8);
MVM_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_conf, 8);
-MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 8);
+MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 64);
MVM_DEBUGFS_WRITE_FILE_OPS(cont_recording, 8);

#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
--
2.5.0


2015-12-21 20:51:31

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 21/45] iwlwifi: mvm: change protocol offload flows

From: Sara Sharon <[email protected]>

RFC4862 states that "In all cases, a node MUST NOT respond to
a Neighbor Solicitation for a tentative address".
Currently the driver configures the NS offload and does not wait
for address to become permanent, thus violating the RFC.
Just removing the address from the address list is not good enough
for all cases, since the NS messages are needed for the duplicate
address detection and should not be discarded.

For d0i3 disable NS offload. Put tentative address in the address
list so the NS packet will not be filtered out by ucode.
For D3 the platform will not wake from NS packets - so enable
NS offload while removing the tentative address from the list.

Given that now NS offload might be disabled, and that the ucode
uses the IP data for other puroposes (L3 filtering) add two
independent flags indicating if IPv4\IPv6 data is valid.

Signed-off-by: Sara Sharon <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 6 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h | 4 ++
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 +
.../net/wireless/intel/iwlwifi/mvm/offloading.c | 74 ++++++++++++++++------
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 3 +-
5 files changed, 69 insertions(+), 20 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index b1c9992..8824a89 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -104,9 +104,13 @@ void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
struct inet6_ifaddr *ifa;
int idx = 0;

+ memset(mvmvif->tentative_addrs, 0, sizeof(mvmvif->tentative_addrs));
+
read_lock_bh(&idev->lock);
list_for_each_entry(ifa, &idev->addr_list, if_list) {
mvmvif->target_ipv6_addrs[idx] = ifa->addr;
+ if (ifa->flags & IFA_F_TENTATIVE)
+ __set_bit(idx, mvmvif->tentative_addrs);
idx++;
if (idx >= IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)
break;
@@ -964,7 +968,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
if (ret)
return ret;

- ret = iwl_mvm_send_proto_offload(mvm, vif, false, 0);
+ ret = iwl_mvm_send_proto_offload(mvm, vif, false, true, 0);
if (ret)
return ret;

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
index 228684c..c36c956 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
@@ -94,10 +94,14 @@ struct iwl_d3_manager_config {
* enum iwl_d3_proto_offloads - enabled protocol offloads
* @IWL_D3_PROTO_OFFLOAD_ARP: ARP data is enabled
* @IWL_D3_PROTO_OFFLOAD_NS: NS (Neighbor Solicitation) is enabled
+ * @IWL_D3_PROTO_IPV4_VALID: IPv4 data is valid
+ * @IWL_D3_PROTO_IPV6_VALID: IPv6 data is valid
*/
enum iwl_proto_offloads {
IWL_D3_PROTO_OFFLOAD_ARP = BIT(0),
IWL_D3_PROTO_OFFLOAD_NS = BIT(1),
+ IWL_D3_PROTO_IPV4_VALID = BIT(2),
+ IWL_D3_PROTO_IPV6_VALID = BIT(3),
};

#define IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1 2
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 3fc7199..d8760fa 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -422,6 +422,7 @@ struct iwl_mvm_vif {
#if IS_ENABLED(CONFIG_IPV6)
/* IPv6 addresses for WoWLAN */
struct in6_addr target_ipv6_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX];
+ unsigned long tentative_addrs[BITS_TO_LONGS(IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)];
int num_target_ipv6_addrs;
#endif

@@ -1299,6 +1300,7 @@ void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
struct ieee80211_vif *vif,
bool disable_offloading,
+ bool offload_ns,
u32 cmd_flags);

/* D0i3 */
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/offloading.c b/drivers/net/wireless/intel/iwlwifi/mvm/offloading.c
index f83e2bc..6338d9c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/offloading.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/offloading.c
@@ -7,6 +7,7 @@
*
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
+ * Copyright(c) 2015 Intel Deutschland GmbH
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
@@ -33,6 +34,7 @@
*
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
+ * Copyright(c) 2015 Intel Deutschland GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -64,6 +66,7 @@
*****************************************************************************/
#include <net/ipv6.h>
#include <net/addrconf.h>
+#include <linux/bitops.h>
#include "mvm.h"

void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
@@ -86,6 +89,7 @@ void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
struct ieee80211_vif *vif,
bool disable_offloading,
+ bool offload_ns,
u32 cmd_flags)
{
union {
@@ -106,6 +110,13 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
#if IS_ENABLED(CONFIG_IPV6)
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
int i;
+ /*
+ * Skip tentative address when ns offload is enabled to avoid
+ * violating RFC4862.
+ * Keep tentative address when ns offload is disabled so the NS packets
+ * will not be filtered out and will wake up the host.
+ */
+ bool skip_tentative = offload_ns;

if (capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL ||
capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE) {
@@ -113,6 +124,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
struct iwl_targ_addr *addrs;
int n_nsc, n_addrs;
int c;
+ int num_skipped = 0;

if (capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL) {
nsc = cmd.v3s.ns_config;
@@ -126,9 +138,6 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
n_addrs = IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V3L;
}

- if (mvmvif->num_target_ipv6_addrs)
- enabled |= IWL_D3_PROTO_OFFLOAD_NS;
-
/*
* For each address we have (and that will fit) fill a target
* address struct and combine for NS offload structs with the
@@ -140,6 +149,12 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
struct in6_addr solicited_addr;
int j;

+ if (skip_tentative &&
+ test_bit(i, mvmvif->tentative_addrs)) {
+ num_skipped++;
+ continue;
+ }
+
addrconf_addr_solict_mult(&mvmvif->target_ipv6_addrs[i],
&solicited_addr);
for (j = 0; j < c; j++)
@@ -154,41 +169,64 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
memcpy(nsc[j].target_mac_addr, vif->addr, ETH_ALEN);
}

+ if (mvmvif->num_target_ipv6_addrs - num_skipped)
+ enabled |= IWL_D3_PROTO_IPV6_VALID;
+
if (capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL)
- cmd.v3s.num_valid_ipv6_addrs = cpu_to_le32(i);
+ cmd.v3s.num_valid_ipv6_addrs =
+ cpu_to_le32(i - num_skipped);
else
- cmd.v3l.num_valid_ipv6_addrs = cpu_to_le32(i);
+ cmd.v3l.num_valid_ipv6_addrs =
+ cpu_to_le32(i - num_skipped);
} else if (capa_flags & IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS) {
- if (mvmvif->num_target_ipv6_addrs) {
- enabled |= IWL_D3_PROTO_OFFLOAD_NS;
- memcpy(cmd.v2.ndp_mac_addr, vif->addr, ETH_ALEN);
- }
+ bool found = false;

BUILD_BUG_ON(sizeof(cmd.v2.target_ipv6_addr[0]) !=
sizeof(mvmvif->target_ipv6_addrs[0]));

for (i = 0; i < min(mvmvif->num_target_ipv6_addrs,
- IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2); i++)
+ IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V2); i++) {
+ if (skip_tentative &&
+ test_bit(i, mvmvif->tentative_addrs))
+ continue;
+
memcpy(cmd.v2.target_ipv6_addr[i],
&mvmvif->target_ipv6_addrs[i],
sizeof(cmd.v2.target_ipv6_addr[i]));
- } else {
- if (mvmvif->num_target_ipv6_addrs) {
- enabled |= IWL_D3_PROTO_OFFLOAD_NS;
- memcpy(cmd.v1.ndp_mac_addr, vif->addr, ETH_ALEN);
- }

+ found = true;
+ }
+ if (found) {
+ enabled |= IWL_D3_PROTO_IPV6_VALID;
+ memcpy(cmd.v2.ndp_mac_addr, vif->addr, ETH_ALEN);
+ }
+ } else {
+ bool found = false;
BUILD_BUG_ON(sizeof(cmd.v1.target_ipv6_addr[0]) !=
sizeof(mvmvif->target_ipv6_addrs[0]));

for (i = 0; i < min(mvmvif->num_target_ipv6_addrs,
- IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1); i++)
+ IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_V1); i++) {
+ if (skip_tentative &&
+ test_bit(i, mvmvif->tentative_addrs))
+ continue;
+
memcpy(cmd.v1.target_ipv6_addr[i],
&mvmvif->target_ipv6_addrs[i],
sizeof(cmd.v1.target_ipv6_addr[i]));
+
+ found = true;
+ }
+
+ if (found) {
+ enabled |= IWL_D3_PROTO_IPV6_VALID;
+ memcpy(cmd.v1.ndp_mac_addr, vif->addr, ETH_ALEN);
+ }
}
-#endif

+ if (offload_ns && (enabled & IWL_D3_PROTO_IPV6_VALID))
+ enabled |= IWL_D3_PROTO_OFFLOAD_NS;
+#endif
if (capa_flags & IWL_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL) {
common = &cmd.v3s.common;
size = sizeof(cmd.v3s);
@@ -204,7 +242,7 @@ int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
}

if (vif->bss_conf.arp_addr_cnt) {
- enabled |= IWL_D3_PROTO_OFFLOAD_ARP;
+ enabled |= IWL_D3_PROTO_OFFLOAD_ARP | IWL_D3_PROTO_IPV4_VALID;
common->host_ipv4_addr = vif->bss_conf.arp_addr_list[0];
memcpy(common->arp_mac_addr, vif->addr, ETH_ALEN);
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 31c16a1..4753ecd 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -1153,7 +1153,8 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac,
data->disable_offloading = true;

iwl_mvm_update_d0i3_power_mode(mvm, vif, true, flags);
- iwl_mvm_send_proto_offload(mvm, vif, data->disable_offloading, flags);
+ iwl_mvm_send_proto_offload(mvm, vif, data->disable_offloading,
+ false, flags);

/*
* on init/association, mvm already configures POWER_TABLE_CMD
--
2.5.0


2015-12-29 16:47:19

by Kalle Valo

[permalink] [raw]
Subject: Re: pull request: iwlwifi-next-2015-12-21

"Grumbach, Emmanuel" <[email protected]> writes:

> Hi Kalle,
>
> here is a pull request for 4.5. I guess there will be one more after
> that depending on when Linus will open the merge window I guess. The
> diffstat look awful and I have no clue why. It looks as if I had done
> the whole code reorganisation... So we have a pretty large pull
> request here. We are facing big new things: a new device family with
> lots of work in the data path and such. Details in the tag. Let me
> know if you have issues. Note that as I said, I needed to merge
> Johannes's tree to get the new uAPSD helper I added and I merge
> iwlwifi-fixes.git to avoid conflicts.
>
> The following changes since commit 1b894521e60c1b91db1e8ba1278660e5c89f1b5f:
>
> mac80211: handle HW ROC expired properly (2015-12-07 11:06:37 +0100)
>
> are available in the git repository at:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next.git tags/iwlwifi-next-for-kalle-2015-12-21

Pulled, thanks. Happy New Year!

--
Kalle Valo

2015-12-21 20:51:29

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 20/45] iwlwifi: expose fw usniffer mode to more utilities

From: Golan Ben-Ami <[email protected]>

Today, in order to configure fw in usniffer mode, the ucode
must have the corresponding tlv, which is revealed to the driver
while parsing the ucode.

Expose the mode of the usniffer to other utilities in the driver
(other than the ucode parser) by passing back a pointer to the value.
This can be very useful for allowing configuring the fw dbg data
using an external configuration file, because this configuration
depends on the fw usniffer mode.

Signed-off-by: Golan Ben-Ami <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
index 16756f0..47a83ab 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
@@ -594,7 +594,8 @@ static int iwl_parse_v1_v2_firmware(struct iwl_drv *drv,
static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
const struct firmware *ucode_raw,
struct iwl_firmware_pieces *pieces,
- struct iwl_ucode_capabilities *capa)
+ struct iwl_ucode_capabilities *capa,
+ bool *usniffer_images)
{
struct iwl_tlv_ucode_header *ucode = (void *)ucode_raw->data;
struct iwl_ucode_tlv *tlv;
@@ -607,7 +608,6 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
char buildstr[25];
u32 build, paging_mem_size;
int num_of_cpus;
- bool usniffer_images = false;
bool usniffer_req = false;
bool gscan_capa = false;

@@ -980,7 +980,7 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
break;
}
case IWL_UCODE_TLV_SEC_RT_USNIFFER:
- usniffer_images = true;
+ *usniffer_images = true;
iwl_store_ucode_sec(pieces, tlv_data,
IWL_UCODE_REGULAR_USNIFFER,
tlv_len);
@@ -1031,7 +1031,7 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
}
}

- if (usniffer_req && !usniffer_images) {
+ if (usniffer_req && !*usniffer_images) {
IWL_ERR(drv,
"user selected to work with usniffer but usniffer image isn't available in ucode package\n");
return -EINVAL;
@@ -1192,6 +1192,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
u32 api_ver;
int i;
bool load_module = false;
+ bool usniffer_images = false;

fw->ucode_capa.max_probe_length = IWL_DEFAULT_MAX_PROBE_LENGTH;
fw->ucode_capa.standard_phy_calibration_size =
@@ -1229,7 +1230,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
err = iwl_parse_v1_v2_firmware(drv, ucode_raw, pieces);
else
err = iwl_parse_tlv_firmware(drv, ucode_raw, pieces,
- &fw->ucode_capa);
+ &fw->ucode_capa, &usniffer_images);

if (err)
goto try_again;
--
2.5.0


2015-12-21 20:52:48

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 45/45] iwlwifi: bail out in case of bad trans state

From: Eliad Peller <[email protected]>

In case of bad trans state (i.e. fw is not loaded) bail
out immediately instead of calling the trans, which might
not be fully initialized yet.

Also add WARN_ON_ONCE to help debugging where the errorneous
call is coming from.

Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 290d538..81b7cb7 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -1001,8 +1001,10 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status)))
return -EIO;

- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return -EIO;
+ }

return trans->ops->tx(trans, skb, dev_cmd, queue);
}
@@ -1010,8 +1012,10 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
static inline void iwl_trans_reclaim(struct iwl_trans *trans, int queue,
int ssn, struct sk_buff_head *skbs)
{
- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return;
+ }

trans->ops->reclaim(trans, queue, ssn, skbs);
}
@@ -1029,8 +1033,10 @@ iwl_trans_txq_enable_cfg(struct iwl_trans *trans, int queue, u16 ssn,
{
might_sleep();

- if (unlikely((trans->state != IWL_TRANS_FW_ALIVE)))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return;
+ }

trans->ops->txq_enable(trans, queue, ssn, cfg, queue_wdg_timeout);
}
@@ -1070,8 +1076,10 @@ static inline void iwl_trans_freeze_txq_timer(struct iwl_trans *trans,
unsigned long txqs,
bool freeze)
{
- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return;
+ }

if (trans->ops->freeze_txq_timer)
trans->ops->freeze_txq_timer(trans, txqs, freeze);
@@ -1080,8 +1088,10 @@ static inline void iwl_trans_freeze_txq_timer(struct iwl_trans *trans,
static inline void iwl_trans_block_txq_ptrs(struct iwl_trans *trans,
bool block)
{
- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return;
+ }

if (trans->ops->block_txq_ptrs)
trans->ops->block_txq_ptrs(trans, block);
@@ -1090,8 +1100,10 @@ static inline void iwl_trans_block_txq_ptrs(struct iwl_trans *trans,
static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans,
u32 txqs)
{
- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ if (WARN_ON_ONCE(trans->state != IWL_TRANS_FW_ALIVE)) {
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return -EIO;
+ }

return trans->ops->wait_tx_queue_empty(trans, txqs);
}
--
2.5.0


2015-12-21 20:52:38

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 40/45] iwlwifi: Update PCI IDs for 8000 and 9000 series

From: Oren Givon <[email protected]>

A new PCI IDs update to the 8000 and 9000 series.

type=feature

Signed-off-by: Oren Givon <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 4f94be9..af10651 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -471,19 +471,20 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
{IWL_PCI_DEVICE(0x24F3, 0x0850, iwl8260_2ac_cfg)},
{IWL_PCI_DEVICE(0x24F3, 0x0950, iwl8260_2ac_cfg)},
{IWL_PCI_DEVICE(0x24F3, 0x0930, iwl8260_2ac_cfg)},
- {IWL_PCI_DEVICE(0x24FD, 0x0000, iwl8265_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x24F3, 0x0000, iwl8265_2ac_cfg)},
{IWL_PCI_DEVICE(0x24FD, 0x0010, iwl8265_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x24FD, 0x8010, iwl8265_2ac_cfg)},

/* 9000 Series */
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl5165_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x2010, iwl5165_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9260_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9260_2ac_cfg)},
- {IWL_PCI_DEVICE(0x9DF0, 0x0000, iwl9260_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x9DF0, 0x0000, iwl5165_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x0310, iwl5165_2ac_cfg)},
- {IWL_PCI_DEVICE(0x9DF0, 0x0510, iwl9260_2ac_cfg)},
- {IWL_PCI_DEVICE(0x9DF0, 0x0710, iwl9260_2ac_cfg)},
- {IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl5165_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x9DF0, 0x0510, iwl5165_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x9DF0, 0x0710, iwl5165_2ac_cfg)},
+ {IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9260_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x0410, iwl9260_2ac_cfg)},
{IWL_PCI_DEVICE(0x9DF0, 0x0610, iwl9260_2ac_cfg)},
#endif /* CONFIG_IWLMVM */
--
2.5.0


2015-12-21 20:52:46

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 44/45] iwlwifi: fix printf specifier

Smatch warned about a bad specifier being used. Fix that.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
index b395854..c15f5be 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
@@ -454,11 +454,11 @@ static void iwl_eeprom_enhanced_txpower(struct device *dev,
TXP_CHECK_AND_PRINT(COMMON_TYPE),
txp->flags);
IWL_DEBUG_EEPROM(dev,
- "\t\t chain_A: 0x%02x chain_B: 0X%02x chain_C: 0X%02x\n",
+ "\t\t chain_A: %d chain_B: %d chain_C: %d\n",
txp->chain_a_max, txp->chain_b_max,
txp->chain_c_max);
IWL_DEBUG_EEPROM(dev,
- "\t\t MIMO2: 0x%02x MIMO3: 0x%02x High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
+ "\t\t MIMO2: %d MIMO3: %d High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
txp->mimo2_max, txp->mimo3_max,
((txp->delta_20_in_40 & 0xf0) >> 4),
(txp->delta_20_in_40 & 0x0f));
--
2.5.0


2015-12-21 20:51:13

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 11/45] iwlwifi: pcie: allow the op_mode to block the tx queues

In certain flows (see next patches), the op_mode may need to
block the Tx queues for a short period. Provide an API for
that. The transport is in charge of counting the number of
times the queues are blocked since the op_mode may block the
queues several times in a row before unblocking them.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 16 +++++++++++++
drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 1 +
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 28 ++++++++++++++++++++++
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 4 +++-
4 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 3d089ae..0cd69cd 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -542,6 +542,11 @@ struct iwl_trans_txq_scd_cfg {
* @wait_tx_queue_empty: wait until tx queues are empty. May sleep.
* @freeze_txq_timer: prevents the timer of the queue from firing until the
* queue is set to awake. Must be atomic.
+ * @block_txq_ptrs: stop updating the write pointers of the Tx queues. Note
+ * that the transport needs to refcount the calls since this function
+ * will be called several times with block = true, and then the queues
+ * need to be unblocked only after the same number of calls with
+ * block = false.
* @write8: write a u8 to a register at offset ofs from the BAR
* @write32: write a u32 to a register at offset ofs from the BAR
* @read32: read a u32 register at offset ofs from the BAR
@@ -600,6 +605,7 @@ struct iwl_trans_ops {
int (*wait_tx_queue_empty)(struct iwl_trans *trans, u32 txq_bm);
void (*freeze_txq_timer)(struct iwl_trans *trans, unsigned long txqs,
bool freeze);
+ void (*block_txq_ptrs)(struct iwl_trans *trans, bool block);

void (*write8)(struct iwl_trans *trans, u32 ofs, u8 val);
void (*write32)(struct iwl_trans *trans, u32 ofs, u32 val);
@@ -1010,6 +1016,16 @@ static inline void iwl_trans_freeze_txq_timer(struct iwl_trans *trans,
trans->ops->freeze_txq_timer(trans, txqs, freeze);
}

+static inline void iwl_trans_block_txq_ptrs(struct iwl_trans *trans,
+ bool block)
+{
+ if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
+ IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+
+ if (trans->ops->block_txq_ptrs)
+ trans->ops->block_txq_ptrs(trans, block);
+}
+
static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans,
u32 txqs)
{
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 44dc09d..31f30a2 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -278,6 +278,7 @@ struct iwl_txq {
bool frozen;
u8 active;
bool ampdu;
+ bool block;
unsigned long wd_timeout;
};

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index efef487..316162a 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1673,6 +1673,33 @@ next_queue:
}
}

+static void iwl_trans_pcie_block_txq_ptrs(struct iwl_trans *trans, bool block)
+{
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+ int i;
+
+ for (i = 0; i < trans->cfg->base_params->num_of_queues; i++) {
+ struct iwl_txq *txq = &trans_pcie->txq[i];
+
+ if (i == trans_pcie->cmd_queue)
+ continue;
+
+ spin_lock_bh(&txq->lock);
+
+ if (!block && !(WARN_ON_ONCE(!txq->block))) {
+ txq->block--;
+ if (!txq->block) {
+ iwl_write32(trans, HBUS_TARG_WRPTR,
+ txq->q.write_ptr | (i << 8));
+ }
+ } else if (block) {
+ txq->block++;
+ }
+
+ spin_unlock_bh(&txq->lock);
+ }
+}
+
#define IWL_FLUSH_WAIT_MS 2000

static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, u32 txq_bm)
@@ -2467,6 +2494,7 @@ static const struct iwl_trans_ops trans_ops_pcie = {

.wait_tx_queue_empty = iwl_trans_pcie_wait_txq_empty,
.freeze_txq_timer = iwl_trans_pcie_freeze_txq_timer,
+ .block_txq_ptrs = iwl_trans_pcie_block_txq_ptrs,

.write8 = iwl_trans_pcie_write8,
.write32 = iwl_trans_pcie_write32,
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index a8c8a4a..95ba920 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -318,7 +318,9 @@ static void iwl_pcie_txq_inc_wr_ptr(struct iwl_trans *trans,
* trying to tx (during RFKILL, we're not trying to tx).
*/
IWL_DEBUG_TX(trans, "Q:%d WR: 0x%x\n", txq_id, txq->q.write_ptr);
- iwl_write32(trans, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8));
+ if (!txq->block)
+ iwl_write32(trans, HBUS_TARG_WRPTR,
+ txq->q.write_ptr | (txq_id << 8));
}

void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans)
--
2.5.0


2015-12-21 20:51:03

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 06/45] iwlwifi: mvm: advertise NETIF_F_SG

From: Johannes Berg <[email protected]>

If the transport supports it, advertise NETIF_F_SG to mac80211 to
be able to use frag SKBs. This will already improve performance by
allowing software GSO to be used.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index fc13ad9..09afb6d 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -439,6 +439,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);

+ if (mvm->trans->max_skb_frags)
+ hw->netdev_features = NETIF_F_HIGHDMA | NETIF_F_SG;
+
hw->queues = mvm->first_agg_queue;
hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FEC |
--
2.5.0


2015-12-21 20:52:14

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 26/45] iwlwifi: pcie: re-organize code towards TSO

The code that handles the TBs that contain the WiFi payload
will be changed for TSO. Move the current code into a
separate function.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 113 +++++++++++++++------------
1 file changed, 64 insertions(+), 49 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 6c460a5..890148c6 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -1798,6 +1798,66 @@ int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
return iwl_pcie_send_hcmd_sync(trans, cmd);
}

+static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb,
+ struct iwl_txq *txq, u8 hdr_len,
+ struct iwl_cmd_meta *out_meta,
+ struct iwl_device_cmd *dev_cmd, u16 tb1_len)
+{
+ struct iwl_queue *q = &txq->q;
+ u16 tb2_len;
+ int i;
+
+ /*
+ * Set up TFD's third entry to point directly to remainder
+ * of skb's head, if any
+ */
+ tb2_len = skb_headlen(skb) - hdr_len;
+
+ if (tb2_len > 0) {
+ dma_addr_t tb2_phys = dma_map_single(trans->dev,
+ skb->data + hdr_len,
+ tb2_len, DMA_TO_DEVICE);
+ if (unlikely(dma_mapping_error(trans->dev, tb2_phys))) {
+ iwl_pcie_tfd_unmap(trans, out_meta,
+ &txq->tfds[q->write_ptr]);
+ return -EINVAL;
+ }
+ iwl_pcie_txq_build_tfd(trans, txq, tb2_phys, tb2_len, false);
+ }
+
+ /* set up the remaining entries to point to the data */
+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+ const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+ dma_addr_t tb_phys;
+ int tb_idx;
+
+ if (!skb_frag_size(frag))
+ continue;
+
+ tb_phys = skb_frag_dma_map(trans->dev, frag, 0,
+ skb_frag_size(frag), DMA_TO_DEVICE);
+
+ if (unlikely(dma_mapping_error(trans->dev, tb_phys))) {
+ iwl_pcie_tfd_unmap(trans, out_meta,
+ &txq->tfds[q->write_ptr]);
+ return -EINVAL;
+ }
+ tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
+ skb_frag_size(frag), false);
+
+ out_meta->flags |= BIT(tb_idx + CMD_TB_BITMAP_POS);
+ }
+
+ trace_iwlwifi_dev_tx(trans->dev, skb,
+ &txq->tfds[txq->q.write_ptr],
+ sizeof(struct iwl_tfd),
+ &dev_cmd->hdr, IWL_HCMD_SCRATCHBUF_SIZE + tb1_len,
+ skb->data + hdr_len, tb2_len);
+ trace_iwlwifi_dev_tx_data(trans->dev, skb,
+ hdr_len, skb->len - hdr_len);
+ return 0;
+}
+
int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
struct iwl_device_cmd *dev_cmd, int txq_id)
{
@@ -1809,12 +1869,11 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
struct iwl_queue *q;
dma_addr_t tb0_phys, tb1_phys, scratch_phys;
void *tb1_addr;
- u16 len, tb1_len, tb2_len;
+ u16 len, tb1_len;
bool wait_write_ptr;
__le16 fc;
u8 hdr_len;
u16 wifi_seq;
- int i;

txq = &trans_pcie->txq[txq_id];
q = &txq->q;
@@ -1910,57 +1969,13 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
goto out_err;
iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false);

- /*
- * Set up TFD's third entry to point directly to remainder
- * of skb's head, if any
- */
- tb2_len = skb_headlen(skb) - hdr_len;
- if (tb2_len > 0) {
- dma_addr_t tb2_phys = dma_map_single(trans->dev,
- skb->data + hdr_len,
- tb2_len, DMA_TO_DEVICE);
- if (unlikely(dma_mapping_error(trans->dev, tb2_phys))) {
- iwl_pcie_tfd_unmap(trans, out_meta,
- &txq->tfds[q->write_ptr]);
- goto out_err;
- }
- iwl_pcie_txq_build_tfd(trans, txq, tb2_phys, tb2_len, false);
- }
-
- /* set up the remaining entries to point to the data */
- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
- const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
- dma_addr_t tb_phys;
- int tb_idx;
-
- if (!skb_frag_size(frag))
- continue;
-
- tb_phys = skb_frag_dma_map(trans->dev, frag, 0,
- skb_frag_size(frag), DMA_TO_DEVICE);
-
- if (unlikely(dma_mapping_error(trans->dev, tb_phys))) {
- iwl_pcie_tfd_unmap(trans, out_meta,
- &txq->tfds[q->write_ptr]);
- goto out_err;
- }
- tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
- skb_frag_size(frag), false);
-
- out_meta->flags |= BIT(tb_idx + CMD_TB_BITMAP_POS);
- }
+ if (unlikely(iwl_fill_data_tbs(trans, skb, txq, hdr_len,
+ out_meta, dev_cmd, tb1_len)))
+ goto out_err;

/* Set up entry for this TFD in Tx byte-count array */
iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len));

- trace_iwlwifi_dev_tx(trans->dev, skb,
- &txq->tfds[txq->q.write_ptr],
- sizeof(struct iwl_tfd),
- &dev_cmd->hdr, IWL_HCMD_SCRATCHBUF_SIZE + tb1_len,
- skb->data + hdr_len, tb2_len);
- trace_iwlwifi_dev_tx_data(trans->dev, skb,
- hdr_len, skb->len - hdr_len);
-
wait_write_ptr = ieee80211_has_morefrags(fc);

/* start timer if queue currently empty */
--
2.5.0


2015-12-21 20:52:40

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 41/45] iwlwifi: mvm: Change number of associated stations when station becomes associated

From: Ayala Beker <[email protected]>

Currently, the number of associated stations gets updated when adding
a new station or removing it. This is incorrect as it's possible that
a station was inserted before it was associated
Fix this by increasing/decreasing ap_assoc_sta_count whenever
a station transitions in/out the associated state.

Signed-off-by: Ayala Beker <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 14 ++++++++------
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 5 -----
2 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 53415dc..296b9c5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -2248,7 +2248,6 @@ static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
struct ieee80211_sta *sta)
{
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
- struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);

/*
@@ -2264,11 +2263,6 @@ static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
ERR_PTR(-ENOENT));

- if (mvm_sta->vif->type == NL80211_IFTYPE_AP) {
- mvmvif->ap_assoc_sta_count--;
- iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
- }
-
mutex_unlock(&mvm->mutex);
}

@@ -2380,6 +2374,10 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
ret = 0;
} else if (old_state == IEEE80211_STA_AUTH &&
new_state == IEEE80211_STA_ASSOC) {
+ if (vif->type == NL80211_IFTYPE_AP) {
+ mvmvif->ap_assoc_sta_count++;
+ iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+ }
ret = iwl_mvm_update_sta(mvm, vif, sta);
if (ret == 0)
iwl_mvm_rs_rate_init(mvm, sta,
@@ -2406,6 +2404,10 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
ret = 0;
} else if (old_state == IEEE80211_STA_ASSOC &&
new_state == IEEE80211_STA_AUTH) {
+ if (vif->type == NL80211_IFTYPE_AP) {
+ mvmvif->ap_assoc_sta_count--;
+ iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+ }
ret = 0;
} else if (old_state == IEEE80211_STA_AUTH &&
new_state == IEEE80211_STA_NONE) {
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 2c9675b..b556e33 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -278,11 +278,6 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
if (sta_id == IWL_MVM_STATION_COUNT)
return -ENOSPC;

- if (vif->type == NL80211_IFTYPE_AP) {
- mvmvif->ap_assoc_sta_count++;
- iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
- }
-
spin_lock_init(&mvm_sta->lock);

mvm_sta->sta_id = sta_id;
--
2.5.0


2015-12-21 20:51:21

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 16/45] iwlwifi: mvm: close the SP if we send fewer frames than expected in SP

When we have holes in the BA window, there might be frames
that have been ACKed between the read and the right
pointers. This means that these frames won't be scheduled
again by the SCD and the firwmare won't see them.
This invalidates the number of frames we tell the firmware
to send. When we detect this case, tell mac80211 to close
the SP and to send an EOSP so that the firmware can be in
sync.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 6 +++++-
drivers/net/wireless/intel/iwlwifi/mvm/sta.h | 6 ++++++
drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 30 ++++++++++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 566b659..78ff21a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1664,6 +1664,7 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm,
*/
if (agg) {
int remaining = cnt;
+ int sleep_tx_count;

spin_lock_bh(&mvmsta->lock);
for_each_set_bit(tid, &_tids, IWL_MAX_TID_COUNT) {
@@ -1688,9 +1689,12 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm,
}
remaining -= n_queued;
}
+ sleep_tx_count = cnt - remaining;
+ if (reason == IEEE80211_FRAME_RELEASE_UAPSD)
+ mvmsta->sleep_tx_count = sleep_tx_count;
spin_unlock_bh(&mvmsta->lock);

- cmd.sleep_tx_count = cpu_to_le16(cnt - remaining);
+ cmd.sleep_tx_count = cpu_to_le16(sleep_tx_count);
if (WARN_ON(cnt - remaining == 0)) {
ieee80211_sta_eosp(sta);
return;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
index 0631cc0..ce1b16a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
@@ -303,6 +303,11 @@ static inline u16 iwl_mvm_tid_queued(struct iwl_mvm_tid_data *tid_data)
* @tt_tx_protection: is thermal throttling enable Tx protection?
* @disable_tx: is tx to this STA disabled?
* @agg_tids: bitmap of tids whose status is operational aggregated (IWL_AGG_ON)
+ * @sleep_tx_count: the number of frames that we told the firmware to let out
+ * even when that station is asleep. This is useful in case the queue
+ * gets empty before all the frames were sent, which can happen when
+ * we are sending frames from an AMPDU queue and there was a hole in
+ * the BA window. To be used for UAPSD only.
*
* When mac80211 creates a station it reserves some space (hw->sta_data_size)
* in the structure for use by driver. This structure is placed in that
@@ -329,6 +334,7 @@ struct iwl_mvm_sta {

bool disable_tx;
u8 agg_tids;
+ u8 sleep_tx_count;
};

static inline struct iwl_mvm_sta *
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index aaebb5d..cc0cdce 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -788,13 +788,43 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
if (tid != IWL_TID_NON_QOS) {
struct iwl_mvm_tid_data *tid_data =
&mvmsta->tid_data[tid];
+ bool send_eosp_ndp = false;

spin_lock_bh(&mvmsta->lock);
tid_data->next_reclaimed = next_reclaimed;
IWL_DEBUG_TX_REPLY(mvm, "Next reclaimed packet:%d\n",
next_reclaimed);
iwl_mvm_check_ratid_empty(mvm, sta, tid);
+
+ if (mvmsta->sleep_tx_count) {
+ mvmsta->sleep_tx_count--;
+ if (mvmsta->sleep_tx_count &&
+ !iwl_mvm_tid_queued(tid_data)) {
+ /*
+ * The number of frames in the queue
+ * dropped to 0 even if we sent less
+ * frames than we thought we had on the
+ * Tx queue.
+ * This means we had holes in the BA
+ * window that we just filled, ask
+ * mac80211 to send EOSP since the
+ * firmware won't know how to do that.
+ * Send NDP and the firmware will send
+ * EOSP notification that will trigger
+ * a call to ieee80211_sta_eosp().
+ */
+ send_eosp_ndp = true;
+ }
+ }
+
spin_unlock_bh(&mvmsta->lock);
+ if (send_eosp_ndp) {
+ iwl_mvm_sta_modify_sleep_tx_count(mvm, sta,
+ IEEE80211_FRAME_RELEASE_UAPSD,
+ 1, tid, false, false);
+ mvmsta->sleep_tx_count = 0;
+ ieee80211_send_eosp_nullfunc(sta, tid);
+ }
}

if (mvmsta->next_status_eosp) {
--
2.5.0


2015-12-21 20:50:57

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 03/45] iwlwifi: mvm: set default new STA as non-aggregated

From: Liad Kaufman <[email protected]>

When sending the first ADD_STA HCMD for a STA, the %add_modify
field indicates an addition of a STA and not a modification
of one. In such a case, all fields of the HCMD are used to
initialize the corresponding fields in the FW, regardless of
what bits are set in %modify_mask.

Set the %tid_disable_tx field to mvm_sta->tid_disable_agg in
iwl_mvm_sta_send_to_fw(). If the STA is only updated this will
have no effect, but if it is added - it will make sure the
STA starts with the correct queues - if any - configured as
non-aggregated by default (until told otherwise).

Signed-off-by: Liad Kaufman <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 354acbd..dc3206a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -106,6 +106,7 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
.add_modify = update ? 1 : 0,
.station_flags_msk = cpu_to_le32(STA_FLG_FAT_EN_MSK |
STA_FLG_MIMO_EN_MSK),
+ .tid_disable_tx = cpu_to_le16(mvm_sta->tid_disable_agg),
};
int ret;
u32 status;
@@ -622,6 +623,7 @@ static int iwl_mvm_add_int_sta_common(struct iwl_mvm *mvm,
color));

cmd.tfd_queue_msk = cpu_to_le32(sta->tfd_queue_msk);
+ cmd.tid_disable_tx = cpu_to_le16(0xffff);

if (addr)
memcpy(cmd.addr, addr, ETH_ALEN);
--
2.5.0


2015-12-21 20:50:54

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 01/45] iwlwifi: mvm: don't keep an mvm ref when the interface is down

From: Luca Coelho <[email protected]>

There is no reason to keep a reference when the interface is down,
since we are not really doing anything. The reference is only needed
when the mac80211 start op (or a hw restart) is running, to prevent
going into runtime or system supend in the meantime. This will allow
us to support runtime PM when the interface is down (in another
patch).

Signed-off-by: Luca Coelho <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 22 +++++++++++-----------
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 4 ++--
2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index a90f1ee..518a1d5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -1004,10 +1004,18 @@ int __iwl_mvm_mac_start(struct iwl_mvm *mvm)

lockdep_assert_held(&mvm->mutex);

- /* Clean up some internal and mac80211 state on restart */
- if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
+ if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
+ /* Clean up some internal and mac80211 state on restart */
iwl_mvm_restart_cleanup(mvm);
-
+ } else {
+ /* Hold the reference to prevent runtime suspend while
+ * the start procedure runs. It's a bit confusing
+ * that the UCODE_DOWN reference is taken, but it just
+ * means "UCODE is not UP yet". ( TODO: rename this
+ * reference).
+ */
+ iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
+ }
ret = iwl_mvm_up(mvm);

if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
@@ -1110,14 +1118,6 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
*/
memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats));

- /*
- * Disallow low power states when the FW is down by taking
- * the UCODE_DOWN ref. in case of ongoing hw restart the
- * ref is already taken, so don't take it again.
- */
- if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
- iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
-
/* async_handlers_wk is now blocked */

/*
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 3b0d597f..b71c85b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -607,8 +607,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,

memset(&mvm->rx_stats, 0, sizeof(struct mvm_statistics_rx));

- /* rpm starts with a taken ref. only set the appropriate bit here. */
- mvm->refs[IWL_MVM_REF_UCODE_DOWN] = 1;
+ /* rpm starts with a taken reference, we can release it now */
+ iwl_trans_unref(mvm->trans);

iwl_mvm_tof_init(mvm);

--
2.5.0


2015-12-21 20:51:23

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 17/45] iwlwifi: avoid d0i3 commands when no/init ucode is loaded

From: Eliad Peller <[email protected]>

d0i3 commands are not supported in the init image, so take
a reference to ensure we don't enter d0i3 during init image,
and additional checks to prevent d0i3 commands when no
fw image is loaded.

Add a few WARN_ON_ONCE to the d0i3 enter/exit commands
to ensure we send d0i3 commands only when the normal
ucode is loaded.

Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 8 ++++++++
3 files changed, 10 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
index 7e2a814..9ce7587 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
@@ -1316,6 +1316,7 @@ static ssize_t iwl_dbgfs_d0i3_refs_read(struct file *file,
PRINT_MVM_REF(IWL_MVM_REF_EXIT_WORK);
PRINT_MVM_REF(IWL_MVM_REF_PROTECT_CSA);
PRINT_MVM_REF(IWL_MVM_REF_FW_DBG_COLLECT);
+ PRINT_MVM_REF(IWL_MVM_REF_INIT_UCODE);

return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 612799a..3f0db29 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -294,6 +294,7 @@ enum iwl_mvm_ref_type {
IWL_MVM_REF_EXIT_WORK,
IWL_MVM_REF_PROTECT_CSA,
IWL_MVM_REF_FW_DBG_COLLECT,
+ IWL_MVM_REF_INIT_UCODE,

/* update debugfs.c when changing this */

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 958984c..31c16a1 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -603,9 +603,11 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
goto out_free;

mutex_lock(&mvm->mutex);
+ iwl_mvm_ref(mvm, IWL_MVM_REF_INIT_UCODE);
err = iwl_run_init_mvm_ucode(mvm, true);
if (!err || !iwlmvm_mod_params.init_dbg)
iwl_trans_stop_device(trans);
+ iwl_mvm_unref(mvm, IWL_MVM_REF_INIT_UCODE);
mutex_unlock(&mvm->mutex);
/* returns 0 if successful, 1 if success but in rfkill */
if (err < 0 && !iwlmvm_mod_params.init_dbg) {
@@ -1213,6 +1215,9 @@ int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode)

IWL_DEBUG_RPM(mvm, "MVM entering D0i3\n");

+ if (WARN_ON_ONCE(mvm->cur_ucode != IWL_UCODE_REGULAR))
+ return -EINVAL;
+
set_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);

/*
@@ -1420,6 +1425,9 @@ int _iwl_mvm_exit_d0i3(struct iwl_mvm *mvm)

IWL_DEBUG_RPM(mvm, "MVM exiting D0i3\n");

+ if (WARN_ON_ONCE(mvm->cur_ucode != IWL_UCODE_REGULAR))
+ return -EINVAL;
+
mutex_lock(&mvm->d0i3_suspend_mutex);
if (test_bit(D0I3_DEFER_WAKEUP, &mvm->d0i3_suspend_flags)) {
IWL_DEBUG_RPM(mvm, "Deferring d0i3 exit until resume\n");
--
2.5.0


2015-12-21 20:52:25

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 33/45] iwlwifi: mvm: small update in the firmware API

Small change in firmware API, no functional change.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
index af7f9dd..75c79e1 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
@@ -79,6 +79,11 @@
#define IWL_RX_INFO_ENERGY_ANT_B_POS 8
#define IWL_RX_INFO_ENERGY_ANT_C_POS 16

+enum iwl_mac_context_info {
+ MAC_CONTEXT_INFO_NONE,
+ MAC_CONTEXT_INFO_GSCAN,
+};
+
/**
* struct iwl_rx_phy_info - phy info
* (REPLY_RX_PHY_CMD = 0xc0)
@@ -97,6 +102,8 @@
* @frame_time: frame's time on the air, based on byte count and frame rate
* calculation
* @mac_active_msk: what MACs were active when the frame was received
+ * @mac_context_info: additional info on the context in which the frame was
+ * received as defined in &enum iwl_mac_context_info
*
* Before each Rx, the device sends this data. It contains PHY information
* about the reception of the packet.
@@ -114,7 +121,8 @@ struct iwl_rx_phy_info {
__le32 non_cfg_phy[IWL_RX_INFO_PHY_CNT];
__le32 rate_n_flags;
__le32 byte_count;
- __le16 mac_active_msk;
+ u8 mac_active_msk;
+ u8 mac_context_info;
__le16 frame_time;
} __packed;

--
2.5.0


2015-12-21 20:52:44

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 43/45] iwlwifi: remove unused parameter from grab_nic_access

All the callers used silent = false.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/main.c | 4 ++--
drivers/net/wireless/intel/iwlwifi/dvm/tt.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-io.c | 14 ++++++-------
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 +++----
drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c | 4 ++--
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 27 +++++++++++--------------
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 2 +-
7 files changed, 28 insertions(+), 32 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index 94bc66a..f62c2d7 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -429,7 +429,7 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32));

/* Make sure device is powered up for SRAM reads */
- if (!iwl_trans_grab_nic_access(priv->trans, false, &reg_flags))
+ if (!iwl_trans_grab_nic_access(priv->trans, &reg_flags))
return;

/* Set starting address; reads will auto-increment */
@@ -1731,7 +1731,7 @@ static int iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
ptr = base + EVENT_START_OFFSET + (start_idx * event_size);

/* Make sure device is powered up for SRAM reads */
- if (!iwl_trans_grab_nic_access(trans, false, &reg_flags))
+ if (!iwl_trans_grab_nic_access(trans, &reg_flags))
return pos;

/* Set starting address; reads will auto-increment */
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tt.c b/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
index 7decfc5..5b73492 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
@@ -184,7 +184,7 @@ static void iwl_tt_check_exit_ct_kill(unsigned long data)
priv->thermal_throttle.ct_kill_toggle = true;
}
iwl_read32(priv->trans, CSR_UCODE_DRV_GP1);
- if (iwl_trans_grab_nic_access(priv->trans, false, &flags))
+ if (iwl_trans_grab_nic_access(priv->trans, &flags))
iwl_trans_release_nic_access(priv->trans, &flags);

/* Reschedule the ct_kill timer to occur in
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-io.c b/drivers/net/wireless/intel/iwlwifi/iwl-io.c
index 07ad5c8..32c8f84 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-io.c
@@ -82,7 +82,7 @@ u32 iwl_read_direct32(struct iwl_trans *trans, u32 reg)
{
u32 value = 0x5a5a5a5a;
unsigned long flags;
- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
value = iwl_read32(trans, reg);
iwl_trans_release_nic_access(trans, &flags);
}
@@ -95,7 +95,7 @@ void iwl_write_direct32(struct iwl_trans *trans, u32 reg, u32 value)
{
unsigned long flags;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write32(trans, reg, value);
iwl_trans_release_nic_access(trans, &flags);
}
@@ -138,7 +138,7 @@ u32 iwl_read_prph(struct iwl_trans *trans, u32 ofs)
unsigned long flags;
u32 val = 0x5a5a5a5a;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
val = iwl_read_prph_no_grab(trans, ofs);
iwl_trans_release_nic_access(trans, &flags);
}
@@ -150,7 +150,7 @@ void iwl_write_prph(struct iwl_trans *trans, u32 ofs, u32 val)
{
unsigned long flags;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write_prph_no_grab(trans, ofs, val);
iwl_trans_release_nic_access(trans, &flags);
}
@@ -176,7 +176,7 @@ void iwl_set_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
{
unsigned long flags;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write_prph_no_grab(trans, ofs,
iwl_read_prph_no_grab(trans, ofs) |
mask);
@@ -190,7 +190,7 @@ void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
{
unsigned long flags;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write_prph_no_grab(trans, ofs,
(iwl_read_prph_no_grab(trans, ofs) &
mask) | bits);
@@ -204,7 +204,7 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
unsigned long flags;
u32 val;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
val = iwl_read_prph_no_grab(trans, ofs);
iwl_write_prph_no_grab(trans, ofs, (val & ~mask));
iwl_trans_release_nic_access(trans, &flags);
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 43a4874..290d538 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -652,8 +652,7 @@ struct iwl_trans_ops {
void (*configure)(struct iwl_trans *trans,
const struct iwl_trans_config *trans_cfg);
void (*set_pmi)(struct iwl_trans *trans, bool state);
- bool (*grab_nic_access)(struct iwl_trans *trans, bool silent,
- unsigned long *flags);
+ bool (*grab_nic_access)(struct iwl_trans *trans, unsigned long *flags);
void (*release_nic_access)(struct iwl_trans *trans,
unsigned long *flags);
void (*set_bits_mask)(struct iwl_trans *trans, u32 reg, u32 mask,
@@ -1170,9 +1169,9 @@ iwl_trans_set_bits_mask(struct iwl_trans *trans, u32 reg, u32 mask, u32 value)
trans->ops->set_bits_mask(trans, reg, mask, value);
}

-#define iwl_trans_grab_nic_access(trans, silent, flags) \
+#define iwl_trans_grab_nic_access(trans, flags) \
__cond_lock(nic_access, \
- likely((trans)->ops->grab_nic_access(trans, silent, flags)))
+ likely((trans)->ops->grab_nic_access(trans, flags)))

static inline void __releases(nic_access)
iwl_trans_release_nic_access(struct iwl_trans *trans, unsigned long *flags)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
index 29d54ec..f406c76 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
@@ -122,7 +122,7 @@ static void iwl_mvm_dump_fifos(struct iwl_mvm *mvm,
unsigned long flags;
int i, j;

- if (!iwl_trans_grab_nic_access(mvm->trans, false, &flags))
+ if (!iwl_trans_grab_nic_access(mvm->trans, &flags))
return;

/* Pull RXF data from all RXFs */
@@ -359,7 +359,7 @@ static u32 iwl_dump_prph(struct iwl_trans *trans,
unsigned long flags;
u32 prph_len = 0, i;

- if (!iwl_trans_grab_nic_access(trans, false, &flags))
+ if (!iwl_trans_grab_nic_access(trans, &flags))
return 0;

for (i = 0; i < ARRAY_SIZE(iwl_prph_dump_addr); i++) {
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index e804190..d44e7af 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1505,8 +1505,8 @@ static void iwl_trans_pcie_set_pmi(struct iwl_trans *trans, bool state)
clear_bit(STATUS_TPOWER_PMI, &trans->status);
}

-static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent,
- unsigned long *flags)
+static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans,
+ unsigned long *flags)
{
int ret;
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
@@ -1547,14 +1547,11 @@ static bool iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent,
CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP), 15000);
if (unlikely(ret < 0)) {
iwl_write32(trans, CSR_RESET, CSR_RESET_REG_FLAG_FORCE_NMI);
- if (!silent) {
- u32 val = iwl_read32(trans, CSR_GP_CNTRL);
- WARN_ONCE(1,
- "Timeout waiting for hardware access (CSR_GP_CNTRL 0x%08x)\n",
- val);
- spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags);
- return false;
- }
+ WARN_ONCE(1,
+ "Timeout waiting for hardware access (CSR_GP_CNTRL 0x%08x)\n",
+ iwl_read32(trans, CSR_GP_CNTRL));
+ spin_unlock_irqrestore(&trans_pcie->reg_lock, *flags);
+ return false;
}

out:
@@ -1602,7 +1599,7 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
int offs, ret = 0;
u32 *vals = buf;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write32(trans, HBUS_TARG_MEM_RADDR, addr);
for (offs = 0; offs < dwords; offs++)
vals[offs] = iwl_read32(trans, HBUS_TARG_MEM_RDAT);
@@ -1620,7 +1617,7 @@ static int iwl_trans_pcie_write_mem(struct iwl_trans *trans, u32 addr,
int offs, ret = 0;
const u32 *vals = buf;

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
iwl_write32(trans, HBUS_TARG_MEM_WADDR, addr);
for (offs = 0; offs < dwords; offs++)
iwl_write32(trans, HBUS_TARG_MEM_WDAT,
@@ -2246,7 +2243,7 @@ static u32 iwl_trans_pcie_fh_regs_dump(struct iwl_trans *trans,
__le32 *val;
int i;

- if (!iwl_trans_grab_nic_access(trans, false, &flags))
+ if (!iwl_trans_grab_nic_access(trans, &flags))
return 0;

(*data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_FH_REGS);
@@ -2273,7 +2270,7 @@ iwl_trans_pci_dump_marbh_monitor(struct iwl_trans *trans,
unsigned long flags;
u32 i;

- if (!iwl_trans_grab_nic_access(trans, false, &flags))
+ if (!iwl_trans_grab_nic_access(trans, &flags))
return 0;

iwl_write_prph_no_grab(trans, MON_DMARB_RD_CTL_ADDR, 0x1);
@@ -2658,7 +2655,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
goto out_pci_disable_msi;
}

- if (iwl_trans_grab_nic_access(trans, false, &flags)) {
+ if (iwl_trans_grab_nic_access(trans, &flags)) {
u32 hw_step;

hw_step = iwl_read_prph_no_grab(trans, WFPM_CTRL_REG);
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index a85ae10..5262028 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -770,7 +770,7 @@ static void iwl_pcie_tx_stop_fh(struct iwl_trans *trans)

spin_lock(&trans_pcie->irq_lock);

- if (!iwl_trans_grab_nic_access(trans, false, &flags))
+ if (!iwl_trans_grab_nic_access(trans, &flags))
goto out;

/* Stop each Tx DMA channel */
--
2.5.0


2015-12-21 20:51:02

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 05/45] iwlwifi: mvm: rs: fix a potential out of bounds access

From: Eyal Shapira <[email protected]>

Klocwork pointed these out. There is a theoretical possibility
that rate->index might be set to IWL_RATE_INVALID (15).
This could trigger an out of bounds access on ht_vht_rates or
legacy_rates arrays. Fix it by adding some checks.

Signed-off-by: Eyal Shapira <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
index feb775a..31b082e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
@@ -552,9 +552,10 @@ static char *rs_pretty_rate(const struct rs_rate *rate)
};
const char *rate_str;

- if (is_type_legacy(rate->type))
+ if (is_type_legacy(rate->type) && (rate->index <= IWL_RATE_54M_INDEX))
rate_str = legacy_rates[rate->index];
- else if (is_type_ht(rate->type) || is_type_vht(rate->type))
+ else if ((is_type_ht(rate->type) || is_type_vht(rate->type)) &&
+ (rate->index <= IWL_RATE_MCS_9_INDEX))
rate_str = ht_vht_rates[rate->index];
else
rate_str = "BAD_RATE";
--
2.5.0


2015-12-23 04:08:38

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH 44/45] iwlwifi: fix printf specifier

On Mon, 2015-12-21 at 22:50 +0200, Emmanuel Grumbach wrote:
> Smatch warned about a bad specifier being used. Fix that.

I see nothing here other than a signed/unsigned
issue that shouldn't need fixing. ?The conversion
from hex to decimal may not be useful.

> Signed-off-by: Emmanuel Grumbach <[email protected]>
> ---
> ?drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c | 4 ++--
> ?1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
> index b395854..c15f5be 100644
> --- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
> +++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
> @@ -454,11 +454,11 @@ static void iwl_eeprom_enhanced_txpower(struct device *dev,
> ? ?TXP_CHECK_AND_PRINT(COMMON_TYPE),
> ? ?txp->flags);
> ? IWL_DEBUG_EEPROM(dev,
> - ?"\t\t chain_A: 0x%02x chain_B: 0X%02x chain_C: 0X%02x\n",
> + ?"\t\t chain_A: %d chain_B: %d chain_C: %d\n",
> ? ?txp->chain_a_max, txp->chain_b_max,
> ? ?txp->chain_c_max);
> ? IWL_DEBUG_EEPROM(dev,
> - ?"\t\t MIMO2: 0x%02x MIMO3: 0x%02x High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
> + ?"\t\t MIMO2: %d MIMO3: %d High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
> ? ?txp->mimo2_max, txp->mimo3_max,
> ? ?((txp->delta_20_in_40 & 0xf0) >> 4),
> ? ?(txp->delta_20_in_40 & 0x0f));


2015-12-21 20:52:36

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 39/45] iwlwifi: mvm: dump more registers upon error

These registers can help to debug PHY issues. Since this
adds a significant amount of work to the debug collection
phase, dump the periphery registers only if the firmware
is stopped.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c | 29 ++++++++++++++-----------
1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
index a6985da..29d54ec 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
@@ -349,6 +349,7 @@ static const struct {
{ .start = 0x00a04560, .end = 0x00a0457c },
{ .start = 0x00a04590, .end = 0x00a04598 },
{ .start = 0x00a045c0, .end = 0x00a045f4 },
+ { .start = 0x00a44000, .end = 0x00a7bf80 },
};

static u32 iwl_dump_prph(struct iwl_trans *trans,
@@ -400,7 +401,7 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
struct iwl_fw_error_dump_trigger_desc *dump_trig;
struct iwl_mvm_dump_ptrs *fw_error_dump;
u32 sram_len, sram_ofs;
- u32 file_len, fifo_data_len = 0;
+ u32 file_len, fifo_data_len = 0, prph_len = 0;
u32 smem_len = mvm->cfg->smem_len;
u32 sram2_len = mvm->cfg->dccm2_len;
bool monitor_dump_only = false;
@@ -460,12 +461,24 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
sizeof(*dump_data) +
sizeof(struct iwl_fw_error_dump_fifo);
}
+
+ /* Make room for PRPH registers */
+ for (i = 0; i < ARRAY_SIZE(iwl_prph_dump_addr); i++) {
+ /* The range includes both boundaries */
+ int num_bytes_in_chunk = iwl_prph_dump_addr[i].end -
+ iwl_prph_dump_addr[i].start + 4;
+
+ prph_len += sizeof(*dump_data) +
+ sizeof(struct iwl_fw_error_dump_prph) +
+ num_bytes_in_chunk;
+ }
}

file_len = sizeof(*dump_file) +
sizeof(*dump_data) * 2 +
sram_len + sizeof(*dump_mem) +
fifo_data_len +
+ prph_len +
sizeof(*dump_info);

/* Make room for the SMEM, if it exists */
@@ -489,17 +502,6 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
sizeof(*dump_info);
}

- /* Make room for PRPH registers */
- for (i = 0; i < ARRAY_SIZE(iwl_prph_dump_addr); i++) {
- /* The range includes both boundaries */
- int num_bytes_in_chunk = iwl_prph_dump_addr[i].end -
- iwl_prph_dump_addr[i].start + 4;
-
- file_len += sizeof(*dump_data) +
- sizeof(struct iwl_fw_error_dump_prph) +
- num_bytes_in_chunk;
- }
-
/*
* In 8000 HW family B-step include the ICCM (which resides separately)
*/
@@ -625,7 +627,8 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
}

dump_data = iwl_fw_error_next_data(dump_data);
- iwl_dump_prph(mvm->trans, &dump_data);
+ if (prph_len)
+ iwl_dump_prph(mvm->trans, &dump_data);

dump_trans_data:
fw_error_dump->trans_ptr = iwl_trans_dump_data(mvm->trans,
--
2.5.0


2015-12-21 20:51:14

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 12/45] iwlwifi: trans: support a callback for ASYNC commands

This allows the op_mode to request from the transport to
call a callback when an ASYNC commands is completed by
the firmware. The same callback will be called for all the
commands. Pass the command whose response triggers the
callback as a parameter to the callback itself.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h | 11 +++++++++++
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 7 +++++++
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 7 +++----
3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h b/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
index 2a58d68..ffff31c 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
@@ -123,6 +123,8 @@ struct iwl_cfg;
* received on the RSS queue(s). The queue parameter indicates which of the
* RSS queues received this frame; it will always be non-zero.
* This method must not sleep.
+ * @async_cb: called when an ASYNC command with CMD_WANT_ASYNC_CALLBACK set
+ * completes. Must be atomic.
* @queue_full: notifies that a HW queue is full.
* Must be atomic and called with BH disabled.
* @queue_not_full: notifies that a HW queue is not full any more.
@@ -155,6 +157,8 @@ struct iwl_op_mode_ops {
struct iwl_rx_cmd_buffer *rxb);
void (*rx_rss)(struct iwl_op_mode *op_mode, struct napi_struct *napi,
struct iwl_rx_cmd_buffer *rxb, unsigned int queue);
+ void (*async_cb)(struct iwl_op_mode *op_mode,
+ const struct iwl_device_cmd *cmd);
void (*queue_full)(struct iwl_op_mode *op_mode, int queue);
void (*queue_not_full)(struct iwl_op_mode *op_mode, int queue);
bool (*hw_rf_kill)(struct iwl_op_mode *op_mode, bool state);
@@ -203,6 +207,13 @@ static inline void iwl_op_mode_rx_rss(struct iwl_op_mode *op_mode,
op_mode->ops->rx_rss(op_mode, napi, rxb, queue);
}

+static inline void iwl_op_mode_async_cb(struct iwl_op_mode *op_mode,
+ const struct iwl_device_cmd *cmd)
+{
+ if (op_mode->ops->async_cb)
+ op_mode->ops->async_cb(op_mode, cmd);
+}
+
static inline void iwl_op_mode_queue_full(struct iwl_op_mode *op_mode,
int queue)
{
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 0cd69cd..77ae7fa 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -248,6 +248,8 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
* @CMD_MAKE_TRANS_IDLE: The command response should mark the trans as idle.
* @CMD_WAKE_UP_TRANS: The command response should wake up the trans
* (i.e. mark it as non-idle).
+ * @CMD_WANT_ASYNC_CALLBACK: the op_mode's async callback function must be
+ * called after this command completes. Valid only with CMD_ASYNC.
* @CMD_TB_BITMAP_POS: Position of the first bit for the TB bitmap. We need to
* check that we leave enough room for the TBs bitmap which needs 20 bits.
*/
@@ -259,6 +261,7 @@ enum CMD_MODE {
CMD_SEND_IN_IDLE = BIT(4),
CMD_MAKE_TRANS_IDLE = BIT(5),
CMD_WAKE_UP_TRANS = BIT(6),
+ CMD_WANT_ASYNC_CALLBACK = BIT(7),

CMD_TB_BITMAP_POS = 11,
};
@@ -903,6 +906,10 @@ static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
return -EIO;
}

+ if (WARN_ON((cmd->flags & CMD_WANT_ASYNC_CALLBACK) &&
+ !(cmd->flags & CMD_ASYNC)))
+ return -EINVAL;
+
if (!(cmd->flags & CMD_ASYNC))
lock_map_acquire_read(&trans->sync_cmd_lockdep_map);

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 95ba920..fe8241f 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -1593,10 +1593,6 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
/*
* iwl_pcie_hcmd_complete - Pull unused buffers off the queue and reclaim them
* @rxb: Rx buffer to reclaim
- *
- * If an Rx buffer has an async callback associated with it the callback
- * will be executed. The attached skb (if present) will only be freed
- * if the callback returns 1
*/
void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
struct iwl_rx_cmd_buffer *rxb)
@@ -1640,6 +1636,9 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
meta->source->_rx_page_order = trans_pcie->rx_page_order;
}

+ if (meta->flags & CMD_WANT_ASYNC_CALLBACK)
+ iwl_op_mode_async_cb(trans->op_mode, cmd);
+
iwl_pcie_cmdq_reclaim(trans, txq_id, index);

if (!(meta->flags & CMD_ASYNC)) {
--
2.5.0


2015-12-21 20:52:18

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 29/45] iwlwifi: 9000: increase the number of queues

9000 family devices have 31 queues.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-9000.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-9000.c b/drivers/net/wireless/intel/iwlwifi/iwl-9000.c
index a784bb6..0d2aa1d 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-9000.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-9000.c
@@ -83,7 +83,7 @@

static const struct iwl_base_params iwl9000_base_params = {
.eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_9000,
- .num_of_queues = IWLAGN_NUM_QUEUES,
+ .num_of_queues = 31,
.pll_cfg_val = 0,
.shadow_ram_support = true,
.led_compensation = 57,
--
2.5.0


2015-12-21 20:51:11

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 10/45] iwlwifi: mvm: check iwl_mvm_wowlan_config_key_params() return value

From: Eliad Peller <[email protected]>

commit 9a4c830007817e ("iwlwifi: mvm: refactor d3 key
update functions") refactored some code into
iwl_mvm_wowlan_config_key_params() function, but the
return value was never checked, and not all the function
flows returned valid values. fix it.

Fixes: ac8ef0ce38de ("iwlwifi: mvm: refactor d3 key update functions")
Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 9e51843..542de74 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -917,6 +917,7 @@ int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
if (ret)
goto out;
}
+ ret = 0;
out:
kfree(key_data.rsc_tsc);
return ret;
@@ -946,8 +947,11 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
* that isn't really a problem though.
*/
mutex_unlock(&mvm->mutex);
- iwl_mvm_wowlan_config_key_params(mvm, vif, true, CMD_ASYNC);
+ ret = iwl_mvm_wowlan_config_key_params(mvm, vif, true,
+ CMD_ASYNC);
mutex_lock(&mvm->mutex);
+ if (ret)
+ return ret;
}

ret = iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, 0,
--
2.5.0


2015-12-21 20:51:07

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 08/45] iwlwifi: mvm: remove an extra tab

From: Dan Carpenter <[email protected]>

Smatch prints a static checker warning here:

drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c:386 iwl_dump_prph()
warn: curly braces intended?

Curly braces are NOT intended, the extra tab was added by mistake in
commit 1a616dd2f171 ('iwlwifi: dump prph registers in a common place
for all transports').

type=cleanup

Signed-off-by: Dan Carpenter <[email protected]>
Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
index 9fcabc5..a6985da 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-dbg.c
@@ -383,7 +383,7 @@ static u32 iwl_dump_prph(struct iwl_trans *trans,
*val++ = cpu_to_le32(iwl_read_prph_no_grab(trans,
reg));

- *data = iwl_fw_error_next_data(*data);
+ *data = iwl_fw_error_next_data(*data);
}

iwl_trans_release_nic_access(trans, &flags);
--
2.5.0


2015-12-21 20:51:25

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 18/45] iwlwifi: mvm: remove the vif parameter of iwl_mvm_configure_bcast_filter()

From: Eliad Peller <[email protected]>

Remove the vif parameter of iwl_mvm_configure_bcast_filter()
as it's not being used.

Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index f428f1c..7487eb0 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -1734,8 +1734,8 @@ bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,

return true;
}
-static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
- struct ieee80211_vif *vif)
+
+static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
{
struct iwl_bcast_filter_cmd cmd;

@@ -1749,8 +1749,7 @@ static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
sizeof(cmd), &cmd);
}
#else
-static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
- struct ieee80211_vif *vif)
+static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm)
{
return 0;
}
@@ -1865,7 +1864,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
}

iwl_mvm_recalc_multicast(mvm);
- iwl_mvm_configure_bcast_filter(mvm, vif);
+ iwl_mvm_configure_bcast_filter(mvm);

/* reset rssi values */
mvmvif->bf_data.ave_beacon_signal = 0;
@@ -1916,7 +1915,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,

if (changes & BSS_CHANGED_ARP_FILTER) {
IWL_DEBUG_MAC80211(mvm, "arp filter changed\n");
- iwl_mvm_configure_bcast_filter(mvm, vif);
+ iwl_mvm_configure_bcast_filter(mvm);
}
}

--
2.5.0


2015-12-21 20:52:33

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 37/45] iwlwifi: mvm: add 9000 series RX processing

From: Johannes Berg <[email protected]>

Convert the convert the new infrastructure added by previous
patches to actually use the new RX descriptor layout.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/Makefile | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h | 6 +
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 +
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 6 +-
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 372 +++++++++++++++++++++
5 files changed, 385 insertions(+), 4 deletions(-)
create mode 100644 drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
index 2c0d20f..80c2f88 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
@@ -1,6 +1,6 @@
obj-$(CONFIG_IWLMVM) += iwlmvm.o
iwlmvm-y += fw.o mac80211.o nvm.o ops.o phy-ctxt.o mac-ctxt.o
-iwlmvm-y += utils.o rx.o tx.o binding.o quota.o sta.o sf.o
+iwlmvm-y += utils.o rx.o rxmq.o tx.o binding.o quota.o sta.o sf.o
iwlmvm-y += scan.o time-event.o rs.o
iwlmvm-y += power.o coex.o coex_legacy.o
iwlmvm-y += tt.o offloading.o tdls.o
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
index 75c79e1..0a8d162 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
@@ -287,11 +287,17 @@ enum iwl_rx_mpdu_status {
IWL_RX_MPDU_STATUS_KEY_ERROR = BIT(4),
IWL_RX_MPDU_STATUS_ICV_OK = BIT(5),
IWL_RX_MPDU_STATUS_MIC_OK = BIT(6),
+ /* TODO - verify this is the correct value */
+ IWL_RX_MPDU_RES_STATUS_TTAK_OK = BIT(7),
IWL_RX_MPDU_STATUS_SEC_MASK = 0x7 << 8,
IWL_RX_MPDU_STATUS_SEC_NONE = 0x0 << 8,
IWL_RX_MPDU_STATUS_SEC_WEP = 0x1 << 8,
IWL_RX_MPDU_STATUS_SEC_CCM = 0x2 << 8,
IWL_RX_MPDU_STATUS_SEC_TKIP = 0x3 << 8,
+ /* TODO - define IWL_RX_MPDU_STATUS_SEC_EXT_ENC - this is a stub */
+ IWL_RX_MPDU_STATUS_SEC_EXT_ENC = 0x4 << 8,
+ /* TODO - define IWL_RX_MPDU_STATUS_SEC_GCM - this is a stub */
+ IWL_RX_MPDU_STATUS_SEC_GCM = 0x5 << 8,
IWL_RX_MPDU_STATUS_DECRYPTED = BIT(11),
IWL_RX_MPDU_STATUS_WEP_MATCH = BIT(12),
IWL_RX_MPDU_STATUS_EXT_IV_MATCH = BIT(13),
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index df68973..0088106 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -1135,6 +1135,9 @@ bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
struct iwl_rx_cmd_buffer *rxb);
+void iwl_mvm_rx_phy_cmd_mq(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
+void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
+ struct iwl_rx_cmd_buffer *rxb, int queue);
void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index a5e1c8e..0885b77 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -836,9 +836,9 @@ static void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);

if (likely(pkt->hdr.cmd == REPLY_RX_MPDU_CMD))
- iwl_mvm_rx_rx_mpdu(mvm, napi, rxb);
+ iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, 0);
else if (pkt->hdr.cmd == REPLY_RX_PHY_CMD)
- iwl_mvm_rx_rx_phy_cmd(mvm, rxb);
+ iwl_mvm_rx_phy_cmd_mq(mvm, rxb);
else
iwl_mvm_rx_common(mvm, rxb, pkt);
}
@@ -1489,7 +1489,7 @@ static void iwl_mvm_rx_mq_rss(struct iwl_op_mode *op_mode,
{
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);

- iwl_mvm_rx_rx_mpdu(mvm, napi, rxb);
+ iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue);
}

static const struct iwl_op_mode_ops iwl_mvm_ops_mq = {
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
new file mode 100644
index 0000000..c67962e
--- /dev/null
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -0,0 +1,372 @@
+/******************************************************************************
+ *
+ * This file is provided under a dual BSD/GPLv2 license. When using or
+ * redistributing this file, you may do so under either license.
+ *
+ * GPL LICENSE SUMMARY
+ *
+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2015 Intel Deutschland GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * The full GNU General Public License is included in this distribution
+ * in the file called COPYING.
+ *
+ * Contact Information:
+ * Intel Linux Wireless <[email protected]>
+ * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+ *
+ * BSD LICENSE
+ *
+ * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
+ * Copyright(c) 2015 Intel Deutschland GmbH
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+#include "iwl-trans.h"
+#include "mvm.h"
+#include "fw-api.h"
+#include "fw-dbg.h"
+
+void iwl_mvm_rx_phy_cmd_mq(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
+{
+ mvm->ampdu_ref++;
+
+#ifdef CONFIG_IWLWIFI_DEBUGFS
+ if (mvm->last_phy_info.phy_flags & cpu_to_le16(RX_RES_PHY_FLAGS_AGG)) {
+ spin_lock(&mvm->drv_stats_lock);
+ mvm->drv_rx_stats.ampdu_count++;
+ spin_unlock(&mvm->drv_stats_lock);
+ }
+#endif
+}
+
+static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
+ struct napi_struct *napi,
+ struct sk_buff *skb,
+ struct ieee80211_hdr *hdr, u16 len,
+ u32 ampdu_status, u8 crypt_len,
+ struct iwl_rx_cmd_buffer *rxb)
+{
+ unsigned int hdrlen, fraglen;
+
+ /* If frame is small enough to fit in skb->head, pull it completely.
+ * If not, only pull ieee80211_hdr (including crypto if present, and
+ * an additional 8 bytes for SNAP/ethertype, see below) so that
+ * splice() or TCP coalesce are more efficient.
+ *
+ * Since, in addition, ieee80211_data_to_8023() always pull in at
+ * least 8 bytes (possibly more for mesh) we can do the same here
+ * to save the cost of doing it later. That still doesn't pull in
+ * the actual IP header since the typical case has a SNAP header.
+ * If the latter changes (there are efforts in the standards group
+ * to do so) we should revisit this and ieee80211_data_to_8023().
+ */
+ hdrlen = (len <= skb_tailroom(skb)) ? len :
+ sizeof(*hdr) + crypt_len + 8;
+
+ memcpy(skb_put(skb, hdrlen), hdr, hdrlen);
+ fraglen = len - hdrlen;
+
+ if (fraglen) {
+ int offset = (void *)hdr + hdrlen -
+ rxb_addr(rxb) + rxb_offset(rxb);
+
+ skb_add_rx_frag(skb, 0, rxb_steal_page(rxb), offset,
+ fraglen, rxb->truesize);
+ }
+
+ ieee80211_rx_napi(mvm->hw, skb, napi);
+}
+
+static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
+ struct iwl_rx_mpdu_desc *desc,
+ struct ieee80211_rx_status *rx_status)
+{
+ int energy_a, energy_b, energy_c, max_energy;
+
+ energy_a = desc->energy_a;
+ energy_a = energy_a ? -energy_a : S8_MIN;
+ energy_b = desc->energy_b;
+ energy_b = energy_b ? -energy_b : S8_MIN;
+ energy_c = desc->energy_c;
+ energy_c = energy_c ? -energy_c : S8_MIN;
+ max_energy = max(energy_a, energy_b);
+ max_energy = max(max_energy, energy_c);
+
+ IWL_DEBUG_STATS(mvm, "energy In A %d B %d C %d , and max %d\n",
+ energy_a, energy_b, energy_c, max_energy);
+
+ rx_status->signal = max_energy;
+ rx_status->chains = 0; /* TODO: phy info */
+ rx_status->chain_signal[0] = energy_a;
+ rx_status->chain_signal[1] = energy_b;
+ rx_status->chain_signal[2] = energy_c;
+}
+
+static u32 iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
+ struct ieee80211_rx_status *stats,
+ struct iwl_rx_mpdu_desc *desc, int queue,
+ u8 *crypt_len)
+{
+ u16 status = le16_to_cpu(desc->status);
+
+ if (!ieee80211_has_protected(hdr->frame_control) ||
+ (status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
+ IWL_RX_MPDU_STATUS_SEC_NONE)
+ return 0;
+
+ /* TODO: handle packets encrypted with unknown alg */
+
+ switch (status & IWL_RX_MPDU_STATUS_SEC_MASK) {
+ case IWL_RX_MPDU_STATUS_SEC_CCM:
+ case IWL_RX_MPDU_STATUS_SEC_GCM:
+ /* alg is CCM: check MIC only */
+ if (!(status & IWL_RX_MPDU_STATUS_MIC_OK))
+ return -1;
+
+ stats->flag |= RX_FLAG_DECRYPTED;
+ *crypt_len = IEEE80211_CCMP_HDR_LEN;
+ return 0;
+ case IWL_RX_MPDU_STATUS_SEC_TKIP:
+ /* Don't drop the frame and decrypt it in SW */
+ if (!(status & IWL_RX_MPDU_RES_STATUS_TTAK_OK))
+ return 0;
+
+ *crypt_len = IEEE80211_TKIP_IV_LEN;
+ /* fall through if TTAK OK */
+ case IWL_RX_MPDU_STATUS_SEC_WEP:
+ if (!(status & IWL_RX_MPDU_STATUS_ICV_OK))
+ return -1;
+
+ stats->flag |= RX_FLAG_DECRYPTED;
+ if ((status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
+ IWL_RX_MPDU_STATUS_SEC_WEP)
+ *crypt_len = IEEE80211_WEP_IV_LEN;
+ return 0;
+ case IWL_RX_MPDU_STATUS_SEC_EXT_ENC:
+ if (!(status & IWL_RX_MPDU_STATUS_MIC_OK))
+ return -1;
+ stats->flag |= RX_FLAG_DECRYPTED;
+ return 0;
+ default:
+ IWL_ERR(mvm, "Unhandled alg: 0x%x\n", status);
+ }
+
+ return 0;
+}
+
+static void iwl_mvm_rx_csum(struct ieee80211_sta *sta,
+ struct sk_buff *skb,
+ struct iwl_rx_mpdu_desc *desc)
+{
+ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
+ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif);
+
+ if (mvmvif->features & NETIF_F_RXCSUM &&
+ desc->l3l4_flags & cpu_to_le16(IWL_RX_L3L4_IP_HDR_CSUM_OK) &&
+ desc->l3l4_flags & cpu_to_le16(IWL_RX_L3L4_TCP_UDP_CSUM_OK))
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+}
+
+void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
+ struct iwl_rx_cmd_buffer *rxb, int queue)
+{
+ struct ieee80211_rx_status *rx_status;
+ struct iwl_rx_packet *pkt = rxb_addr(rxb);
+ struct iwl_rx_mpdu_desc *desc = (void *)pkt->data;
+ struct ieee80211_hdr *hdr = (void *)(desc + 1);
+ u32 len = le16_to_cpu(desc->mpdu_len);
+ u32 rate_n_flags = le32_to_cpu(desc->rate_n_flags);
+ struct ieee80211_sta *sta = NULL;
+ struct sk_buff *skb;
+ u32 ampdu_status;
+ u8 crypt_len = 0;
+
+ /* Dont use dev_alloc_skb(), we'll have enough headroom once
+ * ieee80211_hdr pulled.
+ */
+ skb = alloc_skb(128, GFP_ATOMIC);
+ if (!skb) {
+ IWL_ERR(mvm, "alloc_skb failed\n");
+ return;
+ }
+
+ rx_status = IEEE80211_SKB_RXCB(skb);
+
+ if (iwl_mvm_rx_crypto(mvm, hdr, rx_status, desc, queue, &crypt_len)) {
+ kfree_skb(skb);
+ return;
+ }
+
+ /*
+ * Keep packets with CRC errors (and with overrun) for monitor mode
+ * (otherwise the firmware discards them) but mark them as bad.
+ */
+ if (!(desc->status & cpu_to_le16(IWL_RX_MPDU_STATUS_CRC_OK)) ||
+ !(desc->status & cpu_to_le16(IWL_RX_MPDU_STATUS_OVERRUN_OK))) {
+ IWL_DEBUG_RX(mvm, "Bad CRC or FIFO: 0x%08X.\n",
+ le16_to_cpu(desc->status));
+ rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
+ }
+
+ rx_status->mactime = le64_to_cpu(desc->tsf_on_air_rise);
+ rx_status->device_timestamp = le32_to_cpu(desc->gp2_on_air_rise);
+ rx_status->band = desc->channel > 14 ? IEEE80211_BAND_5GHZ :
+ IEEE80211_BAND_2GHZ;
+ rx_status->freq = ieee80211_channel_to_frequency(desc->channel,
+ rx_status->band);
+ iwl_mvm_get_signal_strength(mvm, desc, rx_status);
+
+ rcu_read_lock();
+
+ if (le16_to_cpu(desc->status) & IWL_RX_MPDU_STATUS_SRC_STA_FOUND) {
+ u8 id = desc->sta_id_flags & IWL_RX_MPDU_SIF_STA_ID_MASK;
+
+ if (!WARN_ON_ONCE(id >= IWL_MVM_STATION_COUNT)) {
+ sta = rcu_dereference(mvm->fw_id_to_mac_id[id]);
+ if (IS_ERR(sta))
+ sta = NULL;
+ }
+ } else if (!is_multicast_ether_addr(hdr->addr2)) {
+ /*
+ * This is fine since we prevent two stations with the same
+ * address from being added.
+ */
+ sta = ieee80211_find_sta_by_ifaddr(mvm->hw, hdr->addr2, NULL);
+ }
+
+ if (sta) {
+ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
+
+ /*
+ * We have tx blocked stations (with CS bit). If we heard
+ * frames from a blocked station on a new channel we can
+ * TX to it again.
+ */
+ if (unlikely(mvm->csa_tx_block_bcn_timeout))
+ iwl_mvm_sta_modify_disable_tx_ap(mvm, sta, false);
+
+ rs_update_last_rssi(mvm, &mvmsta->lq_sta, rx_status);
+
+ if (iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_RSSI) &&
+ ieee80211_is_beacon(hdr->frame_control)) {
+ struct iwl_fw_dbg_trigger_tlv *trig;
+ struct iwl_fw_dbg_trigger_low_rssi *rssi_trig;
+ bool trig_check;
+ s32 rssi;
+
+ trig = iwl_fw_dbg_get_trigger(mvm->fw,
+ FW_DBG_TRIGGER_RSSI);
+ rssi_trig = (void *)trig->data;
+ rssi = le32_to_cpu(rssi_trig->rssi);
+
+ trig_check =
+ iwl_fw_dbg_trigger_check_stop(mvm, mvmsta->vif,
+ trig);
+ if (trig_check && rx_status->signal < rssi)
+ iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL);
+ }
+
+ /* TODO: multi queue TCM */
+
+ if (ieee80211_is_data(hdr->frame_control))
+ iwl_mvm_rx_csum(sta, skb, desc);
+ }
+
+ rcu_read_unlock();
+
+ /*
+ * TODO: PHY info.
+ * Verify we don't have the information in the MPDU descriptor and
+ * that it is not needed.
+ * Make sure for monitor mode that we are on default queue, update
+ * ampdu_ref and the rest of phy info then
+ */
+
+ /* Set up the HT phy flags */
+ switch (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) {
+ case RATE_MCS_CHAN_WIDTH_20:
+ break;
+ case RATE_MCS_CHAN_WIDTH_40:
+ rx_status->flag |= RX_FLAG_40MHZ;
+ break;
+ case RATE_MCS_CHAN_WIDTH_80:
+ rx_status->vht_flag |= RX_VHT_FLAG_80MHZ;
+ break;
+ case RATE_MCS_CHAN_WIDTH_160:
+ rx_status->vht_flag |= RX_VHT_FLAG_160MHZ;
+ break;
+ }
+ if (rate_n_flags & RATE_MCS_SGI_MSK)
+ rx_status->flag |= RX_FLAG_SHORT_GI;
+ if (rate_n_flags & RATE_HT_MCS_GF_MSK)
+ rx_status->flag |= RX_FLAG_HT_GF;
+ if (rate_n_flags & RATE_MCS_LDPC_MSK)
+ rx_status->flag |= RX_FLAG_LDPC;
+ if (rate_n_flags & RATE_MCS_HT_MSK) {
+ u8 stbc = (rate_n_flags & RATE_MCS_HT_STBC_MSK) >>
+ RATE_MCS_STBC_POS;
+ rx_status->flag |= RX_FLAG_HT;
+ rx_status->rate_idx = rate_n_flags & RATE_HT_MCS_INDEX_MSK;
+ rx_status->flag |= stbc << RX_FLAG_STBC_SHIFT;
+ } else if (rate_n_flags & RATE_MCS_VHT_MSK) {
+ u8 stbc = (rate_n_flags & RATE_MCS_VHT_STBC_MSK) >>
+ RATE_MCS_STBC_POS;
+ rx_status->vht_nss =
+ ((rate_n_flags & RATE_VHT_MCS_NSS_MSK) >>
+ RATE_VHT_MCS_NSS_POS) + 1;
+ rx_status->rate_idx = rate_n_flags & RATE_VHT_MCS_RATE_CODE_MSK;
+ rx_status->flag |= RX_FLAG_VHT;
+ rx_status->flag |= stbc << RX_FLAG_STBC_SHIFT;
+ if (rate_n_flags & RATE_MCS_BF_MSK)
+ rx_status->vht_flag |= RX_VHT_FLAG_BF;
+ } else {
+ rx_status->rate_idx =
+ iwl_mvm_legacy_rate_to_mac80211_idx(rate_n_flags,
+ rx_status->band);
+ }
+
+ /* TODO: PHY info - update ampdu queue statistics (for debugfs) */
+ /* TODO: PHY info - gscan */
+
+ iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, hdr, len, ampdu_status,
+ crypt_len, rxb);
+}
--
2.5.0


2015-12-21 20:51:20

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 15/45] iwlwifi: update host command messages to new format

From: Sharon Dvir <[email protected]>

Host commands now have a group id, express this in printed messages.

Signed-off-by: Sharon Dvir <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/agn.h | 9 -
drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c | 4 +-
drivers/net/wireless/intel/iwlwifi/dvm/lib.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/main.c | 94 ++++++++-
drivers/net/wireless/intel/iwlwifi/dvm/rx.c | 87 +-------
drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 60 +++++-
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 34 +++-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h | 5 +
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 222 ++++++++++++---------
drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 10 -
drivers/net/wireless/intel/iwlwifi/pcie/rx.c | 5 +-
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 4 +-
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 31 +--
13 files changed, 345 insertions(+), 222 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/agn.h b/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
index 991def8..82c177a 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
@@ -473,13 +473,4 @@ do { \
} while (0)
#endif /* CONFIG_IWLWIFI_DEBUG */

-extern const char *const iwl_dvm_cmd_strings[REPLY_MAX + 1];
-
-static inline const char *iwl_dvm_get_cmd_string(u8 cmd)
-{
- const char *s = iwl_dvm_cmd_strings[cmd];
- if (s)
- return s;
- return "UNKNOWN";
-}
#endif /* __iwl_agn_h__ */
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
index b15e44f..a114d3e 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
@@ -32,7 +32,9 @@
#include <linux/debugfs.h>
#include <linux/ieee80211.h>
#include <net/mac80211.h>
+
#include "iwl-debug.h"
+#include "iwl-trans.h"
#include "iwl-io.h"
#include "dev.h"
#include "agn.h"
@@ -438,7 +440,7 @@ static ssize_t iwl_dbgfs_rx_handlers_read(struct file *file,
if (priv->rx_handlers_stats[cnt] > 0)
pos += scnprintf(buf + pos, bufsz - pos,
"\tRx handler[%36s]:\t\t %u\n",
- iwl_dvm_get_cmd_string(cnt),
+ iwl_get_cmd_string(priv->trans, (u32)cnt),
priv->rx_handlers_stats[cnt]);
}

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/lib.c b/drivers/net/wireless/intel/iwlwifi/dvm/lib.c
index a612fbe..bee1c03 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/lib.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/lib.c
@@ -1262,7 +1262,7 @@ int iwl_dvm_send_cmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)

if (test_bit(STATUS_FW_ERROR, &priv->status)) {
IWL_ERR(priv, "Command %s failed: FW Error\n",
- iwl_dvm_get_cmd_string(cmd->id));
+ iwl_get_cmd_string(priv->trans, cmd->id));
return -EIO;
}

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index 41f3aa1..9f6f564 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -1,6 +1,7 @@
/******************************************************************************
*
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2015 Intel Deutschland GmbH
*
* Portions of this file are derived from the ipw3945 project, as well
* as portions of the ieee80211 subsystem header files.
@@ -69,6 +70,93 @@ MODULE_DESCRIPTION(DRV_DESCRIPTION);
MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
MODULE_LICENSE("GPL");

+/* Please keep this array *SORTED* by hex value.
+ * Access is done through binary search.
+ * A warning will be triggered on violation.
+ */
+static const struct iwl_hcmd_names iwl_dvm_cmd_names[] = {
+ HCMD_NAME(REPLY_ALIVE),
+ HCMD_NAME(REPLY_ERROR),
+ HCMD_NAME(REPLY_ECHO),
+ HCMD_NAME(REPLY_RXON),
+ HCMD_NAME(REPLY_RXON_ASSOC),
+ HCMD_NAME(REPLY_QOS_PARAM),
+ HCMD_NAME(REPLY_RXON_TIMING),
+ HCMD_NAME(REPLY_ADD_STA),
+ HCMD_NAME(REPLY_REMOVE_STA),
+ HCMD_NAME(REPLY_REMOVE_ALL_STA),
+ HCMD_NAME(REPLY_TX),
+ HCMD_NAME(REPLY_TXFIFO_FLUSH),
+ HCMD_NAME(REPLY_WEPKEY),
+ HCMD_NAME(REPLY_LEDS_CMD),
+ HCMD_NAME(REPLY_TX_LINK_QUALITY_CMD),
+ HCMD_NAME(COEX_PRIORITY_TABLE_CMD),
+ HCMD_NAME(COEX_MEDIUM_NOTIFICATION),
+ HCMD_NAME(COEX_EVENT_CMD),
+ HCMD_NAME(TEMPERATURE_NOTIFICATION),
+ HCMD_NAME(CALIBRATION_CFG_CMD),
+ HCMD_NAME(CALIBRATION_RES_NOTIFICATION),
+ HCMD_NAME(CALIBRATION_COMPLETE_NOTIFICATION),
+ HCMD_NAME(REPLY_QUIET_CMD),
+ HCMD_NAME(REPLY_CHANNEL_SWITCH),
+ HCMD_NAME(CHANNEL_SWITCH_NOTIFICATION),
+ HCMD_NAME(REPLY_SPECTRUM_MEASUREMENT_CMD),
+ HCMD_NAME(SPECTRUM_MEASURE_NOTIFICATION),
+ HCMD_NAME(POWER_TABLE_CMD),
+ HCMD_NAME(PM_SLEEP_NOTIFICATION),
+ HCMD_NAME(PM_DEBUG_STATISTIC_NOTIFIC),
+ HCMD_NAME(REPLY_SCAN_CMD),
+ HCMD_NAME(REPLY_SCAN_ABORT_CMD),
+ HCMD_NAME(SCAN_START_NOTIFICATION),
+ HCMD_NAME(SCAN_RESULTS_NOTIFICATION),
+ HCMD_NAME(SCAN_COMPLETE_NOTIFICATION),
+ HCMD_NAME(BEACON_NOTIFICATION),
+ HCMD_NAME(REPLY_TX_BEACON),
+ HCMD_NAME(WHO_IS_AWAKE_NOTIFICATION),
+ HCMD_NAME(REPLY_TX_POWER_DBM_CMD),
+ HCMD_NAME(QUIET_NOTIFICATION),
+ HCMD_NAME(REPLY_TX_PWR_TABLE_CMD),
+ HCMD_NAME(REPLY_TX_POWER_DBM_CMD_V1),
+ HCMD_NAME(TX_ANT_CONFIGURATION_CMD),
+ HCMD_NAME(MEASURE_ABORT_NOTIFICATION),
+ HCMD_NAME(REPLY_BT_CONFIG),
+ HCMD_NAME(REPLY_STATISTICS_CMD),
+ HCMD_NAME(STATISTICS_NOTIFICATION),
+ HCMD_NAME(REPLY_CARD_STATE_CMD),
+ HCMD_NAME(CARD_STATE_NOTIFICATION),
+ HCMD_NAME(MISSED_BEACONS_NOTIFICATION),
+ HCMD_NAME(REPLY_CT_KILL_CONFIG_CMD),
+ HCMD_NAME(SENSITIVITY_CMD),
+ HCMD_NAME(REPLY_PHY_CALIBRATION_CMD),
+ HCMD_NAME(REPLY_WIPAN_PARAMS),
+ HCMD_NAME(REPLY_WIPAN_RXON),
+ HCMD_NAME(REPLY_WIPAN_RXON_TIMING),
+ HCMD_NAME(REPLY_WIPAN_RXON_ASSOC),
+ HCMD_NAME(REPLY_WIPAN_QOS_PARAM),
+ HCMD_NAME(REPLY_WIPAN_WEPKEY),
+ HCMD_NAME(REPLY_WIPAN_P2P_CHANNEL_SWITCH),
+ HCMD_NAME(REPLY_WIPAN_NOA_NOTIFICATION),
+ HCMD_NAME(REPLY_WIPAN_DEACTIVATION_COMPLETE),
+ HCMD_NAME(REPLY_RX_PHY_CMD),
+ HCMD_NAME(REPLY_RX_MPDU_CMD),
+ HCMD_NAME(REPLY_RX),
+ HCMD_NAME(REPLY_COMPRESSED_BA),
+ HCMD_NAME(REPLY_BT_COEX_PRIO_TABLE),
+ HCMD_NAME(REPLY_BT_COEX_PROT_ENV),
+ HCMD_NAME(REPLY_BT_COEX_PROFILE_NOTIF),
+ HCMD_NAME(REPLY_D3_CONFIG),
+ HCMD_NAME(REPLY_WOWLAN_PATTERNS),
+ HCMD_NAME(REPLY_WOWLAN_WAKEUP_FILTER),
+ HCMD_NAME(REPLY_WOWLAN_TSC_RSC_PARAMS),
+ HCMD_NAME(REPLY_WOWLAN_TKIP_PARAMS),
+ HCMD_NAME(REPLY_WOWLAN_KEK_KCK_MATERIAL),
+ HCMD_NAME(REPLY_WOWLAN_GET_STATUS),
+};
+
+static const struct iwl_hcmd_arr iwl_dvm_groups[] = {
+ [0x0] = HCMD_ARR(iwl_dvm_cmd_names),
+};
+
static const struct iwl_op_mode_ops iwl_dvm_ops;

void iwl_update_chain_flags(struct iwl_priv *priv)
@@ -1244,7 +1332,9 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,

trans_cfg.cmd_q_wdg_timeout = IWL_WATCHDOG_DISABLED;

- trans_cfg.command_names = iwl_dvm_cmd_strings;
+ trans_cfg.command_groups = iwl_dvm_groups;
+ trans_cfg.command_groups_size = ARRAY_SIZE(iwl_dvm_groups);
+
trans_cfg.cmd_fifo = IWLAGN_CMD_FIFO_NUM;

WARN_ON(sizeof(priv->transport_queue_stop) * BITS_PER_BYTE <
@@ -1265,6 +1355,8 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,

trans->rx_mpdu_cmd = REPLY_RX_MPDU_CMD;
trans->rx_mpdu_cmd_hdr_size = sizeof(struct iwl_rx_mpdu_res_start);
+ trans->command_groups = trans_cfg.command_groups;
+ trans->command_groups_size = trans_cfg.command_groups_size;

/* At this point both hw and priv are allocated. */

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
index 4a45b0b..94b41e4 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
@@ -1,6 +1,7 @@
/******************************************************************************
*
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2015 Intel Deutschland GmbH
*
* Portions of this file are derived from the ipw3945 project, as well
* as portionhelp of the ieee80211 subsystem header files.
@@ -32,91 +33,13 @@
#include <linux/sched.h>
#include <net/mac80211.h>
#include <asm/unaligned.h>
+
+#include "iwl-trans.h"
#include "iwl-io.h"
#include "dev.h"
#include "calib.h"
#include "agn.h"

-#define IWL_CMD_ENTRY(x) [x] = #x
-
-const char *const iwl_dvm_cmd_strings[REPLY_MAX + 1] = {
- IWL_CMD_ENTRY(REPLY_ALIVE),
- IWL_CMD_ENTRY(REPLY_ERROR),
- IWL_CMD_ENTRY(REPLY_ECHO),
- IWL_CMD_ENTRY(REPLY_RXON),
- IWL_CMD_ENTRY(REPLY_RXON_ASSOC),
- IWL_CMD_ENTRY(REPLY_QOS_PARAM),
- IWL_CMD_ENTRY(REPLY_RXON_TIMING),
- IWL_CMD_ENTRY(REPLY_ADD_STA),
- IWL_CMD_ENTRY(REPLY_REMOVE_STA),
- IWL_CMD_ENTRY(REPLY_REMOVE_ALL_STA),
- IWL_CMD_ENTRY(REPLY_TXFIFO_FLUSH),
- IWL_CMD_ENTRY(REPLY_WEPKEY),
- IWL_CMD_ENTRY(REPLY_TX),
- IWL_CMD_ENTRY(REPLY_LEDS_CMD),
- IWL_CMD_ENTRY(REPLY_TX_LINK_QUALITY_CMD),
- IWL_CMD_ENTRY(COEX_PRIORITY_TABLE_CMD),
- IWL_CMD_ENTRY(COEX_MEDIUM_NOTIFICATION),
- IWL_CMD_ENTRY(COEX_EVENT_CMD),
- IWL_CMD_ENTRY(REPLY_QUIET_CMD),
- IWL_CMD_ENTRY(REPLY_CHANNEL_SWITCH),
- IWL_CMD_ENTRY(CHANNEL_SWITCH_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_SPECTRUM_MEASUREMENT_CMD),
- IWL_CMD_ENTRY(SPECTRUM_MEASURE_NOTIFICATION),
- IWL_CMD_ENTRY(POWER_TABLE_CMD),
- IWL_CMD_ENTRY(PM_SLEEP_NOTIFICATION),
- IWL_CMD_ENTRY(PM_DEBUG_STATISTIC_NOTIFIC),
- IWL_CMD_ENTRY(REPLY_SCAN_CMD),
- IWL_CMD_ENTRY(REPLY_SCAN_ABORT_CMD),
- IWL_CMD_ENTRY(SCAN_START_NOTIFICATION),
- IWL_CMD_ENTRY(SCAN_RESULTS_NOTIFICATION),
- IWL_CMD_ENTRY(SCAN_COMPLETE_NOTIFICATION),
- IWL_CMD_ENTRY(BEACON_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_TX_BEACON),
- IWL_CMD_ENTRY(WHO_IS_AWAKE_NOTIFICATION),
- IWL_CMD_ENTRY(QUIET_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_TX_PWR_TABLE_CMD),
- IWL_CMD_ENTRY(MEASURE_ABORT_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_BT_CONFIG),
- IWL_CMD_ENTRY(REPLY_STATISTICS_CMD),
- IWL_CMD_ENTRY(STATISTICS_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_CARD_STATE_CMD),
- IWL_CMD_ENTRY(CARD_STATE_NOTIFICATION),
- IWL_CMD_ENTRY(MISSED_BEACONS_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_CT_KILL_CONFIG_CMD),
- IWL_CMD_ENTRY(SENSITIVITY_CMD),
- IWL_CMD_ENTRY(REPLY_PHY_CALIBRATION_CMD),
- IWL_CMD_ENTRY(REPLY_RX_PHY_CMD),
- IWL_CMD_ENTRY(REPLY_RX_MPDU_CMD),
- IWL_CMD_ENTRY(REPLY_COMPRESSED_BA),
- IWL_CMD_ENTRY(CALIBRATION_CFG_CMD),
- IWL_CMD_ENTRY(CALIBRATION_RES_NOTIFICATION),
- IWL_CMD_ENTRY(CALIBRATION_COMPLETE_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_TX_POWER_DBM_CMD),
- IWL_CMD_ENTRY(TEMPERATURE_NOTIFICATION),
- IWL_CMD_ENTRY(TX_ANT_CONFIGURATION_CMD),
- IWL_CMD_ENTRY(REPLY_BT_COEX_PROFILE_NOTIF),
- IWL_CMD_ENTRY(REPLY_BT_COEX_PRIO_TABLE),
- IWL_CMD_ENTRY(REPLY_BT_COEX_PROT_ENV),
- IWL_CMD_ENTRY(REPLY_WIPAN_PARAMS),
- IWL_CMD_ENTRY(REPLY_WIPAN_RXON),
- IWL_CMD_ENTRY(REPLY_WIPAN_RXON_TIMING),
- IWL_CMD_ENTRY(REPLY_WIPAN_RXON_ASSOC),
- IWL_CMD_ENTRY(REPLY_WIPAN_QOS_PARAM),
- IWL_CMD_ENTRY(REPLY_WIPAN_WEPKEY),
- IWL_CMD_ENTRY(REPLY_WIPAN_P2P_CHANNEL_SWITCH),
- IWL_CMD_ENTRY(REPLY_WIPAN_NOA_NOTIFICATION),
- IWL_CMD_ENTRY(REPLY_WIPAN_DEACTIVATION_COMPLETE),
- IWL_CMD_ENTRY(REPLY_WOWLAN_PATTERNS),
- IWL_CMD_ENTRY(REPLY_WOWLAN_WAKEUP_FILTER),
- IWL_CMD_ENTRY(REPLY_WOWLAN_TSC_RSC_PARAMS),
- IWL_CMD_ENTRY(REPLY_WOWLAN_TKIP_PARAMS),
- IWL_CMD_ENTRY(REPLY_WOWLAN_KEK_KCK_MATERIAL),
- IWL_CMD_ENTRY(REPLY_WOWLAN_GET_STATUS),
- IWL_CMD_ENTRY(REPLY_D3_CONFIG),
-};
-#undef IWL_CMD_ENTRY
-
/******************************************************************************
*
* Generic RX handler implementations
@@ -1095,7 +1018,9 @@ void iwl_rx_dispatch(struct iwl_op_mode *op_mode, struct napi_struct *napi,
} else {
/* No handling needed */
IWL_DEBUG_RX(priv, "No handler needed for %s, 0x%02x\n",
- iwl_dvm_get_cmd_string(pkt->hdr.cmd),
+ iwl_get_cmd_string(priv->trans,
+ iwl_cmd_id(pkt->hdr.cmd,
+ 0, 0)),
pkt->hdr.cmd);
}
}
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
index c3fafbc..6069a9f 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
@@ -61,8 +61,10 @@
*
*****************************************************************************/
#include <linux/kernel.h>
-#include "iwl-drv.h"
+#include <linux/bsearch.h>
+
#include "iwl-trans.h"
+#include "iwl-drv.h"

struct iwl_trans *iwl_trans_alloc(unsigned int priv_size,
struct device *dev,
@@ -145,3 +147,59 @@ int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
return ret;
}
IWL_EXPORT_SYMBOL(iwl_trans_send_cmd);
+
+/* Comparator for struct iwl_hcmd_names.
+ * Used in the binary search over a list of host commands.
+ *
+ * @key: command_id that we're looking for.
+ * @elt: struct iwl_hcmd_names candidate for match.
+ *
+ * @return 0 iff equal.
+ */
+static int iwl_hcmd_names_cmp(const void *key, const void *elt)
+{
+ const struct iwl_hcmd_names *name = elt;
+ u8 cmd1 = *(u8 *)key;
+ u8 cmd2 = name->cmd_id;
+
+ return (cmd1 - cmd2);
+}
+
+const char *iwl_get_cmd_string(struct iwl_trans *trans, u32 id)
+{
+ u8 grp, cmd;
+ struct iwl_hcmd_names *ret;
+ const struct iwl_hcmd_arr *arr;
+ size_t size = sizeof(struct iwl_hcmd_names);
+
+ grp = iwl_cmd_groupid(id);
+ cmd = iwl_cmd_opcode(id);
+
+ if (!trans->command_groups || grp >= trans->command_groups_size ||
+ !trans->command_groups[grp].arr)
+ return "UNKNOWN";
+
+ arr = &trans->command_groups[grp];
+ ret = bsearch(&cmd, arr->arr, arr->size, size, iwl_hcmd_names_cmp);
+ if (!ret)
+ return "UNKNOWN";
+ return ret->cmd_name;
+}
+IWL_EXPORT_SYMBOL(iwl_get_cmd_string);
+
+int iwl_cmd_groups_verify_sorted(const struct iwl_trans_config *trans)
+{
+ int i, j;
+ const struct iwl_hcmd_arr *arr;
+
+ for (i = 0; i < trans->command_groups_size; i++) {
+ arr = &trans->command_groups[i];
+ if (!arr->arr)
+ continue;
+ for (j = 0; j < arr->size - 1; j++)
+ if (arr->arr[j].cmd_id > arr->arr[j + 1].cmd_id)
+ return -1;
+ }
+ return 0;
+}
+IWL_EXPORT_SYMBOL(iwl_cmd_groups_verify_sorted);
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index b825d94..f00c9ad 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -68,6 +68,7 @@
#include <linux/ieee80211.h>
#include <linux/mm.h> /* for page_address */
#include <linux/lockdep.h>
+#include <linux/kernel.h>

#include "iwl-debug.h"
#include "iwl-config.h"
@@ -442,6 +443,22 @@ iwl_trans_get_rb_size_order(enum iwl_amsdu_size rb_size)
}
}

+struct iwl_hcmd_names {
+ u8 cmd_id;
+ const char *const cmd_name;
+};
+
+#define HCMD_NAME(x) \
+ { .cmd_id = x, .cmd_name = #x }
+
+struct iwl_hcmd_arr {
+ const struct iwl_hcmd_names *arr;
+ int size;
+};
+
+#define HCMD_ARR(x) \
+ { .arr = x, .size = ARRAY_SIZE(x) }
+
/**
* struct iwl_trans_config - transport configuration
*
@@ -461,8 +478,9 @@ iwl_trans_get_rb_size_order(enum iwl_amsdu_size rb_size)
* in DWORD (as opposed to bytes)
* @scd_set_active: should the transport configure the SCD for HCMD queue
* @wide_cmd_header: firmware supports wide host command header
- * @command_names: array of command names, must be 256 entries
- * (one for each command); for debugging only
+ * @command_groups: array of command groups, each member is an array of the
+ * commands in the group; for debugging only
+ * @command_groups_size: number of command groups, to avoid illegal access
* @sdio_adma_addr: the default address to set for the ADMA in SDIO mode until
* we get the ALIVE from the uCode
*/
@@ -479,8 +497,9 @@ struct iwl_trans_config {
bool bc_table_dword;
bool scd_set_active;
bool wide_cmd_header;
- const char *const *command_names;
-
+ const struct iwl_hcmd_arr *command_groups;
+ int command_groups_size;
+
u32 sdio_adma_addr;
};

@@ -720,6 +739,9 @@ struct iwl_trans {
bool pm_support;
bool ltr_enabled;

+ const struct iwl_hcmd_arr *command_groups;
+ int command_groups_size;
+
u8 num_rx_queues;

/* The following fields are internal only */
@@ -757,12 +779,16 @@ struct iwl_trans {
char trans_specific[0] __aligned(sizeof(void *));
};

+const char *iwl_get_cmd_string(struct iwl_trans *trans, u32 id);
+int iwl_cmd_groups_verify_sorted(const struct iwl_trans_config *trans);
+
static inline void iwl_trans_configure(struct iwl_trans *trans,
const struct iwl_trans_config *trans_cfg)
{
trans->op_mode = trans_cfg->op_mode;

trans->ops->configure(trans, trans_cfg);
+ WARN_ON(iwl_cmd_groups_verify_sorted(trans_cfg));
}

static inline int _iwl_trans_start_hw(struct iwl_trans *trans, bool low_power)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
index 9436798..3f7478b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
@@ -270,6 +270,9 @@ enum {
REPLY_MAX = 0xff,
};

+/* Please keep this enum *SORTED* by hex value.
+ * Needed for binary search, otherwise a warning will be triggered.
+ */
enum iwl_phy_ops_subcmd_ids {
CMD_DTS_MEASUREMENT_TRIGGER_WIDE = 0x0,
DTS_MEASUREMENT_NOTIF_WIDE = 0xFF,
@@ -277,6 +280,8 @@ enum iwl_phy_ops_subcmd_ids {

/* command groups */
enum {
+ LEGACY_GROUP = 0x0,
+ LONG_GROUP = 0x1,
PHY_OPS_GROUP = 0x4,
};

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 4e417fd..958984c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -83,6 +83,8 @@
#include "fw-api-scan.h"
#include "time-event.h"
#include "fw-dbg.h"
+#include "fw-api.h"
+#include "fw-api-scan.h"

#define DRV_DESCRIPTION "The new Intel(R) wireless AGN driver for Linux"
MODULE_DESCRIPTION(DRV_DESCRIPTION);
@@ -269,104 +271,127 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
};
#undef RX_HANDLER
#undef RX_HANDLER_GRP
-#define CMD(x) [x] = #x
-
-static const char *const iwl_mvm_cmd_strings[REPLY_MAX + 1] = {
- CMD(MVM_ALIVE),
- CMD(REPLY_ERROR),
- CMD(ECHO_CMD),
- CMD(INIT_COMPLETE_NOTIF),
- CMD(PHY_CONTEXT_CMD),
- CMD(MGMT_MCAST_KEY),
- CMD(TX_CMD),
- CMD(TXPATH_FLUSH),
- CMD(SHARED_MEM_CFG),
- CMD(MAC_CONTEXT_CMD),
- CMD(TIME_EVENT_CMD),
- CMD(TIME_EVENT_NOTIFICATION),
- CMD(BINDING_CONTEXT_CMD),
- CMD(TIME_QUOTA_CMD),
- CMD(NON_QOS_TX_COUNTER_CMD),
- CMD(DC2DC_CONFIG_CMD),
- CMD(NVM_ACCESS_CMD),
- CMD(PHY_CONFIGURATION_CMD),
- CMD(CALIB_RES_NOTIF_PHY_DB),
- CMD(SET_CALIB_DEFAULT_CMD),
- CMD(FW_PAGING_BLOCK_CMD),
- CMD(ADD_STA_KEY),
- CMD(ADD_STA),
- CMD(FW_GET_ITEM_CMD),
- CMD(REMOVE_STA),
- CMD(LQ_CMD),
- CMD(SCAN_OFFLOAD_CONFIG_CMD),
- CMD(MATCH_FOUND_NOTIFICATION),
- CMD(SCAN_OFFLOAD_REQUEST_CMD),
- CMD(SCAN_OFFLOAD_ABORT_CMD),
- CMD(HOT_SPOT_CMD),
- CMD(SCAN_OFFLOAD_COMPLETE),
- CMD(SCAN_OFFLOAD_UPDATE_PROFILES_CMD),
- CMD(SCAN_ITERATION_COMPLETE),
- CMD(POWER_TABLE_CMD),
- CMD(WEP_KEY),
- CMD(REPLY_RX_PHY_CMD),
- CMD(REPLY_RX_MPDU_CMD),
- CMD(FRAME_RELEASE),
- CMD(BEACON_NOTIFICATION),
- CMD(BEACON_TEMPLATE_CMD),
- CMD(STATISTICS_CMD),
- CMD(STATISTICS_NOTIFICATION),
- CMD(EOSP_NOTIFICATION),
- CMD(REDUCE_TX_POWER_CMD),
- CMD(TX_ANT_CONFIGURATION_CMD),
- CMD(D3_CONFIG_CMD),
- CMD(D0I3_END_CMD),
- CMD(PROT_OFFLOAD_CONFIG_CMD),
- CMD(OFFLOADS_QUERY_CMD),
- CMD(REMOTE_WAKE_CONFIG_CMD),
- CMD(WOWLAN_PATTERNS),
- CMD(WOWLAN_CONFIGURATION),
- CMD(WOWLAN_TSC_RSC_PARAM),
- CMD(WOWLAN_TKIP_PARAM),
- CMD(WOWLAN_KEK_KCK_MATERIAL),
- CMD(WOWLAN_GET_STATUSES),
- CMD(WOWLAN_TX_POWER_PER_DB),
- CMD(SCAN_OFFLOAD_PROFILES_QUERY_CMD),
- CMD(SCAN_OFFLOAD_HOTSPOTS_CONFIG_CMD),
- CMD(SCAN_OFFLOAD_HOTSPOTS_QUERY_CMD),
- CMD(CARD_STATE_NOTIFICATION),
- CMD(MISSED_BEACONS_NOTIFICATION),
- CMD(BT_COEX_PRIO_TABLE),
- CMD(BT_COEX_PROT_ENV),
- CMD(BT_PROFILE_NOTIFICATION),
- CMD(BT_CONFIG),
- CMD(MCAST_FILTER_CMD),
- CMD(BCAST_FILTER_CMD),
- CMD(REPLY_SF_CFG_CMD),
- CMD(REPLY_BEACON_FILTERING_CMD),
- CMD(CMD_DTS_MEASUREMENT_TRIGGER),
- CMD(DTS_MEASUREMENT_NOTIFICATION),
- CMD(REPLY_THERMAL_MNG_BACKOFF),
- CMD(MAC_PM_POWER_TABLE),
- CMD(LTR_CONFIG),
- CMD(BT_COEX_CI),
- CMD(BT_COEX_UPDATE_SW_BOOST),
- CMD(BT_COEX_UPDATE_CORUN_LUT),
- CMD(BT_COEX_UPDATE_REDUCED_TXP),
- CMD(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION),
- CMD(ANTENNA_COUPLING_NOTIFICATION),
- CMD(SCD_QUEUE_CFG),
- CMD(SCAN_CFG_CMD),
- CMD(SCAN_REQ_UMAC),
- CMD(SCAN_ABORT_UMAC),
- CMD(SCAN_COMPLETE_UMAC),
- CMD(TDLS_CHANNEL_SWITCH_CMD),
- CMD(TDLS_CHANNEL_SWITCH_NOTIFICATION),
- CMD(TDLS_CONFIG_CMD),
- CMD(MCC_UPDATE_CMD),
- CMD(SCAN_ITERATION_COMPLETE_UMAC),
- CMD(LDBG_CONFIG_CMD),
+
+/* Please keep this array *SORTED* by hex value.
+ * Access is done through binary search
+ */
+static const struct iwl_hcmd_names iwl_mvm_legacy_names[] = {
+ HCMD_NAME(MVM_ALIVE),
+ HCMD_NAME(REPLY_ERROR),
+ HCMD_NAME(ECHO_CMD),
+ HCMD_NAME(INIT_COMPLETE_NOTIF),
+ HCMD_NAME(PHY_CONTEXT_CMD),
+ HCMD_NAME(DBG_CFG),
+ HCMD_NAME(ANTENNA_COUPLING_NOTIFICATION),
+ HCMD_NAME(SCAN_CFG_CMD),
+ HCMD_NAME(SCAN_REQ_UMAC),
+ HCMD_NAME(SCAN_ABORT_UMAC),
+ HCMD_NAME(SCAN_COMPLETE_UMAC),
+ HCMD_NAME(TOF_CMD),
+ HCMD_NAME(TOF_NOTIFICATION),
+ HCMD_NAME(ADD_STA_KEY),
+ HCMD_NAME(ADD_STA),
+ HCMD_NAME(REMOVE_STA),
+ HCMD_NAME(FW_GET_ITEM_CMD),
+ HCMD_NAME(TX_CMD),
+ HCMD_NAME(SCD_QUEUE_CFG),
+ HCMD_NAME(TXPATH_FLUSH),
+ HCMD_NAME(MGMT_MCAST_KEY),
+ HCMD_NAME(WEP_KEY),
+ HCMD_NAME(SHARED_MEM_CFG),
+ HCMD_NAME(TDLS_CHANNEL_SWITCH_CMD),
+ HCMD_NAME(MAC_CONTEXT_CMD),
+ HCMD_NAME(TIME_EVENT_CMD),
+ HCMD_NAME(TIME_EVENT_NOTIFICATION),
+ HCMD_NAME(BINDING_CONTEXT_CMD),
+ HCMD_NAME(TIME_QUOTA_CMD),
+ HCMD_NAME(NON_QOS_TX_COUNTER_CMD),
+ HCMD_NAME(LQ_CMD),
+ HCMD_NAME(FW_PAGING_BLOCK_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_REQUEST_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_ABORT_CMD),
+ HCMD_NAME(HOT_SPOT_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_PROFILES_QUERY_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_HOTSPOTS_CONFIG_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_HOTSPOTS_QUERY_CMD),
+ HCMD_NAME(BT_COEX_UPDATE_SW_BOOST),
+ HCMD_NAME(BT_COEX_UPDATE_CORUN_LUT),
+ HCMD_NAME(BT_COEX_UPDATE_REDUCED_TXP),
+ HCMD_NAME(BT_COEX_CI),
+ HCMD_NAME(PHY_CONFIGURATION_CMD),
+ HCMD_NAME(CALIB_RES_NOTIF_PHY_DB),
+ HCMD_NAME(SCAN_OFFLOAD_COMPLETE),
+ HCMD_NAME(SCAN_OFFLOAD_UPDATE_PROFILES_CMD),
+ HCMD_NAME(SCAN_OFFLOAD_CONFIG_CMD),
+ HCMD_NAME(POWER_TABLE_CMD),
+ HCMD_NAME(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION),
+ HCMD_NAME(REPLY_THERMAL_MNG_BACKOFF),
+ HCMD_NAME(DC2DC_CONFIG_CMD),
+ HCMD_NAME(NVM_ACCESS_CMD),
+ HCMD_NAME(SET_CALIB_DEFAULT_CMD),
+ HCMD_NAME(BEACON_NOTIFICATION),
+ HCMD_NAME(BEACON_TEMPLATE_CMD),
+ HCMD_NAME(TX_ANT_CONFIGURATION_CMD),
+ HCMD_NAME(BT_CONFIG),
+ HCMD_NAME(STATISTICS_CMD),
+ HCMD_NAME(STATISTICS_NOTIFICATION),
+ HCMD_NAME(EOSP_NOTIFICATION),
+ HCMD_NAME(REDUCE_TX_POWER_CMD),
+ HCMD_NAME(CARD_STATE_CMD),
+ HCMD_NAME(CARD_STATE_NOTIFICATION),
+ HCMD_NAME(MISSED_BEACONS_NOTIFICATION),
+ HCMD_NAME(TDLS_CONFIG_CMD),
+ HCMD_NAME(MAC_PM_POWER_TABLE),
+ HCMD_NAME(TDLS_CHANNEL_SWITCH_NOTIFICATION),
+ HCMD_NAME(MFUART_LOAD_NOTIFICATION),
+ HCMD_NAME(SCAN_ITERATION_COMPLETE_UMAC),
+ HCMD_NAME(REPLY_RX_PHY_CMD),
+ HCMD_NAME(REPLY_RX_MPDU_CMD),
+ HCMD_NAME(BA_NOTIF),
+ HCMD_NAME(MCC_UPDATE_CMD),
+ HCMD_NAME(MCC_CHUB_UPDATE_CMD),
+ HCMD_NAME(MARKER_CMD),
+ HCMD_NAME(BT_COEX_PRIO_TABLE),
+ HCMD_NAME(BT_COEX_PROT_ENV),
+ HCMD_NAME(BT_PROFILE_NOTIFICATION),
+ HCMD_NAME(BCAST_FILTER_CMD),
+ HCMD_NAME(MCAST_FILTER_CMD),
+ HCMD_NAME(REPLY_SF_CFG_CMD),
+ HCMD_NAME(REPLY_BEACON_FILTERING_CMD),
+ HCMD_NAME(D3_CONFIG_CMD),
+ HCMD_NAME(PROT_OFFLOAD_CONFIG_CMD),
+ HCMD_NAME(OFFLOADS_QUERY_CMD),
+ HCMD_NAME(REMOTE_WAKE_CONFIG_CMD),
+ HCMD_NAME(MATCH_FOUND_NOTIFICATION),
+ HCMD_NAME(CMD_DTS_MEASUREMENT_TRIGGER),
+ HCMD_NAME(DTS_MEASUREMENT_NOTIFICATION),
+ HCMD_NAME(WOWLAN_PATTERNS),
+ HCMD_NAME(WOWLAN_CONFIGURATION),
+ HCMD_NAME(WOWLAN_TSC_RSC_PARAM),
+ HCMD_NAME(WOWLAN_TKIP_PARAM),
+ HCMD_NAME(WOWLAN_KEK_KCK_MATERIAL),
+ HCMD_NAME(WOWLAN_GET_STATUSES),
+ HCMD_NAME(WOWLAN_TX_POWER_PER_DB),
+ HCMD_NAME(SCAN_ITERATION_COMPLETE),
+ HCMD_NAME(D0I3_END_CMD),
+ HCMD_NAME(LTR_CONFIG),
+ HCMD_NAME(REPLY_DEBUG_CMD),
};
-#undef CMD
+
+/* Please keep this array *SORTED* by hex value.
+ * Access is done through binary search
+ */
+static const struct iwl_hcmd_names iwl_mvm_phy_names[] = {
+ HCMD_NAME(CMD_DTS_MEASUREMENT_TRIGGER_WIDE),
+ HCMD_NAME(DTS_MEASUREMENT_NOTIF_WIDE),
+};
+
+static const struct iwl_hcmd_arr iwl_mvm_groups[] = {
+ [LEGACY_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
+ [LONG_GROUP] = HCMD_ARR(iwl_mvm_legacy_names),
+ [PHY_OPS_GROUP] = HCMD_ARR(iwl_mvm_phy_names),
+};
+

/* this forward declaration can avoid to export the function */
static void iwl_mvm_async_handlers_wk(struct work_struct *wk);
@@ -508,7 +533,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_DW_BC_TABLE)
trans_cfg.bc_table_dword = true;

- trans_cfg.command_names = iwl_mvm_cmd_strings;
+ trans_cfg.command_groups = iwl_mvm_groups;
+ trans_cfg.command_groups_size = ARRAY_SIZE(iwl_mvm_groups);

trans_cfg.cmd_queue = IWL_MVM_CMD_QUEUE;
trans_cfg.cmd_fifo = IWL_MVM_TX_FIFO_CMD;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 31f30a2..0aceb9f 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -363,8 +363,6 @@ struct iwl_trans_pcie {
bool wide_cmd_header;
u32 rx_page_order;

- const char *const *command_names;
-
/*protect hw register */
spinlock_t reg_lock;
bool cmd_hold_nic_awake;
@@ -527,14 +525,6 @@ static inline u8 get_cmd_index(struct iwl_queue *q, u32 index)
return index & (q->n_window - 1);
}

-static inline const char *get_cmd_string(struct iwl_trans_pcie *trans_pcie,
- u8 cmd)
-{
- if (!trans_pcie->command_names || !trans_pcie->command_names[cmd])
- return "UNKNOWN";
- return trans_pcie->command_names[cmd];
-}
-
static inline bool iwl_is_rfkill_set(struct iwl_trans *trans)
{
return !(iwl_read32(trans, CSR_GP_CNTRL) &
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
index 9193f0c..ccafbd8 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
@@ -877,7 +877,10 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
IWL_DEBUG_RX(trans,
"cmd at offset %d: %s (0x%.2x, seq 0x%x)\n",
rxcb._offset,
- get_cmd_string(trans_pcie, pkt->hdr.cmd),
+ iwl_get_cmd_string(trans,
+ iwl_cmd_id(pkt->hdr.cmd,
+ pkt->hdr.group_id,
+ 0)),
pkt->hdr.cmd, le16_to_cpu(pkt->hdr.sequence));

len = iwl_rx_packet_len(pkt);
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 316162a..0d92763 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1440,10 +1440,12 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
iwl_trans_get_rb_size_order(trans_pcie->rx_buf_size);

trans_pcie->wide_cmd_header = trans_cfg->wide_cmd_header;
- trans_pcie->command_names = trans_cfg->command_names;
trans_pcie->bc_table_dword = trans_cfg->bc_table_dword;
trans_pcie->scd_set_active = trans_cfg->scd_set_active;

+ trans->command_groups = trans_cfg->command_groups;
+ trans->command_groups_size = trans_cfg->command_groups_size;
+
/* init ref_count to 1 (should be cleared when ucode is loaded) */
trans_pcie->ref_count = 1;

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index fe8241f..f2277c7 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -1413,7 +1413,8 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
*/
if (WARN(copy_size > TFD_MAX_PAYLOAD_SIZE,
"Command %s (%#x) is too large (%d bytes)\n",
- get_cmd_string(trans_pcie, cmd->id), cmd->id, copy_size)) {
+ iwl_get_cmd_string(trans, cmd->id),
+ cmd->id, copy_size)) {
idx = -EINVAL;
goto free_dup_buf;
}
@@ -1503,7 +1504,7 @@ static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,

IWL_DEBUG_HC(trans,
"Sending command %s (%.2x.%.2x), seq: 0x%04X, %d bytes at %d[%d]:%d\n",
- get_cmd_string(trans_pcie, out_cmd->hdr.cmd),
+ iwl_get_cmd_string(trans, cmd->id),
group_id, out_cmd->hdr.cmd,
le16_to_cpu(out_cmd->hdr.sequence),
cmd_size, q->write_ptr, idx, trans_pcie->cmd_queue);
@@ -1599,6 +1600,8 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
{
struct iwl_rx_packet *pkt = rxb_addr(rxb);
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
+ u8 group_id = iwl_cmd_groupid(pkt->hdr.group_id);
+ u32 cmd_id;
int txq_id = SEQ_TO_QUEUE(sequence);
int index = SEQ_TO_INDEX(sequence);
int cmd_index;
@@ -1624,6 +1627,7 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
cmd_index = get_cmd_index(&txq->q, index);
cmd = txq->entries[cmd_index].cmd;
meta = &txq->entries[cmd_index].meta;
+ cmd_id = iwl_cmd_id(cmd->hdr.cmd, group_id, 0);

iwl_pcie_tfd_unmap(trans, meta, &txq->tfds[index]);

@@ -1645,11 +1649,11 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
if (!test_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status)) {
IWL_WARN(trans,
"HCMD_ACTIVE already clear for command %s\n",
- get_cmd_string(trans_pcie, cmd->hdr.cmd));
+ iwl_get_cmd_string(trans, cmd_id));
}
clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n",
- get_cmd_string(trans_pcie, cmd->hdr.cmd));
+ iwl_get_cmd_string(trans, cmd_id));
wake_up(&trans_pcie->wait_command_queue);
}

@@ -1663,7 +1667,6 @@ void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
static int iwl_pcie_send_hcmd_async(struct iwl_trans *trans,
struct iwl_host_cmd *cmd)
{
- struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
int ret;

/* An asynchronous command can not expect an SKB to be set. */
@@ -1674,7 +1677,7 @@ static int iwl_pcie_send_hcmd_async(struct iwl_trans *trans,
if (ret < 0) {
IWL_ERR(trans,
"Error sending %s: enqueue_hcmd failed: %d\n",
- get_cmd_string(trans_pcie, cmd->id), ret);
+ iwl_get_cmd_string(trans, cmd->id), ret);
return ret;
}
return 0;
@@ -1688,16 +1691,16 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
int ret;

IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
- get_cmd_string(trans_pcie, cmd->id));
+ iwl_get_cmd_string(trans, cmd->id));

if (WARN(test_and_set_bit(STATUS_SYNC_HCMD_ACTIVE,
&trans->status),
"Command %s: a command is already active!\n",
- get_cmd_string(trans_pcie, cmd->id)))
+ iwl_get_cmd_string(trans, cmd->id)))
return -EIO;

IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
- get_cmd_string(trans_pcie, cmd->id));
+ iwl_get_cmd_string(trans, cmd->id));

cmd_idx = iwl_pcie_enqueue_hcmd(trans, cmd);
if (cmd_idx < 0) {
@@ -1705,7 +1708,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
IWL_ERR(trans,
"Error sending %s: enqueue_hcmd failed: %d\n",
- get_cmd_string(trans_pcie, cmd->id), ret);
+ iwl_get_cmd_string(trans, cmd->id), ret);
return ret;
}

@@ -1718,7 +1721,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
struct iwl_queue *q = &txq->q;

IWL_ERR(trans, "Error sending %s: time out after %dms.\n",
- get_cmd_string(trans_pcie, cmd->id),
+ iwl_get_cmd_string(trans, cmd->id),
jiffies_to_msecs(HOST_COMPLETE_TIMEOUT));

IWL_ERR(trans, "Current CMD queue read_ptr %d write_ptr %d\n",
@@ -1726,7 +1729,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,

clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n",
- get_cmd_string(trans_pcie, cmd->id));
+ iwl_get_cmd_string(trans, cmd->id));
ret = -ETIMEDOUT;

iwl_force_nmi(trans);
@@ -1737,7 +1740,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,

if (test_bit(STATUS_FW_ERROR, &trans->status)) {
IWL_ERR(trans, "FW error in SYNC CMD %s\n",
- get_cmd_string(trans_pcie, cmd->id));
+ iwl_get_cmd_string(trans, cmd->id));
dump_stack();
ret = -EIO;
goto cancel;
@@ -1752,7 +1755,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,

if ((cmd->flags & CMD_WANT_SKB) && !cmd->resp_pkt) {
IWL_ERR(trans, "Error: Response NULL in '%s'\n",
- get_cmd_string(trans_pcie, cmd->id));
+ iwl_get_cmd_string(trans, cmd->id));
ret = -EIO;
goto cancel;
}
--
2.5.0


2015-12-29 16:42:19

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH 40/45] iwlwifi: Update PCI IDs for 8000 and 9000 series

Emmanuel Grumbach <[email protected]> writes:

> From: Oren Givon <[email protected]>
>
> A new PCI IDs update to the 8000 and 9000 series.
>
> type=feature
>
> Signed-off-by: Oren Givon <[email protected]>
> Signed-off-by: Emmanuel Grumbach <[email protected]>

Forgot to clean the internal tags? :) No need to change anything now,
just keep on eye on these. Or better yet check these automatically.

--
Kalle Valo

2015-12-21 20:52:12

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 25/45] iwlwifi: mvm: prepare the code towards TSO implementation

Differentiate between the cases where the skb is a large
send and the other cases.
Advertise TSO even if, at this stage, skb_gso_segment will
be called and it will do all the work.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +-
drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 78 ++++++++++++++++++++++-
2 files changed, 78 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 0227b29..d239e97 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -668,7 +668,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
hw->netdev_features &= ~NETIF_F_RXCSUM;

if (IWL_MVM_SW_TX_CSUM_OFFLOAD)
- hw->netdev_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+ hw->netdev_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
+ NETIF_F_TSO | NETIF_F_TSO6;

ret = ieee80211_register_hw(mvm->hw);
if (ret)
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 4d13df1..04e921f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -64,6 +64,7 @@
*****************************************************************************/
#include <linux/ieee80211.h>
#include <linux/etherdevice.h>
+#include <linux/tcp.h>

#include "iwl-trans.h"
#include "iwl-eeprom-parse.h"
@@ -425,11 +426,39 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
return 0;
}

+static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb_gso,
+ struct ieee80211_sta *sta,
+ struct sk_buff_head *mpdus_skb)
+{
+ struct sk_buff *tmp, *next;
+ char cb[sizeof(skb_gso->cb)];
+
+ memcpy(cb, skb_gso->cb, sizeof(cb));
+ next = skb_gso_segment(skb_gso, 0);
+ if (IS_ERR(next))
+ return -EINVAL;
+ else if (next)
+ consume_skb(skb_gso);
+
+ while (next) {
+ tmp = next;
+ next = tmp->next;
+ memcpy(tmp->cb, cb, sizeof(tmp->cb));
+
+ tmp->prev = NULL;
+ tmp->next = NULL;
+
+ __skb_queue_tail(mpdus_skb, tmp);
+ }
+
+ return 0;
+}
+
/*
* Sets the fields in the Tx cmd that are crypto related
*/
-int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
- struct ieee80211_sta *sta)
+static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
+ struct ieee80211_sta *sta)
{
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
@@ -525,6 +554,51 @@ drop:
return -1;
}

+int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
+ struct ieee80211_sta *sta)
+{
+ struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
+ struct sk_buff_head mpdus_skbs;
+ unsigned int payload_len;
+ int ret;
+
+ if (WARN_ON_ONCE(!mvmsta))
+ return -1;
+
+ if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
+ return -1;
+
+ if (!skb_is_gso(skb))
+ return iwl_mvm_tx_mpdu(mvm, skb, sta);
+
+ payload_len = skb_tail_pointer(skb) - skb_transport_header(skb) -
+ tcp_hdrlen(skb) + skb->data_len;
+
+ if (payload_len <= skb_shinfo(skb)->gso_size)
+ return iwl_mvm_tx_mpdu(mvm, skb, sta);
+
+ __skb_queue_head_init(&mpdus_skbs);
+
+ ret = iwl_mvm_tx_tso(mvm, skb, sta, &mpdus_skbs);
+ if (ret)
+ return ret;
+
+ if (WARN_ON(skb_queue_empty(&mpdus_skbs)))
+ return ret;
+
+ while (!skb_queue_empty(&mpdus_skbs)) {
+ struct sk_buff *skb = __skb_dequeue(&mpdus_skbs);
+
+ ret = iwl_mvm_tx_mpdu(mvm, skb, sta);
+ if (ret) {
+ __skb_queue_purge(&mpdus_skbs);
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
struct ieee80211_sta *sta, u8 tid)
{
--
2.5.0


2015-12-21 20:51:33

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 22/45] iwlwifi: dvm: fix compare_const_fl.cocci warnings

From: Julia Lawall <[email protected]>

Move constants to the right of binary operators.

Generated by: scripts/coccinelle/misc/compare_const_fl.cocci

type=cleanup

Signed-off-by: Fengguang Wu <[email protected]>
Signed-off-by: Julia Lawall <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/calib.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/calib.c b/drivers/net/wireless/intel/iwlwifi/dvm/calib.c
index 9be6362..07a4c64 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/calib.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/calib.c
@@ -311,7 +311,7 @@ static int iwl_sens_energy_cck(struct iwl_priv *priv,
/* If previous beacon had too many false alarms,
* give it some extra margin by reducing sensitivity again
* (but don't go below measured energy of desired Rx) */
- if (IWL_FA_TOO_MANY == data->nrg_prev_state) {
+ if (data->nrg_prev_state == IWL_FA_TOO_MANY) {
IWL_DEBUG_CALIB(priv, "... increasing margin\n");
if (data->nrg_th_cck > (max_nrg_cck + NRG_MARGIN))
data->nrg_th_cck -= NRG_MARGIN;
--
2.5.0


2015-12-21 20:52:43

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 42/45] iwlwifi: update key params on d0i3 entrance/exit

From: Eliad Peller <[email protected]>

In order to let the fw do offloading properly, we need
to provide various key data (e.g. PN).

Configure the params on d0i3 entrance, and update them
back on d0i3 exit.

Since d3 code is now called in d0i3 which requires runtime
pm only, make d3.0 depend on CONFIG_PM (rather than
CONFIG_PM_SLEEP), and add required #ifdefs and wrappers
where needed, so both CONFIG_PM=n and CONFIG_PM_RUNTIME=n
configurations will build correctly.

Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/Makefile | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 84 +++++++++++++++++++++----
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 31 ++++++---
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 64 +++++++++++--------
4 files changed, 136 insertions(+), 45 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
index 80c2f88..23e7e29 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/Makefile
@@ -7,6 +7,6 @@ iwlmvm-y += tt.o offloading.o tdls.o
iwlmvm-$(CONFIG_IWLWIFI_DEBUGFS) += debugfs.o debugfs-vif.o
iwlmvm-$(CONFIG_IWLWIFI_LEDS) += led.o
iwlmvm-y += tof.o fw-dbg.o
-iwlmvm-$(CONFIG_PM_SLEEP) += d3.o
+iwlmvm-$(CONFIG_PM) += d3.o

ccflags-y += -D__CHECK_ENDIAN__ -I$(src)/../
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 3e6b6d6..6ac4072 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -855,15 +855,38 @@ iwl_mvm_get_wowlan_config(struct iwl_mvm *mvm,
return 0;
}

+static void
+iwl_mvm_iter_d0i3_ap_keys(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ void (*iter)(struct ieee80211_hw *hw,
+ struct ieee80211_vif *vif,
+ struct ieee80211_sta *sta,
+ struct ieee80211_key_conf *key,
+ void *data),
+ void *data)
+{
+ struct ieee80211_sta *ap_sta;
+
+ rcu_read_lock();
+
+ ap_sta = rcu_dereference(mvm->fw_id_to_mac_id[mvm->d0i3_ap_sta_id]);
+ if (IS_ERR_OR_NULL(ap_sta))
+ goto out;
+
+ ieee80211_iter_keys_rcu(mvm->hw, vif, iter, data);
+out:
+ rcu_read_unlock();
+}
+
int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
struct ieee80211_vif *vif,
- bool configure_keys,
+ bool d0i3,
u32 cmd_flags)
{
struct iwl_wowlan_kek_kck_material_cmd kek_kck_cmd = {};
struct iwl_wowlan_tkip_params_cmd tkip_cmd = {};
struct wowlan_key_data key_data = {
- .configure_keys = configure_keys,
+ .configure_keys = !d0i3,
.use_rsc_tsc = false,
.tkip = &tkip_cmd,
.use_tkip = false,
@@ -876,15 +899,28 @@ int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
return -ENOMEM;

/*
- * Note that currently we don't propagate cmd_flags
- * to the iterator. In case of key_data.configure_keys,
- * all the configured commands are SYNC, and
- * iwl_mvm_wowlan_program_keys() will take care of
- * locking/unlocking mvm->mutex.
+ * if we have to configure keys, call ieee80211_iter_keys(),
+ * as we need non-atomic context in order to take the
+ * required locks.
+ * for the d0i3 we can't use ieee80211_iter_keys(), as
+ * taking (almost) any mutex might result in deadlock.
*/
- ieee80211_iter_keys(mvm->hw, vif,
- iwl_mvm_wowlan_program_keys,
- &key_data);
+ if (!d0i3) {
+ /*
+ * Note that currently we don't propagate cmd_flags
+ * to the iterator. In case of key_data.configure_keys,
+ * all the configured commands are SYNC, and
+ * iwl_mvm_wowlan_program_keys() will take care of
+ * locking/unlocking mvm->mutex.
+ */
+ ieee80211_iter_keys(mvm->hw, vif,
+ iwl_mvm_wowlan_program_keys,
+ &key_data);
+ } else {
+ iwl_mvm_iter_d0i3_ap_keys(mvm, vif,
+ iwl_mvm_wowlan_program_keys,
+ &key_data);
+ }

if (key_data.error) {
ret = -EIO;
@@ -909,7 +945,8 @@ int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
goto out;
}

- if (mvmvif->rekey_data.valid) {
+ /* configure rekey data only if offloaded rekey is supported (d3) */
+ if (mvmvif->rekey_data.valid && !d0i3) {
memset(&kek_kck_cmd, 0, sizeof(kek_kck_cmd));
memcpy(kek_kck_cmd.kck, mvmvif->rekey_data.kck,
NL80211_KCK_LEN);
@@ -956,7 +993,7 @@ iwl_mvm_wowlan_config(struct iwl_mvm *mvm,
* that isn't really a problem though.
*/
mutex_unlock(&mvm->mutex);
- ret = iwl_mvm_wowlan_config_key_params(mvm, vif, true,
+ ret = iwl_mvm_wowlan_config_key_params(mvm, vif, false,
CMD_ASYNC);
mutex_lock(&mvm->mutex);
if (ret)
@@ -1727,6 +1764,29 @@ out_unlock:
return false;
}

+void iwl_mvm_d0i3_update_keys(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ struct iwl_wowlan_status *status)
+{
+ struct iwl_mvm_d3_gtk_iter_data gtkdata = {
+ .status = status,
+ };
+
+ /*
+ * rekey handling requires taking locks that can't be taken now.
+ * however, d0i3 doesn't offload rekey, so we're fine.
+ */
+ if (WARN_ON_ONCE(status->num_of_gtk_rekeys))
+ return;
+
+ /* find last GTK that we used initially, if any */
+ gtkdata.find_phase = true;
+ iwl_mvm_iter_d0i3_ap_keys(mvm, vif, iwl_mvm_d3_update_keys, &gtkdata);
+
+ gtkdata.find_phase = false;
+ iwl_mvm_iter_d0i3_ap_keys(mvm, vif, iwl_mvm_d3_update_keys, &gtkdata);
+}
+
struct iwl_mvm_nd_query_results {
u32 matched_profiles;
struct iwl_scan_offload_profile_match matches[IWL_SCAN_MAX_PROFILES];
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 86409c5..287c162 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -405,7 +405,7 @@ struct iwl_mvm_vif {
*/
struct iwl_mvm_phy_ctxt *phy_ctxt;

-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_PM
/* WoWLAN GTK rekey data */
struct {
u8 kck[NL80211_KCK_LEN], kek[NL80211_KEK_LEN];
@@ -738,7 +738,7 @@ struct iwl_mvm {

struct ieee80211_vif *p2p_device_vif;

-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_PM
struct wiphy_wowlan_support wowlan;
int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;

@@ -1278,10 +1278,6 @@ static inline void iwl_mvm_leds_exit(struct iwl_mvm *mvm)
/* D3 (WoWLAN, NetDetect) */
int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
int iwl_mvm_resume(struct ieee80211_hw *hw);
-int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
- struct ieee80211_vif *vif,
- bool configure_keys,
- u32 cmd_flags);
void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled);
void iwl_mvm_set_rekey_data(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
@@ -1292,10 +1288,31 @@ void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, int idx);
extern const struct file_operations iwl_dbgfs_d3_test_ops;
-#ifdef CONFIG_PM_SLEEP
+#ifdef CONFIG_PM
+int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ bool host_awake,
+ u32 cmd_flags);
+void iwl_mvm_d0i3_update_keys(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ struct iwl_wowlan_status *status);
void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm,
struct ieee80211_vif *vif);
#else
+static inline int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ bool host_awake,
+ u32 cmd_flags)
+{
+ return 0;
+}
+
+static inline void iwl_mvm_d0i3_update_keys(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ struct iwl_wowlan_status *status)
+{
+}
+
static inline void
iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
{
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 2debce3..89ea70d 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -1076,6 +1076,7 @@ static void iwl_mvm_cmd_queue_full(struct iwl_op_mode *op_mode)

struct iwl_d0i3_iter_data {
struct iwl_mvm *mvm;
+ struct ieee80211_vif *connected_vif;
u8 ap_sta_id;
u8 vif_count;
u8 offloading_tid;
@@ -1167,6 +1168,12 @@ static void iwl_mvm_enter_d0i3_iterator(void *_data, u8 *mac,
*/
data->ap_sta_id = mvmvif->ap_sta_id;
data->vif_count++;
+
+ /*
+ * no new commands can be sent at this stage, so it's safe
+ * to save the vif pointer during d0i3 entrance.
+ */
+ data->connected_vif = vif;
}

static void iwl_mvm_set_wowlan_data(struct iwl_mvm *mvm,
@@ -1261,6 +1268,10 @@ int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode)

/* configure wowlan configuration only if needed */
if (mvm->d0i3_ap_sta_id != IWL_MVM_STATION_COUNT) {
+ iwl_mvm_wowlan_config_key_params(mvm,
+ d0i3_iter_data.connected_vif,
+ true, flags);
+
iwl_mvm_set_wowlan_data(mvm, &wowlan_config_cmd,
&d0i3_iter_data);

@@ -1290,25 +1301,30 @@ static void iwl_mvm_exit_d0i3_iterator(void *_data, u8 *mac,
iwl_mvm_update_d0i3_power_mode(mvm, vif, false, flags);
}

-struct iwl_mvm_wakeup_reason_iter_data {
+struct iwl_mvm_d0i3_exit_work_iter_data {
struct iwl_mvm *mvm;
+ struct iwl_wowlan_status *status;
u32 wakeup_reasons;
};

-static void iwl_mvm_d0i3_wakeup_reason_iter(void *_data, u8 *mac,
- struct ieee80211_vif *vif)
+static void iwl_mvm_d0i3_exit_work_iter(void *_data, u8 *mac,
+ struct ieee80211_vif *vif)
{
- struct iwl_mvm_wakeup_reason_iter_data *data = _data;
+ struct iwl_mvm_d0i3_exit_work_iter_data *data = _data;
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+ u32 reasons = data->wakeup_reasons;

- if (vif->type == NL80211_IFTYPE_STATION && vif->bss_conf.assoc &&
- data->mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id) {
- if (data->wakeup_reasons &
- IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH)
- iwl_mvm_connection_loss(data->mvm, vif, "D0i3");
- else
- ieee80211_beacon_loss(vif);
- }
+ /* consider only the relevant station interface */
+ if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc ||
+ data->mvm->d0i3_ap_sta_id != mvmvif->ap_sta_id)
+ return;
+
+ if (reasons & IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH)
+ iwl_mvm_connection_loss(data->mvm, vif, "D0i3");
+ else if (reasons & IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON)
+ ieee80211_beacon_loss(vif);
+ else
+ iwl_mvm_d0i3_update_keys(data->mvm, vif, data->status);
}

void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq)
@@ -1374,9 +1390,13 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)
.id = WOWLAN_GET_STATUSES,
.flags = CMD_HIGH_PRIO | CMD_WANT_SKB,
};
+ struct iwl_mvm_d0i3_exit_work_iter_data iter_data = {
+ .mvm = mvm,
+ };
+
struct iwl_wowlan_status *status;
int ret;
- u32 handled_reasons, wakeup_reasons = 0;
+ u32 wakeup_reasons = 0;
__le16 *qos_seq = NULL;

mutex_lock(&mvm->mutex);
@@ -1393,18 +1413,12 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)

IWL_DEBUG_RPM(mvm, "wakeup reasons: 0x%x\n", wakeup_reasons);

- handled_reasons = IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_MISSED_BEACON |
- IWL_WOWLAN_WAKEUP_BY_DISCONNECTION_ON_DEAUTH;
- if (wakeup_reasons & handled_reasons) {
- struct iwl_mvm_wakeup_reason_iter_data data = {
- .mvm = mvm,
- .wakeup_reasons = wakeup_reasons,
- };
-
- ieee80211_iterate_active_interfaces(
- mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
- iwl_mvm_d0i3_wakeup_reason_iter, &data);
- }
+ iter_data.wakeup_reasons = wakeup_reasons;
+ iter_data.status = status;
+ ieee80211_iterate_active_interfaces(mvm->hw,
+ IEEE80211_IFACE_ITER_NORMAL,
+ iwl_mvm_d0i3_exit_work_iter,
+ &iter_data);
out:
iwl_mvm_d0i3_enable_tx(mvm, qos_seq);

--
2.5.0


2015-12-21 20:51:35

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 23/45] iwlwifi: change the Intel Wireless email address

[email protected] is not available anymore.
[email protected] should be used instead.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/agn.h | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/dev.h | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/led.h | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/main.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/rs.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/rs.h | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/rx.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/rxon.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/scan.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/sta.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/tt.c | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/tt.h | 2 +-
drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-7000.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-8000.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-config.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-csr.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-debug.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-debug.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-drv.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-drv.h | 4 ++--
drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-io.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-modparams.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-prph.h | 2 +-
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/coex.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/coex_legacy.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/constants.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-coex.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/power.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/quota.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/rs.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/rx.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/sta.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/tdls.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/tof.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/tof.h | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 2 +-
drivers/net/wireless/intel/iwlwifi/mvm/utils.c | 2 +-
drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 2 +-
drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 2 +-
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 2 +-
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 2 +-
68 files changed, 69 insertions(+), 69 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/agn.h b/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
index 82c177a..9de277c 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/agn.h
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
index a114d3e..74c5161 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/debugfs.c
@@ -22,7 +22,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*****************************************************************************/

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/dev.h b/drivers/net/wireless/intel/iwlwifi/dvm/dev.h
index 0ba3e56..1a7ead7 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/dev.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/dev.h
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/led.h b/drivers/net/wireless/intel/iwlwifi/dvm/led.h
index 1c6b225..75f74ed 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/led.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/led.h
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
index f4c2529..29ea1c6 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
@@ -22,7 +22,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index 9f6f564..94bc66a 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -23,7 +23,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
index cef921c..ee75055 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rs.h b/drivers/net/wireless/intel/iwlwifi/dvm/rs.h
index f6bd25c..c5fe445 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.h
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
index 94b41e4..52ab1e0 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rx.c
@@ -23,7 +23,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rxon.c b/drivers/net/wireless/intel/iwlwifi/dvm/rxon.c
index 85ceceb..2d47cb2 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/rxon.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/rxon.c
@@ -20,7 +20,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/scan.c b/drivers/net/wireless/intel/iwlwifi/dvm/scan.c
index 6481594..81a2ddb 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/scan.c
@@ -22,7 +22,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*****************************************************************************/
#include <linux/slab.h>
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/sta.c b/drivers/net/wireless/intel/iwlwifi/dvm/sta.c
index 0fa67d3..8e9768a 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/sta.c
@@ -22,7 +22,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tt.c b/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
index c4736c8..7decfc5 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tt.c
@@ -22,7 +22,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*****************************************************************************/

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tt.h b/drivers/net/wireless/intel/iwlwifi/dvm/tt.h
index 5077265..d324e9b 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tt.h
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tt.h
@@ -22,7 +22,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*****************************************************************************/
#ifndef __iwl_tt_setting_h__
diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
index bddd197..cf0ad5f 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
@@ -22,7 +22,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-7000.c b/drivers/net/wireless/intel/iwlwifi/iwl-7000.c
index 390ee4d..fd9064b 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-7000.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-7000.c
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-8000.c b/drivers/net/wireless/intel/iwlwifi/iwl-8000.c
index 89a25cf..dee4458 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-8000.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-8000.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-config.h b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
index 6a4c0c2..f990481 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-config.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-config.h
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
index 543abea..163b21b 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-debug.c b/drivers/net/wireless/intel/iwlwifi/iwl-debug.c
index 09feff4..b1c3b0d 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-debug.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-debug.c
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-debug.h b/drivers/net/wireless/intel/iwlwifi/iwl-debug.h
index e8dbb24..1103332 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-debug.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-debug.h
@@ -21,7 +21,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
index eb4b99a..22786d7 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
@@ -20,7 +20,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
index 90987d6..1d9dd153 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h
index b87acd6..f4d3cd0 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.h
@@ -19,7 +19,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
index 47a83ab..7acb490 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-drv.h b/drivers/net/wireless/intel/iwlwifi/iwl-drv.h
index cda746b..f6eacfd 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-drv.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-drv.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
@@ -69,7 +69,7 @@
/* for all modules */
#define DRV_NAME "iwlwifi"
#define DRV_COPYRIGHT "Copyright(c) 2003- 2015 Intel Corporation"
-#define DRV_AUTHOR "<[email protected]>"
+#define DRV_AUTHOR "<[email protected]>"

/* radio config bits (actual values from NVM definition) */
#define NVM_RF_CFG_DASH_MSK(x) (x & 0x3) /* bits 0-1 */
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
index e08319a..d2294ad6 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-fw-file.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-io.c b/drivers/net/wireless/intel/iwlwifi/iwl-io.c
index 603c894..07ad5c8 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-io.c
@@ -22,7 +22,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
index 9baf9ef..fd42f63 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-modparams.h
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h b/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
index ffff31c..b49eda8 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-op-mode.h
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c b/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c
index a105455..4a4dea0 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.c
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h b/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h
index 9ee18d0..2410387 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-phy-db.h
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
index 3ab777f..9da7dc4 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-prph.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 8caf68b..777fd6c 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/coex.c b/drivers/net/wireless/intel/iwlwifi/mvm/coex.c
index c9ca029..2e098f8 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/coex.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/coex.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/coex_legacy.c b/drivers/net/wireless/intel/iwlwifi/mvm/coex_legacy.c
index 61c07b0..0150457 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/coex_legacy.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/coex_legacy.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
index 5c21231..1f8f616 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 8824a89..8cd2e67 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
index 7904b41..9e0d463 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs-vif.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
index 9ce7587..2acf9ff 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-coex.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-coex.h
index d398a61..2a33b69 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-coex.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-coex.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
index 9a8a37f..af7f9dd 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
index 3a657e4..d92712d 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
index 3f7478b..995898c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
index 05c9333..e6e8088 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
index ee511aa..d00a6e9 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 3a78a3f..0fb10fd 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index d8760fa..ce9f579 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
index a9fcb15..d8dcb67 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 4753ecd..ffcebea 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
index e68a475..6e6a56f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/phy-ctxt.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/power.c b/drivers/net/wireless/intel/iwlwifi/mvm/power.c
index bed9696..87a9f24 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/power.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/power.c
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/quota.c b/drivers/net/wireless/intel/iwlwifi/mvm/quota.c
index 509a66d..0b762b4 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/quota.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/quota.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
index 31b082e..7bb6fd0 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c
@@ -20,7 +20,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h
index 81314ad..bdb6f2d 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.h
@@ -20,7 +20,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
index a0e957a..145ec68 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index 4887418..87cc993 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index df1fed7..4148ebe 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
index ce1b16a..973f2ed 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c b/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c
index fe2fa56..18711c5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tdls.c
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tof.c b/drivers/net/wireless/intel/iwlwifi/mvm/tof.c
index 4007f1d..a1947d6 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tof.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tof.c
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tof.h b/drivers/net/wireless/intel/iwlwifi/mvm/tof.h
index 9beebc3..8c3421c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tof.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tof.h
@@ -25,7 +25,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index cc0cdce..4d13df1 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
index bbb7f6b..3a989f5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
@@ -27,7 +27,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 9bdce44..4f94be9 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 0aceb9f..92a35d9 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -23,7 +23,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 05d5a5b..a5bf24e 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -26,7 +26,7 @@
* in the file called COPYING.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
* BSD LICENSE
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index f2277c7..2952915 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -23,7 +23,7 @@
* file called LICENSE.
*
* Contact Information:
- * Intel Linux Wireless <[email protected]>
+ * Intel Linux Wireless <[email protected]>
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*
*****************************************************************************/
--
2.5.0


2015-12-21 20:52:17

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 28/45] iwlwifi: pcie: build an A-MSDU using TSO core

When the op_mode sends an skb whose payload is bigger than
MSS, PCIe will create an A-MSDU out of it. PCIe assumes
that the skb that is coming from the op_mode can fit in one
A-MSDU. It is the op_mode's responsibility to make sure
that this guarantee holds.

Additional headers need to be built for the subframes.
The TSO core code takes care of the IP / TCP headers and
the driver takes care of the 802.11 subframe headers.

These headers are stored on a per-cpu page that is re-used
for all the packets handled on that same CPU. Each skb
holds a reference to that page and releases the page when
it is reclaimed. When the page gets full, it is released
and a new one is allocated.

Since any SKB that doesn't go through the fast-xmit path
of mac80211 will be segmented, we can assume here that the
packet is not WEP / TKIP and has a proper SNAP header.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
.../net/wireless/intel/iwlwifi/iwl-devtrace-data.h | 17 ++
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 10 +-
drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 7 +
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 16 ++
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 283 ++++++++++++++++++++-
5 files changed, 328 insertions(+), 5 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h
index bde0233..d80312b 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-data.h
@@ -1,6 +1,7 @@
/******************************************************************************
*
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
+ * Copyright(c) 2015 Intel Deutschland GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
@@ -51,6 +52,22 @@ TRACE_EVENT(iwlwifi_dev_tx_data,
TP_printk("[%s] TX frame data", __get_str(dev))
);

+TRACE_EVENT(iwlwifi_dev_tx_tso_chunk,
+ TP_PROTO(const struct device *dev,
+ u8 *data_src, size_t data_len),
+ TP_ARGS(dev, data_src, data_len),
+ TP_STRUCT__entry(
+ DEV_ENTRY
+
+ __dynamic_array(u8, data, data_len)
+ ),
+ TP_fast_assign(
+ DEV_ASSIGN;
+ memcpy(__get_dynamic_array(data), data_src, data_len);
+ ),
+ TP_printk("[%s] TX frame data", __get_str(dev))
+);
+
TRACE_EVENT(iwlwifi_dev_rx_data,
TP_PROTO(const struct device *dev,
const struct iwl_trans *trans,
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index a2683ef..43a4874 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -381,6 +381,11 @@ static inline void iwl_free_rxb(struct iwl_rx_cmd_buffer *r)

#define MAX_NO_RECLAIM_CMDS 6

+/*
+ * The first entry in driver_data array in ieee80211_tx_info
+ * that can be used by the transport.
+ */
+#define IWL_TRANS_FIRST_DRIVER_DATA 2
#define IWL_MASK(lo, hi) ((1 << (hi)) | ((1 << (hi)) - (1 << (lo))))

/*
@@ -553,7 +558,10 @@ struct iwl_trans_txq_scd_cfg {
* return -ERFKILL straight away.
* May sleep only if CMD_ASYNC is not set
* @tx: send an skb. The transport relies on the op_mode to zero the
- * the ieee80211_tx_info->driver_data.
+ * the ieee80211_tx_info->driver_data. If the MPDU is an A-MSDU, all
+ * the CSUM will be taken care of (TCP CSUM and IP header in case of
+ * IPv4). If the MPDU is a single MSDU, the op_mode must compute the IP
+ * header if it is IPv4.
* Must be atomic
* @reclaim: free packet until ssn. Returns a list of freed packets.
* Must be atomic
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 3d47dd7..cc3888e 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -289,6 +289,11 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx)
sizeof(struct iwl_pcie_txq_scratch_buf) * idx;
}

+struct iwl_tso_hdr_page {
+ struct page *page;
+ u8 *pos;
+};
+
/**
* struct iwl_trans_pcie - PCIe transport specific data
* @rxq: all the RX queue data
@@ -326,6 +331,8 @@ struct iwl_trans_pcie {
struct net_device napi_dev;
struct napi_struct napi;

+ struct __percpu iwl_tso_hdr_page *tso_hdr_page;
+
/* INT ICT Table */
__le32 *ict_tbl;
dma_addr_t ict_tbl_dma;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 97e22fb..e804190 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1465,6 +1465,7 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
void iwl_trans_pcie_free(struct iwl_trans *trans)
{
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+ int i;

synchronize_irq(trans_pcie->pci_dev->irq);

@@ -1484,6 +1485,15 @@ void iwl_trans_pcie_free(struct iwl_trans *trans)

iwl_pcie_free_fw_monitor(trans);

+ for_each_possible_cpu(i) {
+ struct iwl_tso_hdr_page *p =
+ per_cpu_ptr(trans_pcie->tso_hdr_page, i);
+
+ if (p->page)
+ __free_page(p->page);
+ }
+
+ free_percpu(trans_pcie->tso_hdr_page);
iwl_trans_free(trans);
}

@@ -2542,6 +2552,11 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
spin_lock_init(&trans_pcie->ref_lock);
mutex_init(&trans_pcie->mutex);
init_waitqueue_head(&trans_pcie->ucode_write_waitq);
+ trans_pcie->tso_hdr_page = alloc_percpu(struct iwl_tso_hdr_page);
+ if (!trans_pcie->tso_hdr_page) {
+ ret = -ENOMEM;
+ goto out_no_pci;
+ }

ret = pci_enable_device(pdev);
if (ret)
@@ -2690,6 +2705,7 @@ out_pci_release_regions:
out_pci_disable_device:
pci_disable_device(pdev);
out_no_pci:
+ free_percpu(trans_pcie->tso_hdr_page);
iwl_trans_free(trans);
return ERR_PTR(ret);
}
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 890148c6..a85ae10 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -28,8 +28,12 @@
*
*****************************************************************************/
#include <linux/etherdevice.h>
+#include <linux/ieee80211.h>
#include <linux/slab.h>
#include <linux/sched.h>
+#include <net/ip6_checksum.h>
+#include <net/tso.h>
+#include <net/ip6_checksum.h>

#include "iwl-debug.h"
#include "iwl-csr.h"
@@ -578,6 +582,19 @@ static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq,
return 0;
}

+static void iwl_pcie_free_tso_page(struct sk_buff *skb)
+{
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+
+ if (info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA]) {
+ struct page *page =
+ info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA];
+
+ __free_page(page);
+ info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA] = NULL;
+ }
+}
+
/*
* iwl_pcie_txq_unmap - Unmap any remaining DMA mappings and free skb's
*/
@@ -591,6 +608,15 @@ static void iwl_pcie_txq_unmap(struct iwl_trans *trans, int txq_id)
while (q->write_ptr != q->read_ptr) {
IWL_DEBUG_TX_REPLY(trans, "Q %d Free %d\n",
txq_id, q->read_ptr);
+
+ if (txq_id != trans_pcie->cmd_queue) {
+ struct sk_buff *skb = txq->entries[q->read_ptr].skb;
+
+ if (WARN_ON_ONCE(!skb))
+ continue;
+
+ iwl_pcie_free_tso_page(skb);
+ }
iwl_pcie_txq_free_tfd(trans, txq);
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr);
}
@@ -1008,11 +1034,14 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn,
for (;
q->read_ptr != tfd_num;
q->read_ptr = iwl_queue_inc_wrap(q->read_ptr)) {
+ struct sk_buff *skb = txq->entries[txq->q.read_ptr].skb;

- if (WARN_ON_ONCE(txq->entries[txq->q.read_ptr].skb == NULL))
+ if (WARN_ON_ONCE(!skb))
continue;

- __skb_queue_tail(skbs, txq->entries[txq->q.read_ptr].skb);
+ iwl_pcie_free_tso_page(skb);
+
+ __skb_queue_tail(skbs, skb);

txq->entries[txq->q.read_ptr].skb = NULL;

@@ -1858,6 +1887,245 @@ static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb,
return 0;
}

+#ifdef CONFIG_INET
+static struct iwl_tso_hdr_page *
+get_page_hdr(struct iwl_trans *trans, size_t len)
+{
+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+ struct iwl_tso_hdr_page *p = this_cpu_ptr(trans_pcie->tso_hdr_page);
+
+ if (!p->page)
+ goto alloc;
+
+ /* enough room on this page */
+ if (p->pos + len < (u8 *)page_address(p->page) + PAGE_SIZE)
+ return p;
+
+ /* We don't have enough room on this page, get a new one. */
+ __free_page(p->page);
+
+alloc:
+ p->page = alloc_page(GFP_ATOMIC);
+ if (!p->page)
+ return NULL;
+ p->pos = page_address(p->page);
+ return p;
+}
+
+static void iwl_compute_pseudo_hdr_csum(void *iph, struct tcphdr *tcph,
+ bool ipv6, unsigned int len)
+{
+ if (ipv6) {
+ struct ipv6hdr *iphv6 = iph;
+
+ tcph->check = ~csum_ipv6_magic(&iphv6->saddr, &iphv6->daddr,
+ len + tcph->doff * 4,
+ IPPROTO_TCP, 0);
+ } else {
+ struct iphdr *iphv4 = iph;
+
+ ip_send_check(iphv4);
+ tcph->check = ~csum_tcpudp_magic(iphv4->saddr, iphv4->daddr,
+ len + tcph->doff * 4,
+ IPPROTO_TCP, 0);
+ }
+}
+
+static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
+ struct iwl_txq *txq, u8 hdr_len,
+ struct iwl_cmd_meta *out_meta,
+ struct iwl_device_cmd *dev_cmd, u16 tb1_len)
+{
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+ struct iwl_trans_pcie *trans_pcie = txq->trans_pcie;
+ struct ieee80211_hdr *hdr = (void *)skb->data;
+ unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room;
+ unsigned int mss = skb_shinfo(skb)->gso_size;
+ struct iwl_queue *q = &txq->q;
+ u16 length, iv_len, amsdu_pad;
+ u8 *start_hdr;
+ struct iwl_tso_hdr_page *hdr_page;
+ int ret;
+ struct tso_t tso;
+
+ /* if the packet is protected, then it must be CCMP or GCMP */
+ BUILD_BUG_ON(IEEE80211_CCMP_HDR_LEN != IEEE80211_GCMP_HDR_LEN);
+ iv_len = ieee80211_has_protected(hdr->frame_control) ?
+ IEEE80211_CCMP_HDR_LEN : 0;
+
+ trace_iwlwifi_dev_tx(trans->dev, skb,
+ &txq->tfds[txq->q.write_ptr],
+ sizeof(struct iwl_tfd),
+ &dev_cmd->hdr, IWL_HCMD_SCRATCHBUF_SIZE + tb1_len,
+ NULL, 0);
+
+ ip_hdrlen = skb_transport_header(skb) - skb_network_header(skb);
+ snap_ip_tcp_hdrlen = 8 + ip_hdrlen + tcp_hdrlen(skb);
+ total_len = skb->len - snap_ip_tcp_hdrlen - hdr_len - iv_len;
+ amsdu_pad = 0;
+
+ /* total amount of header we may need for this A-MSDU */
+ hdr_room = DIV_ROUND_UP(total_len, mss) *
+ (3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr)) + iv_len;
+
+ /* Our device supports 9 segments at most, it will fit in 1 page */
+ hdr_page = get_page_hdr(trans, hdr_room);
+ if (!hdr_page)
+ return -ENOMEM;
+
+ get_page(hdr_page->page);
+ start_hdr = hdr_page->pos;
+ info->driver_data[IWL_TRANS_FIRST_DRIVER_DATA] = hdr_page->page;
+ memcpy(hdr_page->pos, skb->data + hdr_len, iv_len);
+ hdr_page->pos += iv_len;
+
+ /*
+ * Pull the ieee80211 header + IV to be able to use TSO core,
+ * we will restore it for the tx_status flow.
+ */
+ skb_pull(skb, hdr_len + iv_len);
+
+ tso_start(skb, &tso);
+
+ while (total_len) {
+ /* this is the data left for this subframe */
+ unsigned int data_left =
+ min_t(unsigned int, mss, total_len);
+ struct sk_buff *csum_skb = NULL;
+ unsigned int hdr_tb_len;
+ dma_addr_t hdr_tb_phys;
+ struct tcphdr *tcph;
+ u8 *iph;
+
+ total_len -= data_left;
+
+ memset(hdr_page->pos, 0, amsdu_pad);
+ hdr_page->pos += amsdu_pad;
+ amsdu_pad = (4 - (sizeof(struct ethhdr) + snap_ip_tcp_hdrlen +
+ data_left)) & 0x3;
+ ether_addr_copy(hdr_page->pos, ieee80211_get_DA(hdr));
+ hdr_page->pos += ETH_ALEN;
+ ether_addr_copy(hdr_page->pos, ieee80211_get_SA(hdr));
+ hdr_page->pos += ETH_ALEN;
+
+ length = snap_ip_tcp_hdrlen + data_left;
+ *((__be16 *)hdr_page->pos) = cpu_to_be16(length);
+ hdr_page->pos += sizeof(length);
+
+ /*
+ * This will copy the SNAP as well which will be considered
+ * as MAC header.
+ */
+ tso_build_hdr(skb, hdr_page->pos, &tso, data_left, !total_len);
+ iph = hdr_page->pos + 8;
+ tcph = (void *)(iph + ip_hdrlen);
+
+ /* For testing on current hardware only */
+ if (trans_pcie->sw_csum_tx) {
+ csum_skb = alloc_skb(data_left + tcp_hdrlen(skb),
+ GFP_ATOMIC);
+ if (!csum_skb) {
+ ret = -ENOMEM;
+ goto out_unmap;
+ }
+
+ iwl_compute_pseudo_hdr_csum(iph, tcph,
+ skb->protocol ==
+ htons(ETH_P_IPV6),
+ data_left);
+
+ memcpy(skb_put(csum_skb, tcp_hdrlen(skb)),
+ tcph, tcp_hdrlen(skb));
+ skb_set_transport_header(csum_skb, 0);
+ csum_skb->csum_start =
+ (unsigned char *)tcp_hdr(csum_skb) -
+ csum_skb->head;
+ }
+
+ hdr_page->pos += snap_ip_tcp_hdrlen;
+
+ hdr_tb_len = hdr_page->pos - start_hdr;
+ hdr_tb_phys = dma_map_single(trans->dev, start_hdr,
+ hdr_tb_len, DMA_TO_DEVICE);
+ if (unlikely(dma_mapping_error(trans->dev, hdr_tb_phys))) {
+ dev_kfree_skb(csum_skb);
+ ret = -EINVAL;
+ goto out_unmap;
+ }
+ iwl_pcie_txq_build_tfd(trans, txq, hdr_tb_phys,
+ hdr_tb_len, false);
+ trace_iwlwifi_dev_tx_tso_chunk(trans->dev, start_hdr,
+ hdr_tb_len);
+
+ /* prepare the start_hdr for the next subframe */
+ start_hdr = hdr_page->pos;
+
+ /* put the payload */
+ while (data_left) {
+ unsigned int size = min_t(unsigned int, tso.size,
+ data_left);
+ dma_addr_t tb_phys;
+
+ if (trans_pcie->sw_csum_tx)
+ memcpy(skb_put(csum_skb, size), tso.data, size);
+
+ tb_phys = dma_map_single(trans->dev, tso.data,
+ size, DMA_TO_DEVICE);
+ if (unlikely(dma_mapping_error(trans->dev, tb_phys))) {
+ dev_kfree_skb(csum_skb);
+ ret = -EINVAL;
+ goto out_unmap;
+ }
+
+ iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
+ size, false);
+ trace_iwlwifi_dev_tx_tso_chunk(trans->dev, tso.data,
+ size);
+
+ data_left -= size;
+ tso_build_data(skb, &tso, size);
+ }
+
+ /* For testing on early hardware only */
+ if (trans_pcie->sw_csum_tx) {
+ __wsum csum;
+
+ csum = skb_checksum(csum_skb,
+ skb_checksum_start_offset(csum_skb),
+ csum_skb->len -
+ skb_checksum_start_offset(csum_skb),
+ 0);
+ dev_kfree_skb(csum_skb);
+ dma_sync_single_for_cpu(trans->dev, hdr_tb_phys,
+ hdr_tb_len, DMA_TO_DEVICE);
+ tcph->check = csum_fold(csum);
+ dma_sync_single_for_device(trans->dev, hdr_tb_phys,
+ hdr_tb_len, DMA_TO_DEVICE);
+ }
+ }
+
+ /* re -add the WiFi header and IV */
+ skb_push(skb, hdr_len + iv_len);
+
+ return 0;
+
+out_unmap:
+ iwl_pcie_tfd_unmap(trans, out_meta, &txq->tfds[q->write_ptr]);
+ return ret;
+}
+#else /* CONFIG_INET */
+static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
+ struct iwl_txq *txq, u8 hdr_len,
+ struct iwl_cmd_meta *out_meta,
+ struct iwl_device_cmd *dev_cmd, u16 tb1_len)
+{
+ /* No A-MSDU without CONFIG_INET */
+ WARN_ON(1);
+
+ return -1;
+}
+#endif /* CONFIG_INET */
+
int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
struct iwl_device_cmd *dev_cmd, int txq_id)
{
@@ -1969,9 +2237,16 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
goto out_err;
iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false);

- if (unlikely(iwl_fill_data_tbs(trans, skb, txq, hdr_len,
- out_meta, dev_cmd, tb1_len)))
+ if (ieee80211_is_data_qos(fc) &&
+ (*ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_A_MSDU_PRESENT)) {
+ if (unlikely(iwl_fill_data_tbs_amsdu(trans, skb, txq, hdr_len,
+ out_meta, dev_cmd,
+ tb1_len)))
+ goto out_err;
+ } else if (unlikely(iwl_fill_data_tbs(trans, skb, txq, hdr_len,
+ out_meta, dev_cmd, tb1_len))) {
goto out_err;
+ }

/* Set up entry for this TFD in Tx byte-count array */
iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len));
--
2.5.0


2015-12-21 20:52:31

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 36/45] iwlwifi: mvm: change iwl_mvm_get_key_sta_id() to return the station

From: Johannes Berg <[email protected]>

The code in iwl_mvm_update_tkip_key() is now pretty much duplicated
with the code in iwl_mvm_get_key_sta_id() doing the station ID lookup
again after it was already done. Change iwl_mvm_get_key_sta_id() to
iwl_mvm_get_key_sta(), returning the mvm_sta pointer, to allow that
duplicate code to be removed.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 53 ++++++++++++----------------
1 file changed, 22 insertions(+), 31 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index bfa4699..2c9675b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1228,17 +1228,14 @@ static int iwl_mvm_set_fw_key_idx(struct iwl_mvm *mvm)
return max_offs;
}

-static u8 iwl_mvm_get_key_sta_id(struct iwl_mvm *mvm,
- struct ieee80211_vif *vif,
- struct ieee80211_sta *sta)
+static struct iwl_mvm_sta *iwl_mvm_get_key_sta(struct iwl_mvm *mvm,
+ struct ieee80211_vif *vif,
+ struct ieee80211_sta *sta)
{
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);

- if (sta) {
- struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
-
- return mvm_sta->sta_id;
- }
+ if (sta)
+ return iwl_mvm_sta_from_mac80211(sta);

/*
* The device expects GTKs for station interfaces to be
@@ -1257,12 +1254,12 @@ static u8 iwl_mvm_get_key_sta_id(struct iwl_mvm *mvm,
* be the AP ID, and no station was passed by mac80211.
*/
if (IS_ERR_OR_NULL(sta))
- return IWL_MVM_STATION_COUNT;
+ return NULL;

- return sta_id;
+ return iwl_mvm_sta_from_mac80211(sta);
}

- return IWL_MVM_STATION_COUNT;
+ return NULL;
}

static int iwl_mvm_send_sta_key(struct iwl_mvm *mvm,
@@ -1479,6 +1476,7 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
u8 key_offset)
{
bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);
+ struct iwl_mvm_sta *mvm_sta;
u8 sta_id;
int ret;
static const u8 __maybe_unused zero_addr[ETH_ALEN] = {0};
@@ -1486,11 +1484,12 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
lockdep_assert_held(&mvm->mutex);

/* Get the station id from the mvm local station table */
- sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
- if (sta_id == IWL_MVM_STATION_COUNT) {
- IWL_ERR(mvm, "Failed to find station id\n");
+ mvm_sta = iwl_mvm_get_key_sta(mvm, vif, sta);
+ if (!mvm_sta) {
+ IWL_ERR(mvm, "Failed to find station\n");
return -EINVAL;
}
+ sta_id = mvm_sta->sta_id;

if (keyconf->cipher == WLAN_CIPHER_SUITE_AES_CMAC) {
ret = iwl_mvm_send_sta_igtk(mvm, keyconf, sta_id, false);
@@ -1566,13 +1565,14 @@ int iwl_mvm_remove_sta_key(struct iwl_mvm *mvm,
struct ieee80211_key_conf *keyconf)
{
bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);
- u8 sta_id;
+ struct iwl_mvm_sta *mvm_sta;
+ u8 sta_id = IWL_MVM_STATION_COUNT;
int ret, i;

lockdep_assert_held(&mvm->mutex);

- /* Get the station id from the mvm local station table */
- sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
+ /* Get the station from the mvm local station table */
+ mvm_sta = iwl_mvm_get_key_sta(mvm, vif, sta);

IWL_DEBUG_WEP(mvm, "mvm remove dynamic key: idx=%d sta=%d\n",
keyconf->keyidx, sta_id);
@@ -1593,11 +1593,13 @@ int iwl_mvm_remove_sta_key(struct iwl_mvm *mvm,
}
mvm->fw_key_deleted[keyconf->hw_key_idx] = 0;

- if (sta_id == IWL_MVM_STATION_COUNT) {
+ if (!mvm_sta) {
IWL_DEBUG_WEP(mvm, "station non-existent, early return.\n");
return 0;
}

+ sta_id = mvm_sta->sta_id;
+
ret = __iwl_mvm_remove_sta_key(mvm, sta_id, keyconf, mcast);
if (ret)
return ret;
@@ -1617,24 +1619,13 @@ void iwl_mvm_update_tkip_key(struct iwl_mvm *mvm,
u16 *phase1key)
{
struct iwl_mvm_sta *mvm_sta;
- u8 sta_id;
bool mcast = !(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE);

rcu_read_lock();

- sta_id = iwl_mvm_get_key_sta_id(mvm, vif, sta);
- if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT))
+ mvm_sta = iwl_mvm_get_key_sta(mvm, vif, sta);
+ if (WARN_ON_ONCE(!mvm_sta))
goto unlock;
-
- if (!sta) {
- sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
- if (WARN_ON(IS_ERR_OR_NULL(sta))) {
- rcu_read_unlock();
- return;
- }
- }
-
- mvm_sta = iwl_mvm_sta_from_mac80211(sta);
iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, mcast,
iv32, phase1key, CMD_ASYNC, keyconf->hw_key_idx);

--
2.5.0


2015-12-21 20:52:22

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 31/45] iwlwifi: mvm: enable L3 filtering

From: Sara Sharon <[email protected]>

Firmware will support filtering multicast L3 packets.
The L3 filtering is configured by the WOWLAN_CONFIG command.
All flags should be enabled by default.
Older firmware is not affected as it does not look into
this field.

Signed-off-by: Sara Sharon <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 2 ++
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h | 13 +++++++++++--
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 3 ++-
3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 69fd10a..3e6b6d6 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -804,6 +804,8 @@ iwl_mvm_get_wowlan_config(struct iwl_mvm *mvm,

wowlan_config_cmd->is_11n_connection =
ap_sta->ht_cap.ht_supported;
+ wowlan_config_cmd->flags = ENABLE_L3_FILTERING |
+ ENABLE_NBNS_FILTERING | ENABLE_DHCP_FILTERING;

/* Query the last used seqno and set it */
ret = iwl_mvm_get_last_nonqos_seq(mvm, vif);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
index c36c956..62b9a0a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-d3.h
@@ -7,6 +7,7 @@
*
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
+ * Copyright(c) 2015 Intel Deutschland GmbH
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of version 2 of the GNU General Public License as
@@ -245,6 +246,13 @@ enum iwl_wowlan_wakeup_filters {
IWL_WOWLAN_WAKEUP_BCN_FILTERING = BIT(16),
}; /* WOWLAN_WAKEUP_FILTER_API_E_VER_4 */

+enum iwl_wowlan_flags {
+ IS_11W_ASSOC = BIT(0),
+ ENABLE_L3_FILTERING = BIT(1),
+ ENABLE_NBNS_FILTERING = BIT(2),
+ ENABLE_DHCP_FILTERING = BIT(3),
+};
+
struct iwl_wowlan_config_cmd {
__le32 wakeup_filter;
__le16 non_qos_seq;
@@ -252,8 +260,9 @@ struct iwl_wowlan_config_cmd {
u8 wowlan_ba_teardown_tids;
u8 is_11n_connection;
u8 offloading_tid;
- u8 reserved[3];
-} __packed; /* WOWLAN_CONFIG_API_S_VER_3 */
+ u8 flags;
+ u8 reserved[2];
+} __packed; /* WOWLAN_CONFIG_API_S_VER_4 */

/*
* WOWLAN_TSC_RSC_PARAMS
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 50b8c01..a5e1c8e 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -1186,7 +1186,8 @@ static void iwl_mvm_set_wowlan_data(struct iwl_mvm *mvm,
mvm_ap_sta = iwl_mvm_sta_from_mac80211(ap_sta);
cmd->is_11n_connection = ap_sta->ht_cap.ht_supported;
cmd->offloading_tid = iter_data->offloading_tid;
-
+ cmd->flags = ENABLE_L3_FILTERING | ENABLE_NBNS_FILTERING |
+ ENABLE_DHCP_FILTERING;
/*
* The d0i3 uCode takes care of the nonqos counters,
* so configure only the qos seq ones.
--
2.5.0


2015-12-21 20:51:27

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 19/45] iwlwifi: replace d0i3_mode and wowlan_d0i3 with more generic variables

From: Luca Coelho <[email protected]>

The d0i3_mode variable is used to distinguish between transports that
handle d0i3 entry during suspend by themselves (i.e. the slave
transports) and those which rely on the op_mode layer to do it. The
reason why the former do it by themselves is that they need to
transition from d0i3 in runtime_suspend into d0i3 in system-wide
suspend and this transition needs to happen before the op_mode's
suspend flow is called.

The wowlan_d0i3 element is also a bit confusing, because it just
reflects the wowlan->any value for the trans to understand. This is a
bit unclear in the code and not generic enough for future use.

To make it clearer and to generalize the platform power mode settings,
introduce two variables to indicate the platform power management
modes used by the transport.

Additionally, in order not to take too big a step in one patch, treat
this new variables semantically in the same way as the old d0i3_mode
element, introducing a iwl_mvm_enter_d0i3_on_suspend() function to
help with that.

This commit also adds the foundation for a new concept where the
firmware configuration state (i.e. D0, D3 or D0i3) is abstracted from
the platform PM mode we are in (i.e. runtime suspend or system-wide
suspend).

Signed-off-by: Luca Coelho <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 74 +++++++++++++++++++----
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 40 ++++++++----
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 16 +++--
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 13 ++++
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 7 +--
5 files changed, 111 insertions(+), 39 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index f00c9ad..8caf68b 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -669,18 +669,61 @@ enum iwl_trans_state {
};

/**
- * enum iwl_d0i3_mode - d0i3 mode
+ * DOC: Platform power management
*
- * @IWL_D0I3_MODE_OFF - d0i3 is disabled
- * @IWL_D0I3_MODE_ON_IDLE - enter d0i3 when device is idle
- * (e.g. no active references)
- * @IWL_D0I3_MODE_ON_SUSPEND - enter d0i3 only on suspend
- * (in case of 'any' trigger)
+ * There are two types of platform power management: system-wide
+ * (WoWLAN) and runtime.
+ *
+ * In system-wide power management the entire platform goes into a low
+ * power state (e.g. idle or suspend to RAM) at the same time and the
+ * device is configured as a wakeup source for the entire platform.
+ * This is usually triggered by userspace activity (e.g. the user
+ * presses the suspend button or a power management daemon decides to
+ * put the platform in low power mode). The device's behavior in this
+ * mode is dictated by the wake-on-WLAN configuration.
+ *
+ * In runtime power management, only the devices which are themselves
+ * idle enter a low power state. This is done at runtime, which means
+ * that the entire system is still running normally. This mode is
+ * usually triggered automatically by the device driver and requires
+ * the ability to enter and exit the low power modes in a very short
+ * time, so there is not much impact in usability.
+ *
+ * The terms used for the device's behavior are as follows:
+ *
+ * - D0: the device is fully powered and the host is awake;
+ * - D3: the device is in low power mode and only reacts to
+ * specific events (e.g. magic-packet received or scan
+ * results found);
+ * - D0I3: the device is in low power mode and reacts to any
+ * activity (e.g. RX);
+ *
+ * These terms reflect the power modes in the firmware and are not to
+ * be confused with the physical device power state. The NIC can be
+ * in D0I3 mode even if, for instance, the PCI device is in D3 state.
*/
-enum iwl_d0i3_mode {
- IWL_D0I3_MODE_OFF = 0,
- IWL_D0I3_MODE_ON_IDLE,
- IWL_D0I3_MODE_ON_SUSPEND,
+
+/**
+ * enum iwl_plat_pm_mode - platform power management mode
+ *
+ * This enumeration describes the device's platform power management
+ * behavior when in idle mode (i.e. runtime power management) or when
+ * in system-wide suspend (i.e WoWLAN).
+ *
+ * @IWL_PLAT_PM_MODE_DISABLED: power management is disabled for this
+ * device. At runtime, this means that nothing happens and the
+ * device always remains in active. In system-wide suspend mode,
+ * it means that the all connections will be closed automatically
+ * by mac80211 before the platform is suspended.
+ * @IWL_PLAT_PM_MODE_D3: the device goes into D3 mode (i.e. WoWLAN).
+ * For runtime power management, this mode is not officially
+ * supported.
+ * @IWL_PLAT_PM_MODE_D0I3: the device goes into D0I3 mode.
+ */
+enum iwl_plat_pm_mode {
+ IWL_PLAT_PM_MODE_DISABLED,
+ IWL_PLAT_PM_MODE_D3,
+ IWL_PLAT_PM_MODE_D0I3,
};

/**
@@ -720,6 +763,12 @@ enum iwl_d0i3_mode {
* the opmode.
* @paging_download_buf: Buffer used for copying all of the pages before
* downloading them to the FW. The buffer is allocated in the opmode
+ * @system_pm_mode: the system-wide power management mode in use.
+ * This mode is set dynamically, depending on the WoWLAN values
+ * configured from the userspace at runtime.
+ * @runtime_pm_mode: the runtime power management mode in use. This
+ * mode is set during the initialization phase and is not
+ * supposed to change during runtime.
*/
struct iwl_trans {
const struct iwl_trans_ops *ops;
@@ -770,9 +819,8 @@ struct iwl_trans {
struct iwl_fw_paging *paging_db;
void *paging_download_buf;

- enum iwl_d0i3_mode d0i3_mode;
-
- bool wowlan_d0i3;
+ enum iwl_plat_pm_mode system_pm_mode;
+ enum iwl_plat_pm_mode runtime_pm_mode;

/* pointer to trans specific struct */
/*Ensure that this pointer will always be aligned to sizeof pointer */
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 542de74..b1c9992 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -1183,19 +1183,20 @@ remove_notif:
int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
{
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+ struct iwl_trans *trans = mvm->trans;
int ret;

/* make sure the d0i3 exit work is not pending */
flush_work(&mvm->d0i3_exit_work);

- ret = iwl_trans_suspend(mvm->trans);
+ ret = iwl_trans_suspend(trans);
if (ret)
return ret;

- mvm->trans->wowlan_d0i3 = wowlan->any;
- if (mvm->trans->wowlan_d0i3) {
- /* 'any' trigger means d0i3 usage */
- if (mvm->trans->d0i3_mode == IWL_D0I3_MODE_ON_SUSPEND) {
+ if (wowlan->any) {
+ trans->system_pm_mode = IWL_PLAT_PM_MODE_D0I3;
+
+ if (iwl_mvm_enter_d0i3_on_suspend(mvm)) {
ret = iwl_mvm_enter_d0i3_sync(mvm);

if (ret)
@@ -1206,11 +1207,13 @@ int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
__set_bit(D0I3_DEFER_WAKEUP, &mvm->d0i3_suspend_flags);
mutex_unlock(&mvm->d0i3_suspend_mutex);

- iwl_trans_d3_suspend(mvm->trans, false);
+ iwl_trans_d3_suspend(trans, false);

return 0;
}

+ trans->system_pm_mode = IWL_PLAT_PM_MODE_D3;
+
return __iwl_mvm_suspend(hw, wowlan, false);
}

@@ -1973,8 +1976,9 @@ static int iwl_mvm_resume_d0i3(struct iwl_mvm *mvm)
{
bool exit_now;
enum iwl_d3_status d3_status;
+ struct iwl_trans *trans = mvm->trans;

- iwl_trans_d3_resume(mvm->trans, &d3_status, false);
+ iwl_trans_d3_resume(trans, &d3_status, false);

/*
* make sure to clear D0I3_DEFER_WAKEUP before
@@ -1991,9 +1995,9 @@ static int iwl_mvm_resume_d0i3(struct iwl_mvm *mvm)
_iwl_mvm_exit_d0i3(mvm);
}

- iwl_trans_resume(mvm->trans);
+ iwl_trans_resume(trans);

- if (mvm->trans->d0i3_mode == IWL_D0I3_MODE_ON_SUSPEND) {
+ if (iwl_mvm_enter_d0i3_on_suspend(mvm)) {
int ret = iwl_mvm_exit_d0i3(mvm->hw->priv);

if (ret)
@@ -2009,12 +2013,16 @@ static int iwl_mvm_resume_d0i3(struct iwl_mvm *mvm)
int iwl_mvm_resume(struct ieee80211_hw *hw)
{
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+ int ret;

- /* 'any' trigger means d0i3 was used */
- if (hw->wiphy->wowlan_config->any)
- return iwl_mvm_resume_d0i3(mvm);
+ if (mvm->trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3)
+ ret = iwl_mvm_resume_d0i3(mvm);
else
- return iwl_mvm_resume_d3(mvm);
+ ret = iwl_mvm_resume_d3(mvm);
+
+ mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
+
+ return ret;
}

void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled)
@@ -2038,6 +2046,8 @@ static int iwl_mvm_d3_test_open(struct inode *inode, struct file *file)
ieee80211_stop_queues(mvm->hw);
synchronize_net();

+ mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_D3;
+
/* start pseudo D3 */
rtnl_lock();
err = __iwl_mvm_suspend(mvm->hw, mvm->hw->wiphy->wowlan_config, true);
@@ -2092,9 +2102,13 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
int remaining_time = 10;

mvm->d3_test_active = false;
+
rtnl_lock();
__iwl_mvm_resume(mvm, true);
rtnl_unlock();
+
+ mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
+
iwl_abort_notification_waits(&mvm->notif_wait);
ieee80211_restart_hw(mvm->hw);

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 7487eb0..3a78a3f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -1087,15 +1087,13 @@ static void iwl_mvm_restart_complete(struct iwl_mvm *mvm)

static void iwl_mvm_resume_complete(struct iwl_mvm *mvm)
{
- if (!iwl_mvm_is_d0i3_supported(mvm))
- return;
-
- if (mvm->trans->d0i3_mode == IWL_D0I3_MODE_ON_SUSPEND)
- if (!wait_event_timeout(mvm->d0i3_exit_waitq,
- !test_bit(IWL_MVM_STATUS_IN_D0I3,
- &mvm->status),
- HZ))
- WARN_ONCE(1, "D0i3 exit on resume timed out\n");
+ if (iwl_mvm_is_d0i3_supported(mvm) &&
+ iwl_mvm_enter_d0i3_on_suspend(mvm))
+ WARN_ONCE(!wait_event_timeout(mvm->d0i3_exit_waitq,
+ !test_bit(IWL_MVM_STATUS_IN_D0I3,
+ &mvm->status),
+ HZ),
+ "D0i3 exit on resume timed out\n");
}

static void
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 3f0db29..3fc7199 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -933,6 +933,19 @@ static inline bool iwl_mvm_is_dqa_supported(struct iwl_mvm *mvm)
IWL_UCODE_TLV_CAPA_DQA_SUPPORT);
}

+static inline bool iwl_mvm_enter_d0i3_on_suspend(struct iwl_mvm *mvm)
+{
+ /* For now we only use this mode to differentiate between
+ * slave transports, which handle D0i3 entry in suspend by
+ * themselves in conjunction with runtime PM D0i3. So, this
+ * function is used to check whether we need to do anything
+ * when entering suspend or if the transport layer has already
+ * done it.
+ */
+ return (mvm->trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3) &&
+ (mvm->trans->runtime_pm_mode != IWL_PLAT_PM_MODE_D0I3);
+}
+
static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
{
bool nvm_lar = mvm->nvm_data->lar_enabled;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 0d92763..05d5a5b 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1213,7 +1213,7 @@ static void iwl_trans_pcie_d3_suspend(struct iwl_trans *trans, bool test)
{
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

- if (trans->wowlan_d0i3) {
+ if (trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3) {
/* Enable persistence mode to avoid reset */
iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
CSR_HW_IF_CONFIG_REG_PERSIST_MODE);
@@ -1237,7 +1237,7 @@ static void iwl_trans_pcie_d3_suspend(struct iwl_trans *trans, bool test)
iwl_clear_bit(trans, CSR_GP_CNTRL,
CSR_GP_CNTRL_REG_FLAG_INIT_DONE);

- if (!trans->wowlan_d0i3) {
+ if (trans->system_pm_mode == IWL_PLAT_PM_MODE_D3) {
/*
* reset TX queues -- some of their registers reset during S3
* so if we don't reset everything here the D3 image would try
@@ -1286,7 +1286,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,

iwl_pcie_set_pwr(trans, false);

- if (trans->wowlan_d0i3) {
+ if (trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3) {
iwl_clear_bit(trans, CSR_GP_CNTRL,
CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
} else {
@@ -2677,7 +2677,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
}

trans_pcie->inta_mask = CSR_INI_SET_MASK;
- trans->d0i3_mode = IWL_D0I3_MODE_ON_SUSPEND;

return trans;

--
2.5.0


2015-12-21 20:50:59

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 04/45] iwlwifi: mvm: configure scheduled scan according to traffic conditions

From: Avraham Stern <[email protected]>

Change scan configuration (dwell time, suspend time etc.) according
to traffic conditions. This is useful for scans that are managed by
the FW (e.g. scheduled scan).

Signed-off-by: Avraham Stern <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 +++
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 10 +++++-
drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 43 +++++++++++------------
3 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 518a1d5..fc13ad9 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -993,6 +993,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
mvm->vif_count = 0;
mvm->rx_ba_sessions = 0;
mvm->fw_dbg_conf = FW_DBG_INVALID;
+ mvm->scan_type = IWL_SCAN_TYPE_NOT_SET;

/* keep statistics ticking */
iwl_mvm_accu_radio_stats(mvm);
@@ -1868,6 +1869,9 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
iwl_mvm_bt_coex_vif_change(mvm);
iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT,
IEEE80211_SMPS_AUTOMATIC);
+ if (fw_has_capa(&mvm->fw->ucode_capa,
+ IWL_UCODE_TLV_CAPA_UMAC_SCAN))
+ iwl_mvm_config_scan(mvm);
} else if (changes & BSS_CHANGED_BEACON_INFO) {
/*
* We received a beacon _after_ association so
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 7dc3af6..612799a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -475,6 +475,14 @@ enum iwl_scan_status {
IWL_MVM_SCAN_MASK = 0xff,
};

+enum iwl_mvm_scan_type {
+ IWL_SCAN_TYPE_NOT_SET,
+ IWL_SCAN_TYPE_UNASSOC,
+ IWL_SCAN_TYPE_WILD,
+ IWL_SCAN_TYPE_MILD,
+ IWL_SCAN_TYPE_FRAGMENTED,
+};
+
/**
* struct iwl_nvm_section - describes an NVM section in memory.
*
@@ -643,7 +651,7 @@ struct iwl_mvm {
unsigned int scan_status;
void *scan_cmd;
struct iwl_mcast_filter_cmd *mcast_filter_cmd;
- bool scan_fragmented;
+ enum iwl_mvm_scan_type scan_type;

/* max number of simultaneous scans the FW supports */
unsigned int max_scans;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index 7cbfb08..4887418 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -72,13 +72,6 @@
#define IWL_DENSE_EBS_SCAN_RATIO 5
#define IWL_SPARSE_EBS_SCAN_RATIO 1

-enum iwl_mvm_scan_type {
- IWL_SCAN_TYPE_UNASSOC,
- IWL_SCAN_TYPE_WILD,
- IWL_SCAN_TYPE_MILD,
- IWL_SCAN_TYPE_FRAGMENTED,
-};
-
enum iwl_mvm_traffic_load {
IWL_MVM_TRAFFIC_LOW,
IWL_MVM_TRAFFIC_MEDIUM,
@@ -206,9 +199,7 @@ static enum iwl_mvm_traffic_load iwl_mvm_get_traffic_load(struct iwl_mvm *mvm)
}

static enum
-iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm,
- struct ieee80211_vif *vif,
- struct iwl_mvm_scan_params *params)
+iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm, bool p2p_device)
{
int global_cnt = 0;
enum iwl_mvm_traffic_load load;
@@ -224,8 +215,7 @@ iwl_mvm_scan_type iwl_mvm_get_scan_type(struct iwl_mvm *mvm,
load = iwl_mvm_get_traffic_load(mvm);
low_latency = iwl_mvm_low_latency(mvm);

- if ((load == IWL_MVM_TRAFFIC_HIGH || low_latency) &&
- vif->type != NL80211_IFTYPE_P2P_DEVICE &&
+ if ((load == IWL_MVM_TRAFFIC_HIGH || low_latency) && !p2p_device &&
fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAGMENTED_SCAN))
return IWL_SCAN_TYPE_FRAGMENTED;

@@ -917,18 +907,20 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
struct iwl_host_cmd cmd = {
.id = iwl_cmd_id(SCAN_CFG_CMD, IWL_ALWAYS_LONG_GROUP, 0),
};
+ enum iwl_mvm_scan_type type = iwl_mvm_get_scan_type(mvm, false);

if (WARN_ON(num_channels > mvm->fw->ucode_capa.n_scan_channels))
return -ENOBUFS;

+ if (type == mvm->scan_type)
+ return 0;
+
cmd_size = sizeof(*scan_config) + mvm->fw->ucode_capa.n_scan_channels;

scan_config = kzalloc(cmd_size, GFP_KERNEL);
if (!scan_config)
return -ENOMEM;

- mvm->scan_fragmented = iwl_mvm_low_latency(mvm);
-
scan_config->flags = cpu_to_le32(SCAN_CONFIG_FLAG_ACTIVATE |
SCAN_CONFIG_FLAG_ALLOW_CHUB_REQS |
SCAN_CONFIG_FLAG_SET_TX_CHAINS |
@@ -938,17 +930,18 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
SCAN_CONFIG_FLAG_SET_MAC_ADDR |
SCAN_CONFIG_FLAG_SET_CHANNEL_FLAGS|
SCAN_CONFIG_N_CHANNELS(num_channels) |
- (mvm->scan_fragmented ?
+ (type == IWL_SCAN_TYPE_FRAGMENTED ?
SCAN_CONFIG_FLAG_SET_FRAGMENTED :
SCAN_CONFIG_FLAG_CLEAR_FRAGMENTED));
scan_config->tx_chains = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
scan_config->rx_chains = cpu_to_le32(iwl_mvm_scan_rx_ant(mvm));
scan_config->legacy_rates = iwl_mvm_scan_config_rates(mvm);
- scan_config->out_of_channel_time = cpu_to_le32(170);
- scan_config->suspend_time = cpu_to_le32(30);
- scan_config->dwell_active = 20;
- scan_config->dwell_passive = 110;
- scan_config->dwell_fragmented = 20;
+ scan_config->out_of_channel_time =
+ cpu_to_le32(scan_timing[type].max_out_time);
+ scan_config->suspend_time = cpu_to_le32(scan_timing[type].suspend_time);
+ scan_config->dwell_active = scan_timing[type].dwell_active;
+ scan_config->dwell_passive = scan_timing[type].dwell_passive;
+ scan_config->dwell_fragmented = scan_timing[type].dwell_fragmented;

memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN);

@@ -972,6 +965,8 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
IWL_DEBUG_SCAN(mvm, "Sending UMAC scan config\n");

ret = iwl_mvm_send_cmd(mvm, &cmd);
+ if (!ret)
+ mvm->scan_type = type;

kfree(scan_config);
return ret;
@@ -1225,7 +1220,9 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
params.scan_plans = &scan_plan;
params.n_scan_plans = 1;

- params.type = iwl_mvm_get_scan_type(mvm, vif, &params);
+ params.type =
+ iwl_mvm_get_scan_type(mvm,
+ vif->type == NL80211_IFTYPE_P2P_DEVICE);

iwl_mvm_build_scan_probe(mvm, vif, ies, &params);

@@ -1307,7 +1304,9 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
params.n_scan_plans = req->n_scan_plans;
params.scan_plans = req->scan_plans;

- params.type = iwl_mvm_get_scan_type(mvm, vif, &params);
+ params.type =
+ iwl_mvm_get_scan_type(mvm,
+ vif->type == NL80211_IFTYPE_P2P_DEVICE);

/* In theory, LMAC scans can handle a 32-bit delay, but since
* waiting for over 18 hours to start the scan is a bit silly
--
2.5.0


2015-12-23 06:28:45

by Grumbach, Emmanuel

[permalink] [raw]
Subject: Re: [PATCH 44/45] iwlwifi: fix printf specifier



On 12/23/2015 06:08 AM, Joe Perches wrote:
> On Mon, 2015-12-21 at 22:50 +0200, Emmanuel Grumbach wrote:
>> Smatch warned about a bad specifier being used. Fix that.
> I see nothing here other than a signed/unsigned
> issue that shouldn't need fixing. The conversion
> from hex to decimal may not be useful.

Yes so maybe I could just use the 0x%x specifier since
printk-formats.txt seems to say that 0x%x is good for s32 as well. Seems
that the "02" makes it "unsigned only".
Printing those values in hexadecimal is annoying anyway since we usually
express Tx power in decimal.
Thanks for pointing that out!

>> Signed-off-by: Emmanuel Grumbach <[email protected]>
>> ---
>> drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
>> index b395854..c15f5be 100644
>> --- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
>> +++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
>> @@ -454,11 +454,11 @@ static void iwl_eeprom_enhanced_txpower(struct device *dev,
>> TXP_CHECK_AND_PRINT(COMMON_TYPE),
>> txp->flags);
>> IWL_DEBUG_EEPROM(dev,
>> - "\t\t chain_A: 0x%02x chain_B: 0X%02x chain_C: 0X%02x\n",
>> + "\t\t chain_A: %d chain_B: %d chain_C: %d\n",
>> txp->chain_a_max, txp->chain_b_max,
>> txp->chain_c_max);
>> IWL_DEBUG_EEPROM(dev,
>> - "\t\t MIMO2: 0x%02x MIMO3: 0x%02x High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
>> + "\t\t MIMO2: %d MIMO3: %d High 20_on_40: 0x%02x Low 20_on_40: 0x%02x\n",
>> txp->mimo2_max, txp->mimo3_max,
>> ((txp->delta_20_in_40 & 0xf0) >> 4),
>> (txp->delta_20_in_40 & 0x0f));
>


2015-12-21 20:52:20

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 30/45] iwlwifi: mvm: refactor the way fw_key_table is handled

From: Luca Coelho <[email protected]>

Instead of keeping the fw_key_table bits set when the keys are removed
(i.e. in D3 entry or HW_RESTART flows), clear them and set them again
only when the keys have been successfully re-added. This makes the
bitmask more closely tied to the actual firmware programming.

Signed-off-by: Luca Coelho <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 3 +++
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 10 ++++------
3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 8cd2e67..69fd10a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -779,6 +779,9 @@ static int iwl_mvm_switch_to_d3(struct iwl_mvm *mvm)
*/
set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);

+ /* the fw is reset, so all the keys are cleared */
+ memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
+
mvm->ptk_ivlen = 0;
mvm->ptk_icvlen = 0;
mvm->ptk_ivlen = 0;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index d239e97..be5703c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -984,6 +984,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;

iwl_mvm_reset_phy_ctxts(mvm);
+ memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
memset(mvm->tfd_drained, 0, sizeof(mvm->tfd_drained));
memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 4148ebe..92edacc 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1198,8 +1198,6 @@ static int iwl_mvm_set_fw_key_idx(struct iwl_mvm *mvm)
if (max_offs < 0)
return STA_KEY_IDX_INVALID;

- __set_bit(max_offs, mvm->fw_key_table);
-
return max_offs;
}

@@ -1507,10 +1505,8 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
}

ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf, key_offset, mcast);
- if (ret) {
- __clear_bit(keyconf->hw_key_idx, mvm->fw_key_table);
+ if (ret)
goto end;
- }

/*
* For WEP, the same key is used for multicast and unicast. Upload it
@@ -1523,11 +1519,13 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
ret = __iwl_mvm_set_sta_key(mvm, vif, sta, keyconf,
key_offset, !mcast);
if (ret) {
- __clear_bit(keyconf->hw_key_idx, mvm->fw_key_table);
__iwl_mvm_remove_sta_key(mvm, sta_id, keyconf, mcast);
+ goto end;
}
}

+ __set_bit(key_offset, mvm->fw_key_table);
+
end:
IWL_DEBUG_WEP(mvm, "key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n",
keyconf->cipher, keyconf->keylen, keyconf->keyidx,
--
2.5.0


2015-12-21 20:51:17

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 14/45] iwlwifi: uninline iwl_trans_send_cmd

This function got too big to be inlined. Uninline it.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-trans.c | 33 +++++++++++++++++++++++++
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 34 ++------------------------
2 files changed, 35 insertions(+), 32 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
index ccd317b..c3fafbc 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
@@ -61,6 +61,7 @@
*
*****************************************************************************/
#include <linux/kernel.h>
+#include "iwl-drv.h"
#include "iwl-trans.h"

struct iwl_trans *iwl_trans_alloc(unsigned int priv_size,
@@ -112,3 +113,35 @@ void iwl_trans_free(struct iwl_trans *trans)
kmem_cache_destroy(trans->dev_cmd_pool);
kfree(trans);
}
+
+int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
+{
+ int ret;
+
+ if (unlikely(!(cmd->flags & CMD_SEND_IN_RFKILL) &&
+ test_bit(STATUS_RFKILL, &trans->status)))
+ return -ERFKILL;
+
+ if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status)))
+ return -EIO;
+
+ if (unlikely(trans->state != IWL_TRANS_FW_ALIVE)) {
+ IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
+ return -EIO;
+ }
+
+ if (WARN_ON((cmd->flags & CMD_WANT_ASYNC_CALLBACK) &&
+ !(cmd->flags & CMD_ASYNC)))
+ return -EINVAL;
+
+ if (!(cmd->flags & CMD_ASYNC))
+ lock_map_acquire_read(&trans->sync_cmd_lockdep_map);
+
+ ret = trans->ops->send_cmd(trans, cmd);
+
+ if (!(cmd->flags & CMD_ASYNC))
+ lock_map_release(&trans->sync_cmd_lockdep_map);
+
+ return ret;
+}
+IWL_EXPORT_SYMBOL(iwl_trans_send_cmd);
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 77ae7fa..b825d94 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -889,38 +889,6 @@ iwl_trans_dump_data(struct iwl_trans *trans,
return trans->ops->dump_data(trans, trigger);
}

-static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
- struct iwl_host_cmd *cmd)
-{
- int ret;
-
- if (unlikely(!(cmd->flags & CMD_SEND_IN_RFKILL) &&
- test_bit(STATUS_RFKILL, &trans->status)))
- return -ERFKILL;
-
- if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status)))
- return -EIO;
-
- if (unlikely(trans->state != IWL_TRANS_FW_ALIVE)) {
- IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
- return -EIO;
- }
-
- if (WARN_ON((cmd->flags & CMD_WANT_ASYNC_CALLBACK) &&
- !(cmd->flags & CMD_ASYNC)))
- return -EINVAL;
-
- if (!(cmd->flags & CMD_ASYNC))
- lock_map_acquire_read(&trans->sync_cmd_lockdep_map);
-
- ret = trans->ops->send_cmd(trans, cmd);
-
- if (!(cmd->flags & CMD_ASYNC))
- lock_map_release(&trans->sync_cmd_lockdep_map);
-
- return ret;
-}
-
static inline struct iwl_device_cmd *
iwl_trans_alloc_tx_cmd(struct iwl_trans *trans)
{
@@ -933,6 +901,8 @@ iwl_trans_alloc_tx_cmd(struct iwl_trans *trans)
(dev_cmd_ptr + trans->dev_cmd_headroom);
}

+int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd);
+
static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans,
struct iwl_device_cmd *dev_cmd)
{
--
2.5.0


2015-12-21 20:52:27

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 34/45] iwlwifi: mvm: add extended dwell time

From: David Spinadel <[email protected]>

When doing active scan on crowded channels we are likely to miss probe
responses due to collisions. To overcome this issue we use an extended
dwell time on channels 1, 6 and 11; this dwell time is set to 100.

In case of fragmented scan extended dwell time is the maximum out of
channel time - 44 msec. Fragmented active scan will be addressed later.

Extended dwell time isn't used in sched scan or p2p find.

Signed-off-by: David Spinadel <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
.../net/wireless/intel/iwlwifi/mvm/fw-api-scan.h | 22 +++++++-----
drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 41 ++++++++++++++++------
2 files changed, 45 insertions(+), 18 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
index d92712d..f01dab0 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-scan.h
@@ -285,6 +285,8 @@ struct iwl_scan_channel_opt {
* @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
* @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
* and DS parameter set IEs into probe requests.
+ * @IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL: use extended dwell time on channels
+ * 1, 6 and 11.
* @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
*/
enum iwl_mvm_lmac_scan_flags {
@@ -295,6 +297,7 @@ enum iwl_mvm_lmac_scan_flags {
IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4),
IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5),
IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6),
+ IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL = BIT(7),
IWL_MVM_LMAC_SCAN_FLAG_MATCH = BIT(9),
};

@@ -322,6 +325,7 @@ enum iwl_scan_priority_ext {
* @active-dwell: dwell time for active channels
* @passive-dwell: dwell time for passive channels
* @fragmented-dwell: dwell time for fragmented passive scan
+ * @extended_dwell: dwell time for channels 1, 6 and 11 (in certain cases)
* @reserved2: for alignment and future use
* @rx_chain_selct: PHY_RX_CHAIN_* flags
* @scan_flags: &enum iwl_mvm_lmac_scan_flags
@@ -346,7 +350,8 @@ struct iwl_scan_req_lmac {
u8 active_dwell;
u8 passive_dwell;
u8 fragmented_dwell;
- __le16 reserved2;
+ u8 extended_dwell;
+ u8 reserved2;
__le16 rx_chain_select;
__le32 scan_flags;
__le32 max_out_time;
@@ -490,7 +495,7 @@ enum iwl_channel_flags {
* @dwell_active: default dwell time for active scan
* @dwell_passive: default dwell time for passive scan
* @dwell_fragmented: default dwell time for fragmented scan
- * @reserved: for future use and alignment
+ * @dwell_extended: default dwell time for channels 1, 6 and 11
* @mac_addr: default mac address to be used in probes
* @bcast_sta_id: the index of the station in the fw
* @channel_flags: default channel flags - enum iwl_channel_flags
@@ -507,7 +512,7 @@ struct iwl_scan_config {
u8 dwell_active;
u8 dwell_passive;
u8 dwell_fragmented;
- u8 reserved;
+ u8 dwell_extended;
u8 mac_addr[ETH_ALEN];
u8 bcast_sta_id;
u8 channel_flags;
@@ -543,7 +548,8 @@ enum iwl_umac_scan_general_flags {
IWL_UMAC_SCAN_GEN_FLAGS_MULTIPLE_SSID = BIT(6),
IWL_UMAC_SCAN_GEN_FLAGS_FRAGMENTED = BIT(7),
IWL_UMAC_SCAN_GEN_FLAGS_RRM_ENABLED = BIT(8),
- IWL_UMAC_SCAN_GEN_FLAGS_MATCH = BIT(9)
+ IWL_UMAC_SCAN_GEN_FLAGS_MATCH = BIT(9),
+ IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL = BIT(10),
};

/**
@@ -597,7 +603,7 @@ struct iwl_scan_req_umac_tail {
* @uid: scan id, &enum iwl_umac_scan_uid_offsets
* @ooc_priority: out of channel priority - &enum iwl_scan_priority
* @general_flags: &enum iwl_umac_scan_general_flags
- * @reserved1: for future use and alignment
+ * @extended_dwell: dwell time for channels 1, 6 and 11
* @active_dwell: dwell time for active scan
* @passive_dwell: dwell time for passive scan
* @fragmented_dwell: dwell time for fragmented passive scan
@@ -606,7 +612,7 @@ struct iwl_scan_req_umac_tail {
* @scan_priority: scan internal prioritization &enum iwl_scan_priority
* @channel_flags: &enum iwl_scan_channel_flags
* @n_channels: num of channels in scan request
- * @reserved2: for future use and alignment
+ * @reserved: for future use and alignment
* @data: &struct iwl_scan_channel_cfg_umac and
* &struct iwl_scan_req_umac_tail
*/
@@ -616,7 +622,7 @@ struct iwl_scan_req_umac {
__le32 ooc_priority;
/* SCAN_GENERAL_PARAMS_API_S_VER_1 */
__le32 general_flags;
- u8 reserved1;
+ u8 extended_dwell;
u8 active_dwell;
u8 passive_dwell;
u8 fragmented_dwell;
@@ -626,7 +632,7 @@ struct iwl_scan_req_umac {
/* SCAN_CHANNEL_PARAMS_API_S_VER_1 */
u8 channel_flags;
u8 n_channels;
- __le16 reserved2;
+ __le16 reserved;
u8 data[];
} __packed; /* SCAN_REQUEST_CMD_UMAC_API_S_VER_1 */

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index 87cc993..bee3201 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -82,6 +82,7 @@ struct iwl_mvm_scan_timing_params {
u32 dwell_active;
u32 dwell_passive;
u32 dwell_fragmented;
+ u32 dwell_extended;
u32 suspend_time;
u32 max_out_time;
};
@@ -91,6 +92,7 @@ static struct iwl_mvm_scan_timing_params scan_timing[] = {
.dwell_active = 10,
.dwell_passive = 110,
.dwell_fragmented = 44,
+ .dwell_extended = 100,
.suspend_time = 0,
.max_out_time = 0,
},
@@ -98,6 +100,7 @@ static struct iwl_mvm_scan_timing_params scan_timing[] = {
.dwell_active = 10,
.dwell_passive = 110,
.dwell_fragmented = 44,
+ .dwell_extended = 100,
.suspend_time = 30,
.max_out_time = 120,
},
@@ -105,6 +108,7 @@ static struct iwl_mvm_scan_timing_params scan_timing[] = {
.dwell_active = 10,
.dwell_passive = 110,
.dwell_fragmented = 44,
+ .dwell_extended = 100,
.suspend_time = 120,
.max_out_time = 120,
},
@@ -112,6 +116,7 @@ static struct iwl_mvm_scan_timing_params scan_timing[] = {
.dwell_active = 10,
.dwell_passive = 110,
.dwell_fragmented = 44,
+ .dwell_extended = 44,
.suspend_time = 95,
.max_out_time = 44,
},
@@ -716,6 +721,7 @@ static void iwl_mvm_scan_lmac_dwell(struct iwl_mvm *mvm,
cmd->active_dwell = scan_timing[params->type].dwell_active;
cmd->passive_dwell = scan_timing[params->type].dwell_passive;
cmd->fragmented_dwell = scan_timing[params->type].dwell_fragmented;
+ cmd->extended_dwell = scan_timing[params->type].dwell_extended;
cmd->max_out_time = cpu_to_le32(scan_timing[params->type].max_out_time);
cmd->suspend_time = cpu_to_le32(scan_timing[params->type].suspend_time);
cmd->scan_prio = iwl_mvm_scan_priority(mvm, IWL_SCAN_PRIORITY_EXT_6);
@@ -749,8 +755,15 @@ static inline bool iwl_mvm_scan_use_ebs(struct iwl_mvm *mvm,
vif->type != NL80211_IFTYPE_P2P_DEVICE);
}

+static inline bool iwl_mvm_is_regular_scan(struct iwl_mvm_scan_params *params)
+{
+ return params->n_scan_plans == 1 &&
+ params->scan_plans[0].iterations == 1;
+}
+
static int iwl_mvm_scan_lmac_flags(struct iwl_mvm *mvm,
- struct iwl_mvm_scan_params *params)
+ struct iwl_mvm_scan_params *params,
+ struct ieee80211_vif *vif)
{
int flags = 0;

@@ -776,6 +789,10 @@ static int iwl_mvm_scan_lmac_flags(struct iwl_mvm *mvm,
flags |= IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE;
#endif

+ if (iwl_mvm_is_regular_scan(params) &&
+ vif->type != NL80211_IFTYPE_P2P_DEVICE)
+ flags |= IWL_MVM_LMAC_SCAN_FLAG_EXTENDED_DWELL;
+
return flags;
}

@@ -804,7 +821,8 @@ static int iwl_mvm_scan_lmac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,

cmd->delay = cpu_to_le32(params->delay);

- cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params));
+ cmd->scan_flags = cpu_to_le32(iwl_mvm_scan_lmac_flags(mvm, params,
+ vif));

cmd->flags = iwl_mvm_scan_rxon_flags(params->channels[0]->band);
cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP |
@@ -942,6 +960,7 @@ int iwl_mvm_config_scan(struct iwl_mvm *mvm)
scan_config->dwell_active = scan_timing[type].dwell_active;
scan_config->dwell_passive = scan_timing[type].dwell_passive;
scan_config->dwell_fragmented = scan_timing[type].dwell_fragmented;
+ scan_config->dwell_extended = scan_timing[type].dwell_extended;

memcpy(&scan_config->mac_addr, &mvm->addresses[0].addr, ETH_ALEN);

@@ -983,16 +1002,11 @@ static int iwl_mvm_scan_uid_by_status(struct iwl_mvm *mvm, int status)
return -ENOENT;
}

-static inline bool iwl_mvm_is_regular_scan(struct iwl_mvm_scan_params *params)
-{
- return params->n_scan_plans == 1 &&
- params->scan_plans[0].iterations == 1;
-}
-
static void iwl_mvm_scan_umac_dwell(struct iwl_mvm *mvm,
struct iwl_scan_req_umac *cmd,
struct iwl_mvm_scan_params *params)
{
+ cmd->extended_dwell = scan_timing[params->type].dwell_extended;
cmd->active_dwell = scan_timing[params->type].dwell_active;
cmd->passive_dwell = scan_timing[params->type].dwell_passive;
cmd->fragmented_dwell = scan_timing[params->type].dwell_fragmented;
@@ -1027,7 +1041,8 @@ iwl_mvm_umac_scan_cfg_channels(struct iwl_mvm *mvm,
}

static u32 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm,
- struct iwl_mvm_scan_params *params)
+ struct iwl_mvm_scan_params *params,
+ struct ieee80211_vif *vif)
{
int flags = 0;

@@ -1055,6 +1070,11 @@ static u32 iwl_mvm_scan_umac_flags(struct iwl_mvm *mvm,
if (mvm->scan_iter_notif_enabled)
flags |= IWL_UMAC_SCAN_GEN_FLAGS_ITER_COMPLETE;
#endif
+
+ if (iwl_mvm_is_regular_scan(params) &&
+ vif->type != NL80211_IFTYPE_P2P_DEVICE)
+ flags |= IWL_UMAC_SCAN_GEN_FLAGS_EXTENDED_DWELL;
+
return flags;
}

@@ -1085,7 +1105,8 @@ static int iwl_mvm_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
mvm->scan_uid_status[uid] = type;

cmd->uid = cpu_to_le32(uid);
- cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params));
+ cmd->general_flags = cpu_to_le32(iwl_mvm_scan_umac_flags(mvm, params,
+ vif));

if (type == IWL_MVM_SCAN_SCHED)
cmd->flags = cpu_to_le32(IWL_UMAC_SCAN_FLAG_PREEMPTIVE);
--
2.5.0


2015-12-21 20:51:05

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 07/45] iwlwifi: dvm: advertise NETIF_F_SG

From: Johannes Berg <[email protected]>

If the transport supports it, advertise NETIF_F_SG to mac80211 to
be able to use frag SKBs. This will already improve performance by
allowing software GSO to be used.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
index a9d8b51..f4c2529 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/mac80211.c
@@ -115,6 +115,9 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
ieee80211_hw_set(hw, WANT_MONITOR_VIF);

+ if (priv->trans->max_skb_frags)
+ hw->netdev_features = NETIF_F_HIGHDMA | NETIF_F_SG;
+
hw->offchannel_tx_hw_queue = IWL_AUX_QUEUE;
hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FMT;

--
2.5.0


2015-12-21 20:52:29

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 35/45] iwlwifi: mvm: Add a station in monitor mode

From: Chaya Rachel Ivgi <[email protected]>

Currently when creating a new vif in monitor mode the driver doesn't
allocate a specific station. This causes that in the situation that
tx traffic is injected, the tx queues are not scheduled,
with the result of a TFD queue hang.
Fix that by allocating a station and ensuring its tx queues
are scheduled.

This fixes https://bugzilla.kernel.org/show_bug.cgi?id=104591

Signed-off-by: Chaya Rachel Ivgi <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c | 16 ++++++++++-
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 6 +++++
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 33 ++++++++++++++++++++---
drivers/net/wireless/intel/iwlwifi/mvm/sta.h | 6 +++++
5 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
index d00a6e9..5e3a758 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
@@ -855,11 +855,17 @@ static int iwl_mvm_mac_ctxt_cmd_listener(struct iwl_mvm *mvm,
u32 action)
{
struct iwl_mac_ctx_cmd cmd = {};
+ u32 tfd_queue_msk = 0;
+ int ret, i;

WARN_ON(vif->type != NL80211_IFTYPE_MONITOR);

iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);

+ for (i = 0; i < IEEE80211_NUM_ACS; i++)
+ if (vif->hw_queue[i] != IEEE80211_INVAL_HW_QUEUE)
+ tfd_queue_msk |= BIT(vif->hw_queue[i]);
+
cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_PROMISC |
MAC_FILTER_IN_CONTROL_AND_MGMT |
MAC_FILTER_IN_BEACON |
@@ -867,6 +873,12 @@ static int iwl_mvm_mac_ctxt_cmd_listener(struct iwl_mvm *mvm,
MAC_FILTER_IN_CRC32);
ieee80211_hw_set(mvm->hw, RX_INCLUDES_FCS);

+ /* Allocate sniffer station */
+ ret = iwl_mvm_allocate_int_sta(mvm, &mvm->snif_sta, tfd_queue_msk,
+ vif->type);
+ if (ret)
+ return ret;
+
return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
}

@@ -1289,8 +1301,10 @@ int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif)

mvmvif->uploaded = false;

- if (vif->type == NL80211_IFTYPE_MONITOR)
+ if (vif->type == NL80211_IFTYPE_MONITOR) {
__clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, mvm->hw->flags);
+ iwl_mvm_dealloc_snif_sta(mvm);
+ }

return 0;
}
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index be5703c..53415dc 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -3126,6 +3126,11 @@ static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
ret = iwl_mvm_update_quotas(mvm, false, NULL);
if (ret)
goto out_remove_binding;
+
+ ret = iwl_mvm_add_snif_sta(mvm, vif);
+ if (ret)
+ goto out_remove_binding;
+
}

/* Handle binding during CSA */
@@ -3199,6 +3204,7 @@ static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
case NL80211_IFTYPE_MONITOR:
mvmvif->monitor_active = false;
mvmvif->ps_disabled = false;
+ iwl_mvm_rm_snif_sta(mvm, vif);
break;
case NL80211_IFTYPE_AP:
/* This part is triggered only during CSA */
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index ce9f579..df68973 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -677,6 +677,7 @@ struct iwl_mvm {

/* Internal station */
struct iwl_mvm_int_sta aux_sta;
+ struct iwl_mvm_int_sta snif_sta;

bool last_ebs_successful;

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index 92edacc..bfa4699 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -581,9 +581,9 @@ int iwl_mvm_rm_sta_id(struct iwl_mvm *mvm,
return ret;
}

-static int iwl_mvm_allocate_int_sta(struct iwl_mvm *mvm,
- struct iwl_mvm_int_sta *sta,
- u32 qmask, enum nl80211_iftype iftype)
+int iwl_mvm_allocate_int_sta(struct iwl_mvm *mvm,
+ struct iwl_mvm_int_sta *sta,
+ u32 qmask, enum nl80211_iftype iftype)
{
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
sta->sta_id = iwl_mvm_find_free_sta_id(mvm, iftype);
@@ -673,6 +673,33 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
return ret;
}

+int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
+{
+ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+
+ lockdep_assert_held(&mvm->mutex);
+ return iwl_mvm_add_int_sta_common(mvm, &mvm->snif_sta, vif->addr,
+ mvmvif->id, 0);
+}
+
+int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
+{
+ int ret;
+
+ lockdep_assert_held(&mvm->mutex);
+
+ ret = iwl_mvm_rm_sta_common(mvm, mvm->snif_sta.sta_id);
+ if (ret)
+ IWL_WARN(mvm, "Failed sending remove station\n");
+
+ return ret;
+}
+
+void iwl_mvm_dealloc_snif_sta(struct iwl_mvm *mvm)
+{
+ iwl_mvm_dealloc_int_sta(mvm, &mvm->snif_sta);
+}
+
void iwl_mvm_del_aux_sta(struct iwl_mvm *mvm)
{
lockdep_assert_held(&mvm->mutex);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
index 973f2ed..badf17c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.h
@@ -407,7 +407,13 @@ int iwl_mvm_send_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
int iwl_mvm_add_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
int iwl_mvm_send_rm_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
int iwl_mvm_rm_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+int iwl_mvm_allocate_int_sta(struct iwl_mvm *mvm,
+ struct iwl_mvm_int_sta *sta,
+ u32 qmask, enum nl80211_iftype iftype);
void iwl_mvm_dealloc_bcast_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+int iwl_mvm_add_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+int iwl_mvm_rm_snif_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
+void iwl_mvm_dealloc_snif_sta(struct iwl_mvm *mvm);

void iwl_mvm_sta_drained_wk(struct work_struct *wk);
void iwl_mvm_sta_modify_ps_wake(struct iwl_mvm *mvm,
--
2.5.0


2015-12-21 20:51:09

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 09/45] iwlwifi: mvm: cleanup roc te on restart cleanup

From: Eliad Peller <[email protected]>

iwl_mvm_restart_cleanup() calls ieee80211_remain_on_channel_expired()
on cleanup, but it doesn't clean the actual roc time
events, resulting in failure of further ROC attempts.

Refactor iwl_mvm_stop_roc() a bit, and add a new function
to only cleanup the roc time events (without sending further
commands).

Signed-off-by: Eliad Peller <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 1 +
.../net/wireless/intel/iwlwifi/mvm/time-event.c | 38 ++++++++++++++--------
.../net/wireless/intel/iwlwifi/mvm/time-event.h | 1 +
3 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 09afb6d..f428f1c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -967,6 +967,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
mvm->calibrating = false;

/* just in case one was running */
+ iwl_mvm_cleanup_roc_te(mvm);
ieee80211_remain_on_channel_expired(mvm->hw);

/*
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
index 87a04c3..924dd6a 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.c
@@ -792,11 +792,9 @@ int iwl_mvm_start_p2p_roc(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
return iwl_mvm_time_event_send_add(mvm, vif, te_data, &time_cmd);
}

-void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
+static struct iwl_mvm_time_event_data *iwl_mvm_get_roc_te(struct iwl_mvm *mvm)
{
- struct iwl_mvm_vif *mvmvif = NULL;
struct iwl_mvm_time_event_data *te_data;
- bool is_p2p = false;

lockdep_assert_held(&mvm->mutex);

@@ -810,11 +808,8 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
* request
*/
list_for_each_entry(te_data, &mvm->time_event_list, list) {
- if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) {
- mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
- is_p2p = true;
- goto remove_te;
- }
+ if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE)
+ goto out;
}

/* There can only be at most one AUX ROC time event, we just use the
@@ -823,18 +818,35 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
te_data = list_first_entry_or_null(&mvm->aux_roc_te_list,
struct iwl_mvm_time_event_data,
list);
+out:
+ spin_unlock_bh(&mvm->time_event_lock);
+ return te_data;
+}
+
+void iwl_mvm_cleanup_roc_te(struct iwl_mvm *mvm)
+{
+ struct iwl_mvm_time_event_data *te_data;
+ u32 uid;
+
+ te_data = iwl_mvm_get_roc_te(mvm);
if (te_data)
- mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
+ __iwl_mvm_remove_time_event(mvm, te_data, &uid);
+}

-remove_te:
- spin_unlock_bh(&mvm->time_event_lock);
+void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
+{
+ struct iwl_mvm_vif *mvmvif;
+ struct iwl_mvm_time_event_data *te_data;

- if (!mvmvif) {
+ te_data = iwl_mvm_get_roc_te(mvm);
+ if (!te_data) {
IWL_WARN(mvm, "No remain on channel event\n");
return;
}

- if (is_p2p)
+ mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
+
+ if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE)
iwl_mvm_remove_time_event(mvm, mvmvif, te_data);
else
iwl_mvm_remove_aux_roc_te(mvm, mvmvif, te_data);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.h b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.h
index 61d7cd7..99d9a35 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/time-event.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/time-event.h
@@ -215,6 +215,7 @@ void iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
void iwl_mvm_te_clear_data(struct iwl_mvm *mvm,
struct iwl_mvm_time_event_data *te_data);

+void iwl_mvm_cleanup_roc_te(struct iwl_mvm *mvm);
void iwl_mvm_roc_done_wk(struct work_struct *wk);

/**
--
2.5.0


2015-12-21 20:52:15

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 27/45] iwlwifi: clear ieee80211_tx_info->driver_data in the op_mode

The transport will need to use the info->driver_data
pointers. Since the op_mode has this memory hot in cache,
clear it there.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/dvm/tx.c | 1 +
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 3 ++-
drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 2 +-
3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
index cf0ad5f..59e2001 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
@@ -383,6 +383,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
iwlagn_tx_cmd_build_rate(priv, tx_cmd, info, sta, fc);

memset(&info->status, 0, sizeof(info->status));
+ memset(info->driver_data, 0, sizeof(info->driver_data));

info->driver_data[0] = ctx;
info->driver_data[1] = dev_cmd;
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 6534537..a2683ef 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -552,7 +552,8 @@ struct iwl_trans_txq_scd_cfg {
* If RFkill is asserted in the middle of a SYNC host command, it must
* return -ERFKILL straight away.
* May sleep only if CMD_ASYNC is not set
- * @tx: send an skb
+ * @tx: send an skb. The transport relies on the op_mode to zero the
+ * the ieee80211_tx_info->driver_data.
* Must be atomic
* @reclaim: free packet until ssn. Returns a list of freed packets.
* Must be atomic
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 04e921f..8bf48a7 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -346,8 +346,8 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
iwl_mvm_set_tx_cmd_rate(mvm, tx_cmd, info, sta, hdr->frame_control);

memset(&info->status, 0, sizeof(info->status));
+ memset(info->driver_data, 0, sizeof(info->driver_data));

- info->driver_data[0] = NULL;
info->driver_data[1] = dev_cmd;

return dev_cmd;
--
2.5.0


2015-12-21 20:52:11

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 24/45] iwlwifi: pcie: allow to pretend to have Tx CSUM for debug

Allow to configure the driver to pretend to have TX CSUM
offload support. This will be useful to test the TSO flows
that will come in further patches.
This configuration is disabled by default.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 ++
drivers/net/wireless/intel/iwlwifi/mvm/constants.h | 1 +
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 3 +++
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 1 +
drivers/net/wireless/intel/iwlwifi/pcie/internal.h | 3 +++
drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 1 +
drivers/net/wireless/intel/iwlwifi/pcie/tx.c | 13 +++++++++++++
7 files changed, 24 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
index 777fd6c..6534537 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
@@ -478,6 +478,7 @@ struct iwl_hcmd_arr {
* in DWORD (as opposed to bytes)
* @scd_set_active: should the transport configure the SCD for HCMD queue
* @wide_cmd_header: firmware supports wide host command header
+ * @sw_csum_tx: transport should compute the TCP checksum
* @command_groups: array of command groups, each member is an array of the
* commands in the group; for debugging only
* @command_groups_size: number of command groups, to avoid illegal access
@@ -497,6 +498,7 @@ struct iwl_trans_config {
bool bc_table_dword;
bool scd_set_active;
bool wide_cmd_header;
+ bool sw_csum_tx;
const struct iwl_hcmd_arr *command_groups;
int command_groups_size;

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
index 1f8f616..b00c03f 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/constants.h
@@ -106,6 +106,7 @@
#define IWL_MVM_RS_RSSI_BASED_INIT_RATE 0
#define IWL_MVM_RS_80_20_FAR_RANGE_TWEAK 1
#define IWL_MVM_TOF_IS_RESPONDER 0
+#define IWL_MVM_SW_TX_CSUM_OFFLOAD 0
#define IWL_MVM_RS_NUM_TRY_BEFORE_ANT_TOGGLE 1
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE 2
#define IWL_MVM_RS_HT_VHT_RETRIES_PER_RATE_TW 1
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 0fb10fd..0227b29 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -667,6 +667,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
if (!iwl_mvm_is_csum_supported(mvm))
hw->netdev_features &= ~NETIF_F_RXCSUM;

+ if (IWL_MVM_SW_TX_CSUM_OFFLOAD)
+ hw->netdev_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
+
ret = ieee80211_register_hw(mvm->hw);
if (ret)
iwl_mvm_leds_exit(mvm);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index ffcebea..50b8c01 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -541,6 +541,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
trans_cfg.scd_set_active = true;

trans_cfg.sdio_adma_addr = fw->sdio_adma_addr;
+ trans_cfg.sw_csum_tx = IWL_MVM_SW_TX_CSUM_OFFLOAD;

/* Set a short watchdog for the command queue */
trans_cfg.cmd_q_wdg_timeout =
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
index 92a35d9..3d47dd7 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
@@ -307,6 +307,8 @@ iwl_pcie_get_scratchbuf_dma(struct iwl_txq *txq, int idx)
* @bc_table_dword: true if the BC table expects DWORD (as opposed to bytes)
* @scd_set_active: should the transport configure the SCD for HCMD queue
* @wide_cmd_header: true when ucode supports wide command header format
+ * @sw_csum_tx: if true, then the transport will compute the csum of the TXed
+ * frame.
* @rx_page_order: page order for receive buffer size
* @reg_lock: protect hw register access
* @mutex: to protect stop_device / start_fw / start_hw
@@ -361,6 +363,7 @@ struct iwl_trans_pcie {
bool bc_table_dword;
bool scd_set_active;
bool wide_cmd_header;
+ bool sw_csum_tx;
u32 rx_page_order;

/*protect hw register */
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index a5bf24e..97e22fb 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -1442,6 +1442,7 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
trans_pcie->wide_cmd_header = trans_cfg->wide_cmd_header;
trans_pcie->bc_table_dword = trans_cfg->bc_table_dword;
trans_pcie->scd_set_active = trans_cfg->scd_set_active;
+ trans_pcie->sw_csum_tx = trans_cfg->sw_csum_tx;

trans->command_groups = trans_cfg->command_groups;
trans->command_groups_size = trans_cfg->command_groups_size;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index 2952915..6c460a5 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -1823,6 +1823,19 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
"TX on unused queue %d\n", txq_id))
return -EINVAL;

+ if (unlikely(trans_pcie->sw_csum_tx &&
+ skb->ip_summed == CHECKSUM_PARTIAL)) {
+ int offs = skb_checksum_start_offset(skb);
+ int csum_offs = offs + skb->csum_offset;
+ __wsum csum;
+
+ if (skb_ensure_writable(skb, csum_offs + sizeof(__sum16)))
+ return -1;
+
+ csum = skb_checksum(skb, offs, skb->len - offs, 0);
+ *(__sum16 *)(skb->data + csum_offs) = csum_fold(csum);
+ }
+
if (skb_is_nonlinear(skb) &&
skb_shinfo(skb)->nr_frags > IWL_PCIE_MAX_FRAGS &&
__skb_linearize(skb))
--
2.5.0


2015-12-21 20:51:16

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 13/45] iwlwifi: block the queues when we send ADD_STA for uAPSD

We send an ADD_STA to instruct the firmware to release
frames despite the peer being in PS.
Since the ADD_STA command and the Tx frame that comes
immediately afterwards can be reordered by the DMA engine,
we need to block the Tx queues until the firmware replies
with the ADD_STA response.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 13 +++++++++++++
drivers/net/wireless/intel/iwlwifi/mvm/sta.c | 7 ++++++-
2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index b71c85b..4e417fd 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -839,6 +839,18 @@ static void iwl_mvm_stop_sw_queue(struct iwl_op_mode *op_mode, int queue)
}
}

+static void iwl_mvm_async_cb(struct iwl_op_mode *op_mode,
+ const struct iwl_device_cmd *cmd)
+{
+ struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
+
+ /*
+ * For now, we only set the CMD_WANT_ASYNC_CALLBACK for ADD_STA
+ * commands that need to block the Tx queues.
+ */
+ iwl_trans_block_txq_ptrs(mvm->trans, false);
+}
+
static void iwl_mvm_wake_sw_queue(struct iwl_op_mode *op_mode, int queue)
{
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
@@ -1414,6 +1426,7 @@ int iwl_mvm_exit_d0i3(struct iwl_op_mode *op_mode)

#define IWL_MVM_COMMON_OPS \
/* these could be differentiated */ \
+ .async_cb = iwl_mvm_async_cb, \
.queue_full = iwl_mvm_stop_sw_queue, \
.queue_not_full = iwl_mvm_wake_sw_queue, \
.hw_rf_kill = iwl_mvm_set_hw_rfkill_state, \
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
index dc3206a..566b659 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
@@ -1708,7 +1708,12 @@ void iwl_mvm_sta_modify_sleep_tx_count(struct iwl_mvm *mvm,
cmd.sleep_state_flags |= cpu_to_le16(STA_SLEEP_STATE_UAPSD);
}

- ret = iwl_mvm_send_cmd_pdu(mvm, ADD_STA, CMD_ASYNC, sizeof(cmd), &cmd);
+ /* block the Tx queues until the FW updated the sleep Tx count */
+ iwl_trans_block_txq_ptrs(mvm->trans, true);
+
+ ret = iwl_mvm_send_cmd_pdu(mvm, ADD_STA,
+ CMD_ASYNC | CMD_WANT_ASYNC_CALLBACK,
+ sizeof(cmd), &cmd);
if (ret)
IWL_ERR(mvm, "Failed to send ADD_STA command (%d)\n", ret);
}
--
2.5.0


2015-12-21 20:52:35

by Grumbach, Emmanuel

[permalink] [raw]
Subject: [PATCH 38/45] iwlwifi: mvm: infrastructure for frame-release message

From: Sara Sharon <[email protected]>

Incoming hardware will send frame release notifications to
the reorder buffer in order to update with the BA session
status and up to date NSSN.
This patch enables the API.

Signed-off-by: Johannes Berg <[email protected]>
Signed-off-by: Sara Sharon <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h | 2 ++
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 2 ++
drivers/net/wireless/intel/iwlwifi/mvm/ops.c | 8 +++++++-
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 6 ++++++
4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
index 0a8d162..fb6d341 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api-rx.h
@@ -316,6 +316,8 @@ enum iwl_rx_mpdu_sta_id_flags {
IWL_RX_MPDU_SIF_FILTER_STATUS_MASK = 0xc0,
};

+#define IWL_RX_REORDER_DATA_INVALID_BAID 0x7f
+
enum iwl_rx_mpdu_reorder_data {
IWL_RX_MPDU_REORDER_NSSN_MASK = 0x00000fff,
IWL_RX_MPDU_REORDER_SN_MASK = 0x00fff000,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index 0088106..86409c5 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -1138,6 +1138,8 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
void iwl_mvm_rx_phy_cmd_mq(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
struct iwl_rx_cmd_buffer *rxb, int queue);
+void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm,
+ struct iwl_rx_cmd_buffer *rxb, int queue);
void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 0885b77..2debce3 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -822,6 +822,8 @@ static void iwl_mvm_rx(struct iwl_op_mode *op_mode,

if (likely(pkt->hdr.cmd == REPLY_RX_MPDU_CMD))
iwl_mvm_rx_rx_mpdu(mvm, napi, rxb);
+ else if (pkt->hdr.cmd == FRAME_RELEASE)
+ iwl_mvm_rx_frame_release(mvm, rxb, 0);
else if (pkt->hdr.cmd == REPLY_RX_PHY_CMD)
iwl_mvm_rx_rx_phy_cmd(mvm, rxb);
else
@@ -1488,8 +1490,12 @@ static void iwl_mvm_rx_mq_rss(struct iwl_op_mode *op_mode,
unsigned int queue)
{
struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
+ struct iwl_rx_packet *pkt = rxb_addr(rxb);

- iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue);
+ if (unlikely(pkt->hdr.cmd == FRAME_RELEASE))
+ iwl_mvm_rx_frame_release(mvm, rxb, queue);
+ else
+ iwl_mvm_rx_mpdu_mq(mvm, napi, rxb, queue);
}

static const struct iwl_op_mode_ops iwl_mvm_ops_mq = {
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
index c67962e..e2a872d 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -370,3 +370,9 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, hdr, len, ampdu_status,
crypt_len, rxb);
}
+
+void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm,
+ struct iwl_rx_cmd_buffer *rxb, int queue)
+{
+ /* TODO */
+}
--
2.5.0