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