mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-24 07:46:48 +00:00
a8f63a0717
This updates mac80211 to backprots-4.14-rc2. This was compile and runtime tested with ath9k, ath10k and b43 with multiple stations and ieee80211w and in different scenarios by many other people. To create the backports-4.14-rc2-1.tar.xz use this repository: https://git.kernel.org/pub/scm/linux/kernel/git/backports/backports.git from tag v4.14-rc2-1 Then run this: ./gentree.py --git-revision v4.14-rc2 --clean <path to linux repo> ../backports-4.14-rc2-1 This also adapts the ath10k-ct and mt76 driver to the changed cfg80211 APIs and syncs the nl80211.h file in iw with the new version from backports-4.14-rc2. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
132 lines
4.1 KiB
Diff
132 lines
4.1 KiB
Diff
--- a/drivers/net/wireless/broadcom/b43/main.c
|
|
+++ b/drivers/net/wireless/broadcom/b43/main.c
|
|
@@ -1658,7 +1658,7 @@ static void b43_write_beacon_template(st
|
|
len, ram_offset, shm_size_offset, rate);
|
|
|
|
/* Write the PHY TX control parameters. */
|
|
- antenna = B43_ANTENNA_DEFAULT;
|
|
+ antenna = dev->tx_antenna;
|
|
antenna = b43_antenna_to_phyctl(antenna);
|
|
ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
|
|
/* We can't send beacons with short preamble. Would get PHY errors. */
|
|
@@ -3307,8 +3307,8 @@ static int b43_chip_init(struct b43_wlde
|
|
|
|
/* Select the antennae */
|
|
if (phy->ops->set_rx_antenna)
|
|
- phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
|
|
- b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
|
|
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
|
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
|
|
|
if (phy->type == B43_PHYTYPE_B) {
|
|
value16 = b43_read16(dev, 0x005E);
|
|
@@ -4008,7 +4008,6 @@ static int b43_op_config(struct ieee8021
|
|
struct b43_wldev *dev = wl->current_dev;
|
|
struct b43_phy *phy = &dev->phy;
|
|
struct ieee80211_conf *conf = &hw->conf;
|
|
- int antenna;
|
|
int err = 0;
|
|
|
|
mutex_lock(&wl->mutex);
|
|
@@ -4051,11 +4050,9 @@ static int b43_op_config(struct ieee8021
|
|
}
|
|
|
|
/* Antennas for RX and management frame TX. */
|
|
- antenna = B43_ANTENNA_DEFAULT;
|
|
- b43_mgmtframe_txantenna(dev, antenna);
|
|
- antenna = B43_ANTENNA_DEFAULT;
|
|
+ b43_mgmtframe_txantenna(dev, dev->tx_antenna);
|
|
if (phy->ops->set_rx_antenna)
|
|
- phy->ops->set_rx_antenna(dev, antenna);
|
|
+ phy->ops->set_rx_antenna(dev, dev->rx_antenna);
|
|
|
|
if (wl->radio_enabled != phy->radio_on) {
|
|
if (wl->radio_enabled) {
|
|
@@ -5199,6 +5196,47 @@ static int b43_op_get_survey(struct ieee
|
|
return 0;
|
|
}
|
|
|
|
+static int b43_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)
|
|
+{
|
|
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
|
+ struct b43_wldev *dev = wl->current_dev;
|
|
+
|
|
+ if (tx_ant == 1 && rx_ant == 1) {
|
|
+ dev->tx_antenna = B43_ANTENNA0;
|
|
+ dev->rx_antenna = B43_ANTENNA0;
|
|
+ }
|
|
+ else if (tx_ant == 2 && rx_ant == 2) {
|
|
+ dev->tx_antenna = B43_ANTENNA1;
|
|
+ dev->rx_antenna = B43_ANTENNA1;
|
|
+ }
|
|
+ else if ((tx_ant & 3) == 3 && (rx_ant & 3) == 3) {
|
|
+ dev->tx_antenna = B43_ANTENNA_DEFAULT;
|
|
+ dev->rx_antenna = B43_ANTENNA_DEFAULT;
|
|
+ }
|
|
+ else {
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+
|
|
+static int b43_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant)
|
|
+{
|
|
+ struct b43_wl *wl = hw_to_b43_wl(hw);
|
|
+ struct b43_wldev *dev = wl->current_dev;
|
|
+
|
|
+ switch (dev->tx_antenna) {
|
|
+ case B43_ANTENNA0:
|
|
+ *tx_ant = 1; *rx_ant = 1; break;
|
|
+ case B43_ANTENNA1:
|
|
+ *tx_ant = 2; *rx_ant = 2; break;
|
|
+ case B43_ANTENNA_DEFAULT:
|
|
+ *tx_ant = 3; *rx_ant = 3; break;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static const struct ieee80211_ops b43_hw_ops = {
|
|
.tx = b43_op_tx,
|
|
.conf_tx = b43_op_conf_tx,
|
|
@@ -5220,6 +5258,8 @@ static const struct ieee80211_ops b43_hw
|
|
.sw_scan_complete = b43_op_sw_scan_complete_notifier,
|
|
.get_survey = b43_op_get_survey,
|
|
.rfkill_poll = b43_rfkill_poll,
|
|
+ .set_antenna = b43_op_set_antenna,
|
|
+ .get_antenna = b43_op_get_antenna,
|
|
};
|
|
|
|
/* Hard-reset the chip. Do not call this directly.
|
|
@@ -5523,6 +5563,8 @@ static int b43_one_core_attach(struct b4
|
|
if (!wldev)
|
|
goto out;
|
|
|
|
+ wldev->rx_antenna = B43_ANTENNA_DEFAULT;
|
|
+ wldev->tx_antenna = B43_ANTENNA_DEFAULT;
|
|
wldev->use_pio = b43_modparam_pio;
|
|
wldev->dev = dev;
|
|
wldev->wl = wl;
|
|
@@ -5617,6 +5659,9 @@ static struct b43_wl *b43_wireless_init(
|
|
|
|
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
|
|
|
+ hw->wiphy->available_antennas_rx = 0x3;
|
|
+ hw->wiphy->available_antennas_tx = 0x3;
|
|
+
|
|
wl->hw_registred = false;
|
|
hw->max_rates = 2;
|
|
SET_IEEE80211_DEV(hw, dev->dev);
|
|
--- a/drivers/net/wireless/broadcom/b43/b43.h
|
|
+++ b/drivers/net/wireless/broadcom/b43/b43.h
|
|
@@ -840,6 +840,8 @@ struct b43_wldev {
|
|
bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */
|
|
bool use_pio; /* TRUE if next init should use PIO */
|
|
int gpiomask; /* GPIO LED mask as a module parameter */
|
|
+ int rx_antenna; /* Used RX antenna (B43_ANTENNAxxx) */
|
|
+ int tx_antenna; /* Used TX antenna (B43_ANTENNAxxx) */
|
|
|
|
/* PHY/Radio device. */
|
|
struct b43_phy phy;
|