diff --git a/drivers/staging/bcm/PHSModule.c b/drivers/staging/bcm/PHSModule.c index 4e6bcef56969b3e3c2dd6822aeee0828c979b35d..64319124343d2611f8c3ebf071334b061c076ffc 100644 --- a/drivers/staging/bcm/PHSModule.c +++ b/drivers/staging/bcm/PHSModule.c @@ -635,6 +635,8 @@ ULONG PhsDeleteSFRules(IN void *pvContext, IN B_UINT16 uiVcid) struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev); struct bcm_phs_extension *pDeviceExtension = (struct bcm_phs_extension *)pvContext; + struct bcm_phs_classifier_entry *curr_clsf_entry; + struct bcm_phs_classifier_entry *curr_rules_list; BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, PHS_DISPATCH, DBG_LVL_ALL, "====>\n"); @@ -654,30 +656,36 @@ ULONG PhsDeleteSFRules(IN void *pvContext, IN B_UINT16 uiVcid) pstClassifierRulesTable = pstServiceFlowEntry->pstClassifierTable; if (pstClassifierRulesTable) { for (nClsidIndex = 0; nClsidIndex < MAX_PHSRULE_PER_SF; nClsidIndex++) { - if (pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule) { + curr_clsf_entry = + &pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex]; - if (pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt) - pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt--; + curr_rules_list = + &pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex]; - if (0 == pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt) - kfree(pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule); + if (curr_clsf_entry->pstPhsRule) { - pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex].pstPhsRule = NULL; + if (curr_clsf_entry->pstPhsRule->u8RefCnt) + curr_clsf_entry->pstPhsRule->u8RefCnt--; + + if (0 == curr_clsf_entry->pstPhsRule->u8RefCnt) + kfree(curr_clsf_entry->pstPhsRule); + + curr_clsf_entry->pstPhsRule = NULL; } - memset(&pstClassifierRulesTable->stActivePhsRulesList[nClsidIndex], - 0, sizeof(struct bcm_phs_classifier_entry)); - if (pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule) { + memset(curr_clsf_entry, 0, + sizeof(struct bcm_phs_classifier_entry)); + if (curr_rules_list->pstPhsRule) { - if (pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt) - pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt--; + if (curr_rules_list->pstPhsRule->u8RefCnt) + curr_rules_list->pstPhsRule->u8RefCnt--; - if (0 == pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule->u8RefCnt) - kfree(pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule); + if (0 == curr_rules_list->pstPhsRule->u8RefCnt) + kfree(curr_rules_list->pstPhsRule); - pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex].pstPhsRule = NULL; + curr_rules_list->pstPhsRule = NULL; } - memset(&pstClassifierRulesTable->stOldPhsRulesList[nClsidIndex], - 0, sizeof(struct bcm_phs_classifier_entry)); + memset(curr_rules_list, 0, + sizeof(struct bcm_phs_classifier_entry)); } } pstServiceFlowEntry->bUsed = false;