diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-11-10 21:18:38 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-11-16 16:37:08 -0500 |
commit | 4e8c14e9587c38f4cce8049c766935629fdb8d46 (patch) | |
tree | 7dc06b37bc5648314c96ea9bbb39c9544e98ecd5 | |
parent | 82b873afe83c81d9b1273a816bbdacb266f71a52 (diff) |
ath9k_hw: add a private op for configuring radar pulse detection
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar5008_phy.c | 32 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.c | 32 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.h | 36 |
3 files changed, 100 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c index c83a22cfbe1e..3686811cc8df 100644 --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c | |||
@@ -1579,6 +1579,37 @@ static void ar5008_hw_set_nf_limits(struct ath_hw *ah) | |||
1579 | ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_5416_5GHZ; | 1579 | ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_5416_5GHZ; |
1580 | } | 1580 | } |
1581 | 1581 | ||
1582 | static void ar5008_hw_set_radar_params(struct ath_hw *ah, | ||
1583 | struct ath_hw_radar_conf *conf) | ||
1584 | { | ||
1585 | u32 radar_0 = 0, radar_1 = 0; | ||
1586 | |||
1587 | if (!conf) { | ||
1588 | REG_CLR_BIT(ah, AR_PHY_RADAR_0, AR_PHY_RADAR_0_ENA); | ||
1589 | return; | ||
1590 | } | ||
1591 | |||
1592 | radar_0 |= AR_PHY_RADAR_0_ENA | AR_PHY_RADAR_0_FFT_ENA; | ||
1593 | radar_0 |= SM(conf->fir_power, AR_PHY_RADAR_0_FIRPWR); | ||
1594 | radar_0 |= SM(conf->radar_rssi, AR_PHY_RADAR_0_RRSSI); | ||
1595 | radar_0 |= SM(conf->pulse_height, AR_PHY_RADAR_0_HEIGHT); | ||
1596 | radar_0 |= SM(conf->pulse_rssi, AR_PHY_RADAR_0_PRSSI); | ||
1597 | radar_0 |= SM(conf->pulse_inband, AR_PHY_RADAR_0_INBAND); | ||
1598 | |||
1599 | radar_1 |= AR_PHY_RADAR_1_MAX_RRSSI; | ||
1600 | radar_1 |= AR_PHY_RADAR_1_BLOCK_CHECK; | ||
1601 | radar_1 |= SM(conf->pulse_maxlen, AR_PHY_RADAR_1_MAXLEN); | ||
1602 | radar_1 |= SM(conf->pulse_inband_step, AR_PHY_RADAR_1_RELSTEP_THRESH); | ||
1603 | radar_1 |= SM(conf->radar_inband, AR_PHY_RADAR_1_RELPWR_THRESH); | ||
1604 | |||
1605 | REG_WRITE(ah, AR_PHY_RADAR_0, radar_0); | ||
1606 | REG_WRITE(ah, AR_PHY_RADAR_1, radar_1); | ||
1607 | if (conf->ext_channel) | ||
1608 | REG_SET_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); | ||
1609 | else | ||
1610 | REG_CLR_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); | ||
1611 | } | ||
1612 | |||
1582 | void ar5008_hw_attach_phy_ops(struct ath_hw *ah) | 1613 | void ar5008_hw_attach_phy_ops(struct ath_hw *ah) |
1583 | { | 1614 | { |
1584 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | 1615 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); |
@@ -1609,6 +1640,7 @@ void ar5008_hw_attach_phy_ops(struct ath_hw *ah) | |||
1609 | priv_ops->restore_chainmask = ar5008_restore_chainmask; | 1640 | priv_ops->restore_chainmask = ar5008_restore_chainmask; |
1610 | priv_ops->set_diversity = ar5008_set_diversity; | 1641 | priv_ops->set_diversity = ar5008_set_diversity; |
1611 | priv_ops->do_getnf = ar5008_hw_do_getnf; | 1642 | priv_ops->do_getnf = ar5008_hw_do_getnf; |
1643 | priv_ops->set_radar_params = ar5008_hw_set_radar_params; | ||
1612 | 1644 | ||
1613 | if (modparam_force_new_ani) { | 1645 | if (modparam_force_new_ani) { |
1614 | priv_ops->ani_control = ar5008_hw_ani_control_new; | 1646 | priv_ops->ani_control = ar5008_hw_ani_control_new; |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 44c5454b2ad8..f676b21ac437 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
@@ -1113,6 +1113,37 @@ static void ar9003_hw_ani_cache_ini_regs(struct ath_hw *ah) | |||
1113 | aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; | 1113 | aniState->mrcCCKOff = !ATH9K_ANI_ENABLE_MRC_CCK; |
1114 | } | 1114 | } |
1115 | 1115 | ||
1116 | static void ar9003_hw_set_radar_params(struct ath_hw *ah, | ||
1117 | struct ath_hw_radar_conf *conf) | ||
1118 | { | ||
1119 | u32 radar_0 = 0, radar_1 = 0; | ||
1120 | |||
1121 | if (!conf) { | ||
1122 | REG_CLR_BIT(ah, AR_PHY_RADAR_0, AR_PHY_RADAR_0_ENA); | ||
1123 | return; | ||
1124 | } | ||
1125 | |||
1126 | radar_0 |= AR_PHY_RADAR_0_ENA | AR_PHY_RADAR_0_FFT_ENA; | ||
1127 | radar_0 |= SM(conf->fir_power, AR_PHY_RADAR_0_FIRPWR); | ||
1128 | radar_0 |= SM(conf->radar_rssi, AR_PHY_RADAR_0_RRSSI); | ||
1129 | radar_0 |= SM(conf->pulse_height, AR_PHY_RADAR_0_HEIGHT); | ||
1130 | radar_0 |= SM(conf->pulse_rssi, AR_PHY_RADAR_0_PRSSI); | ||
1131 | radar_0 |= SM(conf->pulse_inband, AR_PHY_RADAR_0_INBAND); | ||
1132 | |||
1133 | radar_1 |= AR_PHY_RADAR_1_MAX_RRSSI; | ||
1134 | radar_1 |= AR_PHY_RADAR_1_BLOCK_CHECK; | ||
1135 | radar_1 |= SM(conf->pulse_maxlen, AR_PHY_RADAR_1_MAXLEN); | ||
1136 | radar_1 |= SM(conf->pulse_inband_step, AR_PHY_RADAR_1_RELSTEP_THRESH); | ||
1137 | radar_1 |= SM(conf->radar_inband, AR_PHY_RADAR_1_RELPWR_THRESH); | ||
1138 | |||
1139 | REG_WRITE(ah, AR_PHY_RADAR_0, radar_0); | ||
1140 | REG_WRITE(ah, AR_PHY_RADAR_1, radar_1); | ||
1141 | if (conf->ext_channel) | ||
1142 | REG_SET_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); | ||
1143 | else | ||
1144 | REG_CLR_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA); | ||
1145 | } | ||
1146 | |||
1116 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | 1147 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah) |
1117 | { | 1148 | { |
1118 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | 1149 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); |
@@ -1141,6 +1172,7 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | |||
1141 | priv_ops->ani_control = ar9003_hw_ani_control; | 1172 | priv_ops->ani_control = ar9003_hw_ani_control; |
1142 | priv_ops->do_getnf = ar9003_hw_do_getnf; | 1173 | priv_ops->do_getnf = ar9003_hw_do_getnf; |
1143 | priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; | 1174 | priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; |
1175 | priv_ops->set_radar_params = ar9003_hw_set_radar_params; | ||
1144 | 1176 | ||
1145 | ar9003_hw_set_nf_limits(ah); | 1177 | ar9003_hw_set_nf_limits(ah); |
1146 | memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs)); | 1178 | memcpy(ah->nf_regs, ar9300_cca_regs, sizeof(ah->nf_regs)); |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 15f51c8943a1..c20a5421f870 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -485,6 +485,40 @@ struct ath_hw_antcomb_conf { | |||
485 | }; | 485 | }; |
486 | 486 | ||
487 | /** | 487 | /** |
488 | * struct ath_hw_radar_conf - radar detection initialization parameters | ||
489 | * | ||
490 | * @pulse_inband: threshold for checking the ratio of in-band power | ||
491 | * to total power for short radar pulses (half dB steps) | ||
492 | * @pulse_inband_step: threshold for checking an in-band power to total | ||
493 | * power ratio increase for short radar pulses (half dB steps) | ||
494 | * @pulse_height: threshold for detecting the beginning of a short | ||
495 | * radar pulse (dB step) | ||
496 | * @pulse_rssi: threshold for detecting if a short radar pulse is | ||
497 | * gone (dB step) | ||
498 | * @pulse_maxlen: maximum pulse length (0.8 us steps) | ||
499 | * | ||
500 | * @radar_rssi: RSSI threshold for starting long radar detection (dB steps) | ||
501 | * @radar_inband: threshold for checking the ratio of in-band power | ||
502 | * to total power for long radar pulses (half dB steps) | ||
503 | * @fir_power: threshold for detecting the end of a long radar pulse (dB) | ||
504 | * | ||
505 | * @ext_channel: enable extension channel radar detection | ||
506 | */ | ||
507 | struct ath_hw_radar_conf { | ||
508 | unsigned int pulse_inband; | ||
509 | unsigned int pulse_inband_step; | ||
510 | unsigned int pulse_height; | ||
511 | unsigned int pulse_rssi; | ||
512 | unsigned int pulse_maxlen; | ||
513 | |||
514 | unsigned int radar_rssi; | ||
515 | unsigned int radar_inband; | ||
516 | int fir_power; | ||
517 | |||
518 | bool ext_channel; | ||
519 | }; | ||
520 | |||
521 | /** | ||
488 | * struct ath_hw_private_ops - callbacks used internally by hardware code | 522 | * struct ath_hw_private_ops - callbacks used internally by hardware code |
489 | * | 523 | * |
490 | * This structure contains private callbacks designed to only be used internally | 524 | * This structure contains private callbacks designed to only be used internally |
@@ -549,6 +583,8 @@ struct ath_hw_private_ops { | |||
549 | bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd, | 583 | bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd, |
550 | int param); | 584 | int param); |
551 | void (*do_getnf)(struct ath_hw *ah, int16_t nfarray[NUM_NF_READINGS]); | 585 | void (*do_getnf)(struct ath_hw *ah, int16_t nfarray[NUM_NF_READINGS]); |
586 | void (*set_radar_params)(struct ath_hw *ah, | ||
587 | struct ath_hw_radar_conf *conf); | ||
552 | 588 | ||
553 | /* ANI */ | 589 | /* ANI */ |
554 | void (*ani_cache_ini_regs)(struct ath_hw *ah); | 590 | void (*ani_cache_ini_regs)(struct ath_hw *ah); |