diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/wmm.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/wmm.c | 79 |
1 files changed, 23 insertions, 56 deletions
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c index b48e03cde23f..4be3d33ceae8 100644 --- a/drivers/net/wireless/mwifiex/wmm.c +++ b/drivers/net/wireless/mwifiex/wmm.c | |||
@@ -878,37 +878,25 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter, | |||
878 | { | 878 | { |
879 | struct mwifiex_private *priv_tmp; | 879 | struct mwifiex_private *priv_tmp; |
880 | struct mwifiex_ra_list_tbl *ptr; | 880 | struct mwifiex_ra_list_tbl *ptr; |
881 | struct mwifiex_bss_prio_node *bssprio_node, *bssprio_head; | ||
882 | struct mwifiex_tid_tbl *tid_ptr; | 881 | struct mwifiex_tid_tbl *tid_ptr; |
883 | atomic_t *hqp; | 882 | atomic_t *hqp; |
884 | unsigned long flags_bss, flags_ra; | 883 | unsigned long flags_bss, flags_ra; |
885 | int i, j; | 884 | int i, j; |
886 | 885 | ||
886 | /* check the BSS with highest priority first */ | ||
887 | for (j = adapter->priv_num - 1; j >= 0; --j) { | 887 | for (j = adapter->priv_num - 1; j >= 0; --j) { |
888 | spin_lock_irqsave(&adapter->bss_prio_tbl[j].bss_prio_lock, | 888 | spin_lock_irqsave(&adapter->bss_prio_tbl[j].bss_prio_lock, |
889 | flags_bss); | 889 | flags_bss); |
890 | 890 | ||
891 | if (list_empty(&adapter->bss_prio_tbl[j].bss_prio_head)) | 891 | /* iterate over BSS with the equal priority */ |
892 | goto skip_prio_tbl; | 892 | list_for_each_entry(adapter->bss_prio_tbl[j].bss_prio_cur, |
893 | 893 | &adapter->bss_prio_tbl[j].bss_prio_head, | |
894 | if (adapter->bss_prio_tbl[j].bss_prio_cur == | 894 | list) { |
895 | (struct mwifiex_bss_prio_node *) | ||
896 | &adapter->bss_prio_tbl[j].bss_prio_head) { | ||
897 | adapter->bss_prio_tbl[j].bss_prio_cur = | ||
898 | list_first_entry(&adapter->bss_prio_tbl[j] | ||
899 | .bss_prio_head, | ||
900 | struct mwifiex_bss_prio_node, | ||
901 | list); | ||
902 | } | ||
903 | |||
904 | bssprio_node = adapter->bss_prio_tbl[j].bss_prio_cur; | ||
905 | bssprio_head = bssprio_node; | ||
906 | 895 | ||
907 | do { | 896 | priv_tmp = adapter->bss_prio_tbl[j].bss_prio_cur->priv; |
908 | priv_tmp = bssprio_node->priv; | ||
909 | 897 | ||
910 | if (atomic_read(&priv_tmp->wmm.tx_pkts_queued) == 0) | 898 | if (atomic_read(&priv_tmp->wmm.tx_pkts_queued) == 0) |
911 | goto skip_bss; | 899 | continue; |
912 | 900 | ||
913 | /* iterate over the WMM queues of the BSS */ | 901 | /* iterate over the WMM queues of the BSS */ |
914 | hqp = &priv_tmp->wmm.highest_queued_prio; | 902 | hqp = &priv_tmp->wmm.highest_queued_prio; |
@@ -933,24 +921,8 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter, | |||
933 | ra_list_spinlock, | 921 | ra_list_spinlock, |
934 | flags_ra); | 922 | flags_ra); |
935 | } | 923 | } |
924 | } | ||
936 | 925 | ||
937 | skip_bss: | ||
938 | /* Get next bss priority node */ | ||
939 | bssprio_node = list_first_entry(&bssprio_node->list, | ||
940 | struct mwifiex_bss_prio_node, | ||
941 | list); | ||
942 | |||
943 | if (bssprio_node == | ||
944 | (struct mwifiex_bss_prio_node *) | ||
945 | &adapter->bss_prio_tbl[j].bss_prio_head) | ||
946 | /* Get next bss priority node */ | ||
947 | bssprio_node = list_first_entry( | ||
948 | &bssprio_node->list, | ||
949 | struct mwifiex_bss_prio_node, | ||
950 | list); | ||
951 | } while (bssprio_node != bssprio_head); | ||
952 | |||
953 | skip_prio_tbl: | ||
954 | spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock, | 926 | spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock, |
955 | flags_bss); | 927 | flags_bss); |
956 | } | 928 | } |
@@ -971,12 +943,12 @@ found: | |||
971 | return ptr; | 943 | return ptr; |
972 | } | 944 | } |
973 | 945 | ||
974 | /* This functions rotates ra lists so packets are picked in round robin | 946 | /* This functions rotates ra and bss lists so packets are picked round robin. |
975 | * fashion. | ||
976 | * | 947 | * |
977 | * After a packet is successfully transmitted, rotate the ra list, so the ra | 948 | * After a packet is successfully transmitted, rotate the ra list, so the ra |
978 | * next to the one transmitted, will come first in the list. This way we pick | 949 | * next to the one transmitted, will come first in the list. This way we pick |
979 | * the ra in a round robin fashion. | 950 | * the ra' in a round robin fashion. Same applies to bss nodes of equal |
951 | * priority. | ||
980 | * | 952 | * |
981 | * Function also increments wmm.packets_out counter. | 953 | * Function also increments wmm.packets_out counter. |
982 | */ | 954 | */ |
@@ -984,17 +956,24 @@ void mwifiex_rotate_priolists(struct mwifiex_private *priv, | |||
984 | struct mwifiex_ra_list_tbl *ra, | 956 | struct mwifiex_ra_list_tbl *ra, |
985 | int tid) | 957 | int tid) |
986 | { | 958 | { |
959 | struct mwifiex_adapter *adapter = priv->adapter; | ||
960 | struct mwifiex_bss_prio_tbl *tbl = adapter->bss_prio_tbl; | ||
987 | struct mwifiex_tid_tbl *tid_ptr = &priv->wmm.tid_tbl_ptr[tid]; | 961 | struct mwifiex_tid_tbl *tid_ptr = &priv->wmm.tid_tbl_ptr[tid]; |
988 | unsigned long flags; | 962 | unsigned long flags; |
989 | 963 | ||
964 | spin_lock_irqsave(&tbl[priv->bss_priority].bss_prio_lock, flags); | ||
965 | /* | ||
966 | * dirty trick: we remove 'head' temporarily and reinsert it after | ||
967 | * curr bss node. imagine list to stay fixed while head is moved | ||
968 | */ | ||
969 | list_move(&tbl[priv->bss_priority].bss_prio_head, | ||
970 | &tbl[priv->bss_priority].bss_prio_cur->list); | ||
971 | spin_unlock_irqrestore(&tbl[priv->bss_priority].bss_prio_lock, flags); | ||
972 | |||
990 | spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags); | 973 | spin_lock_irqsave(&priv->wmm.ra_list_spinlock, flags); |
991 | if (mwifiex_is_ralist_valid(priv, ra, tid)) { | 974 | if (mwifiex_is_ralist_valid(priv, ra, tid)) { |
992 | priv->wmm.packets_out[tid]++; | 975 | priv->wmm.packets_out[tid]++; |
993 | /* | 976 | /* same as above */ |
994 | * dirty trick: we remove 'head' temporarily and reinsert it | ||
995 | * after curr bss node. imagine list to stay fixed while only | ||
996 | * head is moved | ||
997 | */ | ||
998 | list_move(&tid_ptr->ra_list, &ra->list); | 977 | list_move(&tid_ptr->ra_list, &ra->list); |
999 | } | 978 | } |
1000 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags); | 979 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags); |
@@ -1087,12 +1066,6 @@ mwifiex_send_single_packet(struct mwifiex_private *priv, | |||
1087 | ra_list_flags); | 1066 | ra_list_flags); |
1088 | } else { | 1067 | } else { |
1089 | mwifiex_rotate_priolists(priv, ptr, ptr_index); | 1068 | mwifiex_rotate_priolists(priv, ptr, ptr_index); |
1090 | adapter->bss_prio_tbl[priv->bss_priority].bss_prio_cur = | ||
1091 | list_first_entry( | ||
1092 | &adapter->bss_prio_tbl[priv->bss_priority] | ||
1093 | .bss_prio_cur->list, | ||
1094 | struct mwifiex_bss_prio_node, | ||
1095 | list); | ||
1096 | atomic_dec(&priv->wmm.tx_pkts_queued); | 1069 | atomic_dec(&priv->wmm.tx_pkts_queued); |
1097 | } | 1070 | } |
1098 | } | 1071 | } |
@@ -1198,12 +1171,6 @@ mwifiex_send_processed_packet(struct mwifiex_private *priv, | |||
1198 | } | 1171 | } |
1199 | if (ret != -EBUSY) { | 1172 | if (ret != -EBUSY) { |
1200 | mwifiex_rotate_priolists(priv, ptr, ptr_index); | 1173 | mwifiex_rotate_priolists(priv, ptr, ptr_index); |
1201 | adapter->bss_prio_tbl[priv->bss_priority].bss_prio_cur = | ||
1202 | list_first_entry( | ||
1203 | &adapter->bss_prio_tbl[priv->bss_priority] | ||
1204 | .bss_prio_cur->list, | ||
1205 | struct mwifiex_bss_prio_node, | ||
1206 | list); | ||
1207 | atomic_dec(&priv->wmm.tx_pkts_queued); | 1174 | atomic_dec(&priv->wmm.tx_pkts_queued); |
1208 | } | 1175 | } |
1209 | } | 1176 | } |