Mathieu Slabbinck
2016-09-07 20:07:47 UTC
Hi,
I was looking into the TX99 module recently and found that it was not
always starting properly.
If for example echo 1 > tx99 is done, the wireless module would not start
transmitting in all attempts. Even though a cat of tx99 is responding with
1.
Do the same command again (without modifying anything else) and the odds
increase of the module starting to transmit...
Since this was something annoying, I was investigating the write_file_tx99
function which seems to be the cause of the improper handling.
I've created the patch below and it responds much more reliable. Each
request is properly sending out RF waves.
--- a/drivers/net/wireless/ath/ath9k/tx99.c
+++ b/drivers/net/wireless/ath/ath9k/tx99.c
@@ -191,23 +191,14 @@ static ssize_t write_file_tx99(struct file *file,
const char __user *user_buf,
if (strtobool(buf, &start))
return -EINVAL;
- if (start == sc->tx99_state) {
- if (!start)
- return count;
- ath_dbg(common, XMIT, "Resetting TX99\n");
- ath9k_tx99_deinit(sc);
- }
-
- if (!start) {
- ath9k_tx99_deinit(sc);
- return count;
- }
-
- r = ath9k_tx99_init(sc);
- if (r)
- return r;
-
- return count;
+ if (start) {
+ ath9k_tx99_deinit(sc);
+ r = ath9k_tx99_init(sc);
+ }
+ else {
+ ath9k_tx99_deinit(sc);
+ }
+ return count;
}
I'm now just wondering if anyone knows why this piece of code was made this
way the first place, as I'm sure it had a purpose...
Kr
Mathieu
I was looking into the TX99 module recently and found that it was not
always starting properly.
If for example echo 1 > tx99 is done, the wireless module would not start
transmitting in all attempts. Even though a cat of tx99 is responding with
1.
Do the same command again (without modifying anything else) and the odds
increase of the module starting to transmit...
Since this was something annoying, I was investigating the write_file_tx99
function which seems to be the cause of the improper handling.
I've created the patch below and it responds much more reliable. Each
request is properly sending out RF waves.
--- a/drivers/net/wireless/ath/ath9k/tx99.c
+++ b/drivers/net/wireless/ath/ath9k/tx99.c
@@ -191,23 +191,14 @@ static ssize_t write_file_tx99(struct file *file,
const char __user *user_buf,
if (strtobool(buf, &start))
return -EINVAL;
- if (start == sc->tx99_state) {
- if (!start)
- return count;
- ath_dbg(common, XMIT, "Resetting TX99\n");
- ath9k_tx99_deinit(sc);
- }
-
- if (!start) {
- ath9k_tx99_deinit(sc);
- return count;
- }
-
- r = ath9k_tx99_init(sc);
- if (r)
- return r;
-
- return count;
+ if (start) {
+ ath9k_tx99_deinit(sc);
+ r = ath9k_tx99_init(sc);
+ }
+ else {
+ ath9k_tx99_deinit(sc);
+ }
+ return count;
}
I'm now just wondering if anyone knows why this piece of code was made this
way the first place, as I'm sure it had a purpose...
Kr
Mathieu