ath9k: simplify btcoex profile management

This patch simplifies profile management utility functions.

* Separate find_profile from add/del functions
* Return correct values when the profile list is empty or
  profile is ot found
* flush the profiles when there are entries in the list

Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Rajkumar Manoharan 2012-06-11 12:19:36 +05:30 committed by John W. Linville
parent 92a33298e9
commit 9e2e0c8469
1 changed files with 24 additions and 24 deletions

View File

@ -28,12 +28,15 @@ ath_mci_find_profile(struct ath_mci_profile *mci,
{ {
struct ath_mci_profile_info *entry; struct ath_mci_profile_info *entry;
if (list_empty(&mci->info))
return NULL;
list_for_each_entry(entry, &mci->info, list) { list_for_each_entry(entry, &mci->info, list) {
if (entry->conn_handle == info->conn_handle) if (entry->conn_handle == info->conn_handle)
break;
}
return entry; return entry;
} }
return NULL;
}
static bool ath_mci_add_profile(struct ath_common *common, static bool ath_mci_add_profile(struct ath_common *common,
struct ath_mci_profile *mci, struct ath_mci_profile *mci,
@ -49,31 +52,21 @@ static bool ath_mci_add_profile(struct ath_common *common,
(info->type != MCI_GPM_COEX_PROFILE_VOICE)) (info->type != MCI_GPM_COEX_PROFILE_VOICE))
return false; return false;
entry = ath_mci_find_profile(mci, info);
if (entry) {
memcpy(entry, info, 10);
} else {
entry = kzalloc(sizeof(*entry), GFP_KERNEL); entry = kzalloc(sizeof(*entry), GFP_KERNEL);
if (!entry) if (!entry)
return false; return false;
memcpy(entry, info, 10); memcpy(entry, info, 10);
INC_PROF(mci, info); INC_PROF(mci, info);
list_add_tail(&info->list, &mci->info); list_add_tail(&entry->list, &mci->info);
}
return true; return true;
} }
static void ath_mci_del_profile(struct ath_common *common, static void ath_mci_del_profile(struct ath_common *common,
struct ath_mci_profile *mci, struct ath_mci_profile *mci,
struct ath_mci_profile_info *info) struct ath_mci_profile_info *entry)
{ {
struct ath_mci_profile_info *entry;
entry = ath_mci_find_profile(mci, info);
if (!entry) if (!entry)
return; return;
@ -86,12 +79,16 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci)
{ {
struct ath_mci_profile_info *info, *tinfo; struct ath_mci_profile_info *info, *tinfo;
mci->aggr_limit = 0;
if (list_empty(&mci->info))
return;
list_for_each_entry_safe(info, tinfo, &mci->info, list) { list_for_each_entry_safe(info, tinfo, &mci->info, list) {
list_del(&info->list); list_del(&info->list);
DEC_PROF(mci, info); DEC_PROF(mci, info);
kfree(info); kfree(info);
} }
mci->aggr_limit = 0;
} }
static void ath_mci_adjust_aggr_limit(struct ath_btcoex *btcoex) static void ath_mci_adjust_aggr_limit(struct ath_btcoex *btcoex)
@ -229,12 +226,17 @@ static void ath_mci_process_profile(struct ath_softc *sc,
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_btcoex *btcoex = &sc->btcoex; struct ath_btcoex *btcoex = &sc->btcoex;
struct ath_mci_profile *mci = &btcoex->mci; struct ath_mci_profile *mci = &btcoex->mci;
struct ath_mci_profile_info *entry = NULL;
entry = ath_mci_find_profile(mci, info);
if (entry)
memcpy(entry, info, 10);
if (info->start) { if (info->start) {
if (!ath_mci_add_profile(common, mci, info)) if (!entry && !ath_mci_add_profile(common, mci, info))
return; return;
} else } else
ath_mci_del_profile(common, mci, info); ath_mci_del_profile(common, mci, entry);
btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD; btcoex->btcoex_period = ATH_MCI_DEF_BT_PERIOD;
mci->aggr_limit = mci->num_sco ? 6 : 0; mci->aggr_limit = mci->num_sco ? 6 : 0;
@ -263,8 +265,6 @@ static void ath_mci_process_status(struct ath_softc *sc,
if (status->is_link) if (status->is_link)
return; return;
memset(&info, 0, sizeof(struct ath_mci_profile_info));
info.conn_handle = status->conn_handle; info.conn_handle = status->conn_handle;
if (ath_mci_find_profile(mci, &info)) if (ath_mci_find_profile(mci, &info))
return; return;