ath9k: change DFS logging to use ath_dbg()
The DFS pattern detector was initially planned to reside on a higher layer and used generic pr_*() logging functions. Being part of ath9k, use ath_dbg() instead and make DFS log ouput selectable via ATH_DBG_DFS (0x20000) at runtime. This patch does not contain functional modifications. Signed-off-by: Zefir Kurtisi <zefir.kurtisi@neratec.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
7e9dafd873
commit
ca21cfde84
@@ -55,12 +55,6 @@ ath9k_postprocess_radar_event(struct ath_softc *sc,
|
|||||||
u8 rssi;
|
u8 rssi;
|
||||||
u16 dur;
|
u16 dur;
|
||||||
|
|
||||||
ath_dbg(ath9k_hw_common(sc->sc_ah), DFS,
|
|
||||||
"pulse_bw_info=0x%x, pri,ext len/rssi=(%u/%u, %u/%u)\n",
|
|
||||||
ard->pulse_bw_info,
|
|
||||||
ard->pulse_length_pri, ard->rssi,
|
|
||||||
ard->pulse_length_ext, ard->ext_rssi);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only the last 2 bits of the BW info are relevant, they indicate
|
* Only the last 2 bits of the BW info are relevant, they indicate
|
||||||
* which channel the radar was detected in.
|
* which channel the radar was detected in.
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "dfs_pattern_detector.h"
|
#include "dfs_pattern_detector.h"
|
||||||
#include "dfs_pri_detector.h"
|
#include "dfs_pri_detector.h"
|
||||||
|
#include "ath9k.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tolerated deviation of radar time stamp in usecs on both sides
|
* tolerated deviation of radar time stamp in usecs on both sides
|
||||||
@@ -142,6 +143,7 @@ channel_detector_create(struct dfs_pattern_detector *dpd, u16 freq)
|
|||||||
{
|
{
|
||||||
u32 sz, i;
|
u32 sz, i;
|
||||||
struct channel_detector *cd;
|
struct channel_detector *cd;
|
||||||
|
struct ath_common *common = ath9k_hw_common(dpd->ah);
|
||||||
|
|
||||||
cd = kmalloc(sizeof(*cd), GFP_KERNEL);
|
cd = kmalloc(sizeof(*cd), GFP_KERNEL);
|
||||||
if (cd == NULL)
|
if (cd == NULL)
|
||||||
@@ -165,7 +167,8 @@ channel_detector_create(struct dfs_pattern_detector *dpd, u16 freq)
|
|||||||
return cd;
|
return cd;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
pr_err("failed to allocate channel_detector for freq=%d\n", freq);
|
ath_dbg(common, DFS,
|
||||||
|
"failed to allocate channel_detector for freq=%d\n", freq);
|
||||||
channel_detector_exit(dpd, cd);
|
channel_detector_exit(dpd, cd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -216,34 +219,34 @@ static bool
|
|||||||
dpd_add_pulse(struct dfs_pattern_detector *dpd, struct pulse_event *event)
|
dpd_add_pulse(struct dfs_pattern_detector *dpd, struct pulse_event *event)
|
||||||
{
|
{
|
||||||
u32 i;
|
u32 i;
|
||||||
bool ts_wraparound;
|
|
||||||
struct channel_detector *cd;
|
struct channel_detector *cd;
|
||||||
|
|
||||||
if (dpd->region == NL80211_DFS_UNSET) {
|
|
||||||
/*
|
/*
|
||||||
* pulses received for a non-supported or un-initialized
|
* pulses received for a non-supported or un-initialized
|
||||||
* domain are treated as detected radars
|
* domain are treated as detected radars for fail-safety
|
||||||
*/
|
*/
|
||||||
|
if (dpd->region == NL80211_DFS_UNSET)
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
cd = channel_detector_get(dpd, event->freq);
|
cd = channel_detector_get(dpd, event->freq);
|
||||||
if (cd == NULL)
|
if (cd == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ts_wraparound = (event->ts < dpd->last_pulse_ts);
|
|
||||||
dpd->last_pulse_ts = event->ts;
|
dpd->last_pulse_ts = event->ts;
|
||||||
if (ts_wraparound) {
|
/* reset detector on time stamp wraparound, caused by TSF reset */
|
||||||
/*
|
if (event->ts < dpd->last_pulse_ts)
|
||||||
* reset detector on time stamp wraparound
|
|
||||||
* with monotonic time stamps, this should never happen
|
|
||||||
*/
|
|
||||||
pr_warn("DFS: time stamp wraparound detected, resetting\n");
|
|
||||||
dpd_reset(dpd);
|
dpd_reset(dpd);
|
||||||
}
|
|
||||||
/* do type individual pattern matching */
|
/* do type individual pattern matching */
|
||||||
for (i = 0; i < dpd->num_radar_types; i++) {
|
for (i = 0; i < dpd->num_radar_types; i++) {
|
||||||
if (cd->detectors[i]->add_pulse(cd->detectors[i], event) != 0) {
|
struct pri_detector *pd = cd->detectors[i];
|
||||||
|
struct pri_sequence *ps = pd->add_pulse(pd, event);
|
||||||
|
if (ps != NULL) {
|
||||||
|
ath_dbg(ath9k_hw_common(dpd->ah), DFS,
|
||||||
|
"DFS: radar found on freq=%d: id=%d, pri=%d, "
|
||||||
|
"count=%d, count_false=%d\n",
|
||||||
|
event->freq, pd->rs->type_id,
|
||||||
|
ps->pri, ps->count, ps->count_falses);
|
||||||
channel_detector_reset(dpd, cd);
|
channel_detector_reset(dpd, cd);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -285,9 +288,10 @@ static struct dfs_pattern_detector default_dpd = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct dfs_pattern_detector *
|
struct dfs_pattern_detector *
|
||||||
dfs_pattern_detector_init(enum nl80211_dfs_regions region)
|
dfs_pattern_detector_init(struct ath_hw *ah, enum nl80211_dfs_regions region)
|
||||||
{
|
{
|
||||||
struct dfs_pattern_detector *dpd;
|
struct dfs_pattern_detector *dpd;
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
|
||||||
dpd = kmalloc(sizeof(*dpd), GFP_KERNEL);
|
dpd = kmalloc(sizeof(*dpd), GFP_KERNEL);
|
||||||
if (dpd == NULL)
|
if (dpd == NULL)
|
||||||
@@ -296,10 +300,11 @@ dfs_pattern_detector_init(enum nl80211_dfs_regions region)
|
|||||||
*dpd = default_dpd;
|
*dpd = default_dpd;
|
||||||
INIT_LIST_HEAD(&dpd->channel_detectors);
|
INIT_LIST_HEAD(&dpd->channel_detectors);
|
||||||
|
|
||||||
|
dpd->ah = ah;
|
||||||
if (dpd->set_dfs_domain(dpd, region))
|
if (dpd->set_dfs_domain(dpd, region))
|
||||||
return dpd;
|
return dpd;
|
||||||
|
|
||||||
pr_err("Could not set DFS domain to %d. ", region);
|
ath_dbg(common, DFS,"Could not set DFS domain to %d", region);
|
||||||
kfree(dpd);
|
kfree(dpd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ struct dfs_pattern_detector {
|
|||||||
enum nl80211_dfs_regions region;
|
enum nl80211_dfs_regions region;
|
||||||
u8 num_radar_types;
|
u8 num_radar_types;
|
||||||
u64 last_pulse_ts;
|
u64 last_pulse_ts;
|
||||||
|
/* needed for ath_dbg() */
|
||||||
|
struct ath_hw *ah;
|
||||||
|
|
||||||
const struct radar_detector_specs *radar_spec;
|
const struct radar_detector_specs *radar_spec;
|
||||||
struct list_head channel_detectors;
|
struct list_head channel_detectors;
|
||||||
@@ -92,10 +94,10 @@ struct dfs_pattern_detector {
|
|||||||
*/
|
*/
|
||||||
#if defined(CONFIG_ATH9K_DFS_CERTIFIED)
|
#if defined(CONFIG_ATH9K_DFS_CERTIFIED)
|
||||||
extern struct dfs_pattern_detector *
|
extern struct dfs_pattern_detector *
|
||||||
dfs_pattern_detector_init(enum nl80211_dfs_regions region);
|
dfs_pattern_detector_init(struct ath_hw *ah, enum nl80211_dfs_regions region);
|
||||||
#else
|
#else
|
||||||
static inline struct dfs_pattern_detector *
|
static inline struct dfs_pattern_detector *
|
||||||
dfs_pattern_detector_init(enum nl80211_dfs_regions region)
|
dfs_pattern_detector_init(struct ath_hw *ah, enum nl80211_dfs_regions region)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,28 +22,6 @@
|
|||||||
#include "dfs_pri_detector.h"
|
#include "dfs_pri_detector.h"
|
||||||
#include "dfs_debug.h"
|
#include "dfs_debug.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* struct pri_sequence - sequence of pulses matching one PRI
|
|
||||||
* @head: list_head
|
|
||||||
* @pri: pulse repetition interval (PRI) in usecs
|
|
||||||
* @dur: duration of sequence in usecs
|
|
||||||
* @count: number of pulses in this sequence
|
|
||||||
* @count_falses: number of not matching pulses in this sequence
|
|
||||||
* @first_ts: time stamp of first pulse in usecs
|
|
||||||
* @last_ts: time stamp of last pulse in usecs
|
|
||||||
* @deadline_ts: deadline when this sequence becomes invalid (first_ts + dur)
|
|
||||||
*/
|
|
||||||
struct pri_sequence {
|
|
||||||
struct list_head head;
|
|
||||||
u32 pri;
|
|
||||||
u32 dur;
|
|
||||||
u32 count;
|
|
||||||
u32 count_falses;
|
|
||||||
u64 first_ts;
|
|
||||||
u64 last_ts;
|
|
||||||
u64 deadline_ts;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct pulse_elem - elements in pulse queue
|
* struct pulse_elem - elements in pulse queue
|
||||||
* @ts: time stamp in usecs
|
* @ts: time stamp in usecs
|
||||||
@@ -393,7 +371,7 @@ static void pri_detector_exit(struct pri_detector *de)
|
|||||||
kfree(de);
|
kfree(de);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pri_detector_add_pulse(struct pri_detector *de,
|
static struct pri_sequence *pri_detector_add_pulse(struct pri_detector *de,
|
||||||
struct pulse_event *event)
|
struct pulse_event *event)
|
||||||
{
|
{
|
||||||
u32 max_updated_seq;
|
u32 max_updated_seq;
|
||||||
@@ -403,35 +381,29 @@ static bool pri_detector_add_pulse(struct pri_detector *de,
|
|||||||
|
|
||||||
/* ignore pulses not within width range */
|
/* ignore pulses not within width range */
|
||||||
if ((rs->width_min > event->width) || (rs->width_max < event->width))
|
if ((rs->width_min > event->width) || (rs->width_max < event->width))
|
||||||
return false;
|
return NULL;
|
||||||
|
|
||||||
if ((ts - de->last_ts) < rs->max_pri_tolerance)
|
if ((ts - de->last_ts) < rs->max_pri_tolerance)
|
||||||
/* if delta to last pulse is too short, don't use this pulse */
|
/* if delta to last pulse is too short, don't use this pulse */
|
||||||
return false;
|
return NULL;
|
||||||
de->last_ts = ts;
|
de->last_ts = ts;
|
||||||
|
|
||||||
max_updated_seq = pseq_handler_add_to_existing_seqs(de, ts);
|
max_updated_seq = pseq_handler_add_to_existing_seqs(de, ts);
|
||||||
|
|
||||||
if (!pseq_handler_create_sequences(de, ts, max_updated_seq)) {
|
if (!pseq_handler_create_sequences(de, ts, max_updated_seq)) {
|
||||||
pr_err("failed to create pulse sequences\n");
|
|
||||||
pri_detector_reset(de, ts);
|
pri_detector_reset(de, ts);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ps = pseq_handler_check_detection(de);
|
ps = pseq_handler_check_detection(de);
|
||||||
|
|
||||||
if (ps != NULL) {
|
if (ps == NULL)
|
||||||
pr_info("DFS: radar found: pri=%d, count=%d, count_false=%d\n",
|
|
||||||
ps->pri, ps->count, ps->count_falses);
|
|
||||||
pri_detector_reset(de, ts);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
pulse_queue_enqueue(de, ts);
|
pulse_queue_enqueue(de, ts);
|
||||||
return false;
|
|
||||||
|
return ps;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pri_detector *
|
struct pri_detector *pri_detector_init(const struct radar_detector_specs *rs)
|
||||||
pri_detector_init(const struct radar_detector_specs *rs)
|
|
||||||
{
|
{
|
||||||
struct pri_detector *de;
|
struct pri_detector *de;
|
||||||
de = kzalloc(sizeof(*de), GFP_KERNEL);
|
de = kzalloc(sizeof(*de), GFP_KERNEL);
|
||||||
|
|||||||
@@ -19,10 +19,32 @@
|
|||||||
|
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct pri_sequence - sequence of pulses matching one PRI
|
||||||
|
* @head: list_head
|
||||||
|
* @pri: pulse repetition interval (PRI) in usecs
|
||||||
|
* @dur: duration of sequence in usecs
|
||||||
|
* @count: number of pulses in this sequence
|
||||||
|
* @count_falses: number of not matching pulses in this sequence
|
||||||
|
* @first_ts: time stamp of first pulse in usecs
|
||||||
|
* @last_ts: time stamp of last pulse in usecs
|
||||||
|
* @deadline_ts: deadline when this sequence becomes invalid (first_ts + dur)
|
||||||
|
*/
|
||||||
|
struct pri_sequence {
|
||||||
|
struct list_head head;
|
||||||
|
u32 pri;
|
||||||
|
u32 dur;
|
||||||
|
u32 count;
|
||||||
|
u32 count_falses;
|
||||||
|
u64 first_ts;
|
||||||
|
u64 last_ts;
|
||||||
|
u64 deadline_ts;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct pri_detector - PRI detector element for a dedicated radar type
|
* struct pri_detector - PRI detector element for a dedicated radar type
|
||||||
* @exit(): destructor
|
* @exit(): destructor
|
||||||
* @add_pulse(): add pulse event, returns true if pattern was detected
|
* @add_pulse(): add pulse event, returns pri_sequence if pattern was detected
|
||||||
* @reset(): clear states and reset to given time stamp
|
* @reset(): clear states and reset to given time stamp
|
||||||
* @rs: detector specs for this detector element
|
* @rs: detector specs for this detector element
|
||||||
* @last_ts: last pulse time stamp considered for this element in usecs
|
* @last_ts: last pulse time stamp considered for this element in usecs
|
||||||
@@ -34,7 +56,8 @@
|
|||||||
*/
|
*/
|
||||||
struct pri_detector {
|
struct pri_detector {
|
||||||
void (*exit) (struct pri_detector *de);
|
void (*exit) (struct pri_detector *de);
|
||||||
bool (*add_pulse)(struct pri_detector *de, struct pulse_event *e);
|
struct pri_sequence *
|
||||||
|
(*add_pulse)(struct pri_detector *de, struct pulse_event *e);
|
||||||
void (*reset) (struct pri_detector *de, u64 ts);
|
void (*reset) (struct pri_detector *de, u64 ts);
|
||||||
|
|
||||||
/* private: internal use only */
|
/* private: internal use only */
|
||||||
|
|||||||
@@ -577,7 +577,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
|||||||
atomic_set(&ah->intr_ref_cnt, -1);
|
atomic_set(&ah->intr_ref_cnt, -1);
|
||||||
sc->sc_ah = ah;
|
sc->sc_ah = ah;
|
||||||
|
|
||||||
sc->dfs_detector = dfs_pattern_detector_init(NL80211_DFS_UNSET);
|
sc->dfs_detector = dfs_pattern_detector_init(ah, NL80211_DFS_UNSET);
|
||||||
|
|
||||||
if (!pdata) {
|
if (!pdata) {
|
||||||
ah->ah_flags |= AH_USE_EEPROM;
|
ah->ah_flags |= AH_USE_EEPROM;
|
||||||
|
|||||||
Reference in New Issue
Block a user