|
@@ -1816,6 +1816,36 @@ static struct ieee80211_channel wl1271_channels[] = {
|
|
|
{ .hw_value = 13, .center_freq = 2472, .max_power = 25 },
|
|
|
};
|
|
|
|
|
|
+/* mapping to indexes for wl1271_rates */
|
|
|
+const static u8 wl1271_rate_to_idx_2ghz[] = {
|
|
|
+ /* MCS rates are used only with 11n */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */
|
|
|
+
|
|
|
+ 11, /* CONF_HW_RXTX_RATE_54 */
|
|
|
+ 10, /* CONF_HW_RXTX_RATE_48 */
|
|
|
+ 9, /* CONF_HW_RXTX_RATE_36 */
|
|
|
+ 8, /* CONF_HW_RXTX_RATE_24 */
|
|
|
+
|
|
|
+ /* TI-specific rate */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
|
|
|
+
|
|
|
+ 7, /* CONF_HW_RXTX_RATE_18 */
|
|
|
+ 6, /* CONF_HW_RXTX_RATE_12 */
|
|
|
+ 3, /* CONF_HW_RXTX_RATE_11 */
|
|
|
+ 5, /* CONF_HW_RXTX_RATE_9 */
|
|
|
+ 4, /* CONF_HW_RXTX_RATE_6 */
|
|
|
+ 2, /* CONF_HW_RXTX_RATE_5_5 */
|
|
|
+ 1, /* CONF_HW_RXTX_RATE_2 */
|
|
|
+ 0 /* CONF_HW_RXTX_RATE_1 */
|
|
|
+};
|
|
|
+
|
|
|
/* can't be const, mac80211 writes to this */
|
|
|
static struct ieee80211_supported_band wl1271_band_2ghz = {
|
|
|
.channels = wl1271_channels,
|
|
@@ -1898,6 +1928,35 @@ static struct ieee80211_channel wl1271_channels_5ghz[] = {
|
|
|
{ .hw_value = 165, .center_freq = 5825},
|
|
|
};
|
|
|
|
|
|
+/* mapping to indexes for wl1271_rates_5ghz */
|
|
|
+const static u8 wl1271_rate_to_idx_5ghz[] = {
|
|
|
+ /* MCS rates are used only with 11n */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS7 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS6 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS5 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS4 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS3 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS2 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS1 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_MCS0 */
|
|
|
+
|
|
|
+ 7, /* CONF_HW_RXTX_RATE_54 */
|
|
|
+ 6, /* CONF_HW_RXTX_RATE_48 */
|
|
|
+ 5, /* CONF_HW_RXTX_RATE_36 */
|
|
|
+ 4, /* CONF_HW_RXTX_RATE_24 */
|
|
|
+
|
|
|
+ /* TI-specific rate */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22 */
|
|
|
+
|
|
|
+ 3, /* CONF_HW_RXTX_RATE_18 */
|
|
|
+ 2, /* CONF_HW_RXTX_RATE_12 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11 */
|
|
|
+ 1, /* CONF_HW_RXTX_RATE_9 */
|
|
|
+ 0, /* CONF_HW_RXTX_RATE_6 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2 */
|
|
|
+ CONF_HW_RXTX_RATE_UNSUPPORTED /* CONF_HW_RXTX_RATE_1 */
|
|
|
+};
|
|
|
|
|
|
static struct ieee80211_supported_band wl1271_band_5ghz = {
|
|
|
.channels = wl1271_channels_5ghz,
|
|
@@ -1906,6 +1965,11 @@ static struct ieee80211_supported_band wl1271_band_5ghz = {
|
|
|
.n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
|
|
|
};
|
|
|
|
|
|
+const static u8 *wl1271_band_rate_to_idx[] = {
|
|
|
+ [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
|
|
|
+ [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
|
|
|
+};
|
|
|
+
|
|
|
static const struct ieee80211_ops wl1271_ops = {
|
|
|
.start = wl1271_op_start,
|
|
|
.stop = wl1271_op_stop,
|
|
@@ -1923,6 +1987,27 @@ static const struct ieee80211_ops wl1271_ops = {
|
|
|
CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
|
|
|
};
|
|
|
|
|
|
+
|
|
|
+u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate)
|
|
|
+{
|
|
|
+ u8 idx;
|
|
|
+
|
|
|
+ BUG_ON(wl->band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
|
|
|
+
|
|
|
+ if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
|
|
|
+ wl1271_error("Illegal RX rate from HW: %d", rate);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ idx = wl1271_band_rate_to_idx[wl->band][rate];
|
|
|
+ if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
|
|
|
+ wl1271_error("Unsupported RX rate from HW: %d", rate);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return idx;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
|
|
|
struct device_attribute *attr,
|
|
|
char *buf)
|