openwrt/package/kernel/mac80211/patches/812-b43-add-antenna-control.patch
Felix Fietkau 703515f889 mac80211: sync with master branch as of 9edff13abd
Includes the following changes:
9edff13abd mac80211: disable potentially harmful PS software retry for A-MPDU sessions
75216a76b0 mac80211: backport upstream fix for CSA in IBSS mode
368cc8ef47 mac80211: update brcmfmac backporting brcmf_err cleanups
66a63d25c4 mac80211: fix build on linux 3.18
9eacb9d7fc rt2x00: mt7620: lots of improvements
fd94fa61a7 mac80211: brcmfmac: update Raspberry Pi patches for linux 4.9
649e766a64 mac80211: update to wireless-testing 2017-01-31
47540afa5d ath9k: add a warning to the tx99 config option
b367eef21d mac80211: rt2x00: add support for external LNA on MT7620
9200e168f2 mac80211: move (& update) upstream accepted brcmfmac patches

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2017-02-24 12:22:29 +01:00

132 lines
4.0 KiB
Diff

--- a/drivers/net/wireless/broadcom/b43/main.c
+++ b/drivers/net/wireless/broadcom/b43/main.c
@@ -1648,7 +1648,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. */
@@ -3297,8 +3297,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);
@@ -3998,7 +3998,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);
@@ -4041,11 +4040,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) {
@@ -5189,6 +5186,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,
@@ -5210,6 +5248,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.
@@ -5513,6 +5553,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;
@@ -5605,6 +5647,9 @@ static struct b43_wl *b43_wireless_init(
hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
+ 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;