staging: brcm80211: make use of cordic library function
The cordic function which calculates cosine and sine values for given angle is now provided in library module. The phy code now uses this module function. Reviewed-by: Henry Ptasinski <henryp@broadcom.com> Reviewed-by: Roland Vossen <rvossen@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
0ed129c9df
commit
85fd3ec4b1
@ -12,6 +12,7 @@ config BRCMSMAC
|
||||
select FW_LOADER
|
||||
select CRC_CCITT
|
||||
select CRC8
|
||||
select CORDIC
|
||||
---help---
|
||||
This module adds support for PCIe wireless adapters based on Broadcom
|
||||
IEEE802.11n SoftMAC chipsets. If you choose to build a module, it'll
|
||||
|
@ -2779,68 +2779,6 @@ wlc_phy_papd_decode_epsilon(u32 epsilon, s32 *eps_real, s32 *eps_imag)
|
||||
*eps_real -= 0x2000;
|
||||
}
|
||||
|
||||
static const s32 AtanTbl[] = {
|
||||
2949120,
|
||||
1740967,
|
||||
919879,
|
||||
466945,
|
||||
234379,
|
||||
117304,
|
||||
58666,
|
||||
29335,
|
||||
14668,
|
||||
7334,
|
||||
3667,
|
||||
1833,
|
||||
917,
|
||||
458,
|
||||
229,
|
||||
115,
|
||||
57,
|
||||
29
|
||||
};
|
||||
|
||||
void wlc_phy_cordic(s32 theta, struct cs32 *val)
|
||||
{
|
||||
s32 angle, valtmp;
|
||||
unsigned iter;
|
||||
int signx = 1;
|
||||
int signtheta;
|
||||
|
||||
val[0].i = CORDIC_AG;
|
||||
val[0].q = 0;
|
||||
angle = 0;
|
||||
|
||||
signtheta = (theta < 0) ? -1 : 1;
|
||||
theta = ((theta + FIXED(180) * signtheta) % FIXED(360)) -
|
||||
FIXED(180) * signtheta;
|
||||
|
||||
if (FLOAT(theta) > 90) {
|
||||
theta -= FIXED(180);
|
||||
signx = -1;
|
||||
} else if (FLOAT(theta) < -90) {
|
||||
theta += FIXED(180);
|
||||
signx = -1;
|
||||
}
|
||||
|
||||
for (iter = 0; iter < CORDIC_NI; iter++) {
|
||||
if (theta > angle) {
|
||||
valtmp = val[0].i - (val[0].q >> iter);
|
||||
val[0].q = (val[0].i >> iter) + val[0].q;
|
||||
val[0].i = valtmp;
|
||||
angle += AtanTbl[iter];
|
||||
} else {
|
||||
valtmp = val[0].i + (val[0].q >> iter);
|
||||
val[0].q = -(val[0].i >> iter) + val[0].q;
|
||||
val[0].i = valtmp;
|
||||
angle -= AtanTbl[iter];
|
||||
}
|
||||
}
|
||||
|
||||
val[0].i = val[0].i * signx;
|
||||
val[0].q = val[0].q * signx;
|
||||
}
|
||||
|
||||
void wlc_phy_cal_perical_mphase_reset(struct brcms_phy *pi)
|
||||
{
|
||||
wlapi_del_timer(pi->sh->physhim, pi->phycal_timer);
|
||||
|
@ -1039,7 +1039,6 @@ extern void wlc_phy_table_data_write(struct brcms_phy *pi, uint width, u32 val);
|
||||
extern void write_phy_channel_reg(struct brcms_phy *pi, uint val);
|
||||
extern void wlc_phy_txpower_update_shm(struct brcms_phy *pi);
|
||||
|
||||
extern void wlc_phy_cordic(s32 theta, struct cs32 *val);
|
||||
extern u8 wlc_phy_nbits(s32 value);
|
||||
extern void wlc_phy_compute_dB(u32 *cmplx_pwr, s8 *p_dB, u8 core);
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/cordic.h>
|
||||
|
||||
#include <pmu.h>
|
||||
#include <d11.h>
|
||||
@ -2723,7 +2724,7 @@ wlc_lcnphy_start_tx_tone(struct brcms_phy *pi, s32 f_kHz, u16 max_val,
|
||||
u16 num_samps, t, k;
|
||||
u32 bw;
|
||||
s32 theta = 0, rot = 0;
|
||||
struct cs32 tone_samp;
|
||||
struct cordic_iq tone_samp;
|
||||
u32 data_buf[64];
|
||||
u16 i_samp, q_samp;
|
||||
struct phytbl_info tab;
|
||||
@ -2751,12 +2752,12 @@ wlc_lcnphy_start_tx_tone(struct brcms_phy *pi, s32 f_kHz, u16 max_val,
|
||||
} else
|
||||
num_samps = 2;
|
||||
|
||||
rot = FIXED((f_kHz * 36) / phy_bw) / 100;
|
||||
rot = ((f_kHz * 36) / phy_bw) / 100;
|
||||
theta = 0;
|
||||
|
||||
for (t = 0; t < num_samps; t++) {
|
||||
|
||||
wlc_phy_cordic(theta, &tone_samp);
|
||||
tone_samp = cordic_calc_iq(theta);
|
||||
|
||||
theta += rot;
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/cordic.h>
|
||||
|
||||
#include <brcm_hw_ids.h>
|
||||
#include <aiutils.h>
|
||||
@ -14214,7 +14215,8 @@ static u16 wlc_phy_gen_load_samples_nphy(struct brcms_phy *pi, u32 f_kHz,
|
||||
u16 max_val,
|
||||
u8 dac_test_mode);
|
||||
static void wlc_phy_loadsampletable_nphy(struct brcms_phy *pi,
|
||||
struct cs32 *tone_buf, u16 num_samps);
|
||||
struct cordic_iq *tone_buf,
|
||||
u16 num_samps);
|
||||
static void wlc_phy_runsamples_nphy(struct brcms_phy *pi, u16 n, u16 lps,
|
||||
u16 wait, u8 iq, u8 dac_test_mode,
|
||||
bool modify_bbmult);
|
||||
@ -22179,7 +22181,7 @@ wlc_phy_gen_load_samples_nphy(struct brcms_phy *pi, u32 f_kHz, u16 max_val,
|
||||
u16 num_samps, t, spur;
|
||||
s32 theta = 0, rot = 0;
|
||||
u32 tbl_len;
|
||||
struct cs32 *tone_buf = NULL;
|
||||
struct cordic_iq *tone_buf = NULL;
|
||||
|
||||
is_phybw40 = CHSPEC_IS40(pi->radio_chanspec);
|
||||
phy_bw = (is_phybw40 == 1) ? 40 : 20;
|
||||
@ -22194,17 +22196,17 @@ wlc_phy_gen_load_samples_nphy(struct brcms_phy *pi, u32 f_kHz, u16 max_val,
|
||||
tbl_len = (phy_bw << 1);
|
||||
}
|
||||
|
||||
tone_buf = kmalloc(sizeof(struct cs32) * tbl_len, GFP_ATOMIC);
|
||||
tone_buf = kmalloc(sizeof(struct cordic_iq) * tbl_len, GFP_ATOMIC);
|
||||
if (tone_buf == NULL)
|
||||
return 0;
|
||||
|
||||
num_samps = (u16) tbl_len;
|
||||
rot = FIXED((f_kHz * 36) / phy_bw) / 100;
|
||||
rot = ((f_kHz * 36) / phy_bw) / 100;
|
||||
theta = 0;
|
||||
|
||||
for (t = 0; t < num_samps; t++) {
|
||||
|
||||
wlc_phy_cordic(theta, &tone_buf[t]);
|
||||
tone_buf[t] = cordic_calc_iq(theta);
|
||||
|
||||
theta += rot;
|
||||
|
||||
@ -22239,7 +22241,7 @@ wlc_phy_tx_tone_nphy(struct brcms_phy *pi, u32 f_kHz, u16 max_val,
|
||||
}
|
||||
|
||||
static void
|
||||
wlc_phy_loadsampletable_nphy(struct brcms_phy *pi, struct cs32 *tone_buf,
|
||||
wlc_phy_loadsampletable_nphy(struct brcms_phy *pi, struct cordic_iq *tone_buf,
|
||||
u16 num_samps)
|
||||
{
|
||||
u16 t;
|
||||
|
Loading…
x
Reference in New Issue
Block a user