This shows you the differences between two versions of the page.
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 new, driver 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 this, please contact Wilocity [[http://wilocity.com/|http://wilocity.com/]] to obtain and flash FW with [[WiFi|WiFi]] support. | + | |
- | + | ||
- | wil6210 device, 1ae9: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 not. Device 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 mode. works well even with network-manager GUI. Require 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 mode, aka station. Fully functional. Require up-to-date wpa_supplicant. | |
- | iw link: query link status. Report current MCS. | + | * sniffer. May be configured to captures either only CP (control PHY) or all frames |
- | + | * AP mode. Up to 8 simultaneous connected stations supported | |
- | + | * security. supported is GCMP, it is the only allowed cipher accordingly to the spec. | |
- | ===== Module parameters ===== | + | |
- | * rtap_include_phy_info | + | |
- | * * Include PHY info in the radiotap header, default - 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 interrupt. Do not use if possible. - 1MSI - one MSI interrupt. This is the default mode. - 3MSI - 3 MSI interrupts for {Tx, Rx, 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 do, after configuring for monitor mode: | + | Sniffer can capture either only control PHY (CP) or all frames. Note 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 commands, and one for card->host events. | + | Information below is not necessary for operating driver, it 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. | ||
- |