root/dev/ic/ar5211.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ar5k_ar5211_fill
  2. ar5k_ar5211_attach
  3. ar5k_ar5211_nic_reset
  4. ar5k_ar5211_nic_wakeup
  5. ar5k_ar5211_radio_revision
  6. ar5k_ar5211_get_rate_table
  7. ar5k_ar5211_detach
  8. ar5k_ar5211_phy_disable
  9. ar5k_ar5211_reset
  10. ar5k_ar5211_set_def_antenna
  11. ar5k_ar5211_get_def_antenna
  12. ar5k_ar5211_set_opmode
  13. ar5k_ar5211_calibrate
  14. ar5k_ar5211_update_tx_triglevel
  15. ar5k_ar5211_setup_tx_queue
  16. ar5k_ar5211_setup_tx_queueprops
  17. ar5k_ar5211_get_tx_queueprops
  18. ar5k_ar5211_release_tx_queue
  19. ar5k_ar5211_reset_tx_queue
  20. ar5k_ar5211_get_tx_buf
  21. ar5k_ar5211_put_tx_buf
  22. ar5k_ar5211_num_tx_pending
  23. ar5k_ar5211_tx_start
  24. ar5k_ar5211_stop_tx_dma
  25. ar5k_ar5211_setup_tx_desc
  26. ar5k_ar5211_fill_tx_desc
  27. ar5k_ar5211_setup_xtx_desc
  28. ar5k_ar5211_proc_tx_desc
  29. ar5k_ar5211_has_veol
  30. ar5k_ar5211_get_rx_buf
  31. ar5k_ar5211_put_rx_buf
  32. ar5k_ar5211_start_rx
  33. ar5k_ar5211_stop_rx_dma
  34. ar5k_ar5211_start_rx_pcu
  35. ar5k_ar5211_stop_pcu_recv
  36. ar5k_ar5211_set_mcast_filter
  37. ar5k_ar5211_set_mcast_filterindex
  38. ar5k_ar5211_clear_mcast_filter_idx
  39. ar5k_ar5211_get_rx_filter
  40. ar5k_ar5211_set_rx_filter
  41. ar5k_ar5211_setup_rx_desc
  42. ar5k_ar5211_proc_rx_desc
  43. ar5k_ar5211_set_rx_signal
  44. ar5k_ar5211_dump_state
  45. ar5k_ar5211_get_diag_state
  46. ar5k_ar5211_get_lladdr
  47. ar5k_ar5211_set_lladdr
  48. ar5k_ar5211_set_regdomain
  49. ar5k_ar5211_set_ledstate
  50. ar5k_ar5211_set_associd
  51. ar5k_ar5211_set_bssid_mask
  52. ar5k_ar5211_set_gpio_output
  53. ar5k_ar5211_set_gpio_input
  54. ar5k_ar5211_get_gpio
  55. ar5k_ar5211_set_gpio
  56. ar5k_ar5211_set_gpio_intr
  57. ar5k_ar5211_get_tsf32
  58. ar5k_ar5211_get_tsf64
  59. ar5k_ar5211_reset_tsf
  60. ar5k_ar5211_get_regdomain
  61. ar5k_ar5211_detect_card_present
  62. ar5k_ar5211_update_mib_counters
  63. ar5k_ar5211_get_rf_gain
  64. ar5k_ar5211_set_slot_time
  65. ar5k_ar5211_get_slot_time
  66. ar5k_ar5211_set_ack_timeout
  67. ar5k_ar5211_get_ack_timeout
  68. ar5k_ar5211_set_cts_timeout
  69. ar5k_ar5211_get_cts_timeout
  70. ar5k_ar5211_is_cipher_supported
  71. ar5k_ar5211_get_keycache_size
  72. ar5k_ar5211_reset_key
  73. ar5k_ar5211_is_key_valid
  74. ar5k_ar5211_set_key
  75. ar5k_ar5211_set_key_lladdr
  76. ar5k_ar5211_set_power
  77. ar5k_ar5211_get_power_mode
  78. ar5k_ar5211_query_pspoll_support
  79. ar5k_ar5211_init_pspoll
  80. ar5k_ar5211_enable_pspoll
  81. ar5k_ar5211_disable_pspoll
  82. ar5k_ar5211_init_beacon
  83. ar5k_ar5211_set_beacon_timers
  84. ar5k_ar5211_reset_beacon
  85. ar5k_ar5211_wait_for_beacon
  86. ar5k_ar5211_is_intr_pending
  87. ar5k_ar5211_get_isr
  88. ar5k_ar5211_get_intr
  89. ar5k_ar5211_set_intr
  90. ar5k_ar5211_get_capabilities
  91. ar5k_ar5211_radar_alert
  92. ar5k_ar5211_eeprom_is_busy
  93. ar5k_ar5211_eeprom_read
  94. ar5k_ar5211_eeprom_write
  95. ar5k_ar5211_rfregs
  96. ar5k_ar5211_set_txpower_limit

    1 /*      $OpenBSD: ar5211.c,v 1.34 2007/04/10 17:47:55 miod Exp $        */
    2 
    3 /*
    4  * Copyright (c) 2004, 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
    5  *
    6  * Permission to use, copy, modify, and distribute this software for any
    7  * purpose with or without fee is hereby granted, provided that the above
    8  * copyright notice and this permission notice appear in all copies.
    9  *
   10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   17  */
   18 
   19 /*
   20  * HAL interface for the Atheros AR5001 Wireless LAN chipset
   21  * (AR5211 + AR5111).
   22  */
   23 
   24 #include <dev/ic/ar5xxx.h>
   25 #include <dev/ic/ar5211reg.h>
   26 #include <dev/ic/ar5211var.h>
   27 
   28 HAL_BOOL         ar5k_ar5211_nic_reset(struct ath_hal *, u_int32_t);
   29 HAL_BOOL         ar5k_ar5211_nic_wakeup(struct ath_hal *, u_int16_t);
   30 u_int16_t        ar5k_ar5211_radio_revision(struct ath_hal *, HAL_CHIP);
   31 const void       ar5k_ar5211_fill(struct ath_hal *);
   32 void             ar5k_ar5211_rfregs(struct ath_hal *, HAL_CHANNEL *, u_int,
   33     u_int);
   34 
   35 /*
   36  * Initial register setting for the AR5211
   37  */
   38 static const struct ar5k_ini ar5211_ini[] =
   39     AR5K_AR5211_INI;
   40 static const struct ar5k_ar5211_ini_mode ar5211_mode[] =
   41     AR5K_AR5211_INI_MODE;
   42 static const struct ar5k_ar5211_ini_rf ar5211_rf[] =
   43     AR5K_AR5211_INI_RF;
   44 
   45 AR5K_HAL_FUNCTIONS(extern, ar5k_ar5211,);
   46 
   47 const void
   48 ar5k_ar5211_fill(struct ath_hal *hal)
   49 {
   50         hal->ah_magic = AR5K_AR5211_MAGIC;
   51 
   52         /*
   53          * Init/Exit functions
   54          */
   55         AR5K_HAL_FUNCTION(hal, ar5211, get_rate_table);
   56         AR5K_HAL_FUNCTION(hal, ar5211, detach);
   57 
   58         /*
   59          * Reset functions
   60          */
   61         AR5K_HAL_FUNCTION(hal, ar5211, reset);
   62         AR5K_HAL_FUNCTION(hal, ar5211, set_opmode);
   63         AR5K_HAL_FUNCTION(hal, ar5211, calibrate);
   64 
   65         /*
   66          * TX functions
   67          */
   68         AR5K_HAL_FUNCTION(hal, ar5211, update_tx_triglevel);
   69         AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_queue);
   70         AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_queueprops);
   71         AR5K_HAL_FUNCTION(hal, ar5211, release_tx_queue);
   72         AR5K_HAL_FUNCTION(hal, ar5211, reset_tx_queue);
   73         AR5K_HAL_FUNCTION(hal, ar5211, get_tx_buf);
   74         AR5K_HAL_FUNCTION(hal, ar5211, put_tx_buf);
   75         AR5K_HAL_FUNCTION(hal, ar5211, tx_start);
   76         AR5K_HAL_FUNCTION(hal, ar5211, stop_tx_dma);
   77         AR5K_HAL_FUNCTION(hal, ar5211, setup_tx_desc);
   78         AR5K_HAL_FUNCTION(hal, ar5211, setup_xtx_desc);
   79         AR5K_HAL_FUNCTION(hal, ar5211, fill_tx_desc);
   80         AR5K_HAL_FUNCTION(hal, ar5211, proc_tx_desc);
   81         AR5K_HAL_FUNCTION(hal, ar5211, has_veol);
   82 
   83         /*
   84          * RX functions
   85          */
   86         AR5K_HAL_FUNCTION(hal, ar5211, get_rx_buf);
   87         AR5K_HAL_FUNCTION(hal, ar5211, put_rx_buf);
   88         AR5K_HAL_FUNCTION(hal, ar5211, start_rx);
   89         AR5K_HAL_FUNCTION(hal, ar5211, stop_rx_dma);
   90         AR5K_HAL_FUNCTION(hal, ar5211, start_rx_pcu);
   91         AR5K_HAL_FUNCTION(hal, ar5211, stop_pcu_recv);
   92         AR5K_HAL_FUNCTION(hal, ar5211, set_mcast_filter);
   93         AR5K_HAL_FUNCTION(hal, ar5211, set_mcast_filterindex);
   94         AR5K_HAL_FUNCTION(hal, ar5211, clear_mcast_filter_idx);
   95         AR5K_HAL_FUNCTION(hal, ar5211, get_rx_filter);
   96         AR5K_HAL_FUNCTION(hal, ar5211, set_rx_filter);
   97         AR5K_HAL_FUNCTION(hal, ar5211, setup_rx_desc);
   98         AR5K_HAL_FUNCTION(hal, ar5211, proc_rx_desc);
   99         AR5K_HAL_FUNCTION(hal, ar5211, set_rx_signal);
  100 
  101         /*
  102          * Misc functions
  103          */
  104         AR5K_HAL_FUNCTION(hal, ar5211, dump_state);
  105         AR5K_HAL_FUNCTION(hal, ar5211, get_diag_state);
  106         AR5K_HAL_FUNCTION(hal, ar5211, get_lladdr);
  107         AR5K_HAL_FUNCTION(hal, ar5211, set_lladdr);
  108         AR5K_HAL_FUNCTION(hal, ar5211, set_regdomain);
  109         AR5K_HAL_FUNCTION(hal, ar5211, set_ledstate);
  110         AR5K_HAL_FUNCTION(hal, ar5211, set_associd);
  111         AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_input);
  112         AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_output);
  113         AR5K_HAL_FUNCTION(hal, ar5211, get_gpio);
  114         AR5K_HAL_FUNCTION(hal, ar5211, set_gpio);
  115         AR5K_HAL_FUNCTION(hal, ar5211, set_gpio_intr);
  116         AR5K_HAL_FUNCTION(hal, ar5211, get_tsf32);
  117         AR5K_HAL_FUNCTION(hal, ar5211, get_tsf64);
  118         AR5K_HAL_FUNCTION(hal, ar5211, reset_tsf);
  119         AR5K_HAL_FUNCTION(hal, ar5211, get_regdomain);
  120         AR5K_HAL_FUNCTION(hal, ar5211, detect_card_present);
  121         AR5K_HAL_FUNCTION(hal, ar5211, update_mib_counters);
  122         AR5K_HAL_FUNCTION(hal, ar5211, get_rf_gain);
  123         AR5K_HAL_FUNCTION(hal, ar5211, set_slot_time);
  124         AR5K_HAL_FUNCTION(hal, ar5211, get_slot_time);
  125         AR5K_HAL_FUNCTION(hal, ar5211, set_ack_timeout);
  126         AR5K_HAL_FUNCTION(hal, ar5211, get_ack_timeout);
  127         AR5K_HAL_FUNCTION(hal, ar5211, set_cts_timeout);
  128         AR5K_HAL_FUNCTION(hal, ar5211, get_cts_timeout);
  129 
  130         /*
  131          * Key table (WEP) functions
  132          */
  133         AR5K_HAL_FUNCTION(hal, ar5211, is_cipher_supported);
  134         AR5K_HAL_FUNCTION(hal, ar5211, get_keycache_size);
  135         AR5K_HAL_FUNCTION(hal, ar5211, reset_key);
  136         AR5K_HAL_FUNCTION(hal, ar5211, is_key_valid);
  137         AR5K_HAL_FUNCTION(hal, ar5211, set_key);
  138         AR5K_HAL_FUNCTION(hal, ar5211, set_key_lladdr);
  139 
  140         /*
  141          * Power management functions
  142          */
  143         AR5K_HAL_FUNCTION(hal, ar5211, set_power);
  144         AR5K_HAL_FUNCTION(hal, ar5211, get_power_mode);
  145         AR5K_HAL_FUNCTION(hal, ar5211, query_pspoll_support);
  146         AR5K_HAL_FUNCTION(hal, ar5211, init_pspoll);
  147         AR5K_HAL_FUNCTION(hal, ar5211, enable_pspoll);
  148         AR5K_HAL_FUNCTION(hal, ar5211, disable_pspoll);
  149 
  150         /*
  151          * Beacon functions
  152          */
  153         AR5K_HAL_FUNCTION(hal, ar5211, init_beacon);
  154         AR5K_HAL_FUNCTION(hal, ar5211, set_beacon_timers);
  155         AR5K_HAL_FUNCTION(hal, ar5211, reset_beacon);
  156         AR5K_HAL_FUNCTION(hal, ar5211, wait_for_beacon);
  157 
  158         /*
  159          * Interrupt functions
  160          */
  161         AR5K_HAL_FUNCTION(hal, ar5211, is_intr_pending);
  162         AR5K_HAL_FUNCTION(hal, ar5211, get_isr);
  163         AR5K_HAL_FUNCTION(hal, ar5211, get_intr);
  164         AR5K_HAL_FUNCTION(hal, ar5211, set_intr);
  165 
  166         /*
  167          * Chipset functions (ar5k-specific, non-HAL)
  168          */
  169         AR5K_HAL_FUNCTION(hal, ar5211, get_capabilities);
  170         AR5K_HAL_FUNCTION(hal, ar5211, radar_alert);
  171 
  172         /*
  173          * EEPROM access
  174          */
  175         AR5K_HAL_FUNCTION(hal, ar5211, eeprom_is_busy);
  176         AR5K_HAL_FUNCTION(hal, ar5211, eeprom_read);
  177         AR5K_HAL_FUNCTION(hal, ar5211, eeprom_write);
  178 
  179         /*
  180          * Unused functions or functions not implemented
  181          */
  182         AR5K_HAL_FUNCTION(hal, ar5211, get_tx_queueprops);
  183         AR5K_HAL_FUNCTION(hal, ar5211, num_tx_pending);
  184         AR5K_HAL_FUNCTION(hal, ar5211, phy_disable);
  185         AR5K_HAL_FUNCTION(hal, ar5211, set_txpower_limit);
  186         AR5K_HAL_FUNCTION(hal, ar5211, set_def_antenna);
  187         AR5K_HAL_FUNCTION(hal, ar5211, get_def_antenna);
  188         AR5K_HAL_FUNCTION(hal, ar5211, set_bssid_mask);
  189 #ifdef notyet
  190         AR5K_HAL_FUNCTION(hal, ar5211, set_capability);
  191         AR5K_HAL_FUNCTION(hal, ar5211, proc_mib_event);
  192         AR5K_HAL_FUNCTION(hal, ar5211, get_tx_inter_queue);
  193 #endif
  194 }
  195 
  196 struct ath_hal *
  197 ar5k_ar5211_attach(u_int16_t device, void *sc, bus_space_tag_t st,
  198     bus_space_handle_t sh, int *status)
  199 {
  200         struct ath_hal *hal = (struct ath_hal*) sc;
  201         u_int8_t mac[IEEE80211_ADDR_LEN];
  202         u_int32_t srev;
  203 
  204         ar5k_ar5211_fill(hal);
  205 
  206         /* Bring device out of sleep and reset its units */
  207         if (ar5k_ar5211_nic_wakeup(hal, AR5K_INIT_MODE) != AH_TRUE)
  208                 return (NULL);
  209 
  210         /* Get MAC, PHY and RADIO revisions */
  211         srev = AR5K_REG_READ(AR5K_AR5211_SREV);
  212         hal->ah_mac_srev = srev;
  213         hal->ah_mac_version = AR5K_REG_MS(srev, AR5K_AR5211_SREV_VER);
  214         hal->ah_mac_revision = AR5K_REG_MS(srev, AR5K_AR5211_SREV_REV);
  215         hal->ah_phy_revision = AR5K_REG_READ(AR5K_AR5211_PHY_CHIP_ID) &
  216             0x00ffffffff;
  217         hal->ah_radio_5ghz_revision =
  218             ar5k_ar5211_radio_revision(hal, HAL_CHIP_5GHZ);
  219         hal->ah_radio_2ghz_revision = 0;
  220 
  221         /* Identify the chipset (this has to be done in an early step) */
  222         hal->ah_version = AR5K_AR5211;
  223         hal->ah_radio = AR5K_AR5111;
  224         hal->ah_phy = AR5K_AR5211_PHY(0);
  225 
  226         bcopy(etherbroadcastaddr, mac, IEEE80211_ADDR_LEN);
  227         ar5k_ar5211_set_associd(hal, mac, 0, 0);
  228         ar5k_ar5211_get_lladdr(hal, mac);
  229         ar5k_ar5211_set_opmode(hal);
  230 
  231         return (hal);
  232 }
  233 
  234 HAL_BOOL
  235 ar5k_ar5211_nic_reset(struct ath_hal *hal, u_int32_t val)
  236 {
  237         HAL_BOOL ret = AH_FALSE;
  238         u_int32_t mask = val ? val : ~0;
  239 
  240         /* Read-and-clear */
  241         AR5K_REG_READ(AR5K_AR5211_RXDP);
  242 
  243         /*
  244          * Reset the device and wait until success
  245          */
  246         AR5K_REG_WRITE(AR5K_AR5211_RC, val);
  247 
  248         /* Wait at least 128 PCI clocks */
  249         AR5K_DELAY(15);
  250 
  251         val &=
  252             AR5K_AR5211_RC_PCU | AR5K_AR5211_RC_BB;
  253 
  254         mask &=
  255             AR5K_AR5211_RC_PCU | AR5K_AR5211_RC_BB;
  256 
  257         ret = ar5k_register_timeout(hal, AR5K_AR5211_RC, mask, val, AH_FALSE);
  258 
  259         /*
  260          * Reset configuration register
  261          */
  262         if ((val & AR5K_AR5211_RC_PCU) == 0)
  263                 AR5K_REG_WRITE(AR5K_AR5211_CFG, AR5K_AR5211_INIT_CFG);
  264 
  265         return (ret);
  266 }
  267 
  268 HAL_BOOL
  269 ar5k_ar5211_nic_wakeup(struct ath_hal *hal, u_int16_t flags)
  270 {
  271         u_int32_t turbo, mode, clock;
  272 
  273         turbo = 0;
  274         mode = 0;
  275         clock = 0;
  276 
  277         /*
  278          * Get channel mode flags
  279          */
  280 
  281         if (flags & IEEE80211_CHAN_2GHZ) {
  282                 mode |= AR5K_AR5211_PHY_MODE_FREQ_2GHZ;
  283                 clock |= AR5K_AR5211_PHY_PLL_44MHZ;
  284         } else if (flags & IEEE80211_CHAN_5GHZ) {
  285                 mode |= AR5K_AR5211_PHY_MODE_FREQ_5GHZ;
  286                 clock |= AR5K_AR5211_PHY_PLL_40MHZ;
  287         } else {
  288                 AR5K_PRINT("invalid radio frequency mode\n");
  289                 return (AH_FALSE);
  290         }
  291 
  292         if ((flags & IEEE80211_CHAN_CCK) ||
  293             (flags & IEEE80211_CHAN_DYN)) {
  294                 /* Dynamic OFDM/CCK is not supported by the AR5211 */
  295                 mode |= AR5K_AR5211_PHY_MODE_MOD_CCK;
  296         } else if (flags & IEEE80211_CHAN_OFDM) {
  297                 mode |= AR5K_AR5211_PHY_MODE_MOD_OFDM;
  298         } else {
  299                 AR5K_PRINT("invalid radio frequency mode\n");
  300                 return (AH_FALSE);
  301         }
  302 
  303         if (flags & IEEE80211_CHAN_TURBO) {
  304                 turbo = AR5K_AR5211_PHY_TURBO_MODE |
  305                     AR5K_AR5211_PHY_TURBO_SHORT;
  306         }
  307 
  308         /*
  309          * Reset and wakeup the device
  310          */
  311 
  312         /* ...reset chipset and PCI device */
  313         if (ar5k_ar5211_nic_reset(hal,
  314                 AR5K_AR5211_RC_CHIP | AR5K_AR5211_RC_PCI) == AH_FALSE) {
  315                 AR5K_PRINT("failed to reset the AR5211 + PCI chipset\n");
  316                 return (AH_FALSE);
  317         }
  318 
  319         /* ...wakeup */
  320         if (ar5k_ar5211_set_power(hal,
  321                 HAL_PM_AWAKE, AH_TRUE, 0) == AH_FALSE) {
  322                 AR5K_PRINT("failed to resume the AR5211 (again)\n");
  323                 return (AH_FALSE);
  324         }
  325 
  326         /* ...final warm reset */
  327         if (ar5k_ar5211_nic_reset(hal, 0) == AH_FALSE) {
  328                 AR5K_PRINT("failed to warm reset the AR5211\n");
  329                 return (AH_FALSE);
  330         }
  331 
  332         /* ...set the PHY operating mode */
  333         AR5K_REG_WRITE(AR5K_AR5211_PHY_PLL, clock);
  334         AR5K_DELAY(300);
  335 
  336         AR5K_REG_WRITE(AR5K_AR5211_PHY_MODE, mode);
  337         AR5K_REG_WRITE(AR5K_AR5211_PHY_TURBO, turbo);
  338 
  339         return (AH_TRUE);
  340 }
  341 
  342 u_int16_t
  343 ar5k_ar5211_radio_revision(struct ath_hal *hal, HAL_CHIP chip)
  344 {
  345         int i;
  346         u_int32_t srev;
  347         u_int16_t ret;
  348 
  349         /*
  350          * Set the radio chip access register
  351          */
  352         switch (chip) {
  353         case HAL_CHIP_2GHZ:
  354                 AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_2GHZ);
  355                 break;
  356         case HAL_CHIP_5GHZ:
  357                 AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
  358                 break;
  359         default:
  360                 return (0);
  361         }
  362 
  363         AR5K_DELAY(2000);
  364 
  365         /* ...wait until PHY is ready and read the selected radio revision */
  366         AR5K_REG_WRITE(AR5K_AR5211_PHY(0x34), 0x00001c16);
  367 
  368         for (i = 0; i < 8; i++)
  369                 AR5K_REG_WRITE(AR5K_AR5211_PHY(0x20), 0x00010000);
  370         srev = (AR5K_REG_READ(AR5K_AR5211_PHY(0x100)) >> 24) & 0xff;
  371 
  372         ret = ar5k_bitswap(((srev & 0xf0) >> 4) | ((srev & 0x0f) << 4), 8);
  373 
  374         /* Reset to the 5GHz mode */
  375         AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
  376 
  377         return (ret);
  378 }
  379 
  380 const HAL_RATE_TABLE *
  381 ar5k_ar5211_get_rate_table(struct ath_hal *hal, u_int mode)
  382 {
  383         switch (mode) {
  384         case HAL_MODE_11A:
  385                 return (&hal->ah_rt_11a);
  386         case HAL_MODE_TURBO:
  387                 return (&hal->ah_rt_turbo);
  388         case HAL_MODE_11B:
  389                 return (&hal->ah_rt_11b);
  390         case HAL_MODE_11G:
  391         case HAL_MODE_PUREG:
  392                 return (&hal->ah_rt_11g);
  393         default:
  394                 return (NULL);
  395         }
  396 
  397         return (NULL);
  398 }
  399 
  400 void
  401 ar5k_ar5211_detach(struct ath_hal *hal)
  402 {
  403         /*
  404          * Free HAL structure, assume interrupts are down
  405          */
  406         free(hal, M_DEVBUF);
  407 }
  408 
  409 HAL_BOOL
  410 ar5k_ar5211_phy_disable(struct ath_hal *hal)
  411 {
  412         AR5K_REG_WRITE(AR5K_AR5211_PHY_ACTIVE, AR5K_AR5211_PHY_DISABLE);
  413         return (AH_TRUE);
  414 }
  415 
  416 HAL_BOOL
  417 ar5k_ar5211_reset(struct ath_hal *hal, HAL_OPMODE op_mode, HAL_CHANNEL *channel,
  418     HAL_BOOL change_channel, HAL_STATUS *status)
  419 {
  420         struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;
  421         u_int8_t mac[IEEE80211_ADDR_LEN];
  422         u_int32_t data, s_seq, s_ant, s_led[3];
  423         u_int i, mode, freq, ee_mode, ant[2];
  424 
  425         /*
  426          * Save some registers before a reset
  427          */
  428         if (change_channel == AH_TRUE) {
  429                 s_seq = AR5K_REG_READ(AR5K_AR5211_DCU_SEQNUM(0));
  430                 s_ant = AR5K_REG_READ(AR5K_AR5211_DEFAULT_ANTENNA);
  431         } else {
  432                 s_seq = 0;
  433                 s_ant = 1;
  434         }
  435 
  436         s_led[0] = AR5K_REG_READ(AR5K_AR5211_PCICFG) &
  437             AR5K_AR5211_PCICFG_LEDSTATE;
  438         s_led[1] = AR5K_REG_READ(AR5K_AR5211_GPIOCR);
  439         s_led[2] = AR5K_REG_READ(AR5K_AR5211_GPIODO);
  440 
  441         if (ar5k_ar5211_nic_wakeup(hal, channel->c_channel_flags) == AH_FALSE)
  442                 return (AH_FALSE);
  443 
  444         /*
  445          * Initialize operating mode
  446          */
  447         hal->ah_op_mode = op_mode;
  448 
  449         switch (channel->c_channel_flags & CHANNEL_MODES) {
  450         case CHANNEL_A:
  451                 mode = AR5K_INI_VAL_11A;
  452                 freq = AR5K_INI_RFGAIN_5GHZ;
  453                 ee_mode = AR5K_EEPROM_MODE_11A;
  454                 break;
  455         case CHANNEL_T:
  456                 mode = AR5K_INI_VAL_11A_TURBO;
  457                 freq = AR5K_INI_RFGAIN_5GHZ;
  458                 ee_mode = AR5K_EEPROM_MODE_11A;
  459                 break;
  460         case CHANNEL_B:
  461                 mode = AR5K_INI_VAL_11B;
  462                 freq = AR5K_INI_RFGAIN_2GHZ;
  463                 ee_mode = AR5K_EEPROM_MODE_11B;
  464                 break;
  465         case CHANNEL_G:
  466         case CHANNEL_PUREG:
  467                 mode = AR5K_INI_VAL_11G;
  468                 freq = AR5K_INI_RFGAIN_2GHZ;
  469                 ee_mode = AR5K_EEPROM_MODE_11G;
  470                 break;
  471         default:
  472                 AR5K_PRINTF("invalid channel: %d\n", channel->c_channel);
  473                 return (AH_FALSE);
  474         }
  475 
  476         /* PHY access enable */
  477         AR5K_REG_WRITE(AR5K_AR5211_PHY(0), AR5K_AR5211_PHY_SHIFT_5GHZ);
  478 
  479         /*
  480          * Write initial RF registers
  481          */
  482         ar5k_ar5211_rfregs(hal, channel, freq, ee_mode);
  483 
  484         /*
  485          * Write initial mode settings
  486          */
  487         for (i = 0; i < AR5K_ELEMENTS(ar5211_mode); i++) {
  488                 AR5K_REG_WAIT(i);
  489                 AR5K_REG_WRITE((u_int32_t)ar5211_mode[i].mode_register,
  490                     ar5211_mode[i].mode_value[mode]);
  491         }
  492 
  493         /*
  494          * Write initial register settings
  495          */
  496         for (i = 0; i < AR5K_ELEMENTS(ar5211_ini); i++) {
  497                 if (change_channel == AH_TRUE &&
  498                     ar5211_ini[i].ini_register >= AR5K_AR5211_PCU_MIN &&
  499                     ar5211_ini[i].ini_register <= AR5K_AR5211_PCU_MAX)
  500                         continue;
  501 
  502                 AR5K_REG_WAIT(i);
  503                 AR5K_REG_WRITE((u_int32_t)ar5211_ini[i].ini_register,
  504                     ar5211_ini[i].ini_value);
  505         }
  506 
  507         /*
  508          * Write initial RF gain settings
  509          */
  510         if (ar5k_rfgain(hal, AR5K_INI_PHY_5111, freq) == AH_FALSE)
  511                 return (AH_FALSE);
  512 
  513         AR5K_DELAY(1000);
  514 
  515         /*
  516          * Configure additional registers
  517          */
  518 
  519         if (hal->ah_radio == AR5K_AR5111) {
  520                 if (channel->c_channel_flags & IEEE80211_CHAN_B)
  521                         AR5K_REG_ENABLE_BITS(AR5K_AR5211_TXCFG,
  522                             AR5K_AR5211_TXCFG_B_MODE);
  523                 else
  524                         AR5K_REG_DISABLE_BITS(AR5K_AR5211_TXCFG,
  525                             AR5K_AR5211_TXCFG_B_MODE);
  526         }
  527 
  528         /* Set antenna mode */
  529         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x44),
  530             hal->ah_antenna[ee_mode][0], 0xfffffc06);
  531 
  532         if (freq == AR5K_INI_RFGAIN_2GHZ)
  533                 ant[0] = ant[1] = HAL_ANT_FIXED_B;
  534         else
  535                 ant[0] = ant[1] = HAL_ANT_FIXED_A;
  536 
  537         AR5K_REG_WRITE(AR5K_AR5211_PHY_ANT_SWITCH_TABLE_0,
  538             hal->ah_antenna[ee_mode][ant[0]]);
  539         AR5K_REG_WRITE(AR5K_AR5211_PHY_ANT_SWITCH_TABLE_1,
  540             hal->ah_antenna[ee_mode][ant[1]]);
  541 
  542         /* Commit values from EEPROM */
  543         AR5K_REG_WRITE_BITS(AR5K_AR5211_PHY_FC,
  544             AR5K_AR5211_PHY_FC_TX_CLIP, ee->ee_tx_clip);
  545 
  546         AR5K_REG_WRITE(AR5K_AR5211_PHY(0x5a),
  547             AR5K_AR5211_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]));
  548 
  549         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x11),
  550             (ee->ee_switch_settling[ee_mode] << 7) & 0x3f80, 0xffffc07f);
  551         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x12),
  552             (ee->ee_ant_tx_rx[ee_mode] << 12) & 0x3f000, 0xfffc0fff);
  553         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x14),
  554             (ee->ee_adc_desired_size[ee_mode] & 0x00ff) |
  555             ((ee->ee_pga_desired_size[ee_mode] << 8) & 0xff00), 0xffff0000);
  556 
  557         AR5K_REG_WRITE(AR5K_AR5211_PHY(0x0d),
  558             (ee->ee_tx_end2xpa_disable[ee_mode] << 24) |
  559             (ee->ee_tx_end2xpa_disable[ee_mode] << 16) |
  560             (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) |
  561             (ee->ee_tx_frm2xpa_enable[ee_mode]));
  562 
  563         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x0a),
  564             ee->ee_tx_end2xlna_enable[ee_mode] << 8, 0xffff00ff);
  565         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x19),
  566             (ee->ee_thr_62[ee_mode] << 12) & 0x7f000, 0xfff80fff);
  567         AR5K_REG_MASKED_BITS(AR5K_AR5211_PHY(0x49), 4, 0xffffff01);
  568 
  569         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
  570             AR5K_AR5211_PHY_IQ_CORR_ENABLE |
  571             (ee->ee_i_cal[ee_mode] << AR5K_AR5211_PHY_IQ_CORR_Q_I_COFF_S) |
  572             ee->ee_q_cal[ee_mode]);
  573 
  574         /*
  575          * Restore saved values
  576          */
  577         AR5K_REG_WRITE(AR5K_AR5211_DCU_SEQNUM(0), s_seq);
  578         AR5K_REG_WRITE(AR5K_AR5211_DEFAULT_ANTENNA, s_ant);
  579         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PCICFG, s_led[0]);
  580         AR5K_REG_WRITE(AR5K_AR5211_GPIOCR, s_led[1]);
  581         AR5K_REG_WRITE(AR5K_AR5211_GPIODO, s_led[2]);
  582 
  583         /*
  584          * Misc
  585          */
  586         bcopy(etherbroadcastaddr, mac, IEEE80211_ADDR_LEN);
  587         ar5k_ar5211_set_associd(hal, mac, 0, 0);
  588         ar5k_ar5211_set_opmode(hal);
  589         AR5K_REG_WRITE(AR5K_AR5211_PISR, 0xffffffff);
  590         AR5K_REG_WRITE(AR5K_AR5211_RSSI_THR, AR5K_TUNE_RSSI_THRES);
  591 
  592         /*
  593          * Set Rx/Tx DMA Configuration
  594          */
  595         AR5K_REG_WRITE_BITS(AR5K_AR5211_TXCFG, AR5K_AR5211_TXCFG_SDMAMR,
  596             AR5K_AR5211_DMASIZE_512B | AR5K_AR5211_TXCFG_DMASIZE);
  597         AR5K_REG_WRITE_BITS(AR5K_AR5211_RXCFG, AR5K_AR5211_RXCFG_SDMAMW,
  598             AR5K_AR5211_DMASIZE_512B);
  599 
  600         /*
  601          * Set channel and calibrate the PHY
  602          */
  603         if (ar5k_channel(hal, channel) == AH_FALSE)
  604                 return (AH_FALSE);
  605 
  606         /*
  607          * Enable the PHY and wait until completion
  608          */
  609         AR5K_REG_WRITE(AR5K_AR5211_PHY_ACTIVE, AR5K_AR5211_PHY_ENABLE);
  610 
  611         data = AR5K_REG_READ(AR5K_AR5211_PHY_RX_DELAY) &
  612             AR5K_AR5211_PHY_RX_DELAY_M;
  613         data = (channel->c_channel_flags & IEEE80211_CHAN_CCK) ?
  614             ((data << 2) / 22) : (data / 10);
  615 
  616         AR5K_DELAY(100 + data);
  617 
  618         /*
  619          * Start calibration
  620          */
  621         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_AGCCTL,
  622             AR5K_AR5211_PHY_AGCCTL_NF |
  623             AR5K_AR5211_PHY_AGCCTL_CAL);
  624 
  625         if (channel->c_channel_flags & IEEE80211_CHAN_B) {
  626                 hal->ah_calibration = AH_FALSE;
  627         } else {
  628                 hal->ah_calibration = AH_TRUE;
  629                 AR5K_REG_WRITE_BITS(AR5K_AR5211_PHY_IQ,
  630                     AR5K_AR5211_PHY_IQ_CAL_NUM_LOG_MAX, 15);
  631                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
  632                     AR5K_AR5211_PHY_IQ_RUN);
  633         }
  634 
  635         /*
  636          * Reset queues and start beacon timers at the end of the reset routine
  637          */
  638         for (i = 0; i < hal->ah_capabilities.cap_queues.q_tx_num; i++) {
  639                 AR5K_REG_WRITE_Q(AR5K_AR5211_DCU_QCUMASK(i), i);
  640                 if (ar5k_ar5211_reset_tx_queue(hal, i) == AH_FALSE) {
  641                         AR5K_PRINTF("failed to reset TX queue #%d\n", i);
  642                         return (AH_FALSE);
  643                 }
  644         }
  645 
  646         /* Pre-enable interrupts */
  647         ar5k_ar5211_set_intr(hal, HAL_INT_RX | HAL_INT_TX | HAL_INT_FATAL);
  648 
  649         /*
  650          * Set RF kill flags if supported by the device (read from the EEPROM)
  651          */
  652         if (AR5K_EEPROM_HDR_RFKILL(hal->ah_capabilities.cap_eeprom.ee_header)) {
  653                 ar5k_ar5211_set_gpio_input(hal, 0);
  654                 if ((hal->ah_gpio[0] = ar5k_ar5211_get_gpio(hal, 0)) == 0)
  655                         ar5k_ar5211_set_gpio_intr(hal, 0, 1);
  656                 else
  657                         ar5k_ar5211_set_gpio_intr(hal, 0, 0);
  658         }
  659 
  660         /* 
  661          * Disable beacons and reset the register
  662          */
  663         AR5K_REG_DISABLE_BITS(AR5K_AR5211_BEACON,
  664             AR5K_AR5211_BEACON_ENABLE | AR5K_AR5211_BEACON_RESET_TSF);
  665 
  666         return (AH_TRUE);
  667 }
  668 
  669 void
  670 ar5k_ar5211_set_def_antenna(struct ath_hal *hal, u_int ant)
  671 {
  672         AR5K_REG_WRITE(AR5K_AR5211_DEFAULT_ANTENNA, ant);
  673 }
  674 
  675 u_int
  676 ar5k_ar5211_get_def_antenna(struct ath_hal *hal)
  677 {
  678         return AR5K_REG_READ(AR5K_AR5211_DEFAULT_ANTENNA);
  679 }
  680 
  681 void
  682 ar5k_ar5211_set_opmode(struct ath_hal *hal)
  683 {
  684         u_int32_t pcu_reg, low_id, high_id;
  685 
  686         pcu_reg = 0;
  687 
  688         switch (hal->ah_op_mode) {
  689         case IEEE80211_M_IBSS:
  690                 pcu_reg |= AR5K_AR5211_STA_ID1_ADHOC |
  691                     AR5K_AR5211_STA_ID1_DESC_ANTENNA;
  692                 break;
  693 
  694         case IEEE80211_M_HOSTAP:
  695                 pcu_reg |= AR5K_AR5211_STA_ID1_AP |
  696                     AR5K_AR5211_STA_ID1_RTS_DEFAULT_ANTENNA;
  697                 break;
  698 
  699         case IEEE80211_M_STA:
  700         case IEEE80211_M_MONITOR:
  701                 pcu_reg |= AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA;
  702                 break;
  703 
  704         default:
  705                 return;
  706         }
  707 
  708         /*
  709          * Set PCU registers
  710          */
  711         low_id = AR5K_LOW_ID(hal->ah_sta_id);
  712         high_id = AR5K_HIGH_ID(hal->ah_sta_id);
  713         AR5K_REG_WRITE(AR5K_AR5211_STA_ID0, low_id);
  714         AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, pcu_reg | high_id);
  715 
  716         return;
  717 }
  718 
  719 HAL_BOOL
  720 ar5k_ar5211_calibrate(struct ath_hal *hal, HAL_CHANNEL *channel)
  721 {
  722         u_int32_t i_pwr, q_pwr;
  723         int32_t iq_corr, i_coff, i_coffd, q_coff, q_coffd;
  724 
  725         if (hal->ah_calibration == AH_FALSE ||
  726             AR5K_REG_READ(AR5K_AR5211_PHY_IQ) & AR5K_AR5211_PHY_IQ_RUN)
  727                 goto done;
  728 
  729         hal->ah_calibration = AH_FALSE;
  730 
  731         iq_corr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_CORR);
  732         i_pwr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_PWR_I);
  733         q_pwr = AR5K_REG_READ(AR5K_AR5211_PHY_IQRES_CAL_PWR_Q);
  734         i_coffd = ((i_pwr >> 1) + (q_pwr >> 1)) >> 7;
  735         q_coffd = q_pwr >> 6;
  736 
  737         if (i_coffd == 0 || q_coffd == 0)
  738                 goto done;
  739 
  740         i_coff = ((-iq_corr) / i_coffd) & 0x3f;
  741         q_coff = (((int32_t)i_pwr / q_coffd) - 64) & 0x1f;
  742 
  743         /* Commit new IQ value */
  744         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_IQ,
  745             AR5K_AR5211_PHY_IQ_CORR_ENABLE |
  746             ((u_int32_t)q_coff) |
  747             ((u_int32_t)i_coff << AR5K_AR5211_PHY_IQ_CORR_Q_I_COFF_S));
  748 
  749  done:
  750         /* Start noise floor calibration */
  751         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PHY_AGCCTL,
  752             AR5K_AR5211_PHY_AGCCTL_NF);
  753 
  754         return (AH_TRUE);
  755 }
  756 
  757 /*
  758  * Transmit functions
  759  */
  760 
  761 HAL_BOOL
  762 ar5k_ar5211_update_tx_triglevel(struct ath_hal *hal, HAL_BOOL increase)
  763 {
  764         u_int32_t trigger_level, imr;
  765         HAL_BOOL status = AH_FALSE;
  766 
  767         /*
  768          * Disable interrupts by setting the mask
  769          */
  770         imr = ar5k_ar5211_set_intr(hal, hal->ah_imr & ~HAL_INT_GLOBAL);
  771 
  772         trigger_level = AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TXCFG),
  773             AR5K_AR5211_TXCFG_TXFULL);
  774 
  775         if (increase == AH_FALSE) {
  776                 if (--trigger_level < AR5K_TUNE_MIN_TX_FIFO_THRES)
  777                         goto done;
  778         } else
  779                 trigger_level +=
  780                     ((AR5K_TUNE_MAX_TX_FIFO_THRES - trigger_level) / 2);
  781 
  782         /*
  783          * Update trigger level on success
  784          */
  785         AR5K_REG_WRITE_BITS(AR5K_AR5211_TXCFG,
  786             AR5K_AR5211_TXCFG_TXFULL, trigger_level);
  787         status = AH_TRUE;
  788 
  789  done:
  790         /*
  791          * Restore interrupt mask
  792          */
  793         ar5k_ar5211_set_intr(hal, imr);
  794 
  795         return (status);
  796 }
  797 
  798 int
  799 ar5k_ar5211_setup_tx_queue(struct ath_hal *hal, HAL_TX_QUEUE queue_type,
  800     const HAL_TXQ_INFO *queue_info)
  801 {
  802         u_int queue;
  803 
  804         /*
  805          * Get queue by type
  806          */
  807         if (queue_type == HAL_TX_QUEUE_DATA) {
  808                 for (queue = HAL_TX_QUEUE_ID_DATA_MIN;
  809                      hal->ah_txq[queue].tqi_type != HAL_TX_QUEUE_INACTIVE;
  810                      queue++)
  811                         if (queue > HAL_TX_QUEUE_ID_DATA_MAX)
  812                                 return (-1);
  813         } else if (queue_type == HAL_TX_QUEUE_PSPOLL) {
  814                 queue = HAL_TX_QUEUE_ID_PSPOLL;
  815         } else if (queue_type == HAL_TX_QUEUE_BEACON) {
  816                 queue = HAL_TX_QUEUE_ID_BEACON;
  817         } else if (queue_type == HAL_TX_QUEUE_CAB) {
  818                 queue = HAL_TX_QUEUE_ID_CAB;
  819         } else
  820                 return (-1);
  821 
  822         /*
  823          * Setup internal queue structure
  824          */
  825         bzero(&hal->ah_txq[queue], sizeof(HAL_TXQ_INFO));
  826         hal->ah_txq[queue].tqi_type = queue_type;
  827 
  828         if (queue_info != NULL) {
  829                 if (ar5k_ar5211_setup_tx_queueprops(hal, queue, queue_info)
  830                     != AH_TRUE)
  831                         return (-1);
  832         }
  833 
  834         AR5K_Q_ENABLE_BITS(hal->ah_txq_interrupts, queue);
  835 
  836         return (queue);
  837 }
  838 
  839 HAL_BOOL
  840 ar5k_ar5211_setup_tx_queueprops(struct ath_hal *hal, int queue,
  841     const HAL_TXQ_INFO *queue_info)
  842 {
  843         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
  844 
  845         if (hal->ah_txq[queue].tqi_type == HAL_TX_QUEUE_INACTIVE)
  846                 return (AH_FALSE);
  847 
  848         bcopy(queue_info, &hal->ah_txq[queue], sizeof(HAL_TXQ_INFO));
  849 
  850         if (queue_info->tqi_type == HAL_TX_QUEUE_DATA &&
  851             (queue_info->tqi_subtype >= HAL_WME_AC_VI) &&
  852             (queue_info->tqi_subtype <= HAL_WME_UPSD))
  853                 hal->ah_txq[queue].tqi_flags |=
  854                     AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS;
  855 
  856         return (AH_TRUE);
  857 }
  858 
  859 HAL_BOOL
  860 ar5k_ar5211_get_tx_queueprops(struct ath_hal *hal, int queue,
  861     HAL_TXQ_INFO *queue_info)
  862 {
  863         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
  864         bcopy(&hal->ah_txq[queue], queue_info, sizeof(HAL_TXQ_INFO));
  865         return (AH_TRUE);
  866 }
  867 
  868 HAL_BOOL
  869 ar5k_ar5211_release_tx_queue(struct ath_hal *hal, u_int queue)
  870 {
  871         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
  872 
  873         /* This queue will be skipped in further operations */
  874         hal->ah_txq[queue].tqi_type = HAL_TX_QUEUE_INACTIVE;
  875         AR5K_Q_DISABLE_BITS(hal->ah_txq_interrupts, queue);
  876 
  877         return (AH_FALSE);
  878 }
  879 
  880 HAL_BOOL
  881 ar5k_ar5211_reset_tx_queue(struct ath_hal *hal, u_int queue)
  882 {
  883         u_int32_t cw_min, cw_max, retry_lg, retry_sh;
  884         struct ieee80211_channel *channel = (struct ieee80211_channel*)
  885             &hal->ah_current_channel;
  886         HAL_TXQ_INFO *tq;
  887 
  888         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
  889 
  890         tq = &hal->ah_txq[queue];
  891 
  892         if (tq->tqi_type == HAL_TX_QUEUE_INACTIVE)
  893                 return (AH_TRUE);
  894 
  895         /*
  896          * Set registers by channel mode
  897          */
  898         if (IEEE80211_IS_CHAN_B(channel)) {
  899                 hal->ah_cw_min = AR5K_TUNE_CWMIN_11B;
  900                 cw_max = hal->ah_cw_max = AR5K_TUNE_CWMAX_11B;
  901                 hal->ah_aifs = AR5K_TUNE_AIFS_11B;
  902         } else {
  903                 hal->ah_cw_min = AR5K_TUNE_CWMIN;
  904                 cw_max = hal->ah_cw_max = AR5K_TUNE_CWMAX;
  905                 hal->ah_aifs = AR5K_TUNE_AIFS;
  906         }
  907 
  908         /*
  909          * Set retry limits
  910          */
  911         if (hal->ah_software_retry == AH_TRUE) {
  912                 /* XXX Need to test this */
  913                 retry_lg = hal->ah_limit_tx_retries;
  914                 retry_sh = retry_lg =
  915                     retry_lg > AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY ?
  916                     AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY : retry_lg;
  917         } else {
  918                 retry_lg = AR5K_INIT_LG_RETRY;
  919                 retry_sh = AR5K_INIT_SH_RETRY;
  920         }
  921 
  922         AR5K_REG_WRITE(AR5K_AR5211_DCU_RETRY_LMT(queue),
  923             AR5K_REG_SM(AR5K_INIT_SLG_RETRY,
  924             AR5K_AR5211_DCU_RETRY_LMT_SLG_RETRY) |
  925             AR5K_REG_SM(AR5K_INIT_SSH_RETRY,
  926             AR5K_AR5211_DCU_RETRY_LMT_SSH_RETRY) |
  927             AR5K_REG_SM(retry_lg, AR5K_AR5211_DCU_RETRY_LMT_LG_RETRY) |
  928             AR5K_REG_SM(retry_sh, AR5K_AR5211_DCU_RETRY_LMT_SH_RETRY));
  929 
  930         /*
  931          * Set initial content window (cw_min/cw_max)
  932          */
  933         cw_min = 1;
  934         while (cw_min < hal->ah_cw_min)
  935                 cw_min = (cw_min << 1) | 1;
  936 
  937         cw_min = tq->tqi_cw_min < 0 ?
  938             (cw_min >> (-tq->tqi_cw_min)) :
  939             ((cw_min << tq->tqi_cw_min) + (1 << tq->tqi_cw_min) - 1);
  940         cw_max = tq->tqi_cw_max < 0 ?
  941             (cw_max >> (-tq->tqi_cw_max)) :
  942             ((cw_max << tq->tqi_cw_max) + (1 << tq->tqi_cw_max) - 1);
  943 
  944         AR5K_REG_WRITE(AR5K_AR5211_DCU_LCL_IFS(queue),
  945             AR5K_REG_SM(cw_min, AR5K_AR5211_DCU_LCL_IFS_CW_MIN) |
  946             AR5K_REG_SM(cw_max, AR5K_AR5211_DCU_LCL_IFS_CW_MAX) |
  947             AR5K_REG_SM(hal->ah_aifs + tq->tqi_aifs,
  948             AR5K_AR5211_DCU_LCL_IFS_AIFS));
  949 
  950         /*
  951          * Set misc registers
  952          */
  953         AR5K_REG_WRITE(AR5K_AR5211_QCU_MISC(queue),
  954             AR5K_AR5211_QCU_MISC_DCU_EARLY);
  955 
  956         if (tq->tqi_cbr_period) {
  957                 AR5K_REG_WRITE(AR5K_AR5211_QCU_CBRCFG(queue),
  958                     AR5K_REG_SM(tq->tqi_cbr_period,
  959                     AR5K_AR5211_QCU_CBRCFG_INTVAL) |
  960                     AR5K_REG_SM(tq->tqi_cbr_overflow_limit,
  961                     AR5K_AR5211_QCU_CBRCFG_ORN_THRES));
  962                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
  963                     AR5K_AR5211_QCU_MISC_FRSHED_CBR);
  964                 if (tq->tqi_cbr_overflow_limit)
  965                         AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
  966                             AR5K_AR5211_QCU_MISC_CBR_THRES_ENABLE);
  967         }
  968 
  969         if (tq->tqi_ready_time) {
  970                 AR5K_REG_WRITE(AR5K_AR5211_QCU_RDYTIMECFG(queue),
  971                     AR5K_REG_SM(tq->tqi_ready_time,
  972                     AR5K_AR5211_QCU_RDYTIMECFG_INTVAL) |
  973                     AR5K_AR5211_QCU_RDYTIMECFG_ENABLE);
  974         }
  975 
  976         if (tq->tqi_burst_time) {
  977                 AR5K_REG_WRITE(AR5K_AR5211_DCU_CHAN_TIME(queue),
  978                     AR5K_REG_SM(tq->tqi_burst_time,
  979                     AR5K_AR5211_DCU_CHAN_TIME_DUR) |
  980                     AR5K_AR5211_DCU_CHAN_TIME_ENABLE);
  981 
  982                 if (tq->tqi_flags & AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE) {
  983                         AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
  984                             AR5K_AR5211_QCU_MISC_TXE);
  985                 }
  986         }
  987 
  988         if (tq->tqi_flags & AR5K_TXQ_FLAG_BACKOFF_DISABLE) {
  989                 AR5K_REG_WRITE(AR5K_AR5211_DCU_MISC(queue),
  990                     AR5K_AR5211_DCU_MISC_POST_FR_BKOFF_DIS);
  991         }
  992 
  993         if (tq->tqi_flags & AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) {
  994                 AR5K_REG_WRITE(AR5K_AR5211_DCU_MISC(queue),
  995                     AR5K_AR5211_DCU_MISC_BACKOFF_FRAG);
  996         }
  997 
  998         /*
  999          * Set registers by queue type
 1000          */
 1001         switch (tq->tqi_type) {
 1002         case HAL_TX_QUEUE_BEACON:
 1003                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
 1004                     AR5K_AR5211_QCU_MISC_FRSHED_DBA_GT |
 1005                     AR5K_AR5211_QCU_MISC_CBREXP_BCN |
 1006                     AR5K_AR5211_QCU_MISC_BCN_ENABLE);
 1007 
 1008                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_DCU_MISC(queue),
 1009                     (AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
 1010                     AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL) |
 1011                     AR5K_AR5211_DCU_MISC_POST_FR_BKOFF_DIS |
 1012                     AR5K_AR5211_DCU_MISC_BCN_ENABLE);
 1013 
 1014                 AR5K_REG_WRITE(AR5K_AR5211_QCU_RDYTIMECFG(queue),
 1015                     ((AR5K_TUNE_BEACON_INTERVAL -
 1016                     (AR5K_TUNE_SW_BEACON_RESP - AR5K_TUNE_DMA_BEACON_RESP) -
 1017                     AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF) * 1024) |
 1018                     AR5K_AR5211_QCU_RDYTIMECFG_ENABLE);
 1019                 break;
 1020 
 1021         case HAL_TX_QUEUE_CAB:
 1022                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
 1023                     AR5K_AR5211_QCU_MISC_FRSHED_DBA_GT |
 1024                     AR5K_AR5211_QCU_MISC_CBREXP |
 1025                     AR5K_AR5211_QCU_MISC_CBREXP_BCN);
 1026 
 1027                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_DCU_MISC(queue),
 1028                     (AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL <<
 1029                     AR5K_AR5211_DCU_MISC_ARBLOCK_CTL_GLOBAL));
 1030                 break;
 1031 
 1032         case HAL_TX_QUEUE_PSPOLL:
 1033                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_QCU_MISC(queue),
 1034                     AR5K_AR5211_QCU_MISC_CBREXP);
 1035                 break;
 1036 
 1037         case HAL_TX_QUEUE_DATA:
 1038         default:
 1039                 break;
 1040         }
 1041 
 1042         /*
 1043          * Enable tx queue in the secondary interrupt mask registers
 1044          */
 1045         AR5K_REG_WRITE(AR5K_AR5211_SIMR0,
 1046             AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR0_QCU_TXOK) |
 1047             AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR0_QCU_TXDESC));
 1048         AR5K_REG_WRITE(AR5K_AR5211_SIMR1,
 1049             AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR1_QCU_TXERR));
 1050         AR5K_REG_WRITE(AR5K_AR5211_SIMR2,
 1051             AR5K_REG_SM(hal->ah_txq_interrupts, AR5K_AR5211_SIMR2_QCU_TXURN));
 1052 
 1053         return (AH_TRUE);
 1054 }
 1055 
 1056 u_int32_t
 1057 ar5k_ar5211_get_tx_buf(struct ath_hal *hal, u_int queue)
 1058 {
 1059         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
 1060 
 1061         /*
 1062          * Get the transmit queue descriptor pointer from the selected queue
 1063          */
 1064         return (AR5K_REG_READ(AR5K_AR5211_QCU_TXDP(queue)));
 1065 }
 1066 
 1067 HAL_BOOL
 1068 ar5k_ar5211_put_tx_buf(struct ath_hal *hal, u_int queue, u_int32_t phys_addr)
 1069 {
 1070         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
 1071 
 1072         /*
 1073          * Set the transmit queue descriptor pointer for the selected queue
 1074          * (this won't work if the queue is still active)
 1075          */
 1076         if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXE, queue))
 1077                 return (AH_FALSE);
 1078 
 1079         AR5K_REG_WRITE(AR5K_AR5211_QCU_TXDP(queue), phys_addr);
 1080 
 1081         return (AH_TRUE);
 1082 }
 1083 
 1084 u_int32_t
 1085 ar5k_ar5211_num_tx_pending(struct ath_hal *hal, u_int queue)
 1086 {
 1087         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
 1088         return (AR5K_AR5211_QCU_STS(queue) & AR5K_AR5211_QCU_STS_FRMPENDCNT);
 1089 }
 1090 
 1091 HAL_BOOL
 1092 ar5k_ar5211_tx_start(struct ath_hal *hal, u_int queue)
 1093 {
 1094         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
 1095 
 1096         /* Return if queue is disabled */
 1097         if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXD, queue))
 1098                 return (AH_FALSE);
 1099 
 1100         /* Start queue */
 1101         AR5K_REG_WRITE_Q(AR5K_AR5211_QCU_TXE, queue);
 1102 
 1103         return (AH_TRUE);
 1104 }
 1105 
 1106 HAL_BOOL
 1107 ar5k_ar5211_stop_tx_dma(struct ath_hal *hal, u_int queue)
 1108 {
 1109         int i = 100, pending;
 1110 
 1111         AR5K_ASSERT_ENTRY(queue, hal->ah_capabilities.cap_queues.q_tx_num);
 1112 
 1113         /*
 1114          * Schedule TX disable and wait until queue is empty
 1115          */
 1116         AR5K_REG_WRITE_Q(AR5K_AR5211_QCU_TXD, queue);
 1117 
 1118         do {
 1119                 pending = AR5K_REG_READ(AR5K_AR5211_QCU_STS(queue)) &
 1120                      AR5K_AR5211_QCU_STS_FRMPENDCNT;
 1121                 delay(100);
 1122         } while (--i && pending);
 1123 
 1124         /* Clear register */
 1125         AR5K_REG_WRITE(AR5K_AR5211_QCU_TXD, 0);
 1126 
 1127         return (AH_TRUE);
 1128 }
 1129 
 1130 HAL_BOOL
 1131 ar5k_ar5211_setup_tx_desc(struct ath_hal *hal, struct ath_desc *desc,
 1132     u_int packet_length, u_int header_length, HAL_PKT_TYPE type, u_int tx_power,
 1133     u_int tx_rate0, u_int tx_tries0, u_int key_index, u_int antenna_mode,
 1134     u_int flags, u_int rtscts_rate, u_int rtscts_duration)
 1135 {
 1136         struct ar5k_ar5211_tx_desc *tx_desc;
 1137 
 1138         tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
 1139 
 1140         /*
 1141          * Validate input
 1142          */
 1143         if (tx_tries0 == 0)
 1144                 return (AH_FALSE);
 1145 
 1146         if ((tx_desc->tx_control_0 = (packet_length &
 1147             AR5K_AR5211_DESC_TX_CTL0_FRAME_LEN)) != packet_length)
 1148                 return (AH_FALSE);
 1149 
 1150         tx_desc->tx_control_0 |=
 1151             AR5K_REG_SM(tx_rate0, AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE) |
 1152             AR5K_REG_SM(antenna_mode, AR5K_AR5211_DESC_TX_CTL0_ANT_MODE_XMIT);
 1153         tx_desc->tx_control_1 =
 1154             AR5K_REG_SM(type, AR5K_AR5211_DESC_TX_CTL1_FRAME_TYPE);
 1155 
 1156 #define _TX_FLAGS(_c, _flag)                                            \
 1157         if (flags & HAL_TXDESC_##_flag)                                 \
 1158                 tx_desc->tx_control_##_c |=                             \
 1159                         AR5K_AR5211_DESC_TX_CTL##_c##_##_flag
 1160 
 1161         _TX_FLAGS(0, CLRDMASK);
 1162         _TX_FLAGS(0, VEOL);
 1163         _TX_FLAGS(0, INTREQ);
 1164         _TX_FLAGS(0, RTSENA);
 1165         _TX_FLAGS(1, NOACK);
 1166 
 1167 #undef _TX_FLAGS
 1168 
 1169         /*
 1170          * WEP crap
 1171          */
 1172         if (key_index != HAL_TXKEYIX_INVALID) {
 1173                 tx_desc->tx_control_0 |=
 1174                     AR5K_AR5211_DESC_TX_CTL0_ENCRYPT_KEY_VALID;
 1175                 tx_desc->tx_control_1 |=
 1176                     AR5K_REG_SM(key_index,
 1177                     AR5K_AR5211_DESC_TX_CTL1_ENCRYPT_KEY_INDEX);
 1178         }
 1179 
 1180         return (AH_TRUE);
 1181 }
 1182 
 1183 HAL_BOOL
 1184 ar5k_ar5211_fill_tx_desc(struct ath_hal *hal, struct ath_desc *desc,
 1185     u_int segment_length, HAL_BOOL first_segment, HAL_BOOL last_segment)
 1186 {
 1187         struct ar5k_ar5211_tx_desc *tx_desc;
 1188 
 1189         tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
 1190 
 1191         /* Clear status descriptor */
 1192         bzero(desc->ds_hw, sizeof(desc->ds_hw));
 1193 
 1194         /* Validate segment length and initialize the descriptor */
 1195         if ((tx_desc->tx_control_1 = (segment_length &
 1196             AR5K_AR5211_DESC_TX_CTL1_BUF_LEN)) != segment_length)
 1197                 return (AH_FALSE);
 1198 
 1199         if (first_segment != AH_TRUE)
 1200                 tx_desc->tx_control_0 &= ~AR5K_AR5211_DESC_TX_CTL0_FRAME_LEN;
 1201 
 1202         if (last_segment != AH_TRUE)
 1203                 tx_desc->tx_control_1 |= AR5K_AR5211_DESC_TX_CTL1_MORE;
 1204 
 1205         return (AH_TRUE);
 1206 }
 1207 
 1208 HAL_BOOL
 1209 ar5k_ar5211_setup_xtx_desc(struct ath_hal *hal, struct ath_desc *desc,
 1210     u_int tx_rate1, u_int tx_tries1, u_int tx_rate2, u_int tx_tries2,
 1211     u_int tx_rate3, u_int tx_tries3)
 1212 {
 1213         return (AH_FALSE);
 1214 }
 1215 
 1216 HAL_STATUS
 1217 ar5k_ar5211_proc_tx_desc(struct ath_hal *hal, struct ath_desc *desc)
 1218 {
 1219         struct ar5k_ar5211_tx_status *tx_status;
 1220         struct ar5k_ar5211_tx_desc *tx_desc;
 1221 
 1222         tx_desc = (struct ar5k_ar5211_tx_desc*)&desc->ds_ctl0;
 1223         tx_status = (struct ar5k_ar5211_tx_status*)&desc->ds_hw[0];
 1224 
 1225         /* No frame has been send or error */
 1226         if ((tx_status->tx_status_1 & AR5K_AR5211_DESC_TX_STATUS1_DONE) == 0)
 1227                 return (HAL_EINPROGRESS);
 1228 
 1229         /*
 1230          * Get descriptor status
 1231          */
 1232         desc->ds_us.tx.ts_tstamp =
 1233             AR5K_REG_MS(tx_status->tx_status_0,
 1234             AR5K_AR5211_DESC_TX_STATUS0_SEND_TIMESTAMP);
 1235         desc->ds_us.tx.ts_shortretry =
 1236             AR5K_REG_MS(tx_status->tx_status_0,
 1237             AR5K_AR5211_DESC_TX_STATUS0_RTS_FAIL_COUNT);
 1238         desc->ds_us.tx.ts_longretry =
 1239             AR5K_REG_MS(tx_status->tx_status_0,
 1240             AR5K_AR5211_DESC_TX_STATUS0_DATA_FAIL_COUNT);
 1241         desc->ds_us.tx.ts_seqnum =
 1242             AR5K_REG_MS(tx_status->tx_status_1,
 1243             AR5K_AR5211_DESC_TX_STATUS1_SEQ_NUM);
 1244         desc->ds_us.tx.ts_rssi =
 1245             AR5K_REG_MS(tx_status->tx_status_1,
 1246             AR5K_AR5211_DESC_TX_STATUS1_ACK_SIG_STRENGTH);
 1247         desc->ds_us.tx.ts_antenna = 1;
 1248         desc->ds_us.tx.ts_status = 0;
 1249         desc->ds_us.tx.ts_rate =
 1250             AR5K_REG_MS(tx_desc->tx_control_0,
 1251             AR5K_AR5211_DESC_TX_CTL0_XMIT_RATE);
 1252 
 1253         if ((tx_status->tx_status_0 &
 1254             AR5K_AR5211_DESC_TX_STATUS0_FRAME_XMIT_OK) == 0) {
 1255                 if (tx_status->tx_status_0 &
 1256                     AR5K_AR5211_DESC_TX_STATUS0_EXCESSIVE_RETRIES)
 1257                         desc->ds_us.tx.ts_status |= HAL_TXERR_XRETRY;
 1258 
 1259                 if (tx_status->tx_status_0 &
 1260                     AR5K_AR5211_DESC_TX_STATUS0_FIFO_UNDERRUN)
 1261                         desc->ds_us.tx.ts_status |= HAL_TXERR_FIFO;
 1262 
 1263                 if (tx_status->tx_status_0 &
 1264                     AR5K_AR5211_DESC_TX_STATUS0_FILTERED)
 1265                         desc->ds_us.tx.ts_status |= HAL_TXERR_FILT;
 1266         }
 1267 
 1268         return (HAL_OK);
 1269 }
 1270 
 1271 HAL_BOOL
 1272 ar5k_ar5211_has_veol(struct ath_hal *hal)
 1273 {
 1274         return (AH_TRUE);
 1275 }
 1276 
 1277 /*
 1278  * Receive functions
 1279  */
 1280 
 1281 u_int32_t
 1282 ar5k_ar5211_get_rx_buf(struct ath_hal *hal)
 1283 {
 1284         return (AR5K_REG_READ(AR5K_AR5211_RXDP));
 1285 }
 1286 
 1287 void
 1288 ar5k_ar5211_put_rx_buf(struct ath_hal *hal, u_int32_t phys_addr)
 1289 {
 1290         AR5K_REG_WRITE(AR5K_AR5211_RXDP, phys_addr);
 1291 }
 1292 
 1293 void
 1294 ar5k_ar5211_start_rx(struct ath_hal *hal)
 1295 {
 1296         AR5K_REG_WRITE(AR5K_AR5211_CR, AR5K_AR5211_CR_RXE);
 1297 }
 1298 
 1299 HAL_BOOL
 1300 ar5k_ar5211_stop_rx_dma(struct ath_hal *hal)
 1301 {
 1302         int i;
 1303 
 1304         AR5K_REG_WRITE(AR5K_AR5211_CR, AR5K_AR5211_CR_RXD);
 1305 
 1306         /*
 1307          * It may take some time to disable the DMA receive unit
 1308          */
 1309         for (i = 2000;
 1310              i > 0 && (AR5K_REG_READ(AR5K_AR5211_CR) & AR5K_AR5211_CR_RXE) != 0;
 1311              i--)
 1312                 AR5K_DELAY(10);
 1313 
 1314         return (i > 0 ? AH_TRUE : AH_FALSE);
 1315 }
 1316 
 1317 void
 1318 ar5k_ar5211_start_rx_pcu(struct ath_hal *hal)
 1319 {
 1320         AR5K_REG_DISABLE_BITS(AR5K_AR5211_DIAG_SW, AR5K_AR5211_DIAG_SW_DIS_RX);
 1321 }
 1322 
 1323 void
 1324 ar5k_ar5211_stop_pcu_recv(struct ath_hal *hal)
 1325 {
 1326         AR5K_REG_ENABLE_BITS(AR5K_AR5211_DIAG_SW, AR5K_AR5211_DIAG_SW_DIS_RX);
 1327 }
 1328 
 1329 void
 1330 ar5k_ar5211_set_mcast_filter(struct ath_hal *hal, u_int32_t filter0,
 1331     u_int32_t filter1)
 1332 {
 1333         /* Set the multicat filter */
 1334         AR5K_REG_WRITE(AR5K_AR5211_MCAST_FIL0, filter0);
 1335         AR5K_REG_WRITE(AR5K_AR5211_MCAST_FIL1, filter1);
 1336 }
 1337 
 1338 HAL_BOOL
 1339 ar5k_ar5211_set_mcast_filterindex(struct ath_hal *hal, u_int32_t index)
 1340 {
 1341         if (index >= 64) {
 1342             return (AH_FALSE);
 1343         } else if (index >= 32) {
 1344             AR5K_REG_ENABLE_BITS(AR5K_AR5211_MCAST_FIL1,
 1345                 (1 << (index - 32)));
 1346         } else {
 1347             AR5K_REG_ENABLE_BITS(AR5K_AR5211_MCAST_FIL0,
 1348                 (1 << index));
 1349         }
 1350 
 1351         return (AH_TRUE);
 1352 }
 1353 
 1354 HAL_BOOL
 1355 ar5k_ar5211_clear_mcast_filter_idx(struct ath_hal *hal, u_int32_t index)
 1356 {
 1357 
 1358         if (index >= 64) {
 1359             return (AH_FALSE);
 1360         } else if (index >= 32) {
 1361             AR5K_REG_DISABLE_BITS(AR5K_AR5211_MCAST_FIL1,
 1362                 (1 << (index - 32)));
 1363         } else {
 1364             AR5K_REG_DISABLE_BITS(AR5K_AR5211_MCAST_FIL0,
 1365                 (1 << index));
 1366         }
 1367 
 1368         return (AH_TRUE);
 1369 }
 1370 
 1371 u_int32_t
 1372 ar5k_ar5211_get_rx_filter(struct ath_hal *hal)
 1373 {
 1374         return (AR5K_REG_READ(AR5K_AR5211_RX_FILTER));
 1375 }
 1376 
 1377 void
 1378 ar5k_ar5211_set_rx_filter(struct ath_hal *hal, u_int32_t filter)
 1379 {
 1380         AR5K_REG_WRITE(AR5K_AR5211_RX_FILTER, filter);
 1381 }
 1382 
 1383 HAL_BOOL
 1384 ar5k_ar5211_setup_rx_desc(struct ath_hal *hal, struct ath_desc *desc,
 1385     u_int32_t size, u_int flags)
 1386 {
 1387         struct ar5k_ar5211_rx_desc *rx_desc;
 1388 
 1389         rx_desc = (struct ar5k_ar5211_rx_desc*)&desc->ds_ctl0;
 1390 
 1391         if ((rx_desc->rx_control_1 = (size &
 1392             AR5K_AR5211_DESC_RX_CTL1_BUF_LEN)) != size)
 1393                 return (AH_FALSE);
 1394 
 1395         if (flags & HAL_RXDESC_INTREQ)
 1396                 rx_desc->rx_control_1 |= AR5K_AR5211_DESC_RX_CTL1_INTREQ;
 1397 
 1398         return (AH_TRUE);
 1399 }
 1400 
 1401 HAL_STATUS
 1402 ar5k_ar5211_proc_rx_desc(struct ath_hal *hal, struct ath_desc *desc,
 1403     u_int32_t phys_addr, struct ath_desc *next)
 1404 {
 1405         struct ar5k_ar5211_rx_status *rx_status;
 1406 
 1407         rx_status = (struct ar5k_ar5211_rx_status*)&desc->ds_hw[0];
 1408 
 1409         /* No frame received / not ready */
 1410         if ((rx_status->rx_status_1 & AR5K_AR5211_DESC_RX_STATUS1_DONE) == 0)
 1411                 return (HAL_EINPROGRESS);
 1412 
 1413         /*
 1414          * Frame receive status
 1415          */
 1416         desc->ds_us.rx.rs_datalen = rx_status->rx_status_0 &
 1417             AR5K_AR5211_DESC_RX_STATUS0_DATA_LEN;
 1418         desc->ds_us.rx.rs_rssi =
 1419             AR5K_REG_MS(rx_status->rx_status_0,
 1420             AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_SIGNAL);
 1421         desc->ds_us.rx.rs_rate =
 1422             AR5K_REG_MS(rx_status->rx_status_0,
 1423             AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_RATE);
 1424         desc->ds_us.rx.rs_antenna = rx_status->rx_status_0 &
 1425             AR5K_AR5211_DESC_RX_STATUS0_RECEIVE_ANTENNA;
 1426         desc->ds_us.rx.rs_more = rx_status->rx_status_0 &
 1427             AR5K_AR5211_DESC_RX_STATUS0_MORE;
 1428         desc->ds_us.rx.rs_tstamp =
 1429             AR5K_REG_MS(rx_status->rx_status_1,
 1430             AR5K_AR5211_DESC_RX_STATUS1_RECEIVE_TIMESTAMP);
 1431         desc->ds_us.rx.rs_status = 0;
 1432 
 1433         /*
 1434          * Key table status
 1435          */
 1436         if (rx_status->rx_status_1 &
 1437             AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX_VALID) {
 1438                 desc->ds_us.rx.rs_keyix =
 1439                     AR5K_REG_MS(rx_status->rx_status_1,
 1440                     AR5K_AR5211_DESC_RX_STATUS1_KEY_INDEX);
 1441         } else {
 1442                 desc->ds_us.rx.rs_keyix = HAL_RXKEYIX_INVALID;
 1443         }
 1444 
 1445         /*
 1446          * Receive/descriptor errors
 1447          */
 1448         if ((rx_status->rx_status_1 &
 1449             AR5K_AR5211_DESC_RX_STATUS1_FRAME_RECEIVE_OK) == 0) {
 1450                 if (rx_status->rx_status_1 &
 1451                     AR5K_AR5211_DESC_RX_STATUS1_CRC_ERROR)
 1452                         desc->ds_us.rx.rs_status |= HAL_RXERR_CRC;
 1453 
 1454                 if (rx_status->rx_status_1 &
 1455                     AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR) {
 1456                         desc->ds_us.rx.rs_status |= HAL_RXERR_PHY;
 1457                         desc->ds_us.rx.rs_phyerr =
 1458                             AR5K_REG_MS(rx_status->rx_status_1,
 1459                             AR5K_AR5211_DESC_RX_STATUS1_PHY_ERROR);
 1460                 }
 1461 
 1462                 if (rx_status->rx_status_1 &
 1463                     AR5K_AR5211_DESC_RX_STATUS1_DECRYPT_CRC_ERROR)
 1464                         desc->ds_us.rx.rs_status |= HAL_RXERR_DECRYPT;
 1465         }
 1466 
 1467         return (HAL_OK);
 1468 }
 1469 
 1470 void
 1471 ar5k_ar5211_set_rx_signal(struct ath_hal *hal)
 1472 {
 1473         /* Signal state monitoring is not yet supported */
 1474 }
 1475 
 1476 /*
 1477  * Misc functions
 1478  */
 1479 
 1480 void
 1481 ar5k_ar5211_dump_state(struct ath_hal *hal)
 1482 {
 1483 #ifdef AR5K_DEBUG
 1484 #define AR5K_PRINT_REGISTER(_x)                                         \
 1485         printf("(%s: %08x) ", #_x, AR5K_REG_READ(AR5K_AR5211_##_x));
 1486 
 1487         printf("MAC registers:\n");
 1488         AR5K_PRINT_REGISTER(CR);
 1489         AR5K_PRINT_REGISTER(CFG);
 1490         AR5K_PRINT_REGISTER(IER);
 1491         AR5K_PRINT_REGISTER(RTSD0);
 1492         AR5K_PRINT_REGISTER(TXCFG);
 1493         AR5K_PRINT_REGISTER(RXCFG);
 1494         AR5K_PRINT_REGISTER(RXJLA);
 1495         AR5K_PRINT_REGISTER(MIBC);
 1496         AR5K_PRINT_REGISTER(TOPS);
 1497         AR5K_PRINT_REGISTER(RXNOFRM);
 1498         AR5K_PRINT_REGISTER(RPGTO);
 1499         AR5K_PRINT_REGISTER(RFCNT);
 1500         AR5K_PRINT_REGISTER(MISC);
 1501         AR5K_PRINT_REGISTER(PISR);
 1502         AR5K_PRINT_REGISTER(SISR0);
 1503         AR5K_PRINT_REGISTER(SISR1);
 1504         AR5K_PRINT_REGISTER(SISR3);
 1505         AR5K_PRINT_REGISTER(SISR4);
 1506         AR5K_PRINT_REGISTER(QCU_TXE);
 1507         AR5K_PRINT_REGISTER(QCU_TXD);
 1508         AR5K_PRINT_REGISTER(DCU_GBL_IFS_SIFS);
 1509         AR5K_PRINT_REGISTER(DCU_GBL_IFS_SLOT);
 1510         AR5K_PRINT_REGISTER(DCU_FP);
 1511         AR5K_PRINT_REGISTER(DCU_TXP);
 1512         AR5K_PRINT_REGISTER(DCU_TX_FILTER);
 1513         AR5K_PRINT_REGISTER(RC);
 1514         AR5K_PRINT_REGISTER(SCR);
 1515         AR5K_PRINT_REGISTER(INTPEND);
 1516         AR5K_PRINT_REGISTER(PCICFG);
 1517         AR5K_PRINT_REGISTER(GPIOCR);
 1518         AR5K_PRINT_REGISTER(GPIODO);
 1519         AR5K_PRINT_REGISTER(SREV);
 1520         AR5K_PRINT_REGISTER(EEPROM_BASE);
 1521         AR5K_PRINT_REGISTER(EEPROM_DATA);
 1522         AR5K_PRINT_REGISTER(EEPROM_CMD);
 1523         AR5K_PRINT_REGISTER(EEPROM_CFG);
 1524         AR5K_PRINT_REGISTER(PCU_MIN);
 1525         AR5K_PRINT_REGISTER(STA_ID0);
 1526         AR5K_PRINT_REGISTER(STA_ID1);
 1527         AR5K_PRINT_REGISTER(BSS_ID0);
 1528         AR5K_PRINT_REGISTER(SLOT_TIME);
 1529         AR5K_PRINT_REGISTER(TIME_OUT);
 1530         AR5K_PRINT_REGISTER(RSSI_THR);
 1531         AR5K_PRINT_REGISTER(BEACON);
 1532         AR5K_PRINT_REGISTER(CFP_PERIOD);
 1533         AR5K_PRINT_REGISTER(TIMER0);
 1534         AR5K_PRINT_REGISTER(TIMER2);
 1535         AR5K_PRINT_REGISTER(TIMER3);
 1536         AR5K_PRINT_REGISTER(CFP_DUR);
 1537         AR5K_PRINT_REGISTER(MCAST_FIL0);
 1538         AR5K_PRINT_REGISTER(MCAST_FIL1);
 1539         AR5K_PRINT_REGISTER(DIAG_SW);
 1540         AR5K_PRINT_REGISTER(TSF_U32);
 1541         AR5K_PRINT_REGISTER(ADDAC_TEST);
 1542         AR5K_PRINT_REGISTER(DEFAULT_ANTENNA);
 1543         AR5K_PRINT_REGISTER(LAST_TSTP);
 1544         AR5K_PRINT_REGISTER(NAV);
 1545         AR5K_PRINT_REGISTER(RTS_OK);
 1546         AR5K_PRINT_REGISTER(ACK_FAIL);
 1547         AR5K_PRINT_REGISTER(FCS_FAIL);
 1548         AR5K_PRINT_REGISTER(BEACON_CNT);
 1549         AR5K_PRINT_REGISTER(KEYTABLE_0);
 1550         printf("\n");
 1551 
 1552         printf("PHY registers:\n");
 1553         AR5K_PRINT_REGISTER(PHY_TURBO);
 1554         AR5K_PRINT_REGISTER(PHY_AGC);
 1555         AR5K_PRINT_REGISTER(PHY_CHIP_ID);
 1556         AR5K_PRINT_REGISTER(PHY_AGCCTL);
 1557         AR5K_PRINT_REGISTER(PHY_NF);
 1558         AR5K_PRINT_REGISTER(PHY_RX_DELAY);
 1559         AR5K_PRINT_REGISTER(PHY_IQ);
 1560         AR5K_PRINT_REGISTER(PHY_PAPD_PROBE);
 1561         AR5K_PRINT_REGISTER(PHY_FC);
 1562         AR5K_PRINT_REGISTER(PHY_RADAR);
 1563         AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_0);
 1564         AR5K_PRINT_REGISTER(PHY_ANT_SWITCH_TABLE_1);
 1565         printf("\n");
 1566 #endif
 1567 }
 1568 
 1569 HAL_BOOL
 1570 ar5k_ar5211_get_diag_state(struct ath_hal *hal, int id, void **device,
 1571     u_int *size)
 1572 {
 1573         /*
 1574          * We'll ignore this right now. This seems to be some kind of an obscure
 1575          * debugging interface for the binary-only HAL.
 1576          */
 1577         return (AH_FALSE);
 1578 }
 1579 
 1580 void
 1581 ar5k_ar5211_get_lladdr(struct ath_hal *hal, u_int8_t *mac)
 1582 {
 1583         bcopy(hal->ah_sta_id, mac, IEEE80211_ADDR_LEN);
 1584 }
 1585 
 1586 HAL_BOOL
 1587 ar5k_ar5211_set_lladdr(struct ath_hal *hal, const u_int8_t *mac)
 1588 {
 1589         u_int32_t low_id, high_id;
 1590 
 1591         /* Set new station ID */
 1592         bcopy(mac, hal->ah_sta_id, IEEE80211_ADDR_LEN);
 1593 
 1594         low_id = AR5K_LOW_ID(mac);
 1595         high_id = 0x0000ffff & AR5K_HIGH_ID(mac);
 1596 
 1597         AR5K_REG_WRITE(AR5K_AR5211_STA_ID0, low_id);
 1598         AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, high_id);
 1599 
 1600         return (AH_TRUE);
 1601 }
 1602 
 1603 HAL_BOOL
 1604 ar5k_ar5211_set_regdomain(struct ath_hal *hal, u_int16_t regdomain,
 1605     HAL_STATUS *status)
 1606 {
 1607         ieee80211_regdomain_t ieee_regdomain;
 1608 
 1609         ieee_regdomain = ar5k_regdomain_to_ieee(regdomain);
 1610 
 1611         if (ar5k_eeprom_regulation_domain(hal, AH_TRUE,
 1612                 &ieee_regdomain) == AH_TRUE) {
 1613                 *status = HAL_OK;
 1614                 return (AH_TRUE);
 1615         }
 1616 
 1617         *status = EIO;
 1618 
 1619         return (AH_FALSE);
 1620 }
 1621 
 1622 void
 1623 ar5k_ar5211_set_ledstate(struct ath_hal *hal, HAL_LED_STATE state)
 1624 {
 1625         u_int32_t led;
 1626 
 1627         AR5K_REG_DISABLE_BITS(AR5K_AR5211_PCICFG,
 1628             AR5K_AR5211_PCICFG_LEDMODE |  AR5K_AR5211_PCICFG_LED);
 1629 
 1630         /*
 1631          * Some blinking values, define at your wish
 1632          */
 1633         switch (state) {
 1634         case IEEE80211_S_SCAN:
 1635         case IEEE80211_S_AUTH:
 1636                 led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
 1637                     AR5K_AR5211_PCICFG_LED_PEND;
 1638                 break;
 1639 
 1640         case IEEE80211_S_INIT:
 1641                 led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
 1642                     AR5K_AR5211_PCICFG_LED_NONE;
 1643                 break;
 1644 
 1645         case IEEE80211_S_ASSOC:
 1646         case IEEE80211_S_RUN:
 1647                 led = AR5K_AR5211_PCICFG_LEDMODE_PROP |
 1648                     AR5K_AR5211_PCICFG_LED_ASSOC;
 1649                 break;
 1650 
 1651         default:
 1652                 led = AR5K_AR5211_PCICFG_LEDMODE_PROM |
 1653                     AR5K_AR5211_PCICFG_LED_NONE;
 1654                 break;
 1655         }
 1656 
 1657         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PCICFG, led);
 1658 }
 1659 
 1660 void
 1661 ar5k_ar5211_set_associd(struct ath_hal *hal, const u_int8_t *bssid,
 1662     u_int16_t assoc_id, u_int16_t tim_offset)
 1663 {
 1664         u_int32_t low_id, high_id;
 1665 
 1666         /*
 1667          * Set BSSID which triggers the "SME Join" operation
 1668          */
 1669         low_id = AR5K_LOW_ID(bssid);
 1670         high_id = AR5K_HIGH_ID(bssid);
 1671         AR5K_REG_WRITE(AR5K_AR5211_BSS_ID0, low_id);
 1672         AR5K_REG_WRITE(AR5K_AR5211_BSS_ID1, high_id |
 1673             ((assoc_id & 0x3fff) << AR5K_AR5211_BSS_ID1_AID_S));
 1674         bcopy(bssid, hal->ah_bssid, IEEE80211_ADDR_LEN);
 1675 
 1676         if (assoc_id == 0) {
 1677                 ar5k_ar5211_disable_pspoll(hal);
 1678                 return;
 1679         }
 1680 
 1681         AR5K_REG_WRITE(AR5K_AR5211_BEACON,
 1682             (AR5K_REG_READ(AR5K_AR5211_BEACON) &
 1683             ~AR5K_AR5211_BEACON_TIM) |
 1684             (((tim_offset ? tim_offset + 4 : 0) <<
 1685             AR5K_AR5211_BEACON_TIM_S) &
 1686             AR5K_AR5211_BEACON_TIM));
 1687 
 1688         ar5k_ar5211_enable_pspoll(hal, NULL, 0);
 1689 }
 1690 
 1691 HAL_BOOL
 1692 ar5k_ar5211_set_bssid_mask(struct ath_hal *hal, const u_int8_t* mask)
 1693 {
 1694         /* Not supported in 5211 */
 1695         return (AH_FALSE);
 1696 }
 1697 
 1698 HAL_BOOL
 1699 ar5k_ar5211_set_gpio_output(struct ath_hal *hal, u_int32_t gpio)
 1700 {
 1701         if (gpio > AR5K_AR5211_NUM_GPIO)
 1702                 return (AH_FALSE);
 1703 
 1704         AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
 1705             (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio))
 1706             | AR5K_AR5211_GPIOCR_ALL(gpio));
 1707 
 1708         return (AH_TRUE);
 1709 }
 1710 
 1711 HAL_BOOL
 1712 ar5k_ar5211_set_gpio_input(struct ath_hal *hal, u_int32_t gpio)
 1713 {
 1714         if (gpio > AR5K_AR5211_NUM_GPIO)
 1715                 return (AH_FALSE);
 1716 
 1717         AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
 1718             (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &~ AR5K_AR5211_GPIOCR_ALL(gpio))
 1719             | AR5K_AR5211_GPIOCR_NONE(gpio));
 1720 
 1721         return (AH_TRUE);
 1722 }
 1723 
 1724 u_int32_t
 1725 ar5k_ar5211_get_gpio(struct ath_hal *hal, u_int32_t gpio)
 1726 {
 1727         if (gpio > AR5K_AR5211_NUM_GPIO)
 1728                 return (0xffffffff);
 1729 
 1730         /* GPIO input magic */
 1731         return (((AR5K_REG_READ(AR5K_AR5211_GPIODI) &
 1732             AR5K_AR5211_GPIODI_M) >> gpio) & 0x1);
 1733 }
 1734 
 1735 HAL_BOOL
 1736 ar5k_ar5211_set_gpio(struct ath_hal *hal, u_int32_t gpio, u_int32_t val)
 1737 {
 1738         u_int32_t data;
 1739 
 1740         if (gpio > AR5K_AR5211_NUM_GPIO)
 1741                 return (0xffffffff);
 1742 
 1743         /* GPIO output magic */
 1744         data =  AR5K_REG_READ(AR5K_AR5211_GPIODO);
 1745 
 1746         data &= ~(1 << gpio);
 1747         data |= (val&1) << gpio;
 1748 
 1749         AR5K_REG_WRITE(AR5K_AR5211_GPIODO, data);
 1750 
 1751         return (AH_TRUE);
 1752 }
 1753 
 1754 void
 1755 ar5k_ar5211_set_gpio_intr(struct ath_hal *hal, u_int gpio,
 1756     u_int32_t interrupt_level)
 1757 {
 1758         u_int32_t data;
 1759 
 1760         if (gpio > AR5K_AR5211_NUM_GPIO)
 1761                 return;
 1762 
 1763         /*
 1764          * Set the GPIO interrupt
 1765          */
 1766         data = (AR5K_REG_READ(AR5K_AR5211_GPIOCR) &
 1767             ~(AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_SELH |
 1768             AR5K_AR5211_GPIOCR_INT_ENA | AR5K_AR5211_GPIOCR_ALL(gpio))) |
 1769             (AR5K_AR5211_GPIOCR_INT_SEL(gpio) | AR5K_AR5211_GPIOCR_INT_ENA);
 1770 
 1771         AR5K_REG_WRITE(AR5K_AR5211_GPIOCR,
 1772             interrupt_level ? data : (data | AR5K_AR5211_GPIOCR_INT_SELH));
 1773 
 1774         hal->ah_imr |= AR5K_AR5211_PIMR_GPIO;
 1775 
 1776         /* Enable GPIO interrupts */
 1777         AR5K_REG_ENABLE_BITS(AR5K_AR5211_PIMR, AR5K_AR5211_PIMR_GPIO);
 1778 }
 1779 
 1780 u_int32_t
 1781 ar5k_ar5211_get_tsf32(struct ath_hal *hal)
 1782 {
 1783         return (AR5K_REG_READ(AR5K_AR5211_TSF_L32));
 1784 }
 1785 
 1786 u_int64_t
 1787 ar5k_ar5211_get_tsf64(struct ath_hal *hal)
 1788 {
 1789         u_int64_t tsf = AR5K_REG_READ(AR5K_AR5211_TSF_U32);
 1790 
 1791         return (AR5K_REG_READ(AR5K_AR5211_TSF_L32) | (tsf << 32));
 1792 }
 1793 
 1794 void
 1795 ar5k_ar5211_reset_tsf(struct ath_hal *hal)
 1796 {
 1797         AR5K_REG_ENABLE_BITS(AR5K_AR5211_BEACON,
 1798             AR5K_AR5211_BEACON_RESET_TSF);
 1799 }
 1800 
 1801 u_int16_t
 1802 ar5k_ar5211_get_regdomain(struct ath_hal *hal)
 1803 {
 1804         return (ar5k_get_regdomain(hal));
 1805 }
 1806 
 1807 HAL_BOOL
 1808 ar5k_ar5211_detect_card_present(struct ath_hal *hal)
 1809 {
 1810         u_int16_t magic;
 1811 
 1812         /*
 1813          * Checking the EEPROM's magic value could be an indication
 1814          * if the card is still present. I didn't find another suitable
 1815          * way to do this.
 1816          */
 1817         if (ar5k_ar5211_eeprom_read(hal, AR5K_EEPROM_MAGIC, &magic) != 0)
 1818                 return (AH_FALSE);
 1819 
 1820         return (magic == AR5K_EEPROM_MAGIC_VALUE ? AH_TRUE : AH_FALSE);
 1821 }
 1822 
 1823 void
 1824 ar5k_ar5211_update_mib_counters(struct ath_hal *hal, HAL_MIB_STATS *statistics)
 1825 {
 1826         statistics->ackrcv_bad += AR5K_REG_READ(AR5K_AR5211_ACK_FAIL);
 1827         statistics->rts_bad += AR5K_REG_READ(AR5K_AR5211_RTS_FAIL);
 1828         statistics->rts_good += AR5K_REG_READ(AR5K_AR5211_RTS_OK);
 1829         statistics->fcs_bad += AR5K_REG_READ(AR5K_AR5211_FCS_FAIL);
 1830         statistics->beacons += AR5K_REG_READ(AR5K_AR5211_BEACON_CNT);
 1831 }
 1832 
 1833 HAL_RFGAIN
 1834 ar5k_ar5211_get_rf_gain(struct ath_hal *hal)
 1835 {
 1836         return (HAL_RFGAIN_INACTIVE);
 1837 }
 1838 
 1839 HAL_BOOL
 1840 ar5k_ar5211_set_slot_time(struct ath_hal *hal, u_int slot_time)
 1841 {
 1842         if (slot_time < HAL_SLOT_TIME_9 || slot_time > HAL_SLOT_TIME_MAX)
 1843                 return (AH_FALSE);
 1844 
 1845         AR5K_REG_WRITE(AR5K_AR5211_DCU_GBL_IFS_SLOT, slot_time);
 1846 
 1847         return (AH_TRUE);
 1848 }
 1849 
 1850 u_int
 1851 ar5k_ar5211_get_slot_time(struct ath_hal *hal)
 1852 {
 1853         return (AR5K_REG_READ(AR5K_AR5211_DCU_GBL_IFS_SLOT) & 0xffff);
 1854 }
 1855 
 1856 HAL_BOOL
 1857 ar5k_ar5211_set_ack_timeout(struct ath_hal *hal, u_int timeout)
 1858 {
 1859         if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_ACK),
 1860             hal->ah_turbo) <= timeout)
 1861                 return (AH_FALSE);
 1862 
 1863         AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_ACK,
 1864             ar5k_htoclock(timeout, hal->ah_turbo));
 1865 
 1866         return (AH_TRUE);
 1867 }
 1868 
 1869 u_int
 1870 ar5k_ar5211_get_ack_timeout(struct ath_hal *hal)
 1871 {
 1872         return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT),
 1873             AR5K_AR5211_TIME_OUT_ACK), hal->ah_turbo));
 1874 }
 1875 
 1876 HAL_BOOL
 1877 ar5k_ar5211_set_cts_timeout(struct ath_hal *hal, u_int timeout)
 1878 {
 1879         if (ar5k_clocktoh(AR5K_REG_MS(0xffffffff, AR5K_AR5211_TIME_OUT_CTS),
 1880             hal->ah_turbo) <= timeout)
 1881                 return (AH_FALSE);
 1882 
 1883         AR5K_REG_WRITE_BITS(AR5K_AR5211_TIME_OUT, AR5K_AR5211_TIME_OUT_CTS,
 1884             ar5k_htoclock(timeout, hal->ah_turbo));
 1885 
 1886         return (AH_TRUE);
 1887 }
 1888 
 1889 u_int
 1890 ar5k_ar5211_get_cts_timeout(struct ath_hal *hal)
 1891 {
 1892         return (ar5k_clocktoh(AR5K_REG_MS(AR5K_REG_READ(AR5K_AR5211_TIME_OUT),
 1893             AR5K_AR5211_TIME_OUT_CTS), hal->ah_turbo));
 1894 }
 1895 
 1896 /*
 1897  * Key table (WEP) functions
 1898  */
 1899 
 1900 HAL_BOOL
 1901 ar5k_ar5211_is_cipher_supported(struct ath_hal *hal, HAL_CIPHER cipher)
 1902 {
 1903         /*
 1904          * The AR5211 only supports WEP
 1905          */
 1906         if (cipher == HAL_CIPHER_WEP)
 1907                 return (AH_TRUE);
 1908 
 1909         return (AH_FALSE);
 1910 }
 1911 
 1912 u_int32_t
 1913 ar5k_ar5211_get_keycache_size(struct ath_hal *hal)
 1914 {
 1915         return (AR5K_AR5211_KEYCACHE_SIZE);
 1916 }
 1917 
 1918 HAL_BOOL
 1919 ar5k_ar5211_reset_key(struct ath_hal *hal, u_int16_t entry)
 1920 {
 1921         int i;
 1922 
 1923         AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
 1924 
 1925         for (i = 0; i < AR5K_AR5211_KEYCACHE_SIZE; i++)
 1926                 AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_OFF(entry, i), 0);
 1927 
 1928         return (AH_FALSE);
 1929 }
 1930 
 1931 HAL_BOOL
 1932 ar5k_ar5211_is_key_valid(struct ath_hal *hal, u_int16_t entry)
 1933 {
 1934         AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
 1935 
 1936         /*
 1937          * Check the validation flag at the end of the entry
 1938          */
 1939         if (AR5K_REG_READ(AR5K_AR5211_KEYTABLE_MAC1(entry)) &
 1940             AR5K_AR5211_KEYTABLE_VALID)
 1941                 return (AH_TRUE);
 1942 
 1943         return (AH_FALSE);
 1944 }
 1945 
 1946 HAL_BOOL
 1947 ar5k_ar5211_set_key(struct ath_hal *hal, u_int16_t entry,
 1948     const HAL_KEYVAL *keyval, const u_int8_t *mac, int xor_notused)
 1949 {
 1950         int i;
 1951         u_int32_t key_v[AR5K_AR5211_KEYCACHE_SIZE - 2];
 1952 
 1953         AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
 1954 
 1955         bzero(&key_v, sizeof(key_v));
 1956 
 1957         switch (keyval->wk_len) {
 1958         case AR5K_KEYVAL_LENGTH_40:
 1959                 bcopy(keyval->wk_key, &key_v[0], 4);
 1960                 bcopy(keyval->wk_key + 4, &key_v[1], 1);
 1961                 key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_40;
 1962                 break;
 1963 
 1964         case AR5K_KEYVAL_LENGTH_104:
 1965                 bcopy(keyval->wk_key, &key_v[0], 4);
 1966                 bcopy(keyval->wk_key + 4, &key_v[1], 2);
 1967                 bcopy(keyval->wk_key + 6, &key_v[2], 4);
 1968                 bcopy(keyval->wk_key + 10, &key_v[3], 2);
 1969                 bcopy(keyval->wk_key + 12, &key_v[4], 1);
 1970                 key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_104;
 1971                 break;
 1972 
 1973         case AR5K_KEYVAL_LENGTH_128:
 1974                 bcopy(keyval->wk_key, &key_v[0], 4);
 1975                 bcopy(keyval->wk_key + 4, &key_v[1], 2);
 1976                 bcopy(keyval->wk_key + 6, &key_v[2], 4);
 1977                 bcopy(keyval->wk_key + 10, &key_v[3], 2);
 1978                 bcopy(keyval->wk_key + 12, &key_v[4], 4);
 1979                 key_v[5] = AR5K_AR5211_KEYTABLE_TYPE_128;
 1980                 break;
 1981 
 1982         default:
 1983                 /* Unsupported key length (not WEP40/104/128) */
 1984                 return (AH_FALSE);
 1985         }
 1986 
 1987         for (i = 0; i < AR5K_ELEMENTS(key_v); i++)
 1988                 AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_OFF(entry, i), key_v[i]);
 1989 
 1990         return (ar5k_ar5211_set_key_lladdr(hal, entry, mac));
 1991 }
 1992 
 1993 HAL_BOOL
 1994 ar5k_ar5211_set_key_lladdr(struct ath_hal *hal, u_int16_t entry,
 1995     const u_int8_t *mac)
 1996 {
 1997         u_int32_t low_id, high_id;
 1998         const u_int8_t *mac_v;
 1999 
 2000         /*
 2001          * Invalid entry (key table overflow)
 2002          */
 2003         AR5K_ASSERT_ENTRY(entry, AR5K_AR5211_KEYTABLE_SIZE);
 2004 
 2005         /* MAC may be NULL if it's a broadcast key */
 2006         mac_v = mac == NULL ? etherbroadcastaddr : mac;
 2007 
 2008         low_id = AR5K_LOW_ID(mac_v);
 2009         high_id = AR5K_HIGH_ID(mac_v) | AR5K_AR5211_KEYTABLE_VALID;
 2010 
 2011         AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_MAC0(entry), low_id);
 2012         AR5K_REG_WRITE(AR5K_AR5211_KEYTABLE_MAC1(entry), high_id);
 2013 
 2014         return (AH_TRUE);
 2015 }
 2016 
 2017 /*
 2018  * Power management functions
 2019  */
 2020 
 2021 HAL_BOOL
 2022 ar5k_ar5211_set_power(struct ath_hal *hal, HAL_POWER_MODE mode,
 2023     HAL_BOOL set_chip, u_int16_t sleep_duration)
 2024 {
 2025         u_int32_t staid;
 2026         int i;
 2027 
 2028         staid = AR5K_REG_READ(AR5K_AR5211_STA_ID1);
 2029 
 2030         switch (mode) {
 2031         case HAL_PM_AUTO:
 2032                 staid &= ~AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA;
 2033                 /* FALLTHROUGH */
 2034         case HAL_PM_NETWORK_SLEEP:
 2035                 if (set_chip == AH_TRUE) {
 2036                         AR5K_REG_WRITE(AR5K_AR5211_SCR,
 2037                             AR5K_AR5211_SCR_SLE | sleep_duration);
 2038                 }
 2039                 staid |= AR5K_AR5211_STA_ID1_PWR_SV;
 2040                 break;
 2041 
 2042         case HAL_PM_FULL_SLEEP:
 2043                 if (set_chip == AH_TRUE) {
 2044                         AR5K_REG_WRITE(AR5K_AR5211_SCR,
 2045                             AR5K_AR5211_SCR_SLE_SLP);
 2046                 }
 2047                 staid |= AR5K_AR5211_STA_ID1_PWR_SV;
 2048                 break;
 2049 
 2050         case HAL_PM_AWAKE:
 2051                 if (set_chip == AH_FALSE)
 2052                         goto commit;
 2053 
 2054                 AR5K_REG_WRITE(AR5K_AR5211_SCR, AR5K_AR5211_SCR_SLE_WAKE);
 2055 
 2056                 for (i = 5000; i > 0; i--) {
 2057                         /* Check if the AR5211 did wake up */
 2058                         if ((AR5K_REG_READ(AR5K_AR5211_PCICFG) &
 2059                             AR5K_AR5211_PCICFG_SPWR_DN) == 0)
 2060                                 break;
 2061 
 2062                         /* Wait a bit and retry */
 2063                         AR5K_DELAY(200);
 2064                         AR5K_REG_WRITE(AR5K_AR5211_SCR,
 2065                             AR5K_AR5211_SCR_SLE_WAKE);
 2066                 }
 2067 
 2068                 /* Fail if the AR5211 didn't wake up */
 2069                 if (i <= 0)
 2070                         return (AH_FALSE);
 2071 
 2072                 staid &= ~AR5K_AR5211_STA_ID1_PWR_SV;
 2073                 break;
 2074 
 2075         default:
 2076                 return (AH_FALSE);
 2077         }
 2078 
 2079  commit:
 2080         hal->ah_power_mode = mode;
 2081 
 2082         AR5K_REG_WRITE(AR5K_AR5211_STA_ID1, staid);
 2083 
 2084         return (AH_TRUE);
 2085 }
 2086 
 2087 HAL_POWER_MODE
 2088 ar5k_ar5211_get_power_mode(struct ath_hal *hal)
 2089 {
 2090         return (hal->ah_power_mode);
 2091 }
 2092 
 2093 HAL_BOOL
 2094 ar5k_ar5211_query_pspoll_support(struct ath_hal *hal)
 2095 {
 2096         /* nope */
 2097         return (AH_FALSE);
 2098 }
 2099 
 2100 HAL_BOOL
 2101 ar5k_ar5211_init_pspoll(struct ath_hal *hal)
 2102 {
 2103         /*
 2104          * Not used on the AR5211
 2105          */
 2106         return (AH_FALSE);
 2107 }
 2108 
 2109 HAL_BOOL
 2110 ar5k_ar5211_enable_pspoll(struct ath_hal *hal, u_int8_t *bssid,
 2111     u_int16_t assoc_id)
 2112 {
 2113         return (AH_FALSE);
 2114 }
 2115 
 2116 HAL_BOOL
 2117 ar5k_ar5211_disable_pspoll(struct ath_hal *hal)
 2118 {
 2119         return (AH_FALSE);
 2120 }
 2121 
 2122 /*
 2123  * Beacon functions
 2124  */
 2125 
 2126 void
 2127 ar5k_ar5211_init_beacon(struct ath_hal *hal, u_int32_t next_beacon,
 2128     u_int32_t interval)
 2129 {
 2130         u_int32_t timer1, timer2, timer3;
 2131 
 2132         /*
 2133          * Set the additional timers by mode
 2134          */
 2135         switch (hal->ah_op_mode) {
 2136         case HAL_M_STA:
 2137                 timer1 = 0x0000ffff;
 2138                 timer2 = 0x0007ffff;
 2139                 break;
 2140 
 2141         default:
 2142                 timer1 = (next_beacon - AR5K_TUNE_DMA_BEACON_RESP) <<
 2143                     0x00000003;
 2144                 timer2 = (next_beacon - AR5K_TUNE_SW_BEACON_RESP) <<
 2145                     0x00000003;
 2146         }
 2147 
 2148         timer3 = next_beacon +
 2149             (hal->ah_atim_window ? hal->ah_atim_window : 1);
 2150 
 2151         /*
 2152          * Enable all timers and set the beacon register
 2153          * (next beacon, DMA beacon, software beacon, ATIM window time)
 2154          */
 2155         AR5K_REG_WRITE(AR5K_AR5211_TIMER0, next_beacon);
 2156         AR5K_REG_WRITE(AR5K_AR5211_TIMER1, timer1);
 2157         AR5K_REG_WRITE(AR5K_AR5211_TIMER2, timer2);
 2158         AR5K_REG_WRITE(AR5K_AR5211_TIMER3, timer3);
 2159 
 2160         AR5K_REG_WRITE(AR5K_AR5211_BEACON, interval &
 2161             (AR5K_AR5211_BEACON_PERIOD | AR5K_AR5211_BEACON_RESET_TSF |
 2162             AR5K_AR5211_BEACON_ENABLE));
 2163 }
 2164 
 2165 void
 2166 ar5k_ar5211_set_beacon_timers(struct ath_hal *hal,
 2167     const HAL_BEACON_STATE *state, u_int32_t tsf, u_int32_t dtim_count,
 2168     u_int32_t cfp_count)
 2169 {
 2170         u_int32_t cfp_period, next_cfp;
 2171 
 2172         /* Return on an invalid beacon state */
 2173         if (state->bs_interval < 1)
 2174                 return;
 2175 
 2176         /*
 2177          * PCF support?
 2178          */
 2179         if (state->bs_cfp_period > 0) {
 2180                 /* Enable CFP mode and set the CFP and timer registers */
 2181                 cfp_period = state->bs_cfp_period * state->bs_dtim_period *
 2182                     state->bs_interval;
 2183                 next_cfp = (cfp_count * state->bs_dtim_period + dtim_count) *
 2184                     state->bs_interval;
 2185 
 2186                 AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
 2187                     AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA |
 2188                     AR5K_AR5211_STA_ID1_PCF);
 2189                 AR5K_REG_WRITE(AR5K_AR5211_CFP_PERIOD, cfp_period);
 2190                 AR5K_REG_WRITE(AR5K_AR5211_CFP_DUR, state->bs_cfp_max_duration);
 2191                 AR5K_REG_WRITE(AR5K_AR5211_TIMER2,
 2192                     (tsf + (next_cfp == 0 ? cfp_period : next_cfp)) << 3);
 2193         } else {
 2194                 /* Disable PCF mode */
 2195                 AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
 2196                     AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA |
 2197                     AR5K_AR5211_STA_ID1_PCF);
 2198         }
 2199 
 2200         /*
 2201          * Enable the beacon timer register
 2202          */
 2203         AR5K_REG_WRITE(AR5K_AR5211_TIMER0, state->bs_next_beacon);
 2204 
 2205         /*
 2206          * Start the beacon timers
 2207          */
 2208         AR5K_REG_WRITE(AR5K_AR5211_BEACON,
 2209             (AR5K_REG_READ(AR5K_AR5211_BEACON) &~
 2210             (AR5K_AR5211_BEACON_PERIOD | AR5K_AR5211_BEACON_TIM)) |
 2211             AR5K_REG_SM(state->bs_tim_offset ? state->bs_tim_offset + 4 : 0,
 2212             AR5K_AR5211_BEACON_TIM) | AR5K_REG_SM(state->bs_interval,
 2213             AR5K_AR5211_BEACON_PERIOD));
 2214 
 2215         /*
 2216          * Write new beacon miss threshold, if it appears to be valid
 2217          */
 2218         if ((AR5K_AR5211_RSSI_THR_BMISS >> AR5K_AR5211_RSSI_THR_BMISS_S) <
 2219             state->bs_bmiss_threshold)
 2220                 return;
 2221 
 2222         AR5K_REG_WRITE_BITS(AR5K_AR5211_RSSI_THR_M,
 2223             AR5K_AR5211_RSSI_THR_BMISS, state->bs_bmiss_threshold);
 2224         AR5K_REG_WRITE_BITS(AR5K_AR5211_SCR, AR5K_AR5211_SCR_SLDUR,
 2225             (state->bs_sleepduration - 3) << 3);
 2226 }
 2227 
 2228 void
 2229 ar5k_ar5211_reset_beacon(struct ath_hal *hal)
 2230 {
 2231         /*
 2232          * Disable beacon timer
 2233          */
 2234         AR5K_REG_WRITE(AR5K_AR5211_TIMER0, 0);
 2235 
 2236         /*
 2237          * Disable some beacon register values
 2238          */
 2239         AR5K_REG_DISABLE_BITS(AR5K_AR5211_STA_ID1,
 2240             AR5K_AR5211_STA_ID1_DEFAULT_ANTENNA | AR5K_AR5211_STA_ID1_PCF);
 2241         AR5K_REG_WRITE(AR5K_AR5211_BEACON, AR5K_AR5211_BEACON_PERIOD);
 2242 }
 2243 
 2244 HAL_BOOL
 2245 ar5k_ar5211_wait_for_beacon(struct ath_hal *hal, bus_addr_t phys_addr)
 2246 {
 2247         HAL_BOOL ret;
 2248 
 2249         /*
 2250          * Wait for beaconn queue to be done
 2251          */
 2252         ret = ar5k_register_timeout(hal,
 2253             AR5K_AR5211_QCU_STS(HAL_TX_QUEUE_ID_BEACON),
 2254             AR5K_AR5211_QCU_STS_FRMPENDCNT, 0, AH_FALSE);
 2255 
 2256         if (AR5K_REG_READ_Q(AR5K_AR5211_QCU_TXE, HAL_TX_QUEUE_ID_BEACON))
 2257                 return (AH_FALSE);
 2258 
 2259         return (ret);
 2260 }
 2261 
 2262 /*
 2263  * Interrupt handling
 2264  */
 2265 
 2266 HAL_BOOL
 2267 ar5k_ar5211_is_intr_pending(struct ath_hal *hal)
 2268 {
 2269         return (AR5K_REG_READ(AR5K_AR5211_INTPEND) == 0 ? AH_FALSE : AH_TRUE);
 2270 }
 2271 
 2272 HAL_BOOL
 2273 ar5k_ar5211_get_isr(struct ath_hal *hal, u_int32_t *interrupt_mask)
 2274 {
 2275         u_int32_t data;
 2276 
 2277         /*
 2278          * Read interrupt status from the Read-And-Clear shadow register
 2279          */
 2280         data = AR5K_REG_READ(AR5K_AR5211_RAC_PISR);
 2281 
 2282         /*
 2283          * Get abstract interrupt mask (HAL-compatible)
 2284          */
 2285         *interrupt_mask = (data & HAL_INT_COMMON) & hal->ah_imr;
 2286 
 2287         if (data == HAL_INT_NOCARD)
 2288                 return (AH_FALSE);
 2289 
 2290         if (data & (AR5K_AR5211_PISR_RXOK | AR5K_AR5211_PISR_RXERR))
 2291                 *interrupt_mask |= HAL_INT_RX;
 2292 
 2293         if (data & (AR5K_AR5211_PISR_TXOK | AR5K_AR5211_PISR_TXERR))
 2294                 *interrupt_mask |= HAL_INT_TX;
 2295 
 2296         if (data & (AR5K_AR5211_PISR_HIUERR))
 2297                 *interrupt_mask |= HAL_INT_FATAL;
 2298 
 2299         /*
 2300          * Special interrupt handling (not caught by the driver)
 2301          */
 2302         if (((*interrupt_mask) & AR5K_AR5211_PISR_RXPHY) &&
 2303             hal->ah_radar.r_enabled == AH_TRUE)
 2304                 ar5k_radar_alert(hal);
 2305 
 2306         return (AH_TRUE);
 2307 }
 2308 
 2309 u_int32_t
 2310 ar5k_ar5211_get_intr(struct ath_hal *hal)
 2311 {
 2312         /* Return the interrupt mask stored previously */
 2313         return (hal->ah_imr);
 2314 }
 2315 
 2316 HAL_INT
 2317 ar5k_ar5211_set_intr(struct ath_hal *hal, HAL_INT new_mask)
 2318 {
 2319         HAL_INT old_mask, int_mask;
 2320 
 2321         /*
 2322          * Disable card interrupts to prevent any race conditions
 2323          * (they will be re-enabled afterwards).
 2324          */
 2325         AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_DISABLE);
 2326 
 2327         old_mask = hal->ah_imr;
 2328 
 2329         /*
 2330          * Add additional, chipset-dependent interrupt mask flags
 2331          * and write them to the IMR (interrupt mask register).
 2332          */
 2333         int_mask = new_mask & HAL_INT_COMMON;
 2334 
 2335         if (new_mask & HAL_INT_RX)
 2336                 int_mask |=
 2337                     AR5K_AR5211_PIMR_RXOK |
 2338                     AR5K_AR5211_PIMR_RXERR |
 2339                     AR5K_AR5211_PIMR_RXORN |
 2340                     AR5K_AR5211_PIMR_RXDESC;
 2341 
 2342         if (new_mask & HAL_INT_TX)
 2343                 int_mask |=
 2344                     AR5K_AR5211_PIMR_TXOK |
 2345                     AR5K_AR5211_PIMR_TXERR |
 2346                     AR5K_AR5211_PIMR_TXDESC |
 2347                     AR5K_AR5211_PIMR_TXURN;
 2348 
 2349         if (new_mask & HAL_INT_FATAL) {
 2350                 int_mask |= AR5K_AR5211_PIMR_HIUERR;
 2351                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_SIMR2,
 2352                     AR5K_AR5211_SIMR2_MCABT |
 2353                     AR5K_AR5211_SIMR2_SSERR |
 2354                     AR5K_AR5211_SIMR2_DPERR);
 2355         }
 2356 
 2357         AR5K_REG_WRITE(AR5K_AR5211_PIMR, int_mask);
 2358 
 2359         /* Store new interrupt mask */
 2360         hal->ah_imr = new_mask;
 2361 
 2362         /* ..re-enable interrupts */
 2363         AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_ENABLE);
 2364 
 2365         return (old_mask);
 2366 }
 2367 
 2368 /*
 2369  * Misc internal functions
 2370  */
 2371 
 2372 HAL_BOOL
 2373 ar5k_ar5211_get_capabilities(struct ath_hal *hal)
 2374 {
 2375         u_int16_t ee_header;
 2376 
 2377         /* Capabilities stored in the EEPROM */
 2378         ee_header = hal->ah_capabilities.cap_eeprom.ee_header;
 2379 
 2380         /*
 2381          * XXX The AR5211 tranceiver supports frequencies from 4920 to 6100GHz
 2382          * XXX and from 2312 to 2732GHz. There are problems with the current
 2383          * XXX ieee80211 implementation because the IEEE channel mapping
 2384          * XXX does not support negative channel numbers (2312MHz is channel
 2385          * XXX -19). Of course, this doesn't matter because these channels
 2386          * XXX are out of range but some regulation domains like MKK (Japan)
 2387          * XXX will support frequencies somewhere around 4.8GHz.
 2388          */
 2389 
 2390         /*
 2391          * Set radio capabilities
 2392          */
 2393 
 2394         if (AR5K_EEPROM_HDR_11A(ee_header)) {
 2395                 hal->ah_capabilities.cap_range.range_5ghz_min = 5005; /* 4920 */
 2396                 hal->ah_capabilities.cap_range.range_5ghz_max = 6100;
 2397 
 2398                 /* Set supported modes */
 2399                 hal->ah_capabilities.cap_mode = HAL_MODE_11A | HAL_MODE_TURBO;
 2400         }
 2401 
 2402         /* This chip will support 802.11b if the 2GHz radio is connected */
 2403         if (AR5K_EEPROM_HDR_11B(ee_header) || AR5K_EEPROM_HDR_11G(ee_header)) {
 2404                 hal->ah_capabilities.cap_range.range_2ghz_min = 2412; /* 2312 */
 2405                 hal->ah_capabilities.cap_range.range_2ghz_max = 2732;
 2406 
 2407                 if (AR5K_EEPROM_HDR_11B(ee_header))
 2408                         hal->ah_capabilities.cap_mode |= HAL_MODE_11B;
 2409 #if 0
 2410                 if (AR5K_EEPROM_HDR_11G(ee_header))
 2411                         hal->ah_capabilities.cap_mode |= HAL_MODE_11G;
 2412 #endif
 2413         }
 2414 
 2415         /* GPIO */
 2416         hal->ah_gpio_npins = AR5K_AR5211_NUM_GPIO;
 2417 
 2418         /* Set number of supported TX queues */
 2419         hal->ah_capabilities.cap_queues.q_tx_num = AR5K_AR5211_TX_NUM_QUEUES;
 2420 
 2421         return (AH_TRUE);
 2422 }
 2423 
 2424 void
 2425 ar5k_ar5211_radar_alert(struct ath_hal *hal, HAL_BOOL enable)
 2426 {
 2427         /*
 2428          * Enable radar detection
 2429          */
 2430         AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_DISABLE);
 2431 
 2432         if (enable == AH_TRUE) {
 2433                 AR5K_REG_WRITE(AR5K_AR5211_PHY_RADAR,
 2434                     AR5K_AR5211_PHY_RADAR_ENABLE);
 2435                 AR5K_REG_ENABLE_BITS(AR5K_AR5211_PIMR,
 2436                     AR5K_AR5211_PIMR_RXPHY);
 2437         } else {
 2438                 AR5K_REG_WRITE(AR5K_AR5211_PHY_RADAR,
 2439                     AR5K_AR5211_PHY_RADAR_DISABLE);
 2440                 AR5K_REG_DISABLE_BITS(AR5K_AR5211_PIMR,
 2441                     AR5K_AR5211_PIMR_RXPHY);
 2442         }
 2443 
 2444         AR5K_REG_WRITE(AR5K_AR5211_IER, AR5K_AR5211_IER_ENABLE);
 2445 }
 2446 
 2447 /*
 2448  * EEPROM access functions
 2449  */
 2450 
 2451 HAL_BOOL
 2452 ar5k_ar5211_eeprom_is_busy(struct ath_hal *hal)
 2453 {
 2454         return (AR5K_REG_READ(AR5K_AR5211_CFG) & AR5K_AR5211_CFG_EEBS ?
 2455             AH_TRUE : AH_FALSE);
 2456 }
 2457 
 2458 int
 2459 ar5k_ar5211_eeprom_read(struct ath_hal *hal, u_int32_t offset, u_int16_t *data)
 2460 {
 2461         u_int32_t status, i;
 2462 
 2463         /*
 2464          * Initialize EEPROM access
 2465          */
 2466         AR5K_REG_WRITE(AR5K_AR5211_EEPROM_BASE, (u_int8_t)offset);
 2467         AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
 2468             AR5K_AR5211_EEPROM_CMD_READ);
 2469 
 2470         for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
 2471                 status = AR5K_REG_READ(AR5K_AR5211_EEPROM_STATUS);
 2472                 if (status & AR5K_AR5211_EEPROM_STAT_RDDONE) {
 2473                         if (status & AR5K_AR5211_EEPROM_STAT_RDERR)
 2474                                 return (EIO);
 2475                         *data = (u_int16_t)
 2476                             (AR5K_REG_READ(AR5K_AR5211_EEPROM_DATA) & 0xffff);
 2477                         return (0);
 2478                 }
 2479                 AR5K_DELAY(15);
 2480         }
 2481 
 2482         return (ETIMEDOUT);
 2483 }
 2484 
 2485 int
 2486 ar5k_ar5211_eeprom_write(struct ath_hal *hal, u_int32_t offset, u_int16_t data)
 2487 {
 2488         u_int32_t status, timeout;
 2489 
 2490         /* Enable eeprom access */
 2491         AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
 2492             AR5K_AR5211_EEPROM_CMD_RESET);
 2493         AR5K_REG_ENABLE_BITS(AR5K_AR5211_EEPROM_CMD,
 2494             AR5K_AR5211_EEPROM_CMD_WRITE);
 2495 
 2496         /*
 2497          * Prime write pump
 2498          */
 2499         AR5K_REG_WRITE(AR5K_AR5211_EEPROM_BASE, (u_int8_t)offset - 1);
 2500 
 2501         for (timeout = 10000; timeout > 0; timeout--) {
 2502                 AR5K_DELAY(1);
 2503                 status = AR5K_REG_READ(AR5K_AR5211_EEPROM_STATUS);
 2504                 if (status & AR5K_AR5211_EEPROM_STAT_WRDONE) {
 2505                         if (status & AR5K_AR5211_EEPROM_STAT_WRERR)
 2506                                 return (EIO);
 2507                         return (0);
 2508                 }
 2509         }
 2510 
 2511         return (ETIMEDOUT);
 2512 }
 2513 
 2514 /*
 2515  * RF register settings
 2516  */
 2517 
 2518 void
 2519 ar5k_ar5211_rfregs(struct ath_hal *hal, HAL_CHANNEL *channel, u_int freq,
 2520     u_int ee_mode)
 2521 {
 2522         struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;
 2523         struct ar5k_ar5211_ini_rf rf[AR5K_ELEMENTS(ar5211_rf)];
 2524         u_int32_t ob, db, obdb, xpds, xpdp, x_gain;
 2525         u_int i;
 2526 
 2527         bcopy(ar5211_rf, rf, sizeof(rf));
 2528         obdb = 0;
 2529 
 2530         if (freq == AR5K_INI_RFGAIN_2GHZ &&
 2531             hal->ah_ee_version >= AR5K_EEPROM_VERSION_3_1) {
 2532                 ob = ar5k_bitswap(ee->ee_ob[ee_mode][0], 3);
 2533                 db = ar5k_bitswap(ee->ee_db[ee_mode][0], 3);
 2534                 rf[25].rf_value[freq] =
 2535                     ((ob << 6) & 0xc0) | (rf[25].rf_value[freq] & ~0xc0);
 2536                 rf[26].rf_value[freq] =
 2537                     (((ob >> 2) & 0x1) | ((db << 1) & 0xe)) |
 2538                     (rf[26].rf_value[freq] & ~0xf);
 2539         }
 2540 
 2541         if (freq == AR5K_INI_RFGAIN_5GHZ) {
 2542                 /* For 11a and Turbo */
 2543                 obdb = channel->c_channel >= 5725 ? 3 :
 2544                     (channel->c_channel >= 5500 ? 2 :
 2545                         (channel->c_channel >= 5260 ? 1 :
 2546                             (channel->c_channel > 4000 ? 0 : -1)));
 2547         }
 2548 
 2549         ob = ee->ee_ob[ee_mode][obdb];
 2550         db = ee->ee_db[ee_mode][obdb];
 2551         x_gain = ee->ee_x_gain[ee_mode];
 2552         xpds = ee->ee_xpd[ee_mode];
 2553         xpdp = !xpds;
 2554 
 2555         rf[11].rf_value[freq] = (rf[11].rf_value[freq] & ~0xc0) |
 2556                 (((ar5k_bitswap(x_gain, 4) << 7) | (xpdp << 6)) & 0xc0);
 2557         rf[12].rf_value[freq] = (rf[12].rf_value[freq] & ~0x7) |
 2558                 ((ar5k_bitswap(x_gain, 4) >> 1) & 0x7);
 2559         rf[12].rf_value[freq] = (rf[12].rf_value[freq] & ~0x80) |
 2560                 ((ar5k_bitswap(ob, 3) << 7) & 0x80);
 2561         rf[13].rf_value[freq] = (rf[13].rf_value[freq] & ~0x3) |
 2562                 ((ar5k_bitswap(ob, 3) >> 1) & 0x3);
 2563         rf[13].rf_value[freq] = (rf[13].rf_value[freq] & ~0x1c) |
 2564                 ((ar5k_bitswap(db, 3) << 2) & 0x1c);
 2565         rf[17].rf_value[freq] = (rf[17].rf_value[freq] & ~0x8) |
 2566                 ((xpds << 3) & 0x8);
 2567 
 2568         for (i = 0; i < AR5K_ELEMENTS(rf); i++) {
 2569                 AR5K_REG_WAIT(i);
 2570                 AR5K_REG_WRITE((u_int32_t)rf[i].rf_register,
 2571                     rf[i].rf_value[freq]);
 2572         }
 2573 
 2574         hal->ah_rf_gain = HAL_RFGAIN_INACTIVE;
 2575 }
 2576 
 2577 HAL_BOOL
 2578 ar5k_ar5211_set_txpower_limit(struct ath_hal *hal, u_int power)
 2579 {
 2580         /* Not implemented */
 2581         return (AH_FALSE);
 2582 }

/* [<][>][^][v][top][bottom][index][help] */