176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 2004-2008 Reyk Floeter <reyk@openbsd.org> 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 2006-2008 Nick Kossifidis <mickflemm@gmail.com> 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 2007-2008 Jiri Slaby <jirislaby@gmail.com> 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Lightly modified for gPXE, July 2009, by Joshua Oreman <oremanj@rwcr.net>. 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Permission to use, copy, modify, and distribute this software for any 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * purpose with or without fee is hereby granted, provided that the above 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * copyright notice and this permission notice appear in all copies. 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( MIT ); 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**************\ 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman* Capabilities * 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman\**************/ 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "ath5k.h" 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "reg.h" 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "base.h" 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Fill the capabilities struct 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * TODO: Merge this with EEPROM code when we are done with it 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint ath5k_hw_set_capabilities(struct ath5k_hw *ah) 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u16 ee_header; 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Capabilities stored in the EEPROM */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ee_header = ah->ah_capabilities.cap_eeprom.ee_header; 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ah->ah_version == AR5K_AR5210) { 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Set radio capabilities 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (The AR5110 only supports the middle 5GHz band) 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_5ghz_min = 5120; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_5ghz_max = 5430; 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_2ghz_min = 0; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_2ghz_max = 0; 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set supported modes */ 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= AR5K_MODE_BIT_11A; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= AR5K_MODE_BIT_11A_TURBO; 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX The tranceiver supports frequencies from 4920 to 6100GHz 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX and from 2312 to 2732GHz. There are problems with the 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX current ieee80211 implementation because the IEEE 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX channel mapping does not support negative channel 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX numbers (2312MHz is channel -19). Of course, this 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX doesn't matter because these channels are out of range 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX but some regulation domains like MKK (Japan) will 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * XXX support frequencies somewhere around 4.8GHz. 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Set radio capabilities 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (AR5K_EEPROM_HDR_11A(ee_header)) { 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 4920 */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_5ghz_min = 5005; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_5ghz_max = 6100; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set supported modes */ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= AR5K_MODE_BIT_11A; 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= AR5K_MODE_BIT_11A_TURBO; 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ah->ah_version == AR5K_AR5212) 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman AR5K_MODE_BIT_11G_TURBO; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Enable 802.11b if a 2GHz capable radio (2111/5112) is 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * connected */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (AR5K_EEPROM_HDR_11B(ee_header) || 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (AR5K_EEPROM_HDR_11G(ee_header) && 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_version != AR5K_AR5211)) { 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 2312 */ 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_2ghz_min = 2412; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_range.range_2ghz_max = 2732; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (AR5K_EEPROM_HDR_11B(ee_header)) 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman AR5K_MODE_BIT_11B; 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (AR5K_EEPROM_HDR_11G(ee_header) && 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_version != AR5K_AR5211) 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_mode |= 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman AR5K_MODE_BIT_11G; 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* GPIO */ 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_gpio_npins = AR5K_NUM_GPIO; 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set number of supported TX queues */ 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ah->ah_capabilities.cap_queues.q_tx_num = 1; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Main function used by the driver part to check caps */ 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint ath5k_hw_get_capability(struct ath5k_hw *ah, 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman enum ath5k_capability_type cap_type, 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman u32 capability __unused, u32 *result) 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (cap_type) { 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_NUM_TXQUEUES: 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (result) { 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *result = 1; 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_VEOL: 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_COMPRESSION: 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ah->ah_version == AR5K_AR5212) 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto no; 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_BURST: 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_TPC: 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_BSSIDMASK: 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ah->ah_version == AR5K_AR5212) 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto no; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case AR5K_CAP_XR: 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (ah->ah_version == AR5K_AR5212) 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto yes; 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto no; 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto no; 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanno: 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -EINVAL; 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanyes: 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 155