On Tuesday 17 May 2011 05:08 PM, Mohammed Shajakhan wrote: > On Tuesday 17 May 2011 04:43 PM, Vivek Natarajan wrote: >> On Tue, May 17, 2011 at 3:59 PM, Mohammed Shafi Shajakhan >> <mshajak...@atheros.com> wrote: >>> From: Mohammed Shafi Shajakhan<mshajak...@atheros.com> >>> >>> this requires complete testing, disabling seems to work fine but >>> renabling does seems to be complete >>> >>> Signed-off-by: Mohammed Shafi Shajakhan<mshajak...@atheros.com> >>> diff --git a/drivers/net/wireless/ath/ath9k/debug.c >>> b/drivers/net/wireless/ath/ath9k/debug.c >>> index 7afe332..6c9f6bb 100644 >>> --- a/drivers/net/wireless/ath/ath9k/debug.c >>> +++ b/drivers/net/wireless/ath/ath9k/debug.c >>> @@ -176,6 +176,56 @@ static const struct file_operations fops_rx_chainmask >>> = { >>> .llseek = default_llseek, >>> }; >>> >>> +static ssize_t read_file_disable_ani(struct file *file, char __user >>> *user_buf, >>> + size_t count, loff_t *ppos) >>> +{ >>> + struct ath_softc *sc = file->private_data; >>> + struct ath_common *common = ath9k_hw_common(sc->sc_ah); >>> + char buf[32]; >>> + unsigned int len; >>> + >>> + len = sprintf(buf, "%1d\n", common->disable_ani); >>> + return simple_read_from_buffer(user_buf, count, ppos, buf, len); >>> +} >>> + >>> +static ssize_t write_file_disable_ani(struct file *file, >>> + const char __user *user_buf, size_t count, loff_t *ppos) >>> +{ >>> + struct ath_softc *sc = file->private_data; >>> + struct ath_common *common = ath9k_hw_common(sc->sc_ah); >>> + unsigned long disable_ani; >>> + char buf[32]; >>> + ssize_t len; >>> + >>> + len = min(count, sizeof(buf) - 1); >>> + if (copy_from_user(buf, user_buf, len)) >>> + return -EFAULT; >>> + >>> + buf[len] = '\0'; >>> + if (strict_strtoul(buf, 0,&disable_ani)) >>> + return -EINVAL; >>> + >>> + common->disable_ani = !!(disable_ani); >>> + >>> + if (disable_ani) { >>> + sc->sc_flags&= ~SC_OP_ANI_RUN; >>> + del_timer_sync(&common->ani.timer); >>> + } >>> + >>> + else >>> + setup_timer(&common->ani.timer, ath_ani_calibrate, >>> + (unsigned long)sc); >> >> For restarting the timer, you need to do mod_timer and not setup_timer. > > Thanks! I will change that > >> >>> + >>> + return count; >>> +} >>> + >>> +static const struct file_operations fops_disable_ani = { >>> + .read = read_file_disable_ani, >>> + .write = write_file_disable_ani, >>> + .open = ath9k_debugfs_open, >>> + .owner = THIS_MODULE, >>> + .llseek = default_llseek, >>> +}; >>> >>> static ssize_t read_file_dma(struct file *file, char __user *user_buf, >>> size_t count, loff_t *ppos) >>> @@ -1160,6 +1210,8 @@ int ath9k_init_debug(struct ath_hw *ah) >>> sc->debug.debugfs_phy, sc,&fops_rx_chainmask); >>> debugfs_create_file("tx_chainmask", S_IRUSR | S_IWUSR, >>> sc->debug.debugfs_phy, sc,&fops_tx_chainmask); >>> + debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR, >>> + sc->debug.debugfs_phy, sc,&fops_disable_ani); >>> debugfs_create_file("regidx", S_IRUSR | S_IWUSR, >>> sc->debug.debugfs_phy, >>> sc,&fops_regidx); >>> debugfs_create_file("regval", S_IRUSR | S_IWUSR, >>> sc->debug.debugfs_phy, >>> diff --git a/drivers/net/wireless/ath/ath9k/init.c >>> b/drivers/net/wireless/ath/ath9k/init.c >>> index b172d15..bf8ac4e 100644 >>> --- a/drivers/net/wireless/ath/ath9k/init.c >>> +++ b/drivers/net/wireless/ath/ath9k/init.c >>> @@ -519,8 +519,9 @@ static void ath9k_init_misc(struct ath_softc *sc) >>> { >>> struct ath_common *common = ath9k_hw_common(sc->sc_ah); >>> int i = 0; >>> - >>> - setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned >>> long)sc); >>> + if (!(common->disable_ani)) >>> + setup_timer(&common->ani.timer, >>> + ath_ani_calibrate, (unsigned long)sc); >> >> This need not depend on disable_ani since you can stop/restart using >> del_timer and mod_timer. > > incase of disabling ANI completely right from the start by hardcoding > disable_ani true in driver initialization, I thought this might help.. > if this looks redundant I will revert it back. > >> >>> >>> sc->config.txpowlimit = ATH_TXPOWER_MAX; >>> >>> @@ -585,6 +586,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc >>> *sc, u16 subsysid, >>> common->priv = sc; >>> common->debug_mask = ath9k_debug; >>> common->btcoex_enabled = ath9k_btcoex_enable == 1; >>> + common->disable_ani = false; >>> spin_lock_init(&common->cc_lock); >>> >>> spin_lock_init(&sc->sc_serial_rw); >>> diff --git a/drivers/net/wireless/ath/ath9k/main.c >>> b/drivers/net/wireless/ath/ath9k/main.c >>> index 17ebdf1..1ac7c67 100644 >>> --- a/drivers/net/wireless/ath/ath9k/main.c >>> +++ b/drivers/net/wireless/ath/ath9k/main.c >>> @@ -235,7 +235,8 @@ int ath_set_channel(struct ath_softc *sc, struct >>> ieee80211_hw *hw, >>> >>> sc->hw_busy_count = 0; >>> >>> - del_timer_sync(&common->ani.timer); >>> + if (!(common->disable_ani)) >>> + del_timer_sync(&common->ani.timer); >>> cancel_work_sync(&sc->paprd_work); >>> cancel_work_sync(&sc->hw_check_work); >>> cancel_delayed_work_sync(&sc->tx_complete_work); >>> @@ -302,7 +303,8 @@ int ath_set_channel(struct ath_softc *sc, struct >>> ieee80211_hw *hw, >>> ath_set_beacon(sc); >>> ieee80211_queue_delayed_work(sc->hw,&sc->tx_complete_work, >>> 0); >>> ieee80211_queue_delayed_work(sc->hw,&sc->hw_pll_work, >>> HZ/2); >>> - ath_start_ani(common); >>> + if (!(common->disable_ani)) >>> + ath_start_ani(common); >> >> The same applies here. If the requirement is just to stop/restart >> dynamically during runtime, ani initialisation need not depend on >> disable_ani. > > as you had later suggested, this looks fine. > > > Thanks a lot for the review! I will change the setup_timer to mod_timer > and this will fix the ANI getting restarted properly. > >>
did not help in perfectly re starting the ANI, still I am missing something, i need to look into it more >> Vivek. >> . >> > . > _______________________________________________ ath9k-devel mailing list ath9k-devel@lists.ath9k.org https://lists.ath9k.org/mailman/listinfo/ath9k-devel