|
@@ -941,6 +941,42 @@ static int mwifiex_cfg80211_change_beacon(struct wiphy *wiphy,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+mwifiex_cfg80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
|
|
|
+{
|
|
|
+ struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
|
|
|
+ struct mwifiex_private *priv = mwifiex_get_priv(adapter,
|
|
|
+ MWIFIEX_BSS_ROLE_ANY);
|
|
|
+ struct mwifiex_ds_ant_cfg ant_cfg;
|
|
|
+
|
|
|
+ if (!tx_ant || !rx_ant)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if (adapter->hw_dev_mcs_support != HT_STREAM_2X2) {
|
|
|
+ /* Not a MIMO chip. User should provide specific antenna number
|
|
|
+ * for Tx/Rx path or enable all antennas for diversity
|
|
|
+ */
|
|
|
+ if (tx_ant != rx_ant)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if ((tx_ant & (tx_ant - 1)) &&
|
|
|
+ (tx_ant != BIT(adapter->number_of_antenna) - 1))
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if ((tx_ant == BIT(adapter->number_of_antenna) - 1) &&
|
|
|
+ (priv->adapter->number_of_antenna > 1)) {
|
|
|
+ tx_ant = RF_ANTENNA_AUTO;
|
|
|
+ rx_ant = RF_ANTENNA_AUTO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ant_cfg.tx_ant = tx_ant;
|
|
|
+ ant_cfg.rx_ant = rx_ant;
|
|
|
+
|
|
|
+ return mwifiex_send_cmd_sync(priv, HostCmd_CMD_RF_ANTENNA,
|
|
|
+ HostCmd_ACT_GEN_SET, 0, &ant_cfg);
|
|
|
+}
|
|
|
+
|
|
|
/* cfg80211 operation handler for stop ap.
|
|
|
* Function stops BSS running at uAP interface.
|
|
|
*/
|
|
@@ -1726,6 +1762,7 @@ static struct cfg80211_ops mwifiex_cfg80211_ops = {
|
|
|
.stop_ap = mwifiex_cfg80211_stop_ap,
|
|
|
.change_beacon = mwifiex_cfg80211_change_beacon,
|
|
|
.set_cqm_rssi_config = mwifiex_cfg80211_set_cqm_rssi_config,
|
|
|
+ .set_antenna = mwifiex_cfg80211_set_antenna,
|
|
|
};
|
|
|
|
|
|
/*
|
|
@@ -1778,6 +1815,9 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
|
|
|
wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
|
|
|
NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2;
|
|
|
|
|
|
+ wiphy->available_antennas_tx = BIT(adapter->number_of_antenna) - 1;
|
|
|
+ wiphy->available_antennas_rx = BIT(adapter->number_of_antenna) - 1;
|
|
|
+
|
|
|
/* Reserve space for mwifiex specific private data for BSS */
|
|
|
wiphy->bss_priv_size = sizeof(struct mwifiex_bss_priv);
|
|
|
|