Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca21cfde authored by Zefir Kurtisi's avatar Zefir Kurtisi Committed by John W. Linville
Browse files

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: default avatarZefir Kurtisi <zefir.kurtisi@neratec.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7e9dafd8
Loading
Loading
Loading
Loading
+0 −6
Original line number Original line Diff line number Diff line
@@ -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.
+24 −19
Original line number Original line Diff line number Diff line
@@ -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;
}
}
+4 −2
Original line number Original line Diff line number Diff line
@@ -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;
}
}
+9 −37
Original line number Original line Diff line number Diff line
@@ -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);
+25 −2
Original line number Original line Diff line number Diff line
@@ -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 */
Loading