Path: blob/main/sys/dev/ath/ath_hal/ar5212/ar5212_phy.c
39566 views
/*-1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting4* Copyright (c) 2002-2008 Atheros Communications, Inc.5*6* Permission to use, copy, modify, and/or distribute this software for any7* purpose with or without fee is hereby granted, provided that the above8* copyright notice and this permission notice appear in all copies.9*10* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES11* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF12* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR13* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES14* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN15* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF16* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.17*/18#include "opt_ah.h"1920#include "ah.h"21#include "ah_internal.h"2223#include "ar5212/ar5212.h"2425/* shorthands to compact tables for readability */26#define OFDM IEEE80211_T_OFDM27#define CCK IEEE80211_T_CCK28#define TURBO IEEE80211_T_TURBO29#define HALF IEEE80211_T_OFDM_HALF30#define QUART IEEE80211_T_OFDM_QUARTER3132HAL_RATE_TABLE ar5212_11a_table = {338, /* number of rates */34{ 0 },35{36/* short ctrl */37/* valid rateCode Preamble dot11Rate Rate */38/* 6 Mb */ { AH_TRUE, OFDM, 6000, 0x0b, 0x00, (0x80|12), 0 },39/* 9 Mb */ { AH_TRUE, OFDM, 9000, 0x0f, 0x00, 18, 0 },40/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, (0x80|24), 2 },41/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 2 },42/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, (0x80|48), 4 },43/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 4 },44/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 4 },45/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 4 }46},47};4849HAL_RATE_TABLE ar5212_half_table = {508, /* number of rates */51{ 0 },52{53/* short ctrl */54/* valid rateCode Preamble dot11Rate Rate */55/* 3 Mb */ { AH_TRUE, HALF, 3000, 0x0b, 0x00, (0x80|6), 0 },56/* 4.5 Mb */ { AH_TRUE, HALF, 4500, 0x0f, 0x00, 9, 0 },57/* 6 Mb */ { AH_TRUE, HALF, 6000, 0x0a, 0x00, (0x80|12), 2 },58/* 9 Mb */ { AH_TRUE, HALF, 9000, 0x0e, 0x00, 18, 2 },59/* 12 Mb */ { AH_TRUE, HALF, 12000, 0x09, 0x00, (0x80|24), 4 },60/* 18 Mb */ { AH_TRUE, HALF, 18000, 0x0d, 0x00, 36, 4 },61/* 24 Mb */ { AH_TRUE, HALF, 24000, 0x08, 0x00, 48, 4 },62/* 27 Mb */ { AH_TRUE, HALF, 27000, 0x0c, 0x00, 54, 4 }63},64};6566HAL_RATE_TABLE ar5212_quarter_table = {678, /* number of rates */68{ 0 },69{70/* short ctrl */71/* valid rateCode Preamble dot11Rate Rate */72/* 1.5 Mb */ { AH_TRUE, QUART, 1500, 0x0b, 0x00, (0x80|3), 0 },73/* 2 Mb */ { AH_TRUE, QUART, 2250, 0x0f, 0x00, 4, 0 },74/* 3 Mb */ { AH_TRUE, QUART, 3000, 0x0a, 0x00, (0x80|6), 2 },75/* 4.5 Mb */ { AH_TRUE, QUART, 4500, 0x0e, 0x00, 9, 2 },76/* 6 Mb */ { AH_TRUE, QUART, 6000, 0x09, 0x00, (0x80|12), 4 },77/* 9 Mb */ { AH_TRUE, QUART, 9000, 0x0d, 0x00, 18, 4 },78/* 12 Mb */ { AH_TRUE, QUART, 12000, 0x08, 0x00, 24, 4 },79/*13.5 Mb */ { AH_TRUE, QUART, 13500, 0x0c, 0x00, 27, 4 }80},81};8283HAL_RATE_TABLE ar5212_turbog_table = {847, /* number of rates */85{ 0 },86{87/* short ctrl */88/* valid rateCode Preamble dot11Rate Rate */89/* 6 Mb */ { AH_TRUE, TURBO, 12000, 0x0b, 0x00, (0x80|12), 0 },90/* 12 Mb */ { AH_TRUE, TURBO, 24000, 0x0a, 0x00, (0x80|24), 1 },91/* 18 Mb */ { AH_TRUE, TURBO, 36000, 0x0e, 0x00, 36, 1 },92/* 24 Mb */ { AH_TRUE, TURBO, 48000, 0x09, 0x00, (0x80|48), 2 },93/* 36 Mb */ { AH_TRUE, TURBO, 72000, 0x0d, 0x00, 72, 2 },94/* 48 Mb */ { AH_TRUE, TURBO, 96000, 0x08, 0x00, 96, 2 },95/* 54 Mb */ { AH_TRUE, TURBO, 108000, 0x0c, 0x00, 108, 2 }96},97};9899HAL_RATE_TABLE ar5212_turboa_table = {1008, /* number of rates */101{ 0 },102{103/* short ctrl */104/* valid rateCode Preamble dot11Rate Rate */105/* 6 Mb */ { AH_TRUE, TURBO, 12000, 0x0b, 0x00, (0x80|12), 0 },106/* 9 Mb */ { AH_TRUE, TURBO, 18000, 0x0f, 0x00, 18, 0 },107/* 12 Mb */ { AH_TRUE, TURBO, 24000, 0x0a, 0x00, (0x80|24), 2 },108/* 18 Mb */ { AH_TRUE, TURBO, 36000, 0x0e, 0x00, 36, 2 },109/* 24 Mb */ { AH_TRUE, TURBO, 48000, 0x09, 0x00, (0x80|48), 4 },110/* 36 Mb */ { AH_TRUE, TURBO, 72000, 0x0d, 0x00, 72, 4 },111/* 48 Mb */ { AH_TRUE, TURBO, 96000, 0x08, 0x00, 96, 4 },112/* 54 Mb */ { AH_TRUE, TURBO, 108000, 0x0c, 0x00, 108, 4 }113},114};115116HAL_RATE_TABLE ar5212_11b_table = {1174, /* number of rates */118{ 0 },119{120/* short ctrl */121/* valid rateCode Preamble dot11Rate Rate */122/* 1 Mb */ { AH_TRUE, CCK, 1000, 0x1b, 0x00, (0x80| 2), 0 },123/* 2 Mb */ { AH_TRUE, CCK, 2000, 0x1a, 0x04, (0x80| 4), 1 },124/* 5.5 Mb */ { AH_TRUE, CCK, 5500, 0x19, 0x04, (0x80|11), 1 },125/* 11 Mb */ { AH_TRUE, CCK, 11000, 0x18, 0x04, (0x80|22), 1 }126},127};128129/* Venice TODO: roundUpRate() is broken when the rate table does not represent rates130* in increasing order e.g. 5.5, 11, 6, 9.131* An average rate of 6 Mbps will currently map to 11 Mbps.132*/133HAL_RATE_TABLE ar5212_11g_table = {13412, /* number of rates */135{ 0 },136{137/* short ctrl */138/* valid rateCode Preamble dot11Rate Rate */139/* 1 Mb */ { AH_TRUE, CCK, 1000, 0x1b, 0x00, (0x80| 2), 0 },140/* 2 Mb */ { AH_TRUE, CCK, 2000, 0x1a, 0x04, (0x80| 4), 1 },141/* 5.5 Mb */ { AH_TRUE, CCK, 5500, 0x19, 0x04, (0x80|11), 2 },142/* 11 Mb */ { AH_TRUE, CCK, 11000, 0x18, 0x04, (0x80|22), 3 },143/* remove rates 6, 9 from rate ctrl */144/* 6 Mb */ { AH_FALSE, OFDM, 6000, 0x0b, 0x00, 12, 4 },145/* 9 Mb */ { AH_FALSE, OFDM, 9000, 0x0f, 0x00, 18, 4 },146/* 12 Mb */ { AH_TRUE, OFDM, 12000, 0x0a, 0x00, 24, 6 },147/* 18 Mb */ { AH_TRUE, OFDM, 18000, 0x0e, 0x00, 36, 6 },148/* 24 Mb */ { AH_TRUE, OFDM, 24000, 0x09, 0x00, 48, 8 },149/* 36 Mb */ { AH_TRUE, OFDM, 36000, 0x0d, 0x00, 72, 8 },150/* 48 Mb */ { AH_TRUE, OFDM, 48000, 0x08, 0x00, 96, 8 },151/* 54 Mb */ { AH_TRUE, OFDM, 54000, 0x0c, 0x00, 108, 8 }152},153};154155#undef OFDM156#undef CCK157#undef TURBO158#undef XR159160const HAL_RATE_TABLE *161ar5212GetRateTable(struct ath_hal *ah, u_int mode)162{163HAL_RATE_TABLE *rt;164switch (mode) {165case HAL_MODE_11A:166rt = &ar5212_11a_table;167break;168case HAL_MODE_11B:169rt = &ar5212_11b_table;170break;171case HAL_MODE_11G:172#ifdef notdef173case HAL_MODE_PUREG:174#endif175rt = &ar5212_11g_table;176break;177case HAL_MODE_108A:178case HAL_MODE_TURBO:179rt = &ar5212_turboa_table;180break;181case HAL_MODE_108G:182rt = &ar5212_turbog_table;183break;184case HAL_MODE_11A_HALF_RATE:185case HAL_MODE_11G_HALF_RATE:186rt = &ar5212_half_table;187break;188case HAL_MODE_11A_QUARTER_RATE:189case HAL_MODE_11G_QUARTER_RATE:190rt = &ar5212_quarter_table;191break;192default:193HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid mode 0x%x\n",194__func__, mode);195return AH_NULL;196}197ath_hal_setupratetable(ah, rt);198return rt;199}200201202