ar5416_phy.c revision 296373
150476Speter/* 21987Swollman * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting 31987Swollman * Copyright (c) 2002-2008 Atheros Communications, Inc. 41987Swollman * 5156813Sru * Permission to use, copy, modify, and/or distribute this software for any 6156813Sru * purpose with or without fee is hereby granted, provided that the above 7100346Sru * copyright notice and this permission notice appear in all copies. 8100346Sru * 9100346Sru * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10100346Sru * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11100346Sru * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12100346Sru * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13100346Sru * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14100346Sru * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15100346Sru * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16100346Sru * 17100346Sru * $FreeBSD: releng/10.3/sys/dev/ath/ath_hal/ar5416/ar5416_phy.c 218908 2011-02-21 05:10:34Z adrian $ 18100346Sru */ 19100346Sru#include "opt_ah.h" 20100346Sru 21100346Sru#include "ah.h" 22100346Sru#include "ah_internal.h" 23100346Sru 24100346Sru#include "ar5416/ar5416.h" 25100346Sru 26100346Sru/* shorthands to compact tables for readability */ 27100346Sru#define OFDM IEEE80211_T_OFDM 28100346Sru#define CCK IEEE80211_T_CCK 29100346Sru#define HT IEEE80211_T_HT 30100346Sru 31100346SruHAL_RATE_TABLE ar5416_11ng_table = { 32100346Sru 28, /* number of rates */ 33100346Sru { 0 }, 34100346Sru { 35100346Sru/* short ctrl */ 36132211Sscottl/* valid rateCode Preamble dot11Rate Rate */ 374257Sphk/* 1 Mb */ { AH_TRUE, CCK, 1000, 0x1b, 0x00, (0x80| 2), 0 }, 38100346Sru/* 2 Mb */ { AH_TRUE, CCK, 2000, 0x1a, 0x04, (0x80| 4), 1 }, 39100346Sru/* 5.5 Mb */ { AH_TRUE, CCK, 5500, 0x19, 0x04, (0x80|11), 2 }, 40100346Sru/* 11 Mb */ { AH_TRUE, CCK, 11000, 0x18, 0x04, (0x80|22), 3 }, 41100346Sru/* Remove rates 6, 9 from rate ctrl */ 42100346Sru/* 6 Mb */ { AH_FALSE, OFDM, 6000, 0x0b, 0x00, 12, 4 }, 43100346Sru/* 9 Mb */ { AH_FALSE, OFDM, 9000, 0x0f, 0x00, 18, 4 }, 44100346Sru/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, 24, 6 }, 45100346Sru/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 6 }, 46100346Sru/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, 48, 8 }, 47100346Sru/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 8 }, 48100346Sru/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 8 }, 49100346Sru/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 8 }, 50100346Sru/* 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 8 }, 51100346Sru/* 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 8 }, 52100346Sru/*19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 8 }, 53100346Sru/* 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 8 }, 54100346Sru/* 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 8 }, 55100346Sru/* 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 8 }, 56100346Sru/*58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 8 }, 57100346Sru/* 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 8 }, 58100346Sru/* 13 Mb */ { AH_TRUE, HT, 13000, 0x88, 0x00, 8, 8 }, 59100346Sru/* 26 Mb */ { AH_TRUE, HT, 26000, 0x89, 0x00, 9, 8 }, 60100346Sru/* 39 Mb */ { AH_TRUE, HT, 39000, 0x8a, 0x00, 10, 8 }, 61100346Sru/* 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 8 }, 62100346Sru/* 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 8 }, 63100346Sru/* 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 8 }, 64100346Sru/* 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 8 }, 65100346Sru/* 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 8 }, 66100346Sru }, 67100346Sru}; 68100346Sru 69100346Srustatic HAL_RATE_TABLE ar5416_11na_table = { 70100346Sru 24, /* number of rates */ 71100346Sru { 0 }, 72100346Sru { 73100346Sru/* short ctrl */ 74100346Sru/* valid rateCode Preamble dot11Rate Rate */ 75100346Sru/* 6 Mb */ { AH_TRUE, OFDM, 6000, 0x0b, 0x00, (0x80|12), 0 }, 76100346Sru/* 9 Mb */ { AH_TRUE, OFDM, 9000, 0x0f, 0x00, 18, 0 }, 77100346Sru/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, (0x80|24), 2 }, 78100346Sru/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 2 }, 79100346Sru/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, (0x80|48), 4 }, 80100346Sru/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 4 }, 81100346Sru/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 4 }, 82100346Sru/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 4 }, 83100346Sru/* 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 4 }, 84100346Sru/* 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 4 }, 85100346Sru/*19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 4 }, 86100346Sru/* 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 4 }, 87100346Sru/* 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 4 }, 88100346Sru/* 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 4 }, 89100346Sru/*58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 4 }, 90100346Sru/* 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 4 }, 91100346Sru/* 13 Mb */ { AH_TRUE, HT, 13000, 0x88, 0x00, 8, 4 }, 92100346Sru/* 26 Mb */ { AH_TRUE, HT, 26000, 0x89, 0x00, 9, 4 }, 93100346Sru/* 39 Mb */ { AH_TRUE, HT, 39000, 0x8a, 0x00, 10, 4 }, 94100346Sru/* 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 4 }, 95100346Sru/* 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 4 }, 96100346Sru/* 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 4 }, 97100346Sru/* 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 4 }, 98100346Sru/* 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 4 }, 99100346Sru }, 100100346Sru}; 101100346Sru 102100346Sru#undef OFDM 103100346Sru#undef CCK 104100346Sru#undef HT 105100346Sru 106100346Sruconst HAL_RATE_TABLE * 107100346Sruar5416GetRateTable(struct ath_hal *ah, u_int mode) 108100346Sru{ 109100346Sru HAL_RATE_TABLE *rt; 110100346Sru switch (mode) { 111100346Sru case HAL_MODE_11NG_HT20: 112100346Sru case HAL_MODE_11NG_HT40PLUS: 113100346Sru case HAL_MODE_11NG_HT40MINUS: 114100346Sru rt = &ar5416_11ng_table; 115100346Sru break; 116100346Sru case HAL_MODE_11NA_HT20: 117100346Sru case HAL_MODE_11NA_HT40PLUS: 118100346Sru case HAL_MODE_11NA_HT40MINUS: 119100346Sru rt = &ar5416_11na_table; 120100346Sru break; 121100346Sru default: 122100346Sru return ar5212GetRateTable(ah, mode); 123100346Sru } 124100346Sru ath_hal_setupratetable(ah, rt); 125100346Sru return rt; 126100346Sru} 127100346Sru