Jules Irenge | 5af3304 | 2019-03-13 14:53:19 +0000 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0 |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 2 | /****************************************************************************** |
| 3 | * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved. |
| 4 | * |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 5 | * Contact Information: |
| 6 | * wlanfae <wlanfae@realtek.com> |
Yamanappagouda Patil | 839396f | 2016-11-15 13:54:53 +0530 | [diff] [blame] | 7 | ******************************************************************************/ |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 8 | #include "dot11d.h" |
| 9 | |
| 10 | struct channel_list { |
Himadri Pandya | 5f98ddc | 2019-01-01 06:43:19 -0800 | [diff] [blame] | 11 | u8 channel[32]; |
Himadri Pandya | 7575215 | 2019-01-12 22:21:49 -0800 | [diff] [blame] | 12 | u8 len; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 13 | }; |
| 14 | |
Himadri Pandya | 3262af0 | 2019-01-12 22:21:48 -0800 | [diff] [blame] | 15 | static struct channel_list channel_array[] = { |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 16 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, |
| 17 | 149, 153, 157, 161, 165}, 24}, |
| 18 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 11}, |
| 19 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, |
| 20 | 60, 64}, 21}, |
| 21 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, |
| 22 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, |
| 23 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, |
| 24 | 56, 60, 64}, 22}, |
| 25 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, |
| 26 | 56, 60, 64}, 22}, |
| 27 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, |
| 28 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, |
| 29 | 56, 60, 64}, 22}, |
| 30 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, |
| 31 | 56, 60, 64}, 22}, |
| 32 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14}, |
| 33 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, |
| 34 | {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, |
| 35 | 56, 60, 64}, 21} |
| 36 | }; |
| 37 | |
Sean MacLennan | 976d534 | 2011-11-30 15:18:52 -0500 | [diff] [blame] | 38 | void dot11d_init(struct rtllib_device *ieee) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 39 | { |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 40 | struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee); |
Matthew Casey | 3a6b70c | 2014-08-22 06:27:52 -0400 | [diff] [blame] | 41 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 42 | dot11d_info->enabled = false; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 43 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 44 | dot11d_info->state = DOT11D_STATE_NONE; |
| 45 | dot11d_info->country_len = 0; |
| 46 | memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1); |
| 47 | memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 48 | RESET_CIE_WATCHDOG(ieee); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 49 | } |
Sean MacLennan | 976d534 | 2011-11-30 15:18:52 -0500 | [diff] [blame] | 50 | EXPORT_SYMBOL(dot11d_init); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 51 | |
Himadri Pandya | 30c311a | 2019-02-10 14:13:13 +0530 | [diff] [blame] | 52 | void dot11d_channel_map(u8 channel_plan, struct rtllib_device *ieee) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 53 | { |
| 54 | int i, max_chan = 14, min_chan = 1; |
| 55 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 56 | ieee->global_domain = false; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 57 | |
Himadri Pandya | 7575215 | 2019-01-12 22:21:49 -0800 | [diff] [blame] | 58 | if (channel_array[channel_plan].len != 0) { |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 59 | memset(GET_DOT11D_INFO(ieee)->channel_map, 0, |
| 60 | sizeof(GET_DOT11D_INFO(ieee)->channel_map)); |
Himadri Pandya | 7575215 | 2019-01-12 22:21:49 -0800 | [diff] [blame] | 61 | for (i = 0; i < channel_array[channel_plan].len; i++) { |
Himadri Pandya | 3262af0 | 2019-01-12 22:21:48 -0800 | [diff] [blame] | 62 | if (channel_array[channel_plan].channel[i] < min_chan || |
| 63 | channel_array[channel_plan].channel[i] > max_chan) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 64 | break; |
Himadri Pandya | 3262af0 | 2019-01-12 22:21:48 -0800 | [diff] [blame] | 65 | GET_DOT11D_INFO(ieee)->channel_map[channel_array |
Himadri Pandya | 5f98ddc | 2019-01-01 06:43:19 -0800 | [diff] [blame] | 66 | [channel_plan].channel[i]] = 1; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 67 | } |
| 68 | } |
| 69 | |
| 70 | switch (channel_plan) { |
| 71 | case COUNTRY_CODE_GLOBAL_DOMAIN: |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 72 | ieee->global_domain = true; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 73 | for (i = 12; i <= 14; i++) |
| 74 | GET_DOT11D_INFO(ieee)->channel_map[i] = 2; |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 75 | ieee->bss_start_channel = 10; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 76 | ieee->ibss_maxjoin_chal = 11; |
| 77 | break; |
| 78 | |
| 79 | case COUNTRY_CODE_WORLD_WIDE_13: |
| 80 | for (i = 12; i <= 13; i++) |
| 81 | GET_DOT11D_INFO(ieee)->channel_map[i] = 2; |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 82 | ieee->bss_start_channel = 10; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 83 | ieee->ibss_maxjoin_chal = 11; |
| 84 | break; |
| 85 | |
| 86 | default: |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 87 | ieee->bss_start_channel = 1; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 88 | ieee->ibss_maxjoin_chal = 14; |
| 89 | break; |
| 90 | } |
| 91 | } |
Himadri Pandya | 30c311a | 2019-02-10 14:13:13 +0530 | [diff] [blame] | 92 | EXPORT_SYMBOL(dot11d_channel_map); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 93 | |
Himadri Pandya | 8e9f5da | 2019-02-10 14:13:14 +0530 | [diff] [blame] | 94 | void dot11d_reset(struct rtllib_device *ieee) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 95 | { |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 96 | struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 97 | u32 i; |
| 98 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 99 | memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1); |
| 100 | memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 101 | for (i = 1; i <= 11; i++) |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 102 | (dot11d_info->channel_map)[i] = 1; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 103 | for (i = 12; i <= 14; i++) |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 104 | (dot11d_info->channel_map)[i] = 2; |
| 105 | dot11d_info->state = DOT11D_STATE_NONE; |
| 106 | dot11d_info->country_len = 0; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 107 | RESET_CIE_WATCHDOG(ieee); |
| 108 | } |
| 109 | |
Himadri Pandya | 7ed27a0 | 2019-02-10 14:13:18 +0530 | [diff] [blame] | 110 | void dot11d_update_country(struct rtllib_device *dev, u8 *address, |
| 111 | u16 country_len, u8 *country) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 112 | { |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 113 | struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(dev); |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 114 | u8 i, j, number_of_triples, max_channel_number; |
| 115 | struct chnl_txpow_triple *triple; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 116 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 117 | memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1); |
| 118 | memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1); |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 119 | max_channel_number = 0; |
Himadri Pandya | 7ed27a0 | 2019-02-10 14:13:18 +0530 | [diff] [blame] | 120 | number_of_triples = (country_len - 3) / 3; |
| 121 | triple = (struct chnl_txpow_triple *)(country + 3); |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 122 | for (i = 0; i < number_of_triples; i++) { |
| 123 | if (max_channel_number >= triple->first_channel) { |
Mihaela Muraru | c476b2e | 2017-10-14 23:23:28 +0300 | [diff] [blame] | 124 | netdev_info(dev->dev, |
| 125 | "%s: Invalid country IE, skip it......1\n", |
| 126 | __func__); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 127 | return; |
| 128 | } |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 129 | if (MAX_CHANNEL_NUMBER < (triple->first_channel + |
| 130 | triple->num_channels)) { |
Mihaela Muraru | c476b2e | 2017-10-14 23:23:28 +0300 | [diff] [blame] | 131 | netdev_info(dev->dev, |
| 132 | "%s: Invalid country IE, skip it......2\n", |
| 133 | __func__); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 134 | return; |
| 135 | } |
| 136 | |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 137 | for (j = 0; j < triple->num_channels; j++) { |
| 138 | dot11d_info->channel_map[triple->first_channel + j] = 1; |
| 139 | dot11d_info->max_tx_power_list[triple->first_channel + j] = |
| 140 | triple->max_tx_power; |
| 141 | max_channel_number = triple->first_channel + j; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 142 | } |
| 143 | |
Himadri Pandya | 5441ab2 | 2019-02-10 14:13:17 +0530 | [diff] [blame] | 144 | triple = (struct chnl_txpow_triple *)((u8 *)triple + 3); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 145 | } |
| 146 | |
Himadri Pandya | 7ed27a0 | 2019-02-10 14:13:18 +0530 | [diff] [blame] | 147 | UPDATE_CIE_SRC(dev, address); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 148 | |
Himadri Pandya | 7ed27a0 | 2019-02-10 14:13:18 +0530 | [diff] [blame] | 149 | dot11d_info->country_len = country_len; |
| 150 | memcpy(dot11d_info->country_buffer, country, country_len); |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 151 | dot11d_info->state = DOT11D_STATE_LEARNED; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 152 | } |
| 153 | |
Himadri Pandya | c40cac3b | 2019-02-10 14:13:16 +0530 | [diff] [blame] | 154 | void dot11d_scan_complete(struct rtllib_device *dev) |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 155 | { |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 156 | struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(dev); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 157 | |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 158 | switch (dot11d_info->state) { |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 159 | case DOT11D_STATE_LEARNED: |
Himadri Pandya | a180ef3 | 2019-02-06 21:04:16 +0530 | [diff] [blame] | 160 | dot11d_info->state = DOT11D_STATE_DONE; |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 161 | break; |
| 162 | case DOT11D_STATE_DONE: |
Himadri Pandya | 8e9f5da | 2019-02-10 14:13:14 +0530 | [diff] [blame] | 163 | dot11d_reset(dev); |
Larry Finger | 94a7994 | 2011-08-23 19:00:42 -0500 | [diff] [blame] | 164 | break; |
| 165 | case DOT11D_STATE_NONE: |
| 166 | break; |
| 167 | } |
| 168 | } |