2010-09-17 13:01:33

by Mohammed Shafi Shajakhan

[permalink] [raw]
Subject: [PATCH] ath9k : Fix for displaying the channel number

From: Mohammed Shafi Shajakhan <[email protected]>

In the ath9k debugging feature 'wiphy' the current channel used by the
station is incorrectly displayed.This is because the channels available
are sequentially mapped from numbers 0 to 37.This mapping cannot be
changed as the channel number is also used as an index for an array of
structures in struct ath9k_channel channels[38] .
This fix solves the above problem by calculating the channel
number from center frequency.

Signed-off-by: Mohammed Shafi Shajakhan
<[email protected]>
---
drivers/net/wireless/ath/ath9k/debug.c | 21 +++++++++++++++++++--
1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index 54aae93..368895a 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -26,6 +26,22 @@

static struct dentry *ath9k_debugfs_root;

+static inline int center_freq_to_channel(struct ath_wiphy *aphy)
+{
+ struct ieee80211_channel *chan = aphy->hw->conf.channel ;
+
+ if (chan->center_freq == 2484) {
+ return 14;
+ }
+
+ if (chan->center_freq < 2484) {
+ return (chan->center_freq -2407) / 5;
+ }
+
+ return (chan->center_freq - 5000) / 5;
+
+}
+
static int ath9k_debugfs_open(struct inode *inode, struct file *file)
{
file->private_data = inode->i_private;
@@ -488,6 +504,7 @@ static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos)
{
struct ath_softc *sc = file->private_data;
+ struct ath_wiphy *aphy =sc->pri_wiphy ;
char buf[512];
unsigned int len = 0;
int i;
@@ -497,7 +514,7 @@ static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
"primary: %s (%s chan=%d ht=%d)\n",
wiphy_name(sc->pri_wiphy->hw->wiphy),
ath_wiphy_state_str(sc->pri_wiphy->state),
- sc->pri_wiphy->chan_idx, sc->pri_wiphy->chan_is_ht);
+ center_freq_to_channel(aphy), sc->pri_wiphy->chan_is_ht);
for (i = 0; i < sc->num_sec_wiphy; i++) {
struct ath_wiphy *aphy = sc->sec_wiphy[i];
if (aphy == NULL)
@@ -506,7 +523,7 @@ static ssize_t read_file_wiphy(struct file *file, char __user *user_buf,
"secondary: %s (%s chan=%d ht=%d)\n",
wiphy_name(aphy->hw->wiphy),
ath_wiphy_state_str(aphy->state),
- aphy->chan_idx, aphy->chan_is_ht);
+ center_freq_to_channel(aphy), aphy->chan_is_ht);
}

put_unaligned_le32(REG_READ_D(sc->sc_ah, AR_STA_ID0), addr);
--
1.7.0.4



2010-09-17 13:03:29

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] ath9k : Fix for displaying the channel number

On Fri, 2010-09-17 at 18:31 +0530, Mohammed Shafi Shajakhan wrote:

> +static inline int center_freq_to_channel(struct ath_wiphy *aphy)
> +{
> + struct ieee80211_channel *chan = aphy->hw->conf.channel ;
> +
> + if (chan->center_freq == 2484) {
> + return 14;
> + }
> +
> + if (chan->center_freq < 2484) {
> + return (chan->center_freq -2407) / 5;
> + }
> +
> + return (chan->center_freq - 5000) / 5;

This function already exists elsewhere in the kernel.

johannes