162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* ZD1211 USB-WLAN driver for Linux
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2005-2007 Ulrich Kunitz <kune@deine-taler.de>
562306a36Sopenharmony_ci * Copyright (C) 2006-2007 Daniel Drake <dsd@gentoo.org>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _ZD_RF_H
962306a36Sopenharmony_ci#define _ZD_RF_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define UW2451_RF			0x2
1262306a36Sopenharmony_ci#define UCHIP_RF			0x3
1362306a36Sopenharmony_ci#define AL2230_RF			0x4
1462306a36Sopenharmony_ci#define AL7230B_RF			0x5	/* a,b,g */
1562306a36Sopenharmony_ci#define THETA_RF			0x6
1662306a36Sopenharmony_ci#define AL2210_RF			0x7
1762306a36Sopenharmony_ci#define MAXIM_NEW_RF			0x8
1862306a36Sopenharmony_ci#define UW2453_RF			0x9
1962306a36Sopenharmony_ci#define AL2230S_RF			0xa
2062306a36Sopenharmony_ci#define RALINK_RF			0xb
2162306a36Sopenharmony_ci#define INTERSIL_RF			0xc
2262306a36Sopenharmony_ci#define RF2959_RF			0xd
2362306a36Sopenharmony_ci#define MAXIM_NEW2_RF			0xe
2462306a36Sopenharmony_ci#define PHILIPS_RF			0xf
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#define RF_CHANNEL(ch) [(ch)-1]
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci/* Provides functions of the RF transceiver. */
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cienum {
3162306a36Sopenharmony_ci	RF_REG_BITS = 6,
3262306a36Sopenharmony_ci	RF_VALUE_BITS = 18,
3362306a36Sopenharmony_ci	RF_RV_BITS = RF_REG_BITS + RF_VALUE_BITS,
3462306a36Sopenharmony_ci};
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cistruct zd_rf {
3762306a36Sopenharmony_ci	u8 type;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	u8 channel;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	/* whether channel integration and calibration should be updated
4262306a36Sopenharmony_ci	 * defaults to 1 (yes) */
4362306a36Sopenharmony_ci	u8 update_channel_int:1;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	/* whether ZD_CR47 should be patched from the EEPROM, if the appropriate
4662306a36Sopenharmony_ci	 * flag is set in the POD. The vendor driver suggests that this should
4762306a36Sopenharmony_ci	 * be done for all RF's, but a bug in their code prevents but their
4862306a36Sopenharmony_ci	 * HW_OverWritePhyRegFromE2P() routine from ever taking effect. */
4962306a36Sopenharmony_ci	u8 patch_cck_gain:1;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	/* private RF driver data */
5262306a36Sopenharmony_ci	void *priv;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	/* RF-specific functions */
5562306a36Sopenharmony_ci	int (*init_hw)(struct zd_rf *rf);
5662306a36Sopenharmony_ci	int (*set_channel)(struct zd_rf *rf, u8 channel);
5762306a36Sopenharmony_ci	int (*switch_radio_on)(struct zd_rf *rf);
5862306a36Sopenharmony_ci	int (*switch_radio_off)(struct zd_rf *rf);
5962306a36Sopenharmony_ci	int (*patch_6m_band_edge)(struct zd_rf *rf, u8 channel);
6062306a36Sopenharmony_ci	void (*clear)(struct zd_rf *rf);
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciconst char *zd_rf_name(u8 type);
6462306a36Sopenharmony_civoid zd_rf_init(struct zd_rf *rf);
6562306a36Sopenharmony_civoid zd_rf_clear(struct zd_rf *rf);
6662306a36Sopenharmony_ciint zd_rf_init_hw(struct zd_rf *rf, u8 type);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciint zd_rf_scnprint_id(struct zd_rf *rf, char *buffer, size_t size);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciint zd_rf_set_channel(struct zd_rf *rf, u8 channel);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciint zd_switch_radio_on(struct zd_rf *rf);
7362306a36Sopenharmony_ciint zd_switch_radio_off(struct zd_rf *rf);
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciint zd_rf_patch_6m_band_edge(struct zd_rf *rf, u8 channel);
7662306a36Sopenharmony_ciint zd_rf_generic_patch_6m(struct zd_rf *rf, u8 channel);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic inline int zd_rf_should_update_pwr_int(struct zd_rf *rf)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	return rf->update_channel_int;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic inline int zd_rf_should_patch_cck_gain(struct zd_rf *rf)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	return rf->patch_cck_gain;
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* Functions for individual RF chips */
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciint zd_rf_init_rf2959(struct zd_rf *rf);
9162306a36Sopenharmony_ciint zd_rf_init_al2230(struct zd_rf *rf);
9262306a36Sopenharmony_ciint zd_rf_init_al7230b(struct zd_rf *rf);
9362306a36Sopenharmony_ciint zd_rf_init_uw2453(struct zd_rf *rf);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci#endif /* _ZD_RF_H */
96