|
1 | 1 | /* |
2 | 2 | * Copyright (c) 2011-2021 The Linux Foundation. All rights reserved. |
| 3 | + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. |
3 | 4 | * |
4 | 5 | * Previously licensed under the ISC license by Qualcomm Atheros, Inc. |
5 | 6 | * |
@@ -1643,7 +1644,7 @@ lim_populate_peer_rate_set(tpAniSirGlobal pMac, |
1643 | 1644 | { |
1644 | 1645 | tSirMacRateSet tempRateSet; |
1645 | 1646 | tSirMacRateSet tempRateSet2; |
1646 | | - uint32_t i, j, val, min, isArate = 0; |
| 1647 | + uint32_t i, j, val, min; |
1647 | 1648 | uint8_t aRateIndex = 0; |
1648 | 1649 | uint8_t bRateIndex = 0; |
1649 | 1650 |
|
@@ -1703,39 +1704,40 @@ lim_populate_peer_rate_set(tpAniSirGlobal pMac, |
1703 | 1704 | min = j; |
1704 | 1705 | } |
1705 | 1706 | } |
1706 | | - if (sirIsArate(tempRateSet.rate[min] & 0x7f)) { |
1707 | | - isArate = 1; |
| 1707 | + /* |
| 1708 | + * HAL needs to know whether the rate is basic rate or not, as it needs to |
| 1709 | + * update the response rate table accordingly. e.g. if one of the 11a rates is |
| 1710 | + * basic rate, then that rate can be used for sending control frames. |
| 1711 | + * HAL updates the response rate table whenever basic rate set is changed. |
| 1712 | + */ |
| 1713 | + if (basicOnly && !(tempRateSet.rate[min] & 0x80)) { |
| 1714 | + pe_debug("Invalid basic rate"); |
| 1715 | + } else if (sirIsArate(tempRateSet.rate[min] & 0x7f)) { |
| 1716 | + if (aRateIndex >= SIR_NUM_11A_RATES) { |
| 1717 | + pe_debug("OOB, aRateIndex: %d", aRateIndex); |
| 1718 | + } else if (aRateIndex >= 1 && (tempRateSet.rate[min] == |
| 1719 | + pRates->llaRates[aRateIndex - 1])) { |
| 1720 | + pe_debug("Duplicate 11a rate: %d", |
| 1721 | + tempRateSet.rate[min]); |
| 1722 | + } else { |
| 1723 | + pRates->llaRates[aRateIndex++] = |
| 1724 | + tempRateSet.rate[min]; |
| 1725 | + } |
1708 | 1726 | } else if (sirIsBrate(tempRateSet.rate[min] & 0x7f)) { |
1709 | | - isArate = 0; |
| 1727 | + if (bRateIndex >= SIR_NUM_11B_RATES) { |
| 1728 | + pe_debug("OOB, bRateIndex: %d", bRateIndex); |
| 1729 | + } else if (bRateIndex >= 1 && (tempRateSet.rate[min] == |
| 1730 | + pRates->llbRates[bRateIndex - 1])) { |
| 1731 | + pe_debug("Duplicate 11b rate: %d", |
| 1732 | + tempRateSet.rate[min]); |
| 1733 | + } else { |
| 1734 | + pRates->llbRates[bRateIndex++] = |
| 1735 | + tempRateSet.rate[min]; |
| 1736 | + } |
1710 | 1737 | } else { |
1711 | 1738 | pe_debug("%d is neither 11a nor 11b rate", |
1712 | 1739 | tempRateSet.rate[min]); |
1713 | | - tempRateSet.rate[min] = 0xff; |
1714 | | - continue; |
1715 | | - } |
1716 | | - if (tempRateSet.rate[min] == pRates->llaRates[aRateIndex] || |
1717 | | - tempRateSet.rate[min] == pRates->llbRates[bRateIndex]) { |
1718 | | - pe_debug("Duplicate rate: %d", tempRateSet.rate[min]); |
1719 | | - tempRateSet.rate[min] = 0xff; |
1720 | | - continue; |
1721 | | - } |
1722 | | - /* |
1723 | | - * HAL needs to know whether the rate is basic rate or not, |
1724 | | - * as it needs to update the response rate table accordingly. |
1725 | | - * e.g. if one of the 11a rates is basic rate, then that rate |
1726 | | - * can be used for sending control frames. HAL updates the |
1727 | | - * response rate table whenever basic rate set is changed. |
1728 | | - */ |
1729 | | - if (basicOnly && !(tempRateSet.rate[min] & 0x80)) { |
1730 | | - tempRateSet.rate[min] = 0xff; |
1731 | | - continue; |
1732 | 1740 | } |
1733 | | - if (isArate && aRateIndex < SIR_NUM_11A_RATES) |
1734 | | - pRates->llaRates[aRateIndex++] = |
1735 | | - tempRateSet.rate[min]; |
1736 | | - else if (bRateIndex < SIR_NUM_11B_RATES) |
1737 | | - pRates->llbRates[bRateIndex++] = |
1738 | | - tempRateSet.rate[min]; |
1739 | 1741 | tempRateSet.rate[min] = 0xff; |
1740 | 1742 | } |
1741 | 1743 |
|
|
0 commit comments