OpenWrt – Blame information for rev 1
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | --- a/drivers/net/wireless/broadcom/b43/main.c |
2 | +++ b/drivers/net/wireless/broadcom/b43/main.c |
||
3 | @@ -1658,7 +1658,7 @@ static void b43_write_beacon_template(st |
||
4 | len, ram_offset, shm_size_offset, rate); |
||
5 | |||
6 | /* Write the PHY TX control parameters. */ |
||
7 | - antenna = B43_ANTENNA_DEFAULT; |
||
8 | + antenna = dev->tx_antenna; |
||
9 | antenna = b43_antenna_to_phyctl(antenna); |
||
10 | ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); |
||
11 | /* We can't send beacons with short preamble. Would get PHY errors. */ |
||
12 | @@ -3307,8 +3307,8 @@ static int b43_chip_init(struct b43_wlde |
||
13 | |||
14 | /* Select the antennae */ |
||
15 | if (phy->ops->set_rx_antenna) |
||
16 | - phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT); |
||
17 | - b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT); |
||
18 | + phy->ops->set_rx_antenna(dev, dev->rx_antenna); |
||
19 | + b43_mgmtframe_txantenna(dev, dev->tx_antenna); |
||
20 | |||
21 | if (phy->type == B43_PHYTYPE_B) { |
||
22 | value16 = b43_read16(dev, 0x005E); |
||
23 | @@ -4008,7 +4008,6 @@ static int b43_op_config(struct ieee8021 |
||
24 | struct b43_wldev *dev = wl->current_dev; |
||
25 | struct b43_phy *phy = &dev->phy; |
||
26 | struct ieee80211_conf *conf = &hw->conf; |
||
27 | - int antenna; |
||
28 | int err = 0; |
||
29 | |||
30 | mutex_lock(&wl->mutex); |
||
31 | @@ -4051,11 +4050,9 @@ static int b43_op_config(struct ieee8021 |
||
32 | } |
||
33 | |||
34 | /* Antennas for RX and management frame TX. */ |
||
35 | - antenna = B43_ANTENNA_DEFAULT; |
||
36 | - b43_mgmtframe_txantenna(dev, antenna); |
||
37 | - antenna = B43_ANTENNA_DEFAULT; |
||
38 | + b43_mgmtframe_txantenna(dev, dev->tx_antenna); |
||
39 | if (phy->ops->set_rx_antenna) |
||
40 | - phy->ops->set_rx_antenna(dev, antenna); |
||
41 | + phy->ops->set_rx_antenna(dev, dev->rx_antenna); |
||
42 | |||
43 | if (wl->radio_enabled != phy->radio_on) { |
||
44 | if (wl->radio_enabled) { |
||
45 | @@ -5199,6 +5196,47 @@ static int b43_op_get_survey(struct ieee |
||
46 | return 0; |
||
47 | } |
||
48 | |||
49 | +static int b43_op_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant) |
||
50 | +{ |
||
51 | + struct b43_wl *wl = hw_to_b43_wl(hw); |
||
52 | + struct b43_wldev *dev = wl->current_dev; |
||
53 | + |
||
54 | + if (tx_ant == 1 && rx_ant == 1) { |
||
55 | + dev->tx_antenna = B43_ANTENNA0; |
||
56 | + dev->rx_antenna = B43_ANTENNA0; |
||
57 | + } |
||
58 | + else if (tx_ant == 2 && rx_ant == 2) { |
||
59 | + dev->tx_antenna = B43_ANTENNA1; |
||
60 | + dev->rx_antenna = B43_ANTENNA1; |
||
61 | + } |
||
62 | + else if ((tx_ant & 3) == 3 && (rx_ant & 3) == 3) { |
||
63 | + dev->tx_antenna = B43_ANTENNA_DEFAULT; |
||
64 | + dev->rx_antenna = B43_ANTENNA_DEFAULT; |
||
65 | + } |
||
66 | + else { |
||
67 | + return -EINVAL; |
||
68 | + } |
||
69 | + |
||
70 | + return 0; |
||
71 | +} |
||
72 | + |
||
73 | + |
||
74 | +static int b43_op_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant) |
||
75 | +{ |
||
76 | + struct b43_wl *wl = hw_to_b43_wl(hw); |
||
77 | + struct b43_wldev *dev = wl->current_dev; |
||
78 | + |
||
79 | + switch (dev->tx_antenna) { |
||
80 | + case B43_ANTENNA0: |
||
81 | + *tx_ant = 1; *rx_ant = 1; break; |
||
82 | + case B43_ANTENNA1: |
||
83 | + *tx_ant = 2; *rx_ant = 2; break; |
||
84 | + case B43_ANTENNA_DEFAULT: |
||
85 | + *tx_ant = 3; *rx_ant = 3; break; |
||
86 | + } |
||
87 | + return 0; |
||
88 | +} |
||
89 | + |
||
90 | static const struct ieee80211_ops b43_hw_ops = { |
||
91 | .tx = b43_op_tx, |
||
92 | .conf_tx = b43_op_conf_tx, |
||
93 | @@ -5220,6 +5258,8 @@ static const struct ieee80211_ops b43_hw |
||
94 | .sw_scan_complete = b43_op_sw_scan_complete_notifier, |
||
95 | .get_survey = b43_op_get_survey, |
||
96 | .rfkill_poll = b43_rfkill_poll, |
||
97 | + .set_antenna = b43_op_set_antenna, |
||
98 | + .get_antenna = b43_op_get_antenna, |
||
99 | }; |
||
100 | |||
101 | /* Hard-reset the chip. Do not call this directly. |
||
102 | @@ -5523,6 +5563,8 @@ static int b43_one_core_attach(struct b4 |
||
103 | if (!wldev) |
||
104 | goto out; |
||
105 | |||
106 | + wldev->rx_antenna = B43_ANTENNA_DEFAULT; |
||
107 | + wldev->tx_antenna = B43_ANTENNA_DEFAULT; |
||
108 | wldev->use_pio = b43_modparam_pio; |
||
109 | wldev->dev = dev; |
||
110 | wldev->wl = wl; |
||
111 | @@ -5617,6 +5659,9 @@ static struct b43_wl *b43_wireless_init( |
||
112 | |||
113 | wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST); |
||
114 | |||
115 | + hw->wiphy->available_antennas_rx = 0x3; |
||
116 | + hw->wiphy->available_antennas_tx = 0x3; |
||
117 | + |
||
118 | wl->hw_registred = false; |
||
119 | hw->max_rates = 2; |
||
120 | SET_IEEE80211_DEV(hw, dev->dev); |
||
121 | --- a/drivers/net/wireless/broadcom/b43/b43.h |
||
122 | +++ b/drivers/net/wireless/broadcom/b43/b43.h |
||
123 | @@ -841,6 +841,8 @@ struct b43_wldev { |
||
124 | bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */ |
||
125 | bool use_pio; /* TRUE if next init should use PIO */ |
||
126 | int gpiomask; /* GPIO LED mask as a module parameter */ |
||
127 | + int rx_antenna; /* Used RX antenna (B43_ANTENNAxxx) */ |
||
128 | + int tx_antenna; /* Used TX antenna (B43_ANTENNAxxx) */ |
||
129 | |||
130 | /* PHY/Radio device. */ |
||
131 | struct b43_phy phy; |