Instead of looking up an unused bss_num each time we add a virtual interface, associate a fixed bss_num to each priv and for simplicity just use the array index. With bss_num unique to each priv mwifiex_get_priv_by_id() doesn't need the bss_type argument anymore, so it's removed. Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- drivers/net/wireless/marvell/mwifiex/cfg80211.c | 11 ++--- drivers/net/wireless/marvell/mwifiex/cmdevt.c | 6 +-- drivers/net/wireless/marvell/mwifiex/main.c | 1 + drivers/net/wireless/marvell/mwifiex/main.h | 54 ++++-------------------- drivers/net/wireless/marvell/mwifiex/sta_event.c | 3 +- drivers/net/wireless/marvell/mwifiex/txrx.c | 9 ++-- 6 files changed, 19 insertions(+), 65 deletions(-) diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c index 784f342a9bf23..d5a2c8f726b9e 100644 --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c @@ -952,8 +952,6 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv, return -EOPNOTSUPP; } - priv->bss_num = mwifiex_get_unused_bss_num(adapter, priv->bss_type); - spin_lock_irqsave(&adapter->main_proc_lock, flags); adapter->main_locked = false; spin_unlock_irqrestore(&adapter->main_proc_lock, flags); @@ -2999,8 +2997,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy, return ERR_PTR(-EINVAL); } - priv = mwifiex_get_unused_priv_by_bss_type( - adapter, MWIFIEX_BSS_TYPE_STA); + priv = mwifiex_get_unused_priv(adapter); if (!priv) { mwifiex_dbg(adapter, ERROR, "could not get free private struct\n"); @@ -3029,8 +3026,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy, return ERR_PTR(-EINVAL); } - priv = mwifiex_get_unused_priv_by_bss_type( - adapter, MWIFIEX_BSS_TYPE_UAP); + priv = mwifiex_get_unused_priv(adapter); if (!priv) { mwifiex_dbg(adapter, ERROR, "could not get free private struct\n"); @@ -3056,8 +3052,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy, return ERR_PTR(-EINVAL); } - priv = mwifiex_get_unused_priv_by_bss_type( - adapter, MWIFIEX_BSS_TYPE_P2P); + priv = mwifiex_get_unused_priv(adapter); if (!priv) { mwifiex_dbg(adapter, ERROR, "could not get free private struct\n"); diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c index 4f814110f750e..d91351384c6bb 100644 --- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c +++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c @@ -496,8 +496,7 @@ int mwifiex_process_event(struct mwifiex_adapter *adapter) (u16) eventcause; /* Get BSS number and corresponding priv */ - priv = mwifiex_get_priv_by_id(adapter, EVENT_GET_BSS_NUM(eventcause), - EVENT_GET_BSS_TYPE(eventcause)); + priv = mwifiex_get_priv_by_id(adapter, EVENT_GET_BSS_NUM(eventcause)); if (!priv) priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); @@ -847,8 +846,7 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter) /* Get BSS number and corresponding priv */ priv = mwifiex_get_priv_by_id(adapter, - HostCmd_GET_BSS_NO(le16_to_cpu(resp->seq_num)), - HostCmd_GET_BSS_TYPE(le16_to_cpu(resp->seq_num))); + HostCmd_GET_BSS_NO(le16_to_cpu(resp->seq_num))); if (!priv) priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); /* Clear RET_BIT from HostCmd */ diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 7cb90a6a8ccab..888f2801d6f2a 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -85,6 +85,7 @@ static int mwifiex_register(void *card, struct device *dev, if (!adapter->priv[i]) goto error; + adapter->priv[i]->bss_num = i; adapter->priv[i]->adapter = adapter; adapter->priv_num++; } diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h index 541bc50a9561c..2938e55a38d79 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h @@ -1297,20 +1297,12 @@ mwifiex_copy_rates(u8 *dest, u32 pos, u8 *src, int len) * upon the BSS type and BSS number. */ static inline struct mwifiex_private * -mwifiex_get_priv_by_id(struct mwifiex_adapter *adapter, - u8 bss_num, u8 bss_type) +mwifiex_get_priv_by_id(struct mwifiex_adapter *adapter, u8 bss_num) { - int i; - - for (i = 0; i < adapter->priv_num; i++) { - if (adapter->priv[i]->bss_mode == NL80211_IFTYPE_UNSPECIFIED) - continue; + if (bss_num >= MWIFIEX_MAX_BSS_NUM) + return NULL; - if ((adapter->priv[i]->bss_num == bss_num) && - (adapter->priv[i]->bss_type == bss_type)) - break; - } - return ((i < adapter->priv_num) ? adapter->priv[i] : NULL); + return adapter->priv[bss_num]; } /* @@ -1332,47 +1324,19 @@ mwifiex_get_priv(struct mwifiex_adapter *adapter, return ((i < adapter->priv_num) ? adapter->priv[i] : NULL); } -/* - * This function checks available bss_num when adding new interface or - * changing interface type. - */ -static inline u8 -mwifiex_get_unused_bss_num(struct mwifiex_adapter *adapter, u8 bss_type) -{ - u8 i, j; - int index[MWIFIEX_MAX_BSS_NUM]; - - memset(index, 0, sizeof(index)); - for (i = 0; i < adapter->priv_num; i++) - if (adapter->priv[i]->bss_type == bss_type && - !(adapter->priv[i]->bss_mode == - NL80211_IFTYPE_UNSPECIFIED)) { - index[adapter->priv[i]->bss_num] = 1; - } - for (j = 0; j < MWIFIEX_MAX_BSS_NUM; j++) - if (!index[j]) - return j; - return -1; -} - /* * This function returns the first available unused private structure pointer. */ static inline struct mwifiex_private * -mwifiex_get_unused_priv_by_bss_type(struct mwifiex_adapter *adapter, - u8 bss_type) +mwifiex_get_unused_priv(struct mwifiex_adapter *adapter) { - u8 i; + int i; for (i = 0; i < adapter->priv_num; i++) - if (adapter->priv[i]->bss_mode == - NL80211_IFTYPE_UNSPECIFIED) { - adapter->priv[i]->bss_num = - mwifiex_get_unused_bss_num(adapter, bss_type); - break; - } + if (adapter->priv[i]->bss_mode == NL80211_IFTYPE_UNSPECIFIED) + return adapter->priv[i]; - return ((i < adapter->priv_num) ? adapter->priv[i] : NULL); + return NULL; } /* diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c b/drivers/net/wireless/marvell/mwifiex/sta_event.c index b5f3821a6a8f2..15f057d010a3d 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_event.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c @@ -456,8 +456,7 @@ void mwifiex_process_multi_chan_event(struct mwifiex_private *priv, for (i = 0; i < intf_num; i++) { bss_type = grp_info->bss_type_numlist[i] >> 4; bss_num = grp_info->bss_type_numlist[i] & BSS_NUM_MASK; - intf_priv = mwifiex_get_priv_by_id(adapter, bss_num, - bss_type); + intf_priv = mwifiex_get_priv_by_id(adapter, bss_num); if (!intf_priv) { mwifiex_dbg(adapter, ERROR, "Invalid bss_type bss_num\t" diff --git a/drivers/net/wireless/marvell/mwifiex/txrx.c b/drivers/net/wireless/marvell/mwifiex/txrx.c index f44e22f245110..21cfee3290377 100644 --- a/drivers/net/wireless/marvell/mwifiex/txrx.c +++ b/drivers/net/wireless/marvell/mwifiex/txrx.c @@ -31,8 +31,7 @@ int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter, local_rx_pd = (struct rxpd *) (skb->data); /* Get the BSS number from rxpd, get corresponding priv */ - priv = mwifiex_get_priv_by_id(adapter, local_rx_pd->bss_num & - BSS_NUM_MASK, local_rx_pd->bss_type); + priv = mwifiex_get_priv_by_id(adapter, local_rx_pd->bss_num & BSS_NUM_MASK); if (!priv) priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY); @@ -165,8 +164,7 @@ static int mwifiex_host_to_card(struct mwifiex_adapter *adapter, struct mwifiex_txinfo *tx_info; tx_info = MWIFIEX_SKB_TXCB(skb); - priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num, - tx_info->bss_type); + priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num); if (!priv) { mwifiex_dbg(adapter, ERROR, "data: priv not found. Drop TX packet\n"); @@ -281,8 +279,7 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter, return 0; tx_info = MWIFIEX_SKB_TXCB(skb); - priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num, - tx_info->bss_type); + priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num); if (!priv) goto done; -- 2.39.2