User Tools

Site Tools


en:users:drivers:wil6210

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Last revision Both sides next revision
en:users:drivers:wil6210 [2015/01/26 09:49]
127.0.0.1 external edit
en:users:drivers:wil6210 [2015/11/15 13:21]
Vladimir Kondratiev
Line 1: Line 1:
  
 Go back –> [[en/​users/​Drivers/​Atheros|Atheros Linux wireless drivers]] ​ Go back –> [[en/​users/​Drivers/​Atheros|Atheros Linux wireless drivers]] ​
- 
-  
  
  
 ===== About wil6210 ===== ===== About wil6210 =====
  
-The wil6210 driver supports ​several ​60GHz wireless card by Qualcomm ​(1-st ones was originally made by Wilocity; later Wilocity got acquired by Qualcomm). Hardware provides [[WiFi|WiFi]] and wireless PCIE connectivity,​ as described in the [[WiGig|WiGig]] WBE spec. Driver supports [[WiFi|WiFi]] only. All cards are PCIE devices ​+The wil6210 driver supports 60GHz wireless card by Qualcomm. 
 +Hardware provides [[WiFi|WiFi]] and wireless PCIE connectivity,​ as described in 
 +the [[WiGig|WiGig]] WBE spec. Driver supports [[WiFi|WiFi]] only. Card is PCIE device, with PCIe 
 +ID ''​1ae9:​0310''​
  
-Some cards have 60G device combined with Atheros 2.4/5.2 GHz [[WiFi|WiFi]] ​card. On the PCI, it is represented as the following hierarchy: ​+There are old version of the Qualcomm 60GHz card, with PCIe ID ''​1ae9:​0301'' ​it is not supported.
  
 +wil6210 device, ''​1ae9:​0310'',​ has one 2Mb BAR; it supports MSI interrupt.
  
-<​code>​1ae9:​0101-+-1ae9:​0201---168c:​0034 +Since 60GHz is emerging technology ​and hardware ​is completely newdriver provides lots of features 
-          +-1ae9:​0201---1ae9:​0301 +for experimenting, and can be used as researcher workbench.
-          +-1ae9:​0201 +
-          \-1ae9:​0201</​code>​ +
-Chip consists of the root bridge 1ae9:0101, with 4 ports 1ae9:0201. One port routed to separate Atheros card 168c:0034, it is handled by the ath9k driver. Another port connected to the wil6210 device 1ae9:0301, that is on the same chip. 2 empty ports may be populated when connecting in WBE (PCIE-over-60g) mode.  +
- +
-Devices 1ae9:xxxx except 1ae9:0101 are configurable from the firmware, ​and may wary depending on the FW build. In particular, slots 1ae9:0201 may be represented slightly different, using device ID 0200, 0201, 0202, 0203.  +
- +
-**Warning!** It may be that [[WiFi|WiFi]] device 1ae9:​0301 ​is not visible. This is the case if FW build is WBE-only. If you see thisplease contact Wilocity [[http://​wilocity.com/​|http://​wilocity.com/​]] to obtain and flash FW with [[WiFi|WiFi]] support. ​ +
- +
-wil6210 device1ae9:0301, has one 2Mb BAR.  +
- +
-Depending on card flavor ​and generation, Atheros 2.4/5.2 GHz [[WiFi|WiFi]] (device 168c:xxxx) may be present or notDevice IDs for 60G device may also differ. Currently, it may be 1ae9:0301 or 1ae9:​0310 ​+
  
  
 ===== Network features ===== ===== Network features =====
- 
 For the [[WiFi|WiFi]] connection, implemented is 802.11ad spec. Supported are channels 1..3 with corresponded frequencies 58320, 60480, 62640 MHz.  For the [[WiFi|WiFi]] connection, implemented is 802.11ad spec. Supported are channels 1..3 with corresponded frequencies 58320, 60480, 62640 MHz. 
  
 wil6210 use cfg80211 framework, but not mac80211. ​ wil6210 use cfg80211 framework, but not mac80211. ​
  
 +==== Firmware ====
  
-===== What works ===== +We need to get this publicly available... 
-  * sniffer. Due to hardware limitation it captures either only CP (control PHY) or DP (data PHY) frames  +
-  * managed modeworks well even with network-manager GUIRequire up-to-date wpa_supplicant.  +
-  * AP mode. Up to 8 simultaneous connected stations supported  +
-  * security. supported is GCMP, it is the only allowed cipher accordingly to the spec. Driver designed in a way that hardware start running only when network interface brought up, with either '​ifconfig up' or starting AP. All settings made before are cached in the driver but not passed to the hardware+
  
 +Firmware has to be downloaded to the card; card will not work without firmware. ​
  
-==== iw commands supported ​==== +==== What works ==== 
- +  * managed modeaka station. Fully functional. Require up-to-date wpa_supplicant.  
-iw link: query link status. Report current MCS.  +  snifferMay be configured to captures either only CP (control PHYor all frames ​ 
- +  AP modeUp to 8 simultaneous connected stations supported ​ 
- +  securitysupported ​is GCMPit is the only allowed cipher accordingly ​to the spec.
-===== Module parameters ===== +
-    * rtap_include_phy_info  +
-    *  ​* ​Include PHY info in the radiotap headerdefault ​no (bool)  +
-    *   ​use_msi  +
-    *    * Use MSI interrupt: 0 - don't, 1 - (default) - single, or 3 (int)  +
-    *     ​debug_fw  +
-    *      * load driver if FW not ready. For FW debug (bool)  +
-    *       ​max_assoc_sta  +
-    *        * Max number of stations associated ​to the AP (uint)  +
-    *         ​no_fw_recovery  +
-    *          * disable automatic FW error recovery (bool)  +
-    *           ​no_fw_load  +
-    *            * do not download FW, use one in on-card flash(bool) ​ +
-                itr_trsh  +
-    *              * Interrupt moderation threshold, usecs. (uint)  +
-                  mtu_max  +
-    *                * Max MTU value.  +
-                    rx_ring_order  +
-    *                  * Rx ring order; size = 1 << order  +
-    *                   ​tx_ring_order  +
-    *                    * Tx ring order; size = 1 << order  +
- +
-wil6210 support set of interrupt handling modes:  +
- +
-- INTx - legacy pin interruptDo not use if possible. - 1MSI - one MSI interrupt. This is the default mode. - 3MSI - 3 MSI interrupts for {TxRx, Misc}.  +
- +
-For interrupt handling mode, probed ​is highest one specified with @use_msi, with fallback:  +
- +
-3MSI -> 1MSI -> INTx  +
- +
-On the x86 platform, multiple MSI interrupts are not supported with recent kernel (3.17).  +
- +
-When **debug_fw** set to true, driver probe will not fail if firmware do not report "​ready"​ event. This is to aid firmware boot issues debugging+
  
 +==== TODO ====
 +  * P2P and FST flows 
 +  * various offloads
  
-===== Sniffer =====+==== Status ​==== 
 +  * Basic support for 802.11ad merged into kernel 3.6  
 +  * The driver merged into kernel 3.8.  
 +  * Patches for basic 11ad support for hostapd/​wpa_supplicant merged. ​
  
 +==== Sniffer ====
 To configure wil6210 in sniffer mode (assume $WLAN set to network interface name): ​ To configure wil6210 in sniffer mode (assume $WLAN set to network interface name): ​
- 
  
 <​code>#​ iw $WLAN set type monitor</​code>​ <​code>#​ iw $WLAN set type monitor</​code>​
-Due to hardware/​firmware deficiency, sniffer ​can capture either only control PHY (CP) or only data PHY (DP)To configure for desired PHY type doafter configuring ​for monitor ​mode:  +Sniffer ​can capture either only control PHY (CP) or all framesNote however, 
- +data sent at high MCS is hard to acquire by the antennas configured ​for quasi-omni ​mode.
-For CP: +
  
 +To configure for control PHY type do, after configuring for monitor mode: 
  
 <​code>#​ iw $WLAN set monitor control</​code>​ <​code>#​ iw $WLAN set monitor control</​code>​
-For DP:  
  
- 
-<​code>#​ iw $WLAN set monitor none</​code>​ 
 Finally, bring interface up:  Finally, bring interface up: 
- 
  
 <​code>#​ ifconfig $WLAN up</​code>​ <​code>#​ ifconfig $WLAN up</​code>​
  
-===== TODO ===== +==== AP mode ====
-    *                     * P2P and FST flows  +
-    *                     * various offloads  +
-===== Status ===== +
-    *                       * Basic support for 802.11ad merged into kernel 3.6  +
-    *                       * The driver merged into kernel 3.8.  +
-    *                       * Patches for hostapd/​wpa_supplicant submitted, some part is already merged.  +
-===== Firmware ===== +
- +
-We need to get this publicly available...  +
- +
-In the current version, firmware stored in the flash memory on the NIC and not downloaded by the driver. Firmware flashing required for the upgrade only.  +
- +
- +
-===== How to ===== +
- +
-To start AP mode, use recent wpa_supplicant (assume relevant patches already merged). Sample config for non-secure mode: +
  
 +To start AP mode, use recent wpa_supplicant (assume relevant patches already merged).
 +Sample config for non-secure mode: 
  
 <​code>​ap_scan=2 <​code>​ap_scan=2
Line 129: Line 72:
         key_mgmt=NONE         key_mgmt=NONE
 }</​code>​ }</​code>​
 +
 Sample config for secure mode. Note GCMP cipher: ​ Sample config for secure mode. Note GCMP cipher: ​
- 
  
 <​code>​ap_scan=2 <​code>​ap_scan=2
Line 145: Line 88:
 }</​code>​ }</​code>​
  
-===== WMI commands ​=====+===== For developer ​=====
  
-Control communication with the card is done through so called WMI commands and events. Target access to the mailbox within memory in BAR0 used. There are 2 similar mailbox structures: one for host->​card commandsand one for card->​host events+Information below is not necessary ​for operating driverit is interesting 
 +only for those developing/​customizing driver, or experimenting with the 60GHz technology.
  
 +==== Module parameters ====
  
-===== Tx/Rx =====+^ Parameter ​              ^ Type    ^ Default ​ ^ Comment ​                                                                                                                                           ^ 
 +| use_msi ​                | bool    | true     | Use MSI or INTx (pin) interrupt ​                                                                                                                   | 
 +| mtu_max ​                | uint    | 1986     | Maximum supported MTU, [68..7912] ​                                                                                                                 | 
 +| rx_ring_order ​          | uint    | 10       | Rx sing size is ''​1 << order'',​ [5..15] ​                                                                                                           | 
 +| tx_ring_order ​          | uint    | 10       | Tx sing size is ''​1 << order'',​ [5..15] ​                                                                                                           | 
 +| bcast_ring_order ​       | uint    | 7        | Broadcast Tx sing size is ''​1 << order'',​ [5..15] ​                                                                                                 | 
 +| max_assoc_sta ​          | uint    | 8        | Max number of stations associated to the AP, [1..8] ​                                                                                               | 
 +| agg_wsize ​              | int     | 0        | Window size for Tx Block Ack after connect; 0 - use default; < 0 - don't auto-establish. Writeable, new value used when new block ack established ​ | 
 +| rx_ring_overflow_thrsh ​ | ushort ​ | 0        | RX ring overflow threshold in descriptors. ​                                                                                                        | 
 +| no_fw_recovery ​         | bool    | false    | disable automatic FW error recovery ​                                                                                                               | 
 +| debug_fw ​               | bool    | false    | do not perform card reset. For FW debug                                                                                                            | 
 +| rx_align_2 ​             | bool    | false    | align Rx buffers on 4*n+2                                                                                                                          | 
 +| rtap_include_phy_info ​  | bool    | false    | Include PHY info in the radiotap header ​                                                                                                           |
  
-DMA using '​vring'​ structures. Vring in consistent memory; hold descriptors that points to the data buffers. Card to write status back to the descriptor. ​ 
  
-There is one Rx vring. Tx vrings - multiple, per DA*TID. ​+wil6210 support of interrupt handling modes: ​
  
 +  * MSI - MSI interrupt. This is the default mode.
 +  * INTx - legacy pin interrupt. Do not use if possible.
  
-===== Firmware error recovery ​=====+When **debug_fw** set to true, driver probe will not fail if firmware do not report "​ready"​ event. This is to aid firmware boot issues debugging.  
 + 
 + 
 + 
 +==== WMI commands ==== 
 + 
 +Control communication with the card is done through so called WMI commands and events. 
 +Target access to the mailbox within memory in BAR0 used. There are 2 similar mailbox structures:​ 
 +one for host->​card commands, and one for card->​host events.  
 + 
 +==== Tx/Rx ==== 
 + 
 +DMA using '​vring'​ structures. Vring allocated in consistent memory; 
 +hold descriptors that points to the data buffers. Card to write status back to the descriptor.  
 + 
 +There is one Rx vring. Tx vrings - multiple, per DA*TID, AP also has broadcast Tx vring.  
 + 
 +==== Firmware error recovery ====
  
 Should firmware crash, or in case of scan timeout, driver try to recover from error by resetting card. This works for **station** only. In the **AP** mode, driver will not perform recovery. It will, however, report error to the user space. There are 2 modes of firmware recovery, depending on the driver parameter **no_fw_recovery**: ​ Should firmware crash, or in case of scan timeout, driver try to recover from error by resetting card. This works for **station** only. In the **AP** mode, driver will not perform recovery. It will, however, report error to the user space. There are 2 modes of firmware recovery, depending on the driver parameter **no_fw_recovery**: ​
-    *                         * Automatic  +  ​* Automatic  
-    ​* ​                        ​* ​ * when **no_fw_recovery** not set (default), driver starts recovery attempt immediately. If firmware keeps crashing, driver will stop after 5 attempts performed within short time.  +  * when **no_fw_recovery** not set (default), driver starts recovery attempt immediately. If firmware keeps crashing, driver will stop after 5 attempts performed within short time.  
-                            *   Manual  +  * Manual  
-    ​* ​                        ​* ​   ​* when **no_fw_recovery** set (**Y** or **1**), driver will report firmware error to the user space and wait for command to continue. To query error state and continue with recovery, use **recovery** file on the driver'​s debugfs: read it  +  * when **no_fw_recovery** set (**Y** or **1**), driver will report firmware error to the user space and wait for command to continue. To query error state and continue with recovery, use **recovery** file on the driver'​s debugfs: read it  
-    ​* ​                        ​* ​    +
 <​code>​cat /​sys/​kernel/​debug/​ieee80211/​phy/​wil6210/​recovery</​code>​ <​code>​cat /​sys/​kernel/​debug/​ieee80211/​phy/​wil6210/​recovery</​code>​
 to query status, it will reads: ​ to query status, it will reads: ​
Line 170: Line 145:
 If **state** is //​pending//,​ it is time to collect all crash information as desired, and continue with recovery by writing **run** into **recovery**: ​ If **state** is //​pending//,​ it is time to collect all crash information as desired, and continue with recovery by writing **run** into **recovery**: ​
     *                         ​* ​    * <​code>​echo -n "​run"​ > /​sys/​kernel/​debug/​ieee80211/​phy/​wil6210/​recovery</​code>​     *                         ​* ​    * <​code>​echo -n "​run"​ > /​sys/​kernel/​debug/​ieee80211/​phy/​wil6210/​recovery</​code>​
-===== Debug facilities ​=====+ 
 +==== Debug facilities ====
  
  
-==== Dynamic debug ====+=== Dynamic debug ===
  
 Almost all messages printed to the dmesg, are "​dynamic debug" ones. See Documentation/​dynamic-debug-howto.txt for details. Module "​wil6210"​ uses format prefixes to identify message groups: ​ Almost all messages printed to the dmesg, are "​dynamic debug" ones. See Documentation/​dynamic-debug-howto.txt for details. Module "​wil6210"​ uses format prefixes to identify message groups: ​
-    *                         ​* ​      * "DBG[ IRQ]" for interrupt related messages. Prints every IRQ.  +   * "DBG[ IRQ]" for interrupt related messages. Prints every IRQ.  
-    ​* ​                        ​* ​      * "​DBG[TXRX]"​ for Tx/Rx path. Prints every Tx/Rx package.  +   ​* "​DBG[TXRX]"​ for Tx/Rx path. Prints every Tx/Rx package.  
-    ​* ​                        ​* ​      * "DBG[ WMI]" for WMI commands subsystem  +   ​* "DBG[ WMI]" for WMI commands subsystem  
-    ​* ​                        ​* ​      * "DBG[ FW ]" for FW download  +   ​* "DBG[ FW ]" for FW download  
-    ​* ​                        ​* ​      * "​DBG[MISC]"​ for various un-categorized cases Groups IRQ and TXRX are heavy traffic; enable only when required. Group WMI is relatively low traffic, it prints only WMI messages. It is good idea to enable all but IRQ and TXRX when debugging. ​+   ​* "​DBG[MISC]"​ for various un-categorized cases Groups IRQ and TXRX are heavy traffic; enable only when required. Group WMI is relatively low traffic, it prints only WMI messages. It is good idea to enable all but IRQ and TXRX when debugging. ​ 
 +   * "DBG[ IOC]" for IOCTL 
  
  
-==== Debugfs ​====+=== Debugfs ===
  
 All debugfs files placed under standard location for the cfg80211 devices, $DEBUGFS/​ieee80211/​$PHY/​ where $PHY is phy name like '​phy1'​. ​ All debugfs files placed under standard location for the cfg80211 devices, $DEBUGFS/​ieee80211/​$PHY/​ where $PHY is phy name like '​phy1'​. ​
  
 All wil6210 specific files placed under directory '​wil6210'​. Facilities provided: ​ All wil6210 specific files placed under directory '​wil6210'​. Facilities provided: ​
-    *                         ​* ​        * register access. All ICR (Interrupt Control Registers) groups represented as directories,​ with entries per register, allowing read/write. ITR (Interrupt Threshold Registers) represented as well.  +  ​* register access. All ICR (Interrupt Control Registers) groups represented as directories,​ with entries per register, allowing read/write. ITR (Interrupt Threshold Registers) represented as well.  
-    ​* ​                        ​* ​        * raw memory access. All memory sections represented as '​blob'​ files, providing read only access to the memory on card. Sections include: ​+  * raw memory access. All memory sections represented as '​blob'​ files, providing read only access to the memory on card. Sections include: ​
 <​code>​+-------------------------------+---------------+ <​code>​+-------------------------------+---------------+
 | blob_xxx ​ | BAR0    | Size    | Comment ​      | | blob_xxx ​ | BAR0    | Size    | Comment ​      |
Line 202: Line 179:
 +-----------+---------+---------+---------------+</​code>​ +-----------+---------+---------+---------------+</​code>​
 Raw memory access used by firmware/​ucode trace extractor. See below. Also, raw memory dump may be obtained for later analysis. ​ Raw memory access used by firmware/​ucode trace extractor. See below. Also, raw memory dump may be obtained for later analysis. ​
-    *                         ​* ​          * DWORD memory read, as FW see it. Files '​mem_addr'​ and '​mem_val'​ provide access to the memory, using FW addresses (FW memory mapping is somewhat different from what host see in BAR0). Write address to the '​mem_addr',​ then read '​mem_val'​. It will reads like "​[0x%08x] = 0x%08x\n",​ addr, value  +  ​* DWORD memory read, as FW see it. Files '​mem_addr'​ and '​mem_val'​ provide access to the memory, using FW addresses (FW memory mapping is somewhat different from what host see in BAR0). Write address to the '​mem_addr',​ then read '​mem_val'​. It will reads like "​[0x%08x] = 0x%08x\n",​ addr, value  
-    ​* ​                        ​* ​          * mailbox for WMI commands events. File '​mbox'​ reads like: +  * mailbox for WMI commands events. File '​mbox'​ reads like: 
 <​code>​ring tx = { <​code>​ring tx = {
   base = 0x008802e8   base = 0x008802e8
Line 245: Line 222:
  
 Printed for each ring (all addresses in FW memory mapping): ​ Printed for each ring (all addresses in FW memory mapping): ​
-    *                         ​* ​            * base address of ring in card's memory  +  ​* base address of ring in card's memory  
-    ​* ​                        ​* ​            * ring size in bytes and entries  +  * ring size in bytes and entries  
-    ​* ​                        ​* ​            * tail and head pointers  +  * tail and head pointers  
-    ​* ​                        ​* ​            * max. entry size. It is fake for Rx - FW may allocate entry of arbitrary size  +  * max. entry size. It is fake for Rx - FW may allocate entry of arbitrary size  
-    ​* ​                        ​* ​            * mailbox entries, format for entry: ​+  * mailbox entries, format for entry: ​
 <​code> ​      /-- '​E'​ for empty entry, '​F'​ for full <​code> ​      /-- '​E'​ for empty entry, '​F'​ for full
        | /+-- '​t'​ for tail, '​h'​ for head        | /+-- '​t'​ for tail, '​h'​ for head
Line 273: Line 250:
  
 Information printed: ​ Information printed: ​
-    *                         ​* ​                * addresses, physical (pa) and virtual (va)  +  ​* addresses, physical (pa) and virtual (va)  
-    ​* ​                        ​* ​                * size, entries  +  * size, entries  
-    ​* ​                        ​* ​                * software head and tail pointers  +  * software head and tail pointers  
-    ​* ​                        ​* ​                * hardware tail, format: [fw addr] -> value  +  * hardware tail, format: [fw addr] -> value  
-    ​* ​                        ​* ​                * One letter per vring entry, '​H'​ for hardware owned and '​S'​ for software owned ones. +  * One letter per vring entry, '​H'​ for hardware owned and '​S'​ for software owned ones. 
 ===== Contributions to wil6210 ===== ===== Contributions to wil6210 =====
  
Line 286: Line 263:
  
 You should subscribe to this page so you can get e-mail updates on changes and news for ath9k automatically. You'll get an e-mail as soon as this page gets updated. ​ You should subscribe to this page so you can get e-mail updates on changes and news for ath9k automatically. You'll get an e-mail as soon as this page gets updated. ​
- 
en/users/drivers/wil6210.txt · Last modified: 2015/11/15 14:34 by Vladimir Kondratiev