|
@@ -2111,16 +2111,49 @@ static void rtl8180_hw_sleep(struct net_device *dev, u32 th, u32 tl)
|
|
|
spin_unlock_irqrestore(&priv->ps_lock, flags);
|
|
|
}
|
|
|
|
|
|
+static void rtl8180_wmm_single_param_update(struct net_device *dev,
|
|
|
+ u8 mode, AC_CODING eACI, PAC_PARAM param)
|
|
|
+{
|
|
|
+ u8 u1bAIFS;
|
|
|
+ u32 u4bAcParam;
|
|
|
+
|
|
|
+ /* Retrieve parameters to update. */
|
|
|
+ /* Mode G/A: slotTimeTimer = 9; Mode B: 20 */
|
|
|
+ u1bAIFS = param->f.AciAifsn.f.AIFSN * ((mode & IEEE_G) == IEEE_G ?
|
|
|
+ 9 : 20) + aSifsTime;
|
|
|
+ u4bAcParam = (((u32)param->f.TXOPLimit << AC_PARAM_TXOP_LIMIT_OFFSET) |
|
|
|
+ ((u32)param->f.Ecw.f.ECWmax << AC_PARAM_ECW_MAX_OFFSET) |
|
|
|
+ ((u32)param->f.Ecw.f.ECWmin << AC_PARAM_ECW_MIN_OFFSET) |
|
|
|
+ ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
|
|
|
+
|
|
|
+ switch (eACI) {
|
|
|
+ case AC1_BK:
|
|
|
+ write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
|
|
|
+ return;
|
|
|
+ case AC0_BE:
|
|
|
+ write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
|
|
|
+ return;
|
|
|
+ case AC2_VI:
|
|
|
+ write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
|
|
|
+ return;
|
|
|
+ case AC3_VO:
|
|
|
+ write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
|
|
|
+ return;
|
|
|
+ default:
|
|
|
+ pr_warn("SetHwReg8185(): invalid ACI: %d!\n", eACI);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void rtl8180_wmm_param_update(struct work_struct *work)
|
|
|
{
|
|
|
- struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wmm_param_update_wq);
|
|
|
+ struct ieee80211_device *ieee = container_of(work,
|
|
|
+ struct ieee80211_device, wmm_param_update_wq);
|
|
|
struct net_device *dev = ieee->dev;
|
|
|
u8 *ac_param = (u8 *)(ieee->current_network.wmm_param);
|
|
|
u8 mode = ieee->current_network.mode;
|
|
|
- AC_CODING eACI;
|
|
|
- AC_PARAM AcParam;
|
|
|
- PAC_PARAM pAcParam;
|
|
|
- u8 i;
|
|
|
+ AC_CODING eACI;
|
|
|
+ AC_PARAM AcParam;
|
|
|
|
|
|
if (!ieee->current_network.QoS_Enable) {
|
|
|
/* legacy ac_xx_param update */
|
|
@@ -2130,78 +2163,24 @@ static void rtl8180_wmm_param_update(struct work_struct *work)
|
|
|
AcParam.f.Ecw.f.ECWmin = 3; /* Follow 802.11 CWmin. */
|
|
|
AcParam.f.Ecw.f.ECWmax = 7; /* Follow 802.11 CWmax. */
|
|
|
AcParam.f.TXOPLimit = 0;
|
|
|
+
|
|
|
for (eACI = 0; eACI < AC_MAX; eACI++) {
|
|
|
AcParam.f.AciAifsn.f.ACI = (u8)eACI;
|
|
|
- {
|
|
|
- u8 u1bAIFS;
|
|
|
- u32 u4bAcParam;
|
|
|
- pAcParam = (PAC_PARAM)(&AcParam);
|
|
|
- /* Retrieve parameters to update. */
|
|
|
- u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
|
|
|
- u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit))<<AC_PARAM_TXOP_LIMIT_OFFSET)|
|
|
|
- (((u32)(pAcParam->f.Ecw.f.ECWmax))<<AC_PARAM_ECW_MAX_OFFSET)|
|
|
|
- (((u32)(pAcParam->f.Ecw.f.ECWmin))<<AC_PARAM_ECW_MIN_OFFSET)|
|
|
|
- (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
|
|
|
- switch (eACI) {
|
|
|
- case AC1_BK:
|
|
|
- write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC0_BE:
|
|
|
- write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC2_VI:
|
|
|
- write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC3_VO:
|
|
|
- write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- default:
|
|
|
- pr_warn("SetHwReg8185():invalid ACI: %d!\n",
|
|
|
- eACI);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+ rtl8180_wmm_single_param_update(dev, mode, eACI,
|
|
|
+ (PAC_PARAM)&AcParam);
|
|
|
}
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < AC_MAX; i++) {
|
|
|
+ for (eACI = 0; eACI < AC_MAX; eACI++) {
|
|
|
/* AcParam.longData = 0; */
|
|
|
- pAcParam = (AC_PARAM *)ac_param;
|
|
|
- {
|
|
|
- AC_CODING eACI;
|
|
|
- u8 u1bAIFS;
|
|
|
- u32 u4bAcParam;
|
|
|
-
|
|
|
- /* Retrieve parameters to update. */
|
|
|
- eACI = pAcParam->f.AciAifsn.f.ACI;
|
|
|
- /* Mode G/A: slotTimeTimer = 9; Mode B: 20 */
|
|
|
- u1bAIFS = pAcParam->f.AciAifsn.f.AIFSN * (((mode&IEEE_G) == IEEE_G) ? 9 : 20) + aSifsTime;
|
|
|
- u4bAcParam = ((((u32)(pAcParam->f.TXOPLimit)) << AC_PARAM_TXOP_LIMIT_OFFSET) |
|
|
|
- (((u32)(pAcParam->f.Ecw.f.ECWmax)) << AC_PARAM_ECW_MAX_OFFSET) |
|
|
|
- (((u32)(pAcParam->f.Ecw.f.ECWmin)) << AC_PARAM_ECW_MIN_OFFSET) |
|
|
|
- (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET));
|
|
|
-
|
|
|
- switch (eACI) {
|
|
|
- case AC1_BK:
|
|
|
- write_nic_dword(dev, AC_BK_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC0_BE:
|
|
|
- write_nic_dword(dev, AC_BE_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC2_VI:
|
|
|
- write_nic_dword(dev, AC_VI_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- case AC3_VO:
|
|
|
- write_nic_dword(dev, AC_VO_PARAM, u4bAcParam);
|
|
|
- break;
|
|
|
- default:
|
|
|
- pr_warn("SetHwReg8185(): invalid ACI: %d !\n",
|
|
|
- eACI);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- ac_param += (sizeof(AC_PARAM));
|
|
|
+
|
|
|
+ rtl8180_wmm_single_param_update(dev, mode,
|
|
|
+ ((PAC_PARAM)ac_param)->f.AciAifsn.f.ACI,
|
|
|
+ (PAC_PARAM)ac_param);
|
|
|
+
|
|
|
+ ac_param += sizeof(AC_PARAM);
|
|
|
}
|
|
|
}
|
|
|
|