162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef LINUX_B43_PHY_COMMON_H_ 362306a36Sopenharmony_ci#define LINUX_B43_PHY_COMMON_H_ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/types.h> 662306a36Sopenharmony_ci#include <linux/nl80211.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistruct b43_wldev; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* PHY register routing bits */ 1162306a36Sopenharmony_ci#define B43_PHYROUTE 0x0C00 /* PHY register routing bits mask */ 1262306a36Sopenharmony_ci#define B43_PHYROUTE_BASE 0x0000 /* Base registers */ 1362306a36Sopenharmony_ci#define B43_PHYROUTE_OFDM_GPHY 0x0400 /* OFDM register routing for G-PHYs */ 1462306a36Sopenharmony_ci#define B43_PHYROUTE_EXT_GPHY 0x0800 /* Extended G-PHY registers */ 1562306a36Sopenharmony_ci#define B43_PHYROUTE_N_BMODE 0x0C00 /* N-PHY BMODE registers */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* CCK (B-PHY) registers. */ 1862306a36Sopenharmony_ci#define B43_PHY_CCK(reg) ((reg) | B43_PHYROUTE_BASE) 1962306a36Sopenharmony_ci/* N-PHY registers. */ 2062306a36Sopenharmony_ci#define B43_PHY_N(reg) ((reg) | B43_PHYROUTE_BASE) 2162306a36Sopenharmony_ci/* N-PHY BMODE registers. */ 2262306a36Sopenharmony_ci#define B43_PHY_N_BMODE(reg) ((reg) | B43_PHYROUTE_N_BMODE) 2362306a36Sopenharmony_ci/* OFDM (A-PHY) registers. */ 2462306a36Sopenharmony_ci#define B43_PHY_OFDM(reg) ((reg) | B43_PHYROUTE_OFDM_GPHY) 2562306a36Sopenharmony_ci/* Extended G-PHY registers. */ 2662306a36Sopenharmony_ci#define B43_PHY_EXTG(reg) ((reg) | B43_PHYROUTE_EXT_GPHY) 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* Masks for the PHY versioning registers. */ 3062306a36Sopenharmony_ci#define B43_PHYVER_ANALOG 0xF000 3162306a36Sopenharmony_ci#define B43_PHYVER_ANALOG_SHIFT 12 3262306a36Sopenharmony_ci#define B43_PHYVER_TYPE 0x0F00 3362306a36Sopenharmony_ci#define B43_PHYVER_TYPE_SHIFT 8 3462306a36Sopenharmony_ci#define B43_PHYVER_VERSION 0x00FF 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* PHY writes need to be flushed if we reach limit */ 3762306a36Sopenharmony_ci#define B43_MAX_WRITES_IN_ROW 24 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/** 4062306a36Sopenharmony_ci * enum b43_interference_mitigation - Interference Mitigation mode 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * @B43_INTERFMODE_NONE: Disabled 4362306a36Sopenharmony_ci * @B43_INTERFMODE_NONWLAN: Non-WLAN Interference Mitigation 4462306a36Sopenharmony_ci * @B43_INTERFMODE_MANUALWLAN: WLAN Interference Mitigation 4562306a36Sopenharmony_ci * @B43_INTERFMODE_AUTOWLAN: Automatic WLAN Interference Mitigation 4662306a36Sopenharmony_ci */ 4762306a36Sopenharmony_cienum b43_interference_mitigation { 4862306a36Sopenharmony_ci B43_INTERFMODE_NONE, 4962306a36Sopenharmony_ci B43_INTERFMODE_NONWLAN, 5062306a36Sopenharmony_ci B43_INTERFMODE_MANUALWLAN, 5162306a36Sopenharmony_ci B43_INTERFMODE_AUTOWLAN, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* Antenna identifiers */ 5562306a36Sopenharmony_cienum { 5662306a36Sopenharmony_ci B43_ANTENNA0 = 0, /* Antenna 0 */ 5762306a36Sopenharmony_ci B43_ANTENNA1 = 1, /* Antenna 1 */ 5862306a36Sopenharmony_ci B43_ANTENNA_AUTO0 = 2, /* Automatic, starting with antenna 0 */ 5962306a36Sopenharmony_ci B43_ANTENNA_AUTO1 = 3, /* Automatic, starting with antenna 1 */ 6062306a36Sopenharmony_ci B43_ANTENNA2 = 4, 6162306a36Sopenharmony_ci B43_ANTENNA3 = 8, 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci B43_ANTENNA_AUTO = B43_ANTENNA_AUTO0, 6462306a36Sopenharmony_ci B43_ANTENNA_DEFAULT = B43_ANTENNA_AUTO, 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/** 6862306a36Sopenharmony_ci * enum b43_txpwr_result - Return value for the recalc_txpower PHY op. 6962306a36Sopenharmony_ci * 7062306a36Sopenharmony_ci * @B43_TXPWR_RES_NEED_ADJUST: Values changed. Hardware adjustment is needed. 7162306a36Sopenharmony_ci * @B43_TXPWR_RES_DONE: No more work to do. Everything is done. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cienum b43_txpwr_result { 7462306a36Sopenharmony_ci B43_TXPWR_RES_NEED_ADJUST, 7562306a36Sopenharmony_ci B43_TXPWR_RES_DONE, 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/** 7962306a36Sopenharmony_ci * struct b43_phy_operations - Function pointers for PHY ops. 8062306a36Sopenharmony_ci * 8162306a36Sopenharmony_ci * @allocate: Allocate and initialise the PHY data structures. 8262306a36Sopenharmony_ci * Must not be NULL. 8362306a36Sopenharmony_ci * @free: Destroy and free the PHY data structures. 8462306a36Sopenharmony_ci * Must not be NULL. 8562306a36Sopenharmony_ci * 8662306a36Sopenharmony_ci * @prepare_structs: Prepare the PHY data structures. 8762306a36Sopenharmony_ci * The data structures allocated in @allocate are 8862306a36Sopenharmony_ci * initialized here. 8962306a36Sopenharmony_ci * Must not be NULL. 9062306a36Sopenharmony_ci * @prepare_hardware: Prepare the PHY. This is called before b43_chip_init to 9162306a36Sopenharmony_ci * do some early PHY hardware init. 9262306a36Sopenharmony_ci * Can be NULL, if not required. 9362306a36Sopenharmony_ci * @init: Initialize the PHY. 9462306a36Sopenharmony_ci * Must not be NULL. 9562306a36Sopenharmony_ci * @exit: Shutdown the PHY. 9662306a36Sopenharmony_ci * Can be NULL, if not required. 9762306a36Sopenharmony_ci * 9862306a36Sopenharmony_ci * @phy_read: Read from a PHY register. 9962306a36Sopenharmony_ci * Must not be NULL. 10062306a36Sopenharmony_ci * @phy_write: Write to a PHY register. 10162306a36Sopenharmony_ci * Must not be NULL. 10262306a36Sopenharmony_ci * @phy_maskset: Maskset a PHY register, taking shortcuts. 10362306a36Sopenharmony_ci * If it is NULL, a generic algorithm is used. 10462306a36Sopenharmony_ci * @radio_read: Read from a Radio register. 10562306a36Sopenharmony_ci * Must not be NULL. 10662306a36Sopenharmony_ci * @radio_write: Write to a Radio register. 10762306a36Sopenharmony_ci * Must not be NULL. 10862306a36Sopenharmony_ci * 10962306a36Sopenharmony_ci * @supports_hwpctl: Returns a boolean whether Hardware Power Control 11062306a36Sopenharmony_ci * is supported or not. 11162306a36Sopenharmony_ci * If NULL, hwpctl is assumed to be never supported. 11262306a36Sopenharmony_ci * @software_rfkill: Turn the radio ON or OFF. 11362306a36Sopenharmony_ci * Possible state values are 11462306a36Sopenharmony_ci * RFKILL_STATE_SOFT_BLOCKED or 11562306a36Sopenharmony_ci * RFKILL_STATE_UNBLOCKED 11662306a36Sopenharmony_ci * Must not be NULL. 11762306a36Sopenharmony_ci * @switch_analog: Turn the Analog on/off. 11862306a36Sopenharmony_ci * Must not be NULL. 11962306a36Sopenharmony_ci * @switch_channel: Switch the radio to another channel. 12062306a36Sopenharmony_ci * Must not be NULL. 12162306a36Sopenharmony_ci * @get_default_chan: Just returns the default channel number. 12262306a36Sopenharmony_ci * Must not be NULL. 12362306a36Sopenharmony_ci * @set_rx_antenna: Set the antenna used for RX. 12462306a36Sopenharmony_ci * Can be NULL, if not supported. 12562306a36Sopenharmony_ci * @interf_mitigation: Switch the Interference Mitigation mode. 12662306a36Sopenharmony_ci * Can be NULL, if not supported. 12762306a36Sopenharmony_ci * 12862306a36Sopenharmony_ci * @recalc_txpower: Recalculate the transmission power parameters. 12962306a36Sopenharmony_ci * This callback has to recalculate the TX power settings, 13062306a36Sopenharmony_ci * but does not need to write them to the hardware, yet. 13162306a36Sopenharmony_ci * Returns enum b43_txpwr_result to indicate whether the hardware 13262306a36Sopenharmony_ci * needs to be adjusted. 13362306a36Sopenharmony_ci * If B43_TXPWR_NEED_ADJUST is returned, @adjust_txpower 13462306a36Sopenharmony_ci * will be called later. 13562306a36Sopenharmony_ci * If the parameter "ignore_tssi" is true, the TSSI values should 13662306a36Sopenharmony_ci * be ignored and a recalculation of the power settings should be 13762306a36Sopenharmony_ci * done even if the TSSI values did not change. 13862306a36Sopenharmony_ci * This function may sleep, but should not. 13962306a36Sopenharmony_ci * Must not be NULL. 14062306a36Sopenharmony_ci * @adjust_txpower: Write the previously calculated TX power settings 14162306a36Sopenharmony_ci * (from @recalc_txpower) to the hardware. 14262306a36Sopenharmony_ci * This function may sleep. 14362306a36Sopenharmony_ci * Can be NULL, if (and ONLY if) @recalc_txpower _always_ 14462306a36Sopenharmony_ci * returns B43_TXPWR_RES_DONE. 14562306a36Sopenharmony_ci * 14662306a36Sopenharmony_ci * @pwork_15sec: Periodic work. Called every 15 seconds. 14762306a36Sopenharmony_ci * Can be NULL, if not required. 14862306a36Sopenharmony_ci * @pwork_60sec: Periodic work. Called every 60 seconds. 14962306a36Sopenharmony_ci * Can be NULL, if not required. 15062306a36Sopenharmony_ci */ 15162306a36Sopenharmony_cistruct b43_phy_operations { 15262306a36Sopenharmony_ci /* Initialisation */ 15362306a36Sopenharmony_ci int (*allocate)(struct b43_wldev *dev); 15462306a36Sopenharmony_ci void (*free)(struct b43_wldev *dev); 15562306a36Sopenharmony_ci void (*prepare_structs)(struct b43_wldev *dev); 15662306a36Sopenharmony_ci int (*prepare_hardware)(struct b43_wldev *dev); 15762306a36Sopenharmony_ci int (*init)(struct b43_wldev *dev); 15862306a36Sopenharmony_ci void (*exit)(struct b43_wldev *dev); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci /* Register access */ 16162306a36Sopenharmony_ci u16 (*phy_read)(struct b43_wldev *dev, u16 reg); 16262306a36Sopenharmony_ci void (*phy_write)(struct b43_wldev *dev, u16 reg, u16 value); 16362306a36Sopenharmony_ci void (*phy_maskset)(struct b43_wldev *dev, u16 reg, u16 mask, u16 set); 16462306a36Sopenharmony_ci u16 (*radio_read)(struct b43_wldev *dev, u16 reg); 16562306a36Sopenharmony_ci void (*radio_write)(struct b43_wldev *dev, u16 reg, u16 value); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci /* Radio */ 16862306a36Sopenharmony_ci bool (*supports_hwpctl)(struct b43_wldev *dev); 16962306a36Sopenharmony_ci void (*software_rfkill)(struct b43_wldev *dev, bool blocked); 17062306a36Sopenharmony_ci void (*switch_analog)(struct b43_wldev *dev, bool on); 17162306a36Sopenharmony_ci int (*switch_channel)(struct b43_wldev *dev, unsigned int new_channel); 17262306a36Sopenharmony_ci unsigned int (*get_default_chan)(struct b43_wldev *dev); 17362306a36Sopenharmony_ci void (*set_rx_antenna)(struct b43_wldev *dev, int antenna); 17462306a36Sopenharmony_ci int (*interf_mitigation)(struct b43_wldev *dev, 17562306a36Sopenharmony_ci enum b43_interference_mitigation new_mode); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* Transmission power adjustment */ 17862306a36Sopenharmony_ci enum b43_txpwr_result (*recalc_txpower)(struct b43_wldev *dev, 17962306a36Sopenharmony_ci bool ignore_tssi); 18062306a36Sopenharmony_ci void (*adjust_txpower)(struct b43_wldev *dev); 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci /* Misc */ 18362306a36Sopenharmony_ci void (*pwork_15sec)(struct b43_wldev *dev); 18462306a36Sopenharmony_ci void (*pwork_60sec)(struct b43_wldev *dev); 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistruct b43_phy_g; 18862306a36Sopenharmony_cistruct b43_phy_n; 18962306a36Sopenharmony_cistruct b43_phy_lp; 19062306a36Sopenharmony_cistruct b43_phy_ht; 19162306a36Sopenharmony_cistruct b43_phy_lcn; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cistruct b43_phy { 19462306a36Sopenharmony_ci /* Hardware operation callbacks. */ 19562306a36Sopenharmony_ci const struct b43_phy_operations *ops; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci /* Most hardware context information is stored in the standard- 19862306a36Sopenharmony_ci * specific data structures pointed to by the pointers below. 19962306a36Sopenharmony_ci * Only one of them is valid (the currently enabled PHY). */ 20062306a36Sopenharmony_ci#ifdef CONFIG_B43_DEBUG 20162306a36Sopenharmony_ci /* No union for debug build to force NULL derefs in buggy code. */ 20262306a36Sopenharmony_ci struct { 20362306a36Sopenharmony_ci#else 20462306a36Sopenharmony_ci union { 20562306a36Sopenharmony_ci#endif 20662306a36Sopenharmony_ci /* G-PHY specific information */ 20762306a36Sopenharmony_ci struct b43_phy_g *g; 20862306a36Sopenharmony_ci /* N-PHY specific information */ 20962306a36Sopenharmony_ci struct b43_phy_n *n; 21062306a36Sopenharmony_ci /* LP-PHY specific information */ 21162306a36Sopenharmony_ci struct b43_phy_lp *lp; 21262306a36Sopenharmony_ci /* HT-PHY specific information */ 21362306a36Sopenharmony_ci struct b43_phy_ht *ht; 21462306a36Sopenharmony_ci /* LCN-PHY specific information */ 21562306a36Sopenharmony_ci struct b43_phy_lcn *lcn; 21662306a36Sopenharmony_ci /* AC-PHY specific information */ 21762306a36Sopenharmony_ci struct b43_phy_ac *ac; 21862306a36Sopenharmony_ci }; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* Band support flags. */ 22162306a36Sopenharmony_ci bool supports_2ghz; 22262306a36Sopenharmony_ci bool supports_5ghz; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci /* Is GMODE (2 GHz mode) bit enabled? */ 22562306a36Sopenharmony_ci bool gmode; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci /* After power reset full init has to be performed */ 22862306a36Sopenharmony_ci bool do_full_init; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci /* Analog Type */ 23162306a36Sopenharmony_ci u8 analog; 23262306a36Sopenharmony_ci /* B43_PHYTYPE_ */ 23362306a36Sopenharmony_ci u8 type; 23462306a36Sopenharmony_ci /* PHY revision number. */ 23562306a36Sopenharmony_ci u8 rev; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci /* Count writes since last read */ 23862306a36Sopenharmony_ci u8 writes_counter; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci /* Radio versioning */ 24162306a36Sopenharmony_ci u16 radio_manuf; /* Radio manufacturer */ 24262306a36Sopenharmony_ci u16 radio_ver; /* Radio version */ 24362306a36Sopenharmony_ci u8 radio_rev; /* Radio revision */ 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci /* Software state of the radio */ 24662306a36Sopenharmony_ci bool radio_on; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci /* Desired TX power level (in dBm). 24962306a36Sopenharmony_ci * This is set by the user and adjusted in b43_phy_xmitpower(). */ 25062306a36Sopenharmony_ci int desired_txpower; 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci /* Hardware Power Control enabled? */ 25362306a36Sopenharmony_ci bool hardware_power_control; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* The time (in absolute jiffies) when the next TX power output 25662306a36Sopenharmony_ci * check is needed. */ 25762306a36Sopenharmony_ci unsigned long next_txpwr_check_time; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci /* Current channel */ 26062306a36Sopenharmony_ci struct cfg80211_chan_def *chandef; 26162306a36Sopenharmony_ci unsigned int channel; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci /* PHY TX errors counter. */ 26462306a36Sopenharmony_ci atomic_t txerr_cnt; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#ifdef CONFIG_B43_DEBUG 26762306a36Sopenharmony_ci /* PHY registers locked (w.r.t. firmware) */ 26862306a36Sopenharmony_ci bool phy_locked; 26962306a36Sopenharmony_ci /* Radio registers locked (w.r.t. firmware) */ 27062306a36Sopenharmony_ci bool radio_locked; 27162306a36Sopenharmony_ci#endif /* B43_DEBUG */ 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci/** 27662306a36Sopenharmony_ci * b43_phy_allocate - Allocate PHY structs 27762306a36Sopenharmony_ci * Allocate the PHY data structures, based on the current dev->phy.type 27862306a36Sopenharmony_ci */ 27962306a36Sopenharmony_ciint b43_phy_allocate(struct b43_wldev *dev); 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/** 28262306a36Sopenharmony_ci * b43_phy_free - Free PHY structs 28362306a36Sopenharmony_ci */ 28462306a36Sopenharmony_civoid b43_phy_free(struct b43_wldev *dev); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci/** 28762306a36Sopenharmony_ci * b43_phy_init - Initialise the PHY 28862306a36Sopenharmony_ci */ 28962306a36Sopenharmony_ciint b43_phy_init(struct b43_wldev *dev); 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/** 29262306a36Sopenharmony_ci * b43_phy_exit - Cleanup PHY 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_civoid b43_phy_exit(struct b43_wldev *dev); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/** 29762306a36Sopenharmony_ci * b43_has_hardware_pctl - Hardware Power Control supported? 29862306a36Sopenharmony_ci * Returns a boolean, whether hardware power control is supported. 29962306a36Sopenharmony_ci */ 30062306a36Sopenharmony_cibool b43_has_hardware_pctl(struct b43_wldev *dev); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/** 30362306a36Sopenharmony_ci * b43_phy_read - 16bit PHY register read access 30462306a36Sopenharmony_ci */ 30562306a36Sopenharmony_ciu16 b43_phy_read(struct b43_wldev *dev, u16 reg); 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci/** 30862306a36Sopenharmony_ci * b43_phy_write - 16bit PHY register write access 30962306a36Sopenharmony_ci */ 31062306a36Sopenharmony_civoid b43_phy_write(struct b43_wldev *dev, u16 reg, u16 value); 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci/** 31362306a36Sopenharmony_ci * b43_phy_copy - copy contents of 16bit PHY register to another 31462306a36Sopenharmony_ci */ 31562306a36Sopenharmony_civoid b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/** 31862306a36Sopenharmony_ci * b43_phy_mask - Mask a PHY register with a mask 31962306a36Sopenharmony_ci */ 32062306a36Sopenharmony_civoid b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask); 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci/** 32362306a36Sopenharmony_ci * b43_phy_set - OR a PHY register with a bitmap 32462306a36Sopenharmony_ci */ 32562306a36Sopenharmony_civoid b43_phy_set(struct b43_wldev *dev, u16 offset, u16 set); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci/** 32862306a36Sopenharmony_ci * b43_phy_maskset - Mask and OR a PHY register with a mask and bitmap 32962306a36Sopenharmony_ci */ 33062306a36Sopenharmony_civoid b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/** 33362306a36Sopenharmony_ci * b43_radio_read - 16bit Radio register read access 33462306a36Sopenharmony_ci */ 33562306a36Sopenharmony_ciu16 b43_radio_read(struct b43_wldev *dev, u16 reg); 33662306a36Sopenharmony_ci#define b43_radio_read16 b43_radio_read /* DEPRECATED */ 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci/** 33962306a36Sopenharmony_ci * b43_radio_write - 16bit Radio register write access 34062306a36Sopenharmony_ci */ 34162306a36Sopenharmony_civoid b43_radio_write(struct b43_wldev *dev, u16 reg, u16 value); 34262306a36Sopenharmony_ci#define b43_radio_write16 b43_radio_write /* DEPRECATED */ 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/** 34562306a36Sopenharmony_ci * b43_radio_mask - Mask a 16bit radio register with a mask 34662306a36Sopenharmony_ci */ 34762306a36Sopenharmony_civoid b43_radio_mask(struct b43_wldev *dev, u16 offset, u16 mask); 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/** 35062306a36Sopenharmony_ci * b43_radio_set - OR a 16bit radio register with a bitmap 35162306a36Sopenharmony_ci */ 35262306a36Sopenharmony_civoid b43_radio_set(struct b43_wldev *dev, u16 offset, u16 set); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci/** 35562306a36Sopenharmony_ci * b43_radio_maskset - Mask and OR a radio register with a mask and bitmap 35662306a36Sopenharmony_ci */ 35762306a36Sopenharmony_civoid b43_radio_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci/** 36062306a36Sopenharmony_ci * b43_radio_wait_value - Waits for a given value in masked register read 36162306a36Sopenharmony_ci */ 36262306a36Sopenharmony_cibool b43_radio_wait_value(struct b43_wldev *dev, u16 offset, u16 mask, 36362306a36Sopenharmony_ci u16 value, int delay, int timeout); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci/** 36662306a36Sopenharmony_ci * b43_radio_lock - Lock firmware radio register access 36762306a36Sopenharmony_ci */ 36862306a36Sopenharmony_civoid b43_radio_lock(struct b43_wldev *dev); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci/** 37162306a36Sopenharmony_ci * b43_radio_unlock - Unlock firmware radio register access 37262306a36Sopenharmony_ci */ 37362306a36Sopenharmony_civoid b43_radio_unlock(struct b43_wldev *dev); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci/** 37662306a36Sopenharmony_ci * b43_phy_lock - Lock firmware PHY register access 37762306a36Sopenharmony_ci */ 37862306a36Sopenharmony_civoid b43_phy_lock(struct b43_wldev *dev); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci/** 38162306a36Sopenharmony_ci * b43_phy_unlock - Unlock firmware PHY register access 38262306a36Sopenharmony_ci */ 38362306a36Sopenharmony_civoid b43_phy_unlock(struct b43_wldev *dev); 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_civoid b43_phy_put_into_reset(struct b43_wldev *dev); 38662306a36Sopenharmony_civoid b43_phy_take_out_of_reset(struct b43_wldev *dev); 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci/** 38962306a36Sopenharmony_ci * b43_switch_channel - Switch to another channel 39062306a36Sopenharmony_ci */ 39162306a36Sopenharmony_ciint b43_switch_channel(struct b43_wldev *dev, unsigned int new_channel); 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci/** 39462306a36Sopenharmony_ci * b43_software_rfkill - Turn the radio ON or OFF in software. 39562306a36Sopenharmony_ci */ 39662306a36Sopenharmony_civoid b43_software_rfkill(struct b43_wldev *dev, bool blocked); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci/** 39962306a36Sopenharmony_ci * b43_phy_txpower_check - Check TX power output. 40062306a36Sopenharmony_ci * 40162306a36Sopenharmony_ci * Compare the current TX power output to the desired power emission 40262306a36Sopenharmony_ci * and schedule an adjustment in case it mismatches. 40362306a36Sopenharmony_ci * 40462306a36Sopenharmony_ci * @flags: OR'ed enum b43_phy_txpower_check_flags flags. 40562306a36Sopenharmony_ci * See the docs below. 40662306a36Sopenharmony_ci */ 40762306a36Sopenharmony_civoid b43_phy_txpower_check(struct b43_wldev *dev, unsigned int flags); 40862306a36Sopenharmony_ci/** 40962306a36Sopenharmony_ci * enum b43_phy_txpower_check_flags - Flags for b43_phy_txpower_check() 41062306a36Sopenharmony_ci * 41162306a36Sopenharmony_ci * @B43_TXPWR_IGNORE_TIME: Ignore the schedule time and force-redo 41262306a36Sopenharmony_ci * the check now. 41362306a36Sopenharmony_ci * @B43_TXPWR_IGNORE_TSSI: Redo the recalculation, even if the average 41462306a36Sopenharmony_ci * TSSI did not change. 41562306a36Sopenharmony_ci */ 41662306a36Sopenharmony_cienum b43_phy_txpower_check_flags { 41762306a36Sopenharmony_ci B43_TXPWR_IGNORE_TIME = (1 << 0), 41862306a36Sopenharmony_ci B43_TXPWR_IGNORE_TSSI = (1 << 1), 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_cistruct work_struct; 42262306a36Sopenharmony_civoid b43_phy_txpower_adjust_work(struct work_struct *work); 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci/** 42562306a36Sopenharmony_ci * b43_phy_shm_tssi_read - Read the average of the last 4 TSSI from SHM. 42662306a36Sopenharmony_ci * 42762306a36Sopenharmony_ci * @shm_offset: The SHM address to read the values from. 42862306a36Sopenharmony_ci * 42962306a36Sopenharmony_ci * Returns the average of the 4 TSSI values, or a negative error code. 43062306a36Sopenharmony_ci */ 43162306a36Sopenharmony_ciint b43_phy_shm_tssi_read(struct b43_wldev *dev, u16 shm_offset); 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci/** 43462306a36Sopenharmony_ci * b43_phy_switch_analog_generic - Generic PHY operation for switching the Analog. 43562306a36Sopenharmony_ci * 43662306a36Sopenharmony_ci * It does the switching based on the PHY0 core register. 43762306a36Sopenharmony_ci * Do _not_ call this directly. Only use it as a switch_analog callback 43862306a36Sopenharmony_ci * for struct b43_phy_operations. 43962306a36Sopenharmony_ci */ 44062306a36Sopenharmony_civoid b43_phyop_switch_analog_generic(struct b43_wldev *dev, bool on); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_cibool b43_is_40mhz(struct b43_wldev *dev); 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_civoid b43_phy_force_clock(struct b43_wldev *dev, bool force); 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci#endif /* LINUX_B43_PHY_COMMON_H_ */ 447