162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Broadcom B43 wireless driver 462306a36Sopenharmony_ci * IEEE 802.11ac AC-PHY support 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (c) 2015 Rafał Miłecki <zajec5@gmail.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "b43.h" 1062306a36Sopenharmony_ci#include "phy_ac.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/************************************************** 1362306a36Sopenharmony_ci * Basic PHY ops 1462306a36Sopenharmony_ci **************************************************/ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_cistatic int b43_phy_ac_op_allocate(struct b43_wldev *dev) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci struct b43_phy_ac *phy_ac; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci phy_ac = kzalloc(sizeof(*phy_ac), GFP_KERNEL); 2162306a36Sopenharmony_ci if (!phy_ac) 2262306a36Sopenharmony_ci return -ENOMEM; 2362306a36Sopenharmony_ci dev->phy.ac = phy_ac; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci return 0; 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic void b43_phy_ac_op_free(struct b43_wldev *dev) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci struct b43_phy *phy = &dev->phy; 3162306a36Sopenharmony_ci struct b43_phy_ac *phy_ac = phy->ac; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci kfree(phy_ac); 3462306a36Sopenharmony_ci phy->ac = NULL; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic void b43_phy_ac_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask, 3862306a36Sopenharmony_ci u16 set) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci b43_write16f(dev, B43_MMIO_PHY_CONTROL, reg); 4162306a36Sopenharmony_ci b43_write16(dev, B43_MMIO_PHY_DATA, 4262306a36Sopenharmony_ci (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic u16 b43_phy_ac_op_radio_read(struct b43_wldev *dev, u16 reg) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci b43_write16f(dev, B43_MMIO_RADIO24_CONTROL, reg); 4862306a36Sopenharmony_ci return b43_read16(dev, B43_MMIO_RADIO24_DATA); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic void b43_phy_ac_op_radio_write(struct b43_wldev *dev, u16 reg, 5262306a36Sopenharmony_ci u16 value) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci b43_write16f(dev, B43_MMIO_RADIO24_CONTROL, reg); 5562306a36Sopenharmony_ci b43_write16(dev, B43_MMIO_RADIO24_DATA, value); 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic unsigned int b43_phy_ac_op_get_default_chan(struct b43_wldev *dev) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci if (b43_current_band(dev->wl) == NL80211_BAND_2GHZ) 6162306a36Sopenharmony_ci return 11; 6262306a36Sopenharmony_ci return 36; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic enum b43_txpwr_result 6662306a36Sopenharmony_cib43_phy_ac_op_recalc_txpower(struct b43_wldev *dev, bool ignore_tssi) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return B43_TXPWR_RES_DONE; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic void b43_phy_ac_op_adjust_txpower(struct b43_wldev *dev) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/************************************************** 7662306a36Sopenharmony_ci * PHY ops struct 7762306a36Sopenharmony_ci **************************************************/ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ciconst struct b43_phy_operations b43_phyops_ac = { 8062306a36Sopenharmony_ci .allocate = b43_phy_ac_op_allocate, 8162306a36Sopenharmony_ci .free = b43_phy_ac_op_free, 8262306a36Sopenharmony_ci .phy_maskset = b43_phy_ac_op_maskset, 8362306a36Sopenharmony_ci .radio_read = b43_phy_ac_op_radio_read, 8462306a36Sopenharmony_ci .radio_write = b43_phy_ac_op_radio_write, 8562306a36Sopenharmony_ci .get_default_chan = b43_phy_ac_op_get_default_chan, 8662306a36Sopenharmony_ci .recalc_txpower = b43_phy_ac_op_recalc_txpower, 8762306a36Sopenharmony_ci .adjust_txpower = b43_phy_ac_op_adjust_txpower, 8862306a36Sopenharmony_ci}; 89