1185377Ssam/* 2185377Ssam * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting 3185377Ssam * Copyright (c) 2002-2008 Atheros Communications, Inc. 4185377Ssam * 5185377Ssam * Permission to use, copy, modify, and/or distribute this software for any 6185377Ssam * purpose with or without fee is hereby granted, provided that the above 7185377Ssam * copyright notice and this permission notice appear in all copies. 8185377Ssam * 9185377Ssam * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10185377Ssam * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11185377Ssam * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12185377Ssam * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13185377Ssam * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14185377Ssam * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15185377Ssam * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16185377Ssam * 17203158Srpaulo * $FreeBSD$ 18185377Ssam */ 19185377Ssam#include "opt_ah.h" 20185377Ssam 21185377Ssam#include "ah.h" 22185377Ssam#include "ah_internal.h" 23185377Ssam 24185377Ssam#include "ar5416/ar5416.h" 25185377Ssam 26185377Ssam/* shorthands to compact tables for readability */ 27185377Ssam#define OFDM IEEE80211_T_OFDM 28185377Ssam#define CCK IEEE80211_T_CCK 29185377Ssam#define HT IEEE80211_T_HT 30185377Ssam 31185377SsamHAL_RATE_TABLE ar5416_11ng_table = { 32185377Ssam 28, /* number of rates */ 33185377Ssam { 0 }, 34185377Ssam { 35185377Ssam/* short ctrl */ 36185377Ssam/* valid rateCode Preamble dot11Rate Rate */ 37185377Ssam/* 1 Mb */ { AH_TRUE, CCK, 1000, 0x1b, 0x00, (0x80| 2), 0 }, 38185377Ssam/* 2 Mb */ { AH_TRUE, CCK, 2000, 0x1a, 0x04, (0x80| 4), 1 }, 39185377Ssam/* 5.5 Mb */ { AH_TRUE, CCK, 5500, 0x19, 0x04, (0x80|11), 2 }, 40185377Ssam/* 11 Mb */ { AH_TRUE, CCK, 11000, 0x18, 0x04, (0x80|22), 3 }, 41185380Ssam/* Remove rates 6, 9 from rate ctrl */ 42185377Ssam/* 6 Mb */ { AH_FALSE, OFDM, 6000, 0x0b, 0x00, 12, 4 }, 43185377Ssam/* 9 Mb */ { AH_FALSE, OFDM, 9000, 0x0f, 0x00, 18, 4 }, 44185377Ssam/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, 24, 6 }, 45185377Ssam/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 6 }, 46185377Ssam/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, 48, 8 }, 47185377Ssam/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 8 }, 48185377Ssam/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 8 }, 49185377Ssam/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 8 }, 50185377Ssam/* 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 8 }, 51185377Ssam/* 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 8 }, 52185377Ssam/*19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 8 }, 53185377Ssam/* 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 8 }, 54185377Ssam/* 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 8 }, 55185377Ssam/* 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 8 }, 56185377Ssam/*58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 8 }, 57185377Ssam/* 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 8 }, 58185377Ssam/* 13 Mb */ { AH_TRUE, HT, 13000, 0x88, 0x00, 8, 8 }, 59185377Ssam/* 26 Mb */ { AH_TRUE, HT, 26000, 0x89, 0x00, 9, 8 }, 60185377Ssam/* 39 Mb */ { AH_TRUE, HT, 39000, 0x8a, 0x00, 10, 8 }, 61185377Ssam/* 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 8 }, 62185377Ssam/* 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 8 }, 63185377Ssam/* 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 8 }, 64185377Ssam/* 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 8 }, 65185377Ssam/* 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 8 }, 66185377Ssam }, 67185377Ssam}; 68185377Ssam 69185377Ssamstatic HAL_RATE_TABLE ar5416_11na_table = { 70185377Ssam 24, /* number of rates */ 71185377Ssam { 0 }, 72185377Ssam { 73185377Ssam/* short ctrl */ 74185377Ssam/* valid rateCode Preamble dot11Rate Rate */ 75185377Ssam/* 6 Mb */ { AH_TRUE, OFDM, 6000, 0x0b, 0x00, (0x80|12), 0 }, 76185377Ssam/* 9 Mb */ { AH_TRUE, OFDM, 9000, 0x0f, 0x00, 18, 0 }, 77185377Ssam/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, (0x80|24), 2 }, 78185377Ssam/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 2 }, 79185377Ssam/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, (0x80|48), 4 }, 80218908Sadrian/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 4 }, 81218908Sadrian/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 4 }, 82218908Sadrian/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 4 }, 83218908Sadrian/* 6.5 Mb */ { AH_TRUE, HT, 6500, 0x80, 0x00, 0, 4 }, 84218908Sadrian/* 13 Mb */ { AH_TRUE, HT, 13000, 0x81, 0x00, 1, 4 }, 85218908Sadrian/*19.5 Mb */ { AH_TRUE, HT, 19500, 0x82, 0x00, 2, 4 }, 86218908Sadrian/* 26 Mb */ { AH_TRUE, HT, 26000, 0x83, 0x00, 3, 4 }, 87218908Sadrian/* 39 Mb */ { AH_TRUE, HT, 39000, 0x84, 0x00, 4, 4 }, 88218908Sadrian/* 52 Mb */ { AH_TRUE, HT, 52000, 0x85, 0x00, 5, 4 }, 89218908Sadrian/*58.5 Mb */ { AH_TRUE, HT, 58500, 0x86, 0x00, 6, 4 }, 90218908Sadrian/* 65 Mb */ { AH_TRUE, HT, 65000, 0x87, 0x00, 7, 4 }, 91218908Sadrian/* 13 Mb */ { AH_TRUE, HT, 13000, 0x88, 0x00, 8, 4 }, 92218908Sadrian/* 26 Mb */ { AH_TRUE, HT, 26000, 0x89, 0x00, 9, 4 }, 93218908Sadrian/* 39 Mb */ { AH_TRUE, HT, 39000, 0x8a, 0x00, 10, 4 }, 94218908Sadrian/* 52 Mb */ { AH_TRUE, HT, 52000, 0x8b, 0x00, 11, 4 }, 95218908Sadrian/* 78 Mb */ { AH_TRUE, HT, 78000, 0x8c, 0x00, 12, 4 }, 96218908Sadrian/* 104 Mb */ { AH_TRUE, HT, 104000, 0x8d, 0x00, 13, 4 }, 97218908Sadrian/* 117 Mb */ { AH_TRUE, HT, 117000, 0x8e, 0x00, 14, 4 }, 98218908Sadrian/* 130 Mb */ { AH_TRUE, HT, 130000, 0x8f, 0x00, 15, 4 }, 99185377Ssam }, 100185377Ssam}; 101185377Ssam 102185377Ssam#undef OFDM 103185377Ssam#undef CCK 104185377Ssam#undef HT 105185377Ssam 106185377Ssamconst HAL_RATE_TABLE * 107185377Ssamar5416GetRateTable(struct ath_hal *ah, u_int mode) 108185377Ssam{ 109185377Ssam HAL_RATE_TABLE *rt; 110185377Ssam switch (mode) { 111185377Ssam case HAL_MODE_11NG_HT20: 112185377Ssam case HAL_MODE_11NG_HT40PLUS: 113185377Ssam case HAL_MODE_11NG_HT40MINUS: 114185377Ssam rt = &ar5416_11ng_table; 115185377Ssam break; 116185377Ssam case HAL_MODE_11NA_HT20: 117185377Ssam case HAL_MODE_11NA_HT40PLUS: 118185377Ssam case HAL_MODE_11NA_HT40MINUS: 119185377Ssam rt = &ar5416_11na_table; 120185377Ssam break; 121185377Ssam default: 122185377Ssam return ar5212GetRateTable(ah, mode); 123185377Ssam } 124185377Ssam ath_hal_setupratetable(ah, rt); 125185377Ssam return rt; 126185377Ssam} 127