Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/************************************************************
   2 * CMHOST.C
   3 * This file contains the routines for handling Connection
   4 * Management.
   5 ************************************************************/
   6
   7#include "headers.h"
   8
   9enum E_CLASSIFIER_ACTION {
  10	eInvalidClassifierAction,
  11	eAddClassifier,
  12	eReplaceClassifier,
  13	eDeleteClassifier
  14};
  15
  16static ULONG GetNextTargetBufferLocation(struct bcm_mini_adapter *Adapter, B_UINT16 tid);
  17
  18/************************************************************
  19 * Function - SearchSfid
  20 *
  21 * Description - This routinue would search QOS queues having
  22 *  specified SFID as input parameter.
  23 *
  24 * Parameters -	Adapter: Pointer to the Adapter structure
  25 *  uiSfid : Given SFID for matching
  26 *
  27 * Returns - Queue index for this SFID(If matched)
  28 *  Else Invalid Queue Index(If Not matched)
  29 ************************************************************/
  30int SearchSfid(struct bcm_mini_adapter *Adapter, UINT uiSfid)
  31{
  32	int i;
  33
  34	for (i = (NO_OF_QUEUES-1); i >= 0; i--)
  35		if (Adapter->PackInfo[i].ulSFID == uiSfid)
  36			return i;
  37
  38	return NO_OF_QUEUES+1;
  39}
  40
  41/***************************************************************
  42 * Function -SearchFreeSfid
  43 *
  44 * Description - This routinue would search Free available SFID.
  45 *
  46 * Parameter - Adapter: Pointer to the Adapter structure
  47 *
  48 * Returns - Queue index for the free SFID
  49 *  Else returns Invalid Index.
  50 ****************************************************************/
  51static int SearchFreeSfid(struct bcm_mini_adapter *Adapter)
  52{
  53	int i;
  54
  55	for (i = 0; i < (NO_OF_QUEUES-1); i++)
  56		if (Adapter->PackInfo[i].ulSFID == 0)
  57			return i;
  58
  59	return NO_OF_QUEUES+1;
  60}
  61
  62/*
  63 * Function: SearchClsid
  64 * Description:	This routinue would search Classifier  having specified ClassifierID as input parameter
  65 * Input parameters: struct bcm_mini_adapter *Adapter - Adapter Context
  66 *  unsigned int uiSfid   - The SF in which the classifier is to searched
  67 *  B_UINT16  uiClassifierID - The classifier ID to be searched
  68 * Return: int :Classifier table index of matching entry
  69 */
  70static int SearchClsid(struct bcm_mini_adapter *Adapter, ULONG ulSFID, B_UINT16  uiClassifierID)
  71{
  72	int i;
  73
  74	for (i = 0; i < MAX_CLASSIFIERS; i++) {
  75		if ((Adapter->astClassifierTable[i].bUsed) &&
  76			(Adapter->astClassifierTable[i].uiClassifierRuleIndex == uiClassifierID) &&
  77			(Adapter->astClassifierTable[i].ulSFID == ulSFID))
  78			return i;
  79	}
  80
  81	return MAX_CLASSIFIERS+1;
  82}
  83
  84/*
  85 * @ingroup ctrl_pkt_functions
  86 * This routinue would search Free available Classifier entry in classifier table.
  87 * @return free Classifier Entry index in classifier table for specified SF
  88 */
  89static int SearchFreeClsid(struct bcm_mini_adapter *Adapter /**Adapter Context*/)
  90{
  91	int i;
  92
  93	for (i = 0; i < MAX_CLASSIFIERS; i++) {
  94		if (!Adapter->astClassifierTable[i].bUsed)
  95			return i;
  96	}
  97
  98	return MAX_CLASSIFIERS+1;
  99}
 100
 101static VOID deleteSFBySfid(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex)
 102{
 103	/* deleting all the packet held in the SF */
 104	flush_queue(Adapter, uiSearchRuleIndex);
 105
 106	/* Deleting the all classifiers for this SF */
 107	DeleteAllClassifiersForSF(Adapter, uiSearchRuleIndex);
 108
 109	/* Resetting only MIBS related entries in the SF */
 110	memset((PVOID)&Adapter->PackInfo[uiSearchRuleIndex], 0, sizeof(struct bcm_mibs_table));
 111}
 112
 113static inline VOID
 114CopyIpAddrToClassifier(struct bcm_classifier_rule *pstClassifierEntry,
 115		B_UINT8 u8IpAddressLen, B_UINT8 *pu8IpAddressMaskSrc,
 116		bool bIpVersion6, enum bcm_ipaddr_context eIpAddrContext)
 117{
 118	int i = 0;
 119	UINT nSizeOfIPAddressInBytes = IP_LENGTH_OF_ADDRESS;
 120	UCHAR *ptrClassifierIpAddress = NULL;
 121	UCHAR *ptrClassifierIpMask = NULL;
 122	struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
 123
 124	if (bIpVersion6)
 125		nSizeOfIPAddressInBytes = IPV6_ADDRESS_SIZEINBYTES;
 126
 127	/* Destination Ip Address */
 128	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Address Range Length:0x%X ", u8IpAddressLen);
 129	if ((bIpVersion6 ? (IPV6_ADDRESS_SIZEINBYTES * MAX_IP_RANGE_LENGTH * 2) :
 130			(TOTAL_MASKED_ADDRESS_IN_BYTES)) >= u8IpAddressLen) {
 131		/*
 132		 * checking both the mask and address togethor in Classification.
 133		 * So length will be : TotalLengthInBytes/nSizeOfIPAddressInBytes * 2
 134		 * (nSizeOfIPAddressInBytes for address and nSizeOfIPAddressInBytes for mask)
 135		 */
 136		if (eIpAddrContext == eDestIpAddress) {
 137			pstClassifierEntry->ucIPDestinationAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
 138			if (bIpVersion6) {
 139				ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv6Address;
 140				ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv6Mask;
 141			} else {
 142				ptrClassifierIpAddress = pstClassifierEntry->stDestIpAddress.ucIpv4Address;
 143				ptrClassifierIpMask = pstClassifierEntry->stDestIpAddress.ucIpv4Mask;
 144			}
 145		} else if (eIpAddrContext == eSrcIpAddress) {
 146			pstClassifierEntry->ucIPSourceAddressLength = u8IpAddressLen/(nSizeOfIPAddressInBytes * 2);
 147			if (bIpVersion6) {
 148				ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv6Address;
 149				ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv6Mask;
 150			} else {
 151				ptrClassifierIpAddress = pstClassifierEntry->stSrcIpAddress.ucIpv4Address;
 152				ptrClassifierIpMask = pstClassifierEntry->stSrcIpAddress.ucIpv4Mask;
 153			}
 154		}
 155		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Address Length:0x%X\n", pstClassifierEntry->ucIPDestinationAddressLength);
 156		while ((u8IpAddressLen >= nSizeOfIPAddressInBytes) && (i < MAX_IP_RANGE_LENGTH)) {
 157			memcpy(ptrClassifierIpAddress +
 158				(i * nSizeOfIPAddressInBytes),
 159				(pu8IpAddressMaskSrc+(i*nSizeOfIPAddressInBytes*2)),
 160				nSizeOfIPAddressInBytes);
 161
 162			if (!bIpVersion6) {
 163				if (eIpAddrContext == eSrcIpAddress) {
 164					pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
 165					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Address:0x%luX ",
 166							pstClassifierEntry->stSrcIpAddress.ulIpv4Addr[i]);
 167				} else if (eIpAddrContext == eDestIpAddress) {
 168					pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
 169					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Address:0x%luX ",
 170							pstClassifierEntry->stDestIpAddress.ulIpv4Addr[i]);
 171				}
 172			}
 173			u8IpAddressLen -= nSizeOfIPAddressInBytes;
 174			if (u8IpAddressLen >= nSizeOfIPAddressInBytes) {
 175				memcpy(ptrClassifierIpMask +
 176					(i * nSizeOfIPAddressInBytes),
 177					(pu8IpAddressMaskSrc+nSizeOfIPAddressInBytes +
 178						(i*nSizeOfIPAddressInBytes*2)),
 179					nSizeOfIPAddressInBytes);
 180
 181				if (!bIpVersion6) {
 182					if (eIpAddrContext == eSrcIpAddress) {
 183						pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i] =
 184							ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
 185						BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Src Ip Mask Address:0x%luX ",
 186								pstClassifierEntry->stSrcIpAddress.ulIpv4Mask[i]);
 187					} else if (eIpAddrContext == eDestIpAddress) {
 188						pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i] =
 189							ntohl(pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
 190						BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dest Ip Mask Address:0x%luX ",
 191								pstClassifierEntry->stDestIpAddress.ulIpv4Mask[i]);
 192					}
 193				}
 194				u8IpAddressLen -= nSizeOfIPAddressInBytes;
 195			}
 196			if (u8IpAddressLen == 0)
 197				pstClassifierEntry->bDestIpValid = TRUE;
 198
 199			i++;
 200		}
 201		if (bIpVersion6) {
 202			/* Restore EndianNess of Struct */
 203			for (i = 0; i < MAX_IP_RANGE_LENGTH * 4; i++) {
 204				if (eIpAddrContext == eSrcIpAddress) {
 205					pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Addr[i]);
 206					pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stSrcIpAddress.ulIpv6Mask[i]);
 207				} else if (eIpAddrContext == eDestIpAddress) {
 208					pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Addr[i]);
 209					pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i] = ntohl(pstClassifierEntry->stDestIpAddress.ulIpv6Mask[i]);
 210				}
 211			}
 212		}
 213	}
 214}
 215
 216void ClearTargetDSXBuffer(struct bcm_mini_adapter *Adapter, B_UINT16 TID, bool bFreeAll)
 217{
 218	int i;
 219
 220	for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
 221		if (Adapter->astTargetDsxBuffer[i].valid)
 222			continue;
 223
 224		if ((bFreeAll) || (Adapter->astTargetDsxBuffer[i].tid == TID)) {
 225			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "ClearTargetDSXBuffer: found tid %d buffer cleared %lx\n",
 226					TID, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
 227			Adapter->astTargetDsxBuffer[i].valid = 1;
 228			Adapter->astTargetDsxBuffer[i].tid = 0;
 229			Adapter->ulFreeTargetBufferCnt++;
 230		}
 231	}
 232}
 233
 234/*
 235 * @ingroup ctrl_pkt_functions
 236 * copy classifier rule into the specified SF index
 237 */
 238static inline VOID CopyClassifierRuleToSF(struct bcm_mini_adapter *Adapter, struct bcm_convergence_types *psfCSType, UINT uiSearchRuleIndex, UINT nClassifierIndex)
 239{
 240	struct bcm_classifier_rule *pstClassifierEntry = NULL;
 241	/* VOID *pvPhsContext = NULL; */
 242	int i;
 243	/* UCHAR ucProtocolLength=0; */
 244	/* ULONG ulPhsStatus; */
 245
 246	if (Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value == 0 ||
 247		nClassifierIndex > (MAX_CLASSIFIERS-1))
 248		return;
 249
 250	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Storing Classifier Rule Index : %X",
 251			ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex));
 252
 253	if (nClassifierIndex > MAX_CLASSIFIERS-1)
 254		return;
 255
 256	pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
 257	if (pstClassifierEntry) {
 258		/* Store if Ipv6 */
 259		pstClassifierEntry->bIpv6Protocol = (Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : false;
 260
 261		/* Destinaiton Port */
 262		pstClassifierEntry->ucDestPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength / 4;
 263		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Length:0x%X ", pstClassifierEntry->ucDestPortRangeLength);
 264
 265		if (psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength <= MAX_PORT_RANGE) {
 266			for (i = 0; i < (pstClassifierEntry->ucDestPortRangeLength); i++) {
 267				pstClassifierEntry->usDestPortRangeLo[i] = *((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+i));
 268				pstClassifierEntry->usDestPortRangeHi[i] =
 269					*((PUSHORT)(psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange+2+i));
 270				pstClassifierEntry->usDestPortRangeLo[i] = ntohs(pstClassifierEntry->usDestPortRangeLo[i]);
 271				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Destination Port Range Lo:0x%X ",
 272						pstClassifierEntry->usDestPortRangeLo[i]);
 273				pstClassifierEntry->usDestPortRangeHi[i] = ntohs(pstClassifierEntry->usDestPortRangeHi[i]);
 274			}
 275		} else {
 276			pstClassifierEntry->ucDestPortRangeLength = 0;
 277		}
 278
 279		/* Source Port */
 280		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Length:0x%X ",
 281				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
 282		if (psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength <= MAX_PORT_RANGE) {
 283			pstClassifierEntry->ucSrcPortRangeLength = psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength/4;
 284			for (i = 0; i < (pstClassifierEntry->ucSrcPortRangeLength); i++) {
 285				pstClassifierEntry->usSrcPortRangeLo[i] =
 286					*((PUSHORT)(psfCSType->cCPacketClassificationRule.
 287							u8ProtocolSourcePortRange+i));
 288				pstClassifierEntry->usSrcPortRangeHi[i] =
 289					*((PUSHORT)(psfCSType->cCPacketClassificationRule.
 290							u8ProtocolSourcePortRange+2+i));
 291				pstClassifierEntry->usSrcPortRangeLo[i] =
 292					ntohs(pstClassifierEntry->usSrcPortRangeLo[i]);
 293				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Source Port Range Lo:0x%X ",
 294						pstClassifierEntry->usSrcPortRangeLo[i]);
 295				pstClassifierEntry->usSrcPortRangeHi[i] = ntohs(pstClassifierEntry->usSrcPortRangeHi[i]);
 296			}
 297		}
 298		/* Destination Ip Address and Mask */
 299		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Destination Parameters : ");
 300		CopyIpAddrToClassifier(pstClassifierEntry,
 301				psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength,
 302				psfCSType->cCPacketClassificationRule.u8IPDestinationAddress,
 303				(Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ?
 304			TRUE : false, eDestIpAddress);
 305
 306		/* Source Ip Address and Mask */
 307		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Ip Source Parameters : ");
 308
 309		CopyIpAddrToClassifier(pstClassifierEntry,
 310				psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength,
 311				psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress,
 312				(Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion == IPV6) ? TRUE : false,
 313				eSrcIpAddress);
 314
 315		/* TOS */
 316		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "TOS Length:0x%X ", psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
 317		if (psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength == 3) {
 318			pstClassifierEntry->ucIPTypeOfServiceLength = psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength;
 319			pstClassifierEntry->ucTosLow = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0];
 320			pstClassifierEntry->ucTosHigh = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1];
 321			pstClassifierEntry->ucTosMask = psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2];
 322			pstClassifierEntry->bTOSValid = TRUE;
 323		}
 324		if (psfCSType->cCPacketClassificationRule.u8Protocol == 0) {
 325			/* we didn't get protocol field filled in by the BS */
 326			pstClassifierEntry->ucProtocolLength = 0;
 327		} else {
 328			pstClassifierEntry->ucProtocolLength = 1; /* 1 valid protocol */
 329		}
 330
 331		pstClassifierEntry->ucProtocol[0] = psfCSType->cCPacketClassificationRule.u8Protocol;
 332		pstClassifierEntry->u8ClassifierRulePriority = psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority;
 333
 334		/* store the classifier rule ID and set this classifier entry as valid */
 335		pstClassifierEntry->ucDirection = Adapter->PackInfo[uiSearchRuleIndex].ucDirection;
 336		pstClassifierEntry->uiClassifierRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
 337		pstClassifierEntry->usVCID_Value = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
 338		pstClassifierEntry->ulSFID = Adapter->PackInfo[uiSearchRuleIndex].ulSFID;
 339		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Index %d Dir: %d, Index: %d, Vcid: %d\n",
 340				uiSearchRuleIndex, pstClassifierEntry->ucDirection,
 341				pstClassifierEntry->uiClassifierRuleIndex,
 342				pstClassifierEntry->usVCID_Value);
 343
 344		if (psfCSType->cCPacketClassificationRule.u8AssociatedPHSI)
 345			pstClassifierEntry->u8AssociatedPHSI = psfCSType->cCPacketClassificationRule.u8AssociatedPHSI;
 346
 347		/* Copy ETH CS Parameters */
 348		pstClassifierEntry->ucEthCSSrcMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddressLength);
 349		memcpy(pstClassifierEntry->au8EThCSSrcMAC, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress, MAC_ADDRESS_SIZE);
 350		memcpy(pstClassifierEntry->au8EThCSSrcMACMask, psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
 351		pstClassifierEntry->ucEthCSDestMACLen = (psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
 352		memcpy(pstClassifierEntry->au8EThCSDestMAC, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress, MAC_ADDRESS_SIZE);
 353		memcpy(pstClassifierEntry->au8EThCSDestMACMask, psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress + MAC_ADDRESS_SIZE, MAC_ADDRESS_SIZE);
 354		pstClassifierEntry->ucEtherTypeLen = (psfCSType->cCPacketClassificationRule.u8EthertypeLength);
 355		memcpy(pstClassifierEntry->au8EthCSEtherType, psfCSType->cCPacketClassificationRule.u8Ethertype, NUM_ETHERTYPE_BYTES);
 356		memcpy(pstClassifierEntry->usUserPriority, &psfCSType->cCPacketClassificationRule.u16UserPriority, 2);
 357		pstClassifierEntry->usVLANID = ntohs(psfCSType->cCPacketClassificationRule.u16VLANID);
 358		pstClassifierEntry->usValidityBitMap = ntohs(psfCSType->cCPacketClassificationRule.u16ValidityBitMap);
 359
 360		pstClassifierEntry->bUsed = TRUE;
 361	}
 362}
 363
 364/*
 365 * @ingroup ctrl_pkt_functions
 366 */
 367static inline VOID DeleteClassifierRuleFromSF(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex, UINT nClassifierIndex)
 368{
 369	struct bcm_classifier_rule *pstClassifierEntry = NULL;
 370	B_UINT16 u16PacketClassificationRuleIndex;
 371	USHORT usVCID;
 372	/* VOID *pvPhsContext = NULL; */
 373	/*ULONG ulPhsStatus; */
 374
 375	usVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
 376
 377	if (nClassifierIndex > MAX_CLASSIFIERS-1)
 378		return;
 379
 380	if (usVCID == 0)
 381		return;
 382
 383	u16PacketClassificationRuleIndex = Adapter->astClassifierTable[nClassifierIndex].uiClassifierRuleIndex;
 384	pstClassifierEntry = &Adapter->astClassifierTable[nClassifierIndex];
 385	if (pstClassifierEntry) {
 386		pstClassifierEntry->bUsed = false;
 387		pstClassifierEntry->uiClassifierRuleIndex = 0;
 388		memset(pstClassifierEntry, 0, sizeof(struct bcm_classifier_rule));
 389
 390		/* Delete the PHS Rule for this classifier */
 391		PhsDeleteClassifierRule(&Adapter->stBCMPhsContext, usVCID, u16PacketClassificationRuleIndex);
 392	}
 393}
 394
 395/*
 396 * @ingroup ctrl_pkt_functions
 397 */
 398VOID DeleteAllClassifiersForSF(struct bcm_mini_adapter *Adapter, UINT uiSearchRuleIndex)
 399{
 400	struct bcm_classifier_rule *pstClassifierEntry = NULL;
 401	int i;
 402	/* B_UINT16  u16PacketClassificationRuleIndex; */
 403	USHORT ulVCID;
 404	/* VOID *pvPhsContext = NULL; */
 405	/* ULONG ulPhsStatus; */
 406
 407	ulVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
 408
 409	if (ulVCID == 0)
 410		return;
 411
 412	for (i = 0; i < MAX_CLASSIFIERS; i++) {
 413		if (Adapter->astClassifierTable[i].usVCID_Value == ulVCID) {
 414			pstClassifierEntry = &Adapter->astClassifierTable[i];
 415
 416			if (pstClassifierEntry->bUsed)
 417				DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, i);
 418		}
 419	}
 420
 421	/* Delete All Phs Rules Associated with this SF */
 422	PhsDeleteSFRules(&Adapter->stBCMPhsContext, ulVCID);
 423}
 424
 425/*
 426 * This routinue  copies the Connection Management
 427 * related data into the Adapter structure.
 428 * @ingroup ctrl_pkt_functions
 429 */
 430static VOID CopyToAdapter(register struct bcm_mini_adapter *Adapter, /* <Pointer to the Adapter structure */
 431			register struct bcm_connect_mgr_params *psfLocalSet, /* Pointer to the connection manager parameters structure */
 432			register UINT uiSearchRuleIndex, /* <Index of Queue, to which this data belongs */
 433			register UCHAR ucDsxType,
 434			struct bcm_add_indication_alt *pstAddIndication) {
 435
 436	/* UCHAR ucProtocolLength = 0; */
 437	ULONG ulSFID;
 438	UINT nClassifierIndex = 0;
 439	enum E_CLASSIFIER_ACTION eClassifierAction = eInvalidClassifierAction;
 440	B_UINT16 u16PacketClassificationRuleIndex = 0;
 441	int i;
 442	struct bcm_convergence_types *psfCSType = NULL;
 443	struct bcm_phs_rule sPhsRule;
 444	USHORT uVCID = Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value;
 445	UINT UGIValue = 0;
 446
 447	Adapter->PackInfo[uiSearchRuleIndex].bValid = TRUE;
 448	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Search Rule Index = %d\n", uiSearchRuleIndex);
 449	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s: SFID= %x ", __func__, ntohl(psfLocalSet->u32SFID));
 450	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Updating Queue %d", uiSearchRuleIndex);
 451
 452	ulSFID = ntohl(psfLocalSet->u32SFID);
 453	/* Store IP Version used */
 454	/* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
 455
 456	Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = 0;
 457	Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
 458
 459	/* Enable IP/ETh CS Support As Required */
 460	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : u8CSSpecification : %X\n", psfLocalSet->u8CSSpecification);
 461	switch (psfLocalSet->u8CSSpecification) {
 462	case eCSPacketIPV4:
 463	{
 464		Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
 465		break;
 466	}
 467	case eCSPacketIPV6:
 468	{
 469		Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
 470		break;
 471	}
 472	case eCS802_3PacketEthernet:
 473	case eCS802_1QPacketVLAN:
 474	{
 475		Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
 476		break;
 477	}
 478	case eCSPacketIPV4Over802_1QVLAN:
 479	case eCSPacketIPV4Over802_3Ethernet:
 480	{
 481		Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
 482		Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
 483		break;
 484	}
 485	case eCSPacketIPV6Over802_1QVLAN:
 486	case eCSPacketIPV6Over802_3Ethernet:
 487	{
 488		Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV6_CS;
 489		Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = ETH_CS_802_3;
 490		break;
 491	}
 492	default:
 493	{
 494		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error in value of CS Classification.. setting default to IP CS\n");
 495		Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport = IPV4_CS;
 496		break;
 497	}
 498	}
 499
 500	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "CopyToAdapter : Queue No : %X ETH CS Support :  %X  , IP CS Support : %X\n",
 501			uiSearchRuleIndex,
 502			Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport,
 503			Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport);
 504
 505	/* Store IP Version used */
 506	/* Get The Version Of IP used (IPv6 or IPv4) from CSSpecification field of SF */
 507	if (Adapter->PackInfo[uiSearchRuleIndex].bIPCSSupport == IPV6_CS)
 508		Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV6;
 509	else
 510		Adapter->PackInfo[uiSearchRuleIndex].ucIpVersion = IPV4;
 511
 512	/* To ensure that the ETH CS code doesn't gets executed if the BS doesn't supports ETH CS */
 513	if (!Adapter->bETHCSEnabled)
 514		Adapter->PackInfo[uiSearchRuleIndex].bEthCSSupport = 0;
 515
 516	if (psfLocalSet->u8ServiceClassNameLength > 0 && psfLocalSet->u8ServiceClassNameLength < 32)
 517		memcpy(Adapter->PackInfo[uiSearchRuleIndex].ucServiceClassName,	psfLocalSet->u8ServiceClassName, psfLocalSet->u8ServiceClassNameLength);
 518
 519	Adapter->PackInfo[uiSearchRuleIndex].u8QueueType = psfLocalSet->u8ServiceFlowSchedulingType;
 520
 521	if (Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == BE && Adapter->PackInfo[uiSearchRuleIndex].ucDirection)
 522		Adapter->usBestEffortQueueIndex = uiSearchRuleIndex;
 523
 524	Adapter->PackInfo[uiSearchRuleIndex].ulSFID = ntohl(psfLocalSet->u32SFID);
 525
 526	Adapter->PackInfo[uiSearchRuleIndex].u8TrafficPriority = psfLocalSet->u8TrafficPriority;
 527
 528	/* copy all the classifier in the Service Flow param  structure */
 529	for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
 530		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
 531		psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
 532		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Classifier index =%d", i);
 533
 534		if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
 535			Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
 536
 537		if (psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority)
 538			Adapter->PackInfo[uiSearchRuleIndex].bClassifierPriority = TRUE;
 539
 540		if (ucDsxType == DSA_ACK) {
 541			eClassifierAction = eAddClassifier;
 542		} else if (ucDsxType == DSC_ACK) {
 543			switch (psfCSType->u8ClassfierDSCAction) {
 544			case 0: /* DSC Add Classifier */
 545			{
 546				eClassifierAction = eAddClassifier;
 547			}
 548			break;
 549			case 1: /* DSC Replace Classifier */
 550			{
 551				eClassifierAction = eReplaceClassifier;
 552			}
 553			break;
 554			case 2: /* DSC Delete Classifier */
 555			{
 556				eClassifierAction = eDeleteClassifier;
 557			}
 558			break;
 559			default:
 560			{
 561				eClassifierAction = eInvalidClassifierAction;
 562			}
 563			}
 564		}
 565
 566		u16PacketClassificationRuleIndex = ntohs(psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
 567
 568		switch (eClassifierAction) {
 569		case eAddClassifier:
 570		{
 571			/* Get a Free Classifier Index From Classifier table for this SF to add the Classifier */
 572			/* Contained in this message */
 573			nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
 574
 575			if (nClassifierIndex > MAX_CLASSIFIERS) {
 576				nClassifierIndex = SearchFreeClsid(Adapter);
 577				if (nClassifierIndex > MAX_CLASSIFIERS) {
 578					/* Failed To get a free Entry */
 579					BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Failed To get a free Classifier Entry");
 580					break;
 581				}
 582				/* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
 583				CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
 584			} else {
 585				/* This Classifier Already Exists and it is invalid to Add Classifier with existing PCRI */
 586				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
 587						"CopyToAdapter: Error The Specified Classifier Already Exists and attempted To Add Classifier with Same PCRI : 0x%x\n",
 588						u16PacketClassificationRuleIndex);
 589			}
 590		}
 591		break;
 592		case eReplaceClassifier:
 593		{
 594			/* Get the Classifier Index From Classifier table for this SF and replace existing  Classifier */
 595			/* with the new classifier Contained in this message */
 596			nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
 597			if (nClassifierIndex > MAX_CLASSIFIERS) {
 598				/* Failed To search the classifier */
 599				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be replaced failed");
 600				break;
 601			}
 602			/* Copy the Classifier Rule for this service flow into our Classifier table maintained per SF. */
 603			CopyClassifierRuleToSF(Adapter, psfCSType, uiSearchRuleIndex, nClassifierIndex);
 604		}
 605		break;
 606		case eDeleteClassifier:
 607		{
 608			/* Get the Classifier Index From Classifier table for this SF and replace existing  Classifier */
 609			/* with the new classifier Contained in this message */
 610			nClassifierIndex = SearchClsid(Adapter, ulSFID, u16PacketClassificationRuleIndex);
 611			if (nClassifierIndex > MAX_CLASSIFIERS)	{
 612				/* Failed To search the classifier */
 613				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Error Search for Classifier To be deleted failed");
 614				break;
 615			}
 616
 617			/* Delete This classifier */
 618			DeleteClassifierRuleFromSF(Adapter, uiSearchRuleIndex, nClassifierIndex);
 619		}
 620		break;
 621		default:
 622		{
 623			/* Invalid Action for classifier */
 624			break;
 625		}
 626		}
 627	}
 628
 629	/* Repeat parsing Classification Entries to process PHS Rules */
 630	for (i = 0; i < psfLocalSet->u8TotalClassifiers; i++) {
 631		psfCSType = &psfLocalSet->cConvergenceSLTypes[i];
 632		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "psfCSType->u8PhsDSCAction : 0x%x\n", psfCSType->u8PhsDSCAction);
 633
 634		switch (psfCSType->u8PhsDSCAction) {
 635		case eDeleteAllPHSRules:
 636		{
 637			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Deleting All PHS Rules For VCID: 0x%X\n", uVCID);
 638
 639			/* Delete All the PHS rules for this Service flow */
 640			PhsDeleteSFRules(&Adapter->stBCMPhsContext, uVCID);
 641			break;
 642		}
 643		case eDeletePHSRule:
 644		{
 645			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "PHS DSC Action = Delete PHS Rule\n");
 646
 647			if (psfCSType->cPhsRule.u8PHSI)
 648				PhsDeletePHSRule(&Adapter->stBCMPhsContext, uVCID, psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
 649
 650			break;
 651		}
 652		default:
 653		{
 654			if (ucDsxType == DSC_ACK) {
 655				/* BCM_DEBUG_PRINT(CONN_MSG,("Invalid PHS DSC Action For DSC\n",psfCSType->cPhsRule.u8PHSI)); */
 656				break; /* FOr DSC ACK Case PHS DSC Action must be in valid set */
 657			}
 658		}
 659		/* Proceed To Add PHS rule for DSA_ACK case even if PHS DSC action is unspecified */
 660		/* No Break Here . Intentionally! */
 661
 662		case eAddPHSRule:
 663		case eSetPHSRule:
 664		{
 665			if (psfCSType->cPhsRule.u8PHSI)	{
 666				/* Apply This PHS Rule to all classifiers whose Associated PHSI Match */
 667				unsigned int uiClassifierIndex = 0;
 668				if (pstAddIndication->u8Direction == UPLINK_DIR) {
 669					for (uiClassifierIndex = 0; uiClassifierIndex < MAX_CLASSIFIERS; uiClassifierIndex++) {
 670						if ((Adapter->astClassifierTable[uiClassifierIndex].bUsed) &&
 671							(Adapter->astClassifierTable[uiClassifierIndex].ulSFID == Adapter->PackInfo[uiSearchRuleIndex].ulSFID) &&
 672							(Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI == psfCSType->cPhsRule.u8PHSI)) {
 673							BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,
 674									"Adding PHS Rule For Classifier: 0x%x cPhsRule.u8PHSI: 0x%x\n",
 675									Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
 676									psfCSType->cPhsRule.u8PHSI);
 677							/* Update The PHS Rule for this classifier as Associated PHSI id defined */
 678
 679							/* Copy the PHS Rule */
 680							sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
 681							sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
 682							sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
 683							sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
 684							sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
 685							memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
 686							memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
 687							sPhsRule.u8RefCnt = 0;
 688							sPhsRule.bUnclassifiedPHSRule = false;
 689							sPhsRule.PHSModifiedBytes = 0;
 690							sPhsRule.PHSModifiedNumPackets = 0;
 691							sPhsRule.PHSErrorNumPackets = 0;
 692
 693							/* bPHSRuleAssociated = TRUE; */
 694							/* Store The PHS Rule for this classifier */
 695
 696							PhsUpdateClassifierRule(
 697								&Adapter->stBCMPhsContext,
 698								uVCID,
 699								Adapter->astClassifierTable[uiClassifierIndex].uiClassifierRuleIndex,
 700								&sPhsRule,
 701								Adapter->astClassifierTable[uiClassifierIndex].u8AssociatedPHSI);
 702
 703							/* Update PHS Rule For the Classifier */
 704							if (sPhsRule.u8PHSI) {
 705								Adapter->astClassifierTable[uiClassifierIndex].u32PHSRuleID = sPhsRule.u8PHSI;
 706								memcpy(&Adapter->astClassifierTable[uiClassifierIndex].sPhsRule, &sPhsRule, sizeof(struct bcm_phs_rule));
 707							}
 708						}
 709					}
 710				} else {
 711					/* Error PHS Rule specified in signaling could not be applied to any classifier */
 712
 713					/* Copy the PHS Rule */
 714					sPhsRule.u8PHSI = psfCSType->cPhsRule.u8PHSI;
 715					sPhsRule.u8PHSFLength = psfCSType->cPhsRule.u8PHSFLength;
 716					sPhsRule.u8PHSMLength = psfCSType->cPhsRule.u8PHSMLength;
 717					sPhsRule.u8PHSS = psfCSType->cPhsRule.u8PHSS;
 718					sPhsRule.u8PHSV = psfCSType->cPhsRule.u8PHSV;
 719					memcpy(sPhsRule.u8PHSF, psfCSType->cPhsRule.u8PHSF, MAX_PHS_LENGTHS);
 720					memcpy(sPhsRule.u8PHSM, psfCSType->cPhsRule.u8PHSM, MAX_PHS_LENGTHS);
 721					sPhsRule.u8RefCnt = 0;
 722					sPhsRule.bUnclassifiedPHSRule = TRUE;
 723					sPhsRule.PHSModifiedBytes = 0;
 724					sPhsRule.PHSModifiedNumPackets = 0;
 725					sPhsRule.PHSErrorNumPackets = 0;
 726					/* Store The PHS Rule for this classifier */
 727
 728					/*
 729					 * Passing the argument u8PHSI instead of clsid. Because for DL with no classifier rule,
 730					 * clsid will be zero hence we can't have multiple PHS rules for the same SF.
 731					 * To support multiple PHS rule, passing u8PHSI.
 732					 */
 733					PhsUpdateClassifierRule(
 734						&Adapter->stBCMPhsContext,
 735						uVCID,
 736						sPhsRule.u8PHSI,
 737						&sPhsRule,
 738						sPhsRule.u8PHSI);
 739				}
 740			}
 741		}
 742		break;
 743		}
 744	}
 745
 746	if (psfLocalSet->u32MaxSustainedTrafficRate == 0) {
 747		/* No Rate Limit . Set Max Sustained Traffic Rate to Maximum */
 748		Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
 749	} else if (ntohl(psfLocalSet->u32MaxSustainedTrafficRate) > WIMAX_MAX_ALLOWED_RATE) {
 750		/* Too large Allowed Rate specified. Limiting to Wi Max  Allowed rate */
 751		Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate = WIMAX_MAX_ALLOWED_RATE;
 752	} else {
 753		Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate =  ntohl(psfLocalSet->u32MaxSustainedTrafficRate);
 754	}
 755
 756	Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = ntohl(psfLocalSet->u32MaximumLatency);
 757	if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency == 0) /* 0 should be treated as infinite */
 758		Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency = MAX_LATENCY_ALLOWED;
 759
 760	if ((Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == ERTPS ||
 761			Adapter->PackInfo[uiSearchRuleIndex].u8QueueType == UGS))
 762		UGIValue = ntohs(psfLocalSet->u16UnsolicitedGrantInterval);
 763
 764	if (UGIValue == 0)
 765		UGIValue = DEFAULT_UG_INTERVAL;
 766
 767	/*
 768	 * For UGI based connections...
 769	 * DEFAULT_UGI_FACTOR*UGIInterval worth of data is the max token count at host...
 770	 * The extra amount of token is to ensure that a large amount of jitter won't have loss in throughput...
 771	 * In case of non-UGI based connection, 200 frames worth of data is the max token count at host...
 772	 */
 773	Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
 774		(DEFAULT_UGI_FACTOR*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
 775
 776	if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize < WIMAX_MAX_MTU*8) {
 777		UINT UGIFactor = 0;
 778		/* Special Handling to ensure the biggest size of packet can go out from host to FW as follows:
 779		 * 1. Any packet from Host to FW can go out in different packet size.
 780		 * 2. So in case the Bucket count is smaller than MTU, the packets of size (Size > TokenCount), will get dropped.
 781		 * 3. We can allow packets of MaxSize from Host->FW that can go out from FW in multiple SDUs by fragmentation at Wimax Layer
 782		 */
 783		UGIFactor = (Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency/UGIValue + 1);
 784
 785		if (UGIFactor > DEFAULT_UGI_FACTOR)
 786			Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize =
 787				(UGIFactor*Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate*UGIValue)/1000;
 788
 789		if (Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize > WIMAX_MAX_MTU*8)
 790			Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize = WIMAX_MAX_MTU*8;
 791	}
 792
 793	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "LAT: %d, UGI: %d\n", Adapter->PackInfo[uiSearchRuleIndex].uiMaxLatency, UGIValue);
 794	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiMaxAllowedRate: 0x%x, u32MaxSustainedTrafficRate: 0x%x ,uiMaxBucketSize: 0x%x",
 795			Adapter->PackInfo[uiSearchRuleIndex].uiMaxAllowedRate,
 796			ntohl(psfLocalSet->u32MaxSustainedTrafficRate),
 797			Adapter->PackInfo[uiSearchRuleIndex].uiMaxBucketSize);
 798
 799	/* copy the extended SF Parameters to Support MIBS */
 800	CopyMIBSExtendedSFParameters(Adapter, psfLocalSet, uiSearchRuleIndex);
 801
 802	/* store header suppression enabled flag per SF */
 803	Adapter->PackInfo[uiSearchRuleIndex].bHeaderSuppressionEnabled =
 804		!(psfLocalSet->u8RequesttransmissionPolicy &
 805			MASK_DISABLE_HEADER_SUPPRESSION);
 806
 807	kfree(Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication);
 808	Adapter->PackInfo[uiSearchRuleIndex].pstSFIndication = pstAddIndication;
 809
 810	/* Re Sort the SF list in PackInfo according to Traffic Priority */
 811	SortPackInfo(Adapter);
 812
 813	/* Re Sort the Classifier Rules table and re - arrange
 814	 * according to Classifier Rule Priority
 815	 */
 816	SortClassifiers(Adapter);
 817	DumpPhsRules(&Adapter->stBCMPhsContext);
 818	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s <=====", __func__);
 819}
 820
 821/***********************************************************************
 822 * Function - DumpCmControlPacket
 823 *
 824 * Description - This routinue Dumps the Contents of the AddIndication
 825 *  Structure in the Connection Management Control Packet
 826 *
 827 * Parameter - pvBuffer: Pointer to the buffer containing the
 828 *  AddIndication data.
 829 *
 830 * Returns - None
 831 *************************************************************************/
 832static VOID DumpCmControlPacket(PVOID pvBuffer)
 833{
 834	int uiLoopIndex;
 835	int nIndex;
 836	struct bcm_add_indication_alt *pstAddIndication;
 837	UINT nCurClassifierCnt;
 838	struct bcm_mini_adapter *Adapter = GET_BCM_ADAPTER(gblpnetdev);
 839
 840	pstAddIndication = pvBuffer;
 841	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "======>");
 842	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Type: 0x%X", pstAddIndication->u8Type);
 843	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Direction: 0x%X", pstAddIndication->u8Direction);
 844	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TID: 0x%X", ntohs(pstAddIndication->u16TID));
 845	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", ntohs(pstAddIndication->u16CID));
 846	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VCID: 0x%X", ntohs(pstAddIndication->u16VCID));
 847	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " AuthorizedSet--->");
 848	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", htonl(pstAddIndication->sfAuthorizedSet.u32SFID));
 849	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", htons(pstAddIndication->sfAuthorizedSet.u16CID));
 850	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
 851			pstAddIndication->sfAuthorizedSet.u8ServiceClassNameLength);
 852
 853	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassName: 0x%X ,0x%X , 0x%X, 0x%X, 0x%X, 0x%X",
 854			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[0],
 855			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[1],
 856			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[2],
 857			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[3],
 858			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[4],
 859			pstAddIndication->sfAuthorizedSet.u8ServiceClassName[5]);
 860
 861	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%X", pstAddIndication->sfAuthorizedSet.u8MBSService);
 862	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%X", pstAddIndication->sfAuthorizedSet.u8QosParamSet);
 863	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%X, %p",
 864			pstAddIndication->sfAuthorizedSet.u8TrafficPriority, &pstAddIndication->sfAuthorizedSet.u8TrafficPriority);
 865	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxSustainedTrafficRate: 0x%X 0x%p",
 866			pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate,
 867			&pstAddIndication->sfAuthorizedSet.u32MaxSustainedTrafficRate);
 868	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaxTrafficBurst);
 869	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate	: 0x%X",
 870			pstAddIndication->sfAuthorizedSet.u32MinReservedTrafficRate);
 871	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%X",
 872			pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParamLength);
 873	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%X",
 874			pstAddIndication->sfAuthorizedSet.u8VendorSpecificQoSParam[0]);
 875	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%X",
 876			pstAddIndication->sfAuthorizedSet.u8ServiceFlowSchedulingType);
 877	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAuthorizedSet.u32ToleratedJitter);
 878	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAuthorizedSet.u32MaximumLatency);
 879	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%X",
 880			pstAddIndication->sfAuthorizedSet.u8FixedLengthVSVariableLengthSDUIndicator);
 881	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X",	pstAddIndication->sfAuthorizedSet.u8SDUSize);
 882	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%X", pstAddIndication->sfAuthorizedSet.u16TargetSAID);
 883	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQEnable);
 884	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQWindowSize);
 885	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryTxTimeOut);
 886	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRetryRxTimeOut);
 887	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockLifeTime);
 888	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQSyncLossTimeOut);
 889	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfAuthorizedSet.u8ARQDeliverInOrder);
 890	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQRxPurgeTimeOut);
 891	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAuthorizedSet.u16ARQBlockSize);
 892	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%X",	pstAddIndication->sfAuthorizedSet.u8CSSpecification);
 893	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%X",
 894			pstAddIndication->sfAuthorizedSet.u8TypeOfDataDeliveryService);
 895	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAuthorizedSet.u16SDUInterArrivalTime);
 896	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAuthorizedSet.u16TimeBase);
 897	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAuthorizedSet.u8PagingPreference);
 898	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UnsolicitedPollingInterval: 0x%X",
 899			pstAddIndication->sfAuthorizedSet.u16UnsolicitedPollingInterval);
 900
 901	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "sfAuthorizedSet.u8HARQChannelMapping %x  %x %x ",
 902			*(unsigned int *)pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping,
 903			*(unsigned int *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[4],
 904			*(USHORT *)&pstAddIndication->sfAuthorizedSet.u8HARQChannelMapping[8]);
 905	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%X",
 906			pstAddIndication->sfAuthorizedSet.u8TrafficIndicationPreference);
 907	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAuthorizedSet.u8TotalClassifiers);
 908
 909	nCurClassifierCnt = pstAddIndication->sfAuthorizedSet.u8TotalClassifiers;
 910	if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
 911		nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
 912
 913	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,  "pstAddIndication->sfAuthorizedSet.bValid %d", pstAddIndication->sfAuthorizedSet.bValid);
 914	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,  "pstAddIndication->sfAuthorizedSet.u16MacOverhead %x", pstAddIndication->sfAuthorizedSet.u16MacOverhead);
 915	if (!pstAddIndication->sfAuthorizedSet.bValid)
 916		pstAddIndication->sfAuthorizedSet.bValid = 1;
 917	for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
 918		struct bcm_convergence_types *psfCSType = NULL;
 919		psfCSType =  &pstAddIndication->sfAuthorizedSet.cConvergenceSLTypes[nIndex];
 920
 921		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "psfCSType = %p", psfCSType);
 922		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "CCPacketClassificationRuleSI====>");
 923		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%X ",
 924				psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
 925		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,  "u8IPTypeOfServiceLength: 0x%X ",
 926				psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
 927		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
 928				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
 929				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
 930				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
 931
 932		for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
 933			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ",
 934					psfCSType->cCPacketClassificationRule.u8Protocol);
 935
 936		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
 937				psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
 938
 939		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
 940			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
 941					psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
 942
 943		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%X ",
 944				psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
 945
 946		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
 947			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
 948					psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
 949
 950		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength:0x%X ",
 951				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
 952		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
 953				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
 954				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
 955				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
 956				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
 957
 958		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
 959				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
 960		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%02X ,0x%02X ,0x%02X ,0x%02X ",
 961				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
 962				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
 963				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
 964				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
 965
 966		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
 967				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
 968
 969		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
 970				DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: %pM",
 971				psfCSType->cCPacketClassificationRule.
 972						u8EthernetDestMacAddress);
 973
 974		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
 975				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
 976
 977		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
 978				DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: %pM",
 979				psfCSType->cCPacketClassificationRule.
 980						u8EthernetSourceMACAddress);
 981
 982		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ",
 983				psfCSType->cCPacketClassificationRule.u8EthertypeLength);
 984		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Ethertype[3]: 0x%02X ,0x%02X ,0x%02X ",
 985				psfCSType->cCPacketClassificationRule.u8Ethertype[0],
 986				psfCSType->cCPacketClassificationRule.u8Ethertype[1],
 987				psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
 988
 989		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
 990		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
 991		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
 992		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
 993				psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
 994
 995		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%X ",
 996				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
 997		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%X ",
 998				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
 999#ifdef VERSION_D5
1000		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1001				psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1002		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1003				DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x%*ph ",
1004				6, psfCSType->cCPacketClassificationRule.
1005					      u8IPv6FlowLable);
1006#endif
1007	}
1008
1009	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%02X", pstAddIndication->sfAuthorizedSet.bValid);
1010	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "AdmittedSet--->");
1011	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfAdmittedSet.u32SFID);
1012	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfAdmittedSet.u16CID);
1013	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X",
1014			pstAddIndication->sfAdmittedSet.u8ServiceClassNameLength);
1015	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,
1016			"u8ServiceClassName: 0x%*ph",
1017			6, pstAddIndication->sfAdmittedSet.u8ServiceClassName);
1018
1019	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfAdmittedSet.u8MBSService);
1020	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfAdmittedSet.u8QosParamSet);
1021	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfAdmittedSet.u8TrafficPriority);
1022	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfAdmittedSet.u32MaxTrafficBurst);
1023	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1024			pstAddIndication->sfAdmittedSet.u32MinReservedTrafficRate);
1025
1026	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1027			pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParamLength);
1028	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1029			pstAddIndication->sfAdmittedSet.u8VendorSpecificQoSParam[0]);
1030	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1031			pstAddIndication->sfAdmittedSet.u8ServiceFlowSchedulingType);
1032	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfAdmittedSet.u32ToleratedJitter);
1033	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X", pstAddIndication->sfAdmittedSet.u32MaximumLatency);
1034	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1035			pstAddIndication->sfAdmittedSet.u8FixedLengthVSVariableLengthSDUIndicator);
1036	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%02X", pstAddIndication->sfAdmittedSet.u8SDUSize);
1037	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TargetSAID: 0x%02X", pstAddIndication->sfAdmittedSet.u16TargetSAID);
1038	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQEnable: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQEnable);
1039	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQWindowSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQWindowSize);
1040	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryTxTimeOut);
1041	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRetryRxTimeOut);
1042	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockLifeTime);
1043	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQSyncLossTimeOut);
1044	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ARQDeliverInOrder: 0x%02X", pstAddIndication->sfAdmittedSet.u8ARQDeliverInOrder);
1045	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQRxPurgeTimeOut);
1046	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16ARQBlockSize: 0x%X", pstAddIndication->sfAdmittedSet.u16ARQBlockSize);
1047	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8CSSpecification: 0x%02X", pstAddIndication->sfAdmittedSet.u8CSSpecification);
1048	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TypeOfDataDeliveryService: 0x%02X",
1049			pstAddIndication->sfAdmittedSet.u8TypeOfDataDeliveryService);
1050	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfAdmittedSet.u16SDUInterArrivalTime);
1051	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16TimeBase: 0x%X", pstAddIndication->sfAdmittedSet.u16TimeBase);
1052	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8PagingPreference: 0x%X", pstAddIndication->sfAdmittedSet.u8PagingPreference);
1053	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficIndicationPreference: 0x%02X",
1054			pstAddIndication->sfAdmittedSet.u8TrafficIndicationPreference);
1055	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfAdmittedSet.u8TotalClassifiers);
1056
1057	nCurClassifierCnt = pstAddIndication->sfAdmittedSet.u8TotalClassifiers;
1058	if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1059		nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1060
1061	for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++) {
1062		struct bcm_convergence_types *psfCSType = NULL;
1063
1064		psfCSType =  &pstAddIndication->sfAdmittedSet.cConvergenceSLTypes[nIndex];
1065		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1066		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ClassifierRulePriority: 0x%02X ",
1067				psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1068		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPTypeOfServiceLength: 0x%02X",
1069				psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1070		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1071				DBG_LVL_ALL, "u8IPTypeOfService[3]: 0x%*ph",
1072				3, psfCSType->cCPacketClassificationRule.
1073					      u8IPTypeOfService);
1074		for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1075			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8Protocol: 0x%02X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1076
1077		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%02X ",
1078				psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1079
1080		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1081			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%02X ",
1082					psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1083
1084		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1085				psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1086
1087		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1088			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddress[32]: 0x%02X ",
1089					psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1090
1091		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolSourcePortRangeLength: 0x%02X ",
1092				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1093
1094		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1095				DBG_LVL_ALL, "u8ProtocolSourcePortRange[4]: 0x%*ph ",
1096				4, psfCSType->cCPacketClassificationRule.
1097						u8ProtocolSourcePortRange);
1098
1099		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ProtocolDestPortRangeLength: 0x%02X ",
1100				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1101
1102		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1103				DBG_LVL_ALL, "u8ProtocolDestPortRange[4]: 0x%*ph ",
1104				4, psfCSType->cCPacketClassificationRule.
1105						u8ProtocolDestPortRange);
1106
1107		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetDestMacAddressLength: 0x%02X ",
1108				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1109
1110		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1111				DBG_LVL_ALL, "u8EthernetDestMacAddress[6]: %pM",
1112				psfCSType->cCPacketClassificationRule.
1113						u8EthernetDestMacAddress);
1114
1115		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddressLength: 0x%02X ",
1116				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1117
1118		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1119				DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: %pM",
1120				psfCSType->cCPacketClassificationRule.
1121						u8EthernetSourceMACAddress);
1122
1123		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthertypeLength: 0x%02X ", psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1124		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1125				DBG_LVL_ALL, "u8Ethertype[3]: 0x%*ph",
1126				3, psfCSType->cCPacketClassificationRule.
1127					      u8Ethertype);
1128
1129		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16UserPriority: 0x%X ", psfCSType->cCPacketClassificationRule.u16UserPriority);
1130		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1131		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8AssociatedPHSI: 0x%02X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1132		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16PacketClassificationRuleIndex: 0x%X ",
1133				psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1134		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParamLength: 0x%02X",
1135				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1136		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificClassifierParam[1]: 0x%02X ",
1137				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1138#ifdef VERSION_D5
1139		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPv6FlowLableLength: 0x%X ",
1140				psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1141		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL,
1142				DBG_LVL_ALL, "u8IPv6FlowLable[6]: 0x%*ph ",
1143				6, psfCSType->cCPacketClassificationRule.
1144					      u8IPv6FlowLable);
1145#endif
1146	}
1147
1148	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "bValid: 0x%X", pstAddIndication->sfAdmittedSet.bValid);
1149	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " ActiveSet--->");
1150	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32SFID: 0x%X", pstAddIndication->sfActiveSet.u32SFID);
1151	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u16CID: 0x%X", pstAddIndication->sfActiveSet.u16CID);
1152	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceClassNameLength: 0x%X", pstAddIndication->sfActiveSet.u8ServiceClassNameLength);
1153	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL,
1154			"u8ServiceClassName: 0x%*ph",
1155			6, pstAddIndication->sfActiveSet.u8ServiceClassName);
1156
1157	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8MBSService: 0x%02X", pstAddIndication->sfActiveSet.u8MBSService);
1158	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8QosParamSet: 0x%02X", pstAddIndication->sfActiveSet.u8QosParamSet);
1159	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8TrafficPriority: 0x%02X", pstAddIndication->sfActiveSet.u8TrafficPriority);
1160	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaxTrafficBurst: 0x%X", pstAddIndication->sfActiveSet.u32MaxTrafficBurst);
1161	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MinReservedTrafficRate: 0x%X",
1162			pstAddIndication->sfActiveSet.u32MinReservedTrafficRate);
1163	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParamLength: 0x%02X",
1164			pstAddIndication->sfActiveSet.u8VendorSpecificQoSParamLength);
1165	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8VendorSpecificQoSParam: 0x%02X",
1166			pstAddIndication->sfActiveSet.u8VendorSpecificQoSParam[0]);
1167	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8ServiceFlowSchedulingType: 0x%02X",
1168			pstAddIndication->sfActiveSet.u8ServiceFlowSchedulingType);
1169	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32ToleratedJitter: 0x%X", pstAddIndication->sfActiveSet.u32ToleratedJitter);
1170	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u32MaximumLatency: 0x%X",	pstAddIndication->sfActiveSet.u32MaximumLatency);
1171	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8FixedLengthVSVariableLengthSDUIndicator: 0x%02X",
1172			pstAddIndication->sfActiveSet.u8FixedLengthVSVariableLengthSDUIndicator);
1173	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8SDUSize: 0x%X",	pstAddIndication->sfActiveSet.u8SDUSize);
1174	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TargetSAID: 0x%X", pstAddIndication->sfActiveSet.u16TargetSAID);
1175	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQEnable: 0x%X", pstAddIndication->sfActiveSet.u8ARQEnable);
1176	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQWindowSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQWindowSize);
1177	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryTxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryTxTimeOut);
1178	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRetryRxTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRetryRxTimeOut);
1179	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockLifeTime: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockLifeTime);
1180	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQSyncLossTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQSyncLossTimeOut);
1181	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ARQDeliverInOrder: 0x%X", pstAddIndication->sfActiveSet.u8ARQDeliverInOrder);
1182	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQRxPurgeTimeOut: 0x%X", pstAddIndication->sfActiveSet.u16ARQRxPurgeTimeOut);
1183	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16ARQBlockSize: 0x%X", pstAddIndication->sfActiveSet.u16ARQBlockSize);
1184	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8CSSpecification: 0x%X", pstAddIndication->sfActiveSet.u8CSSpecification);
1185	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TypeOfDataDeliveryService: 0x%X",
1186			pstAddIndication->sfActiveSet.u8TypeOfDataDeliveryService);
1187	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16SDUInterArrivalTime: 0x%X", pstAddIndication->sfActiveSet.u16SDUInterArrivalTime);
1188	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16TimeBase: 0x%X", pstAddIndication->sfActiveSet.u16TimeBase);
1189	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8PagingPreference: 0x%X", pstAddIndication->sfActiveSet.u8PagingPreference);
1190	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8TrafficIndicationPreference: 0x%X",
1191			pstAddIndication->sfActiveSet.u8TrafficIndicationPreference);
1192	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " Total Classifiers Received: 0x%X", pstAddIndication->sfActiveSet.u8TotalClassifiers);
1193
1194	nCurClassifierCnt = pstAddIndication->sfActiveSet.u8TotalClassifiers;
1195	if (nCurClassifierCnt > MAX_CLASSIFIERS_IN_SF)
1196		nCurClassifierCnt = MAX_CLASSIFIERS_IN_SF;
1197
1198	for (nIndex = 0; nIndex < nCurClassifierCnt; nIndex++)	{
1199		struct bcm_convergence_types *psfCSType = NULL;
1200
1201		psfCSType =  &pstAddIndication->sfActiveSet.cConvergenceSLTypes[nIndex];
1202		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " CCPacketClassificationRuleSI====>");
1203		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ClassifierRulePriority: 0x%X ",
1204				psfCSType->cCPacketClassificationRule.u8ClassifierRulePriority);
1205		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfServiceLength: 0x%X ",
1206				psfCSType->cCPacketClassificationRule.u8IPTypeOfServiceLength);
1207		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPTypeOfService[3]: 0x%X ,0x%X ,0x%X ",
1208				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[0],
1209				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[1],
1210				psfCSType->cCPacketClassificationRule.u8IPTypeOfService[2]);
1211
1212		for (uiLoopIndex = 0; uiLoopIndex < 1; uiLoopIndex++)
1213			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Protocol: 0x%X ", psfCSType->cCPacketClassificationRule.u8Protocol);
1214
1215		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddressLength: 0x%X ",
1216				psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddressLength);
1217
1218		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1219			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPMaskedSourceAddress[32]: 0x%X ",
1220					psfCSType->cCPacketClassificationRule.u8IPMaskedSourceAddress[uiLoopIndex]);
1221
1222		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8IPDestinationAddressLength: 0x%02X ",
1223				psfCSType->cCPacketClassificationRule.u8IPDestinationAddressLength);
1224
1225		for (uiLoopIndex = 0; uiLoopIndex < 32; uiLoopIndex++)
1226			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPDestinationAddress[32]:0x%X ",
1227					psfCSType->cCPacketClassificationRule.u8IPDestinationAddress[uiLoopIndex]);
1228
1229		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRangeLength: 0x%X ",
1230				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRangeLength);
1231
1232		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolSourcePortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1233				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[0],
1234				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[1],
1235				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[2],
1236				psfCSType->cCPacketClassificationRule.u8ProtocolSourcePortRange[3]);
1237
1238		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRangeLength: 0x%X ",
1239				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRangeLength);
1240		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8ProtocolDestPortRange[4]: 0x%X ,0x%X ,0x%X ,0x%X ",
1241				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[0],
1242				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[1],
1243				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[2],
1244				psfCSType->cCPacketClassificationRule.u8ProtocolDestPortRange[3]);
1245
1246		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddressLength: 0x%X ",
1247				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1248		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetDestMacAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1249				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[0],
1250				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[1],
1251				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[2],
1252				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[3],
1253				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[4],
1254				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddress[5]);
1255
1256		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthernetSourceMACAddressLength: 0x%X ",
1257				psfCSType->cCPacketClassificationRule.u8EthernetDestMacAddressLength);
1258		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, "u8EthernetSourceMACAddress[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X",
1259				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[0],
1260				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[1],
1261				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[2],
1262				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[3],
1263				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[4],
1264				psfCSType->cCPacketClassificationRule.u8EthernetSourceMACAddress[5]);
1265
1266		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8EthertypeLength: 0x%X ",
1267				psfCSType->cCPacketClassificationRule.u8EthertypeLength);
1268		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8Ethertype[3]: 0x%X ,0x%X ,0x%X ",
1269				psfCSType->cCPacketClassificationRule.u8Ethertype[0],
1270				psfCSType->cCPacketClassificationRule.u8Ethertype[1],
1271				psfCSType->cCPacketClassificationRule.u8Ethertype[2]);
1272		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16UserPriority: 0x%X ",
1273				psfCSType->cCPacketClassificationRule.u16UserPriority);
1274		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16VLANID: 0x%X ", psfCSType->cCPacketClassificationRule.u16VLANID);
1275		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8AssociatedPHSI: 0x%X ", psfCSType->cCPacketClassificationRule.u8AssociatedPHSI);
1276		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u16PacketClassificationRuleIndex:0x%X ",
1277				psfCSType->cCPacketClassificationRule.u16PacketClassificationRuleIndex);
1278
1279		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParamLength:0x%X ",
1280				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParamLength);
1281		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8VendorSpecificClassifierParam[1]:0x%X ",
1282				psfCSType->cCPacketClassificationRule.u8VendorSpecificClassifierParam[0]);
1283#ifdef VERSION_D5
1284		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLableLength: 0x%X ",
1285				psfCSType->cCPacketClassificationRule.u8IPv6FlowLableLength);
1286		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " u8IPv6FlowLable[6]: 0x%X ,0x%X ,0x%X ,0x%X ,0x%X ,0x%X ",
1287				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[0],
1288				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[1],
1289				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[2],
1290				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[3],
1291				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[4],
1292				psfCSType->cCPacketClassificationRule.u8IPv6FlowLable[5]);
1293#endif
1294	}
1295
1296	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, DUMP_CONTROL, DBG_LVL_ALL, " bValid: 0x%X", pstAddIndication->sfActiveSet.bValid);
1297}
1298
1299static inline ULONG RestoreSFParam(struct bcm_mini_adapter *Adapter, ULONG ulAddrSFParamSet, PUCHAR pucDestBuffer)
1300{
1301	UINT  nBytesToRead = sizeof(struct bcm_connect_mgr_params);
1302
1303	if (ulAddrSFParamSet == 0 || NULL == pucDestBuffer) {
1304		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Got Param address as 0!!");
1305		return 0;
1306	}
1307	ulAddrSFParamSet = ntohl(ulAddrSFParamSet);
1308
1309	/* Read out the SF Param Set At the indicated Location */
1310	if (rdm(Adapter, ulAddrSFParamSet, (PUCHAR)pucDestBuffer, nBytesToRead) < 0)
1311		return STATUS_FAILURE;
1312
1313	return 1;
1314}
1315
1316static ULONG StoreSFParam(struct bcm_mini_adapter *Adapter, PUCHAR pucSrcBuffer, ULONG ulAddrSFParamSet)
1317{
1318	UINT nBytesToWrite = sizeof(struct bcm_connect_mgr_params);
1319	int ret = 0;
1320
1321	if (ulAddrSFParamSet == 0 || NULL == pucSrcBuffer)
1322		return 0;
1323
1324	ret = wrm(Adapter, ulAddrSFParamSet, (u8 *)pucSrcBuffer, nBytesToWrite);
1325	if (ret < 0) {
1326		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "%s:%d WRM failed", __func__, __LINE__);
1327		return ret;
1328	}
1329	return 1;
1330}
1331
1332ULONG StoreCmControlResponseMessage(struct bcm_mini_adapter *Adapter, PVOID pvBuffer, UINT *puBufferLength)
1333{
1334	struct bcm_add_indication_alt *pstAddIndicationAlt = NULL;
1335	struct bcm_add_indication *pstAddIndication = NULL;
1336	struct bcm_del_request *pstDeletionRequest;
1337	UINT uiSearchRuleIndex;
1338	ULONG ulSFID;
1339
1340	pstAddIndicationAlt = pvBuffer;
1341
1342	/*
1343	 * In case of DSD Req By MS, we should immediately delete this SF so that
1344	 * we can stop the further classifying the pkt for this SF.
1345	 */
1346	if (pstAddIndicationAlt->u8Type == DSD_REQ) {
1347		pstDeletionRequest = pvBuffer;
1348
1349		ulSFID = ntohl(pstDeletionRequest->u32SFID);
1350		uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1351
1352		if (uiSearchRuleIndex < NO_OF_QUEUES) {
1353			deleteSFBySfid(Adapter, uiSearchRuleIndex);
1354			Adapter->u32TotalDSD++;
1355		}
1356		return 1;
1357	}
1358
1359	if ((pstAddIndicationAlt->u8Type == DSD_RSP) ||
1360		(pstAddIndicationAlt->u8Type == DSD_ACK)) {
1361		/* No Special handling send the message as it is */
1362		return 1;
1363	}
1364	/* For DSA_REQ, only up to "psfAuthorizedSet" parameter should be accessed by driver! */
1365
1366	pstAddIndication = kmalloc(sizeof(struct bcm_add_indication), GFP_KERNEL);
1367	if (pstAddIndication == NULL)
1368		return 0;
1369
1370	/* AUTHORIZED SET */
1371	pstAddIndication->psfAuthorizedSet = (struct bcm_connect_mgr_params *)
1372			GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1373	if (!pstAddIndication->psfAuthorizedSet) {
1374		kfree(pstAddIndication);
1375		return 0;
1376	}
1377
1378	if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAuthorizedSet,
1379				(ULONG)pstAddIndication->psfAuthorizedSet) != 1) {
1380		kfree(pstAddIndication);
1381		return 0;
1382	}
1383
1384	/* this can't possibly be right */
1385	pstAddIndication->psfAuthorizedSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfAuthorizedSet);
1386
1387	if (pstAddIndicationAlt->u8Type == DSA_REQ) {
1388		struct bcm_add_request AddRequest;
1389
1390		AddRequest.u8Type = pstAddIndicationAlt->u8Type;
1391		AddRequest.eConnectionDir = pstAddIndicationAlt->u8Direction;
1392		AddRequest.u16TID = pstAddIndicationAlt->u16TID;
1393		AddRequest.u16CID = pstAddIndicationAlt->u16CID;
1394		AddRequest.u16VCID = pstAddIndicationAlt->u16VCID;
1395		AddRequest.psfParameterSet = pstAddIndication->psfAuthorizedSet;
1396		(*puBufferLength) = sizeof(struct bcm_add_request);
1397		memcpy(pvBuffer, &AddRequest, sizeof(struct bcm_add_request));
1398		kfree(pstAddIndication);
1399		return 1;
1400	}
1401
1402	/* Since it's not DSA_REQ, we can access all field in pstAddIndicationAlt */
1403	/* We need to extract the structure from the buffer and pack it differently */
1404
1405	pstAddIndication->u8Type = pstAddIndicationAlt->u8Type;
1406	pstAddIndication->eConnectionDir = pstAddIndicationAlt->u8Direction;
1407	pstAddIndication->u16TID = pstAddIndicationAlt->u16TID;
1408	pstAddIndication->u16CID = pstAddIndicationAlt->u16CID;
1409	pstAddIndication->u16VCID = pstAddIndicationAlt->u16VCID;
1410	pstAddIndication->u8CC = pstAddIndicationAlt->u8CC;
1411
1412	/* ADMITTED SET */
1413	pstAddIndication->psfAdmittedSet = (struct bcm_connect_mgr_params *)
1414		GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1415	if (!pstAddIndication->psfAdmittedSet) {
1416		kfree(pstAddIndication);
1417		return 0;
1418	}
1419	if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfAdmittedSet, (ULONG)pstAddIndication->psfAdmittedSet) != 1) {
1420		kfree(pstAddIndication);
1421		return 0;
1422	}
1423
1424	pstAddIndication->psfAdmittedSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfAdmittedSet);
1425
1426	/* ACTIVE SET */
1427	pstAddIndication->psfActiveSet = (struct bcm_connect_mgr_params *)
1428		GetNextTargetBufferLocation(Adapter, pstAddIndicationAlt->u16TID);
1429	if (!pstAddIndication->psfActiveSet) {
1430		kfree(pstAddIndication);
1431		return 0;
1432	}
1433	if (StoreSFParam(Adapter, (PUCHAR)&pstAddIndicationAlt->sfActiveSet, (ULONG)pstAddIndication->psfActiveSet) != 1) {
1434		kfree(pstAddIndication);
1435		return 0;
1436	}
1437
1438	pstAddIndication->psfActiveSet = (struct bcm_connect_mgr_params *)ntohl((ULONG)pstAddIndication->psfActiveSet);
1439
1440	(*puBufferLength) = sizeof(struct bcm_add_indication);
1441	*(struct bcm_add_indication *)pvBuffer = *pstAddIndication;
1442	kfree(pstAddIndication);
1443	return 1;
1444}
1445
1446static inline struct bcm_add_indication_alt
1447*RestoreCmControlResponseMessage(register struct bcm_mini_adapter *Adapter, register PVOID pvBuffer)
1448{
1449	ULONG ulStatus = 0;
1450	struct bcm_add_indication *pstAddIndication = NULL;
1451	struct bcm_add_indication_alt *pstAddIndicationDest = NULL;
1452
1453	pstAddIndication = pvBuffer;
1454	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "=====>");
1455	if ((pstAddIndication->u8Type == DSD_REQ) ||
1456		(pstAddIndication->u8Type == DSD_RSP) ||
1457		(pstAddIndication->u8Type == DSD_ACK))
1458		return pvBuffer;
1459
1460	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Inside RestoreCmControlResponseMessage ");
1461	/*
1462	 * Need to Allocate memory to contain the SUPER Large structures
1463	 * Our driver can't create these structures on Stack :(
1464	 */
1465	pstAddIndicationDest = kmalloc(sizeof(struct bcm_add_indication_alt), GFP_KERNEL);
1466
1467	if (pstAddIndicationDest) {
1468		memset(pstAddIndicationDest, 0, sizeof(struct bcm_add_indication_alt));
1469	} else {
1470		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Failed to allocate memory for SF Add Indication Structure ");
1471		return NULL;
1472	}
1473	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Type : 0x%X", pstAddIndication->u8Type);
1474	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8Direction : 0x%X", pstAddIndication->eConnectionDir);
1475	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8TID : 0x%X", ntohs(pstAddIndication->u16TID));
1476	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u8CID : 0x%X", ntohs(pstAddIndication->u16CID));
1477	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-u16VCID : 0x%X", ntohs(pstAddIndication->u16VCID));
1478	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-autorized set loc : %p", pstAddIndication->psfAuthorizedSet);
1479	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-admitted set loc : %p", pstAddIndication->psfAdmittedSet);
1480	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "AddIndication-Active set loc : %p", pstAddIndication->psfActiveSet);
1481
1482	pstAddIndicationDest->u8Type = pstAddIndication->u8Type;
1483	pstAddIndicationDest->u8Direction = pstAddIndication->eConnectionDir;
1484	pstAddIndicationDest->u16TID = pstAddIndication->u16TID;
1485	pstAddIndicationDest->u16CID = pstAddIndication->u16CID;
1486	pstAddIndicationDest->u16VCID = pstAddIndication->u16VCID;
1487	pstAddIndicationDest->u8CC = pstAddIndication->u8CC;
1488
1489	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,  "Restoring Active Set ");
1490	ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfActiveSet, (PUCHAR)&pstAddIndicationDest->sfActiveSet);
1491	if (ulStatus != 1)
1492		goto failed_restore_sf_param;
1493
1494	if (pstAddIndicationDest->sfActiveSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1495		pstAddIndicationDest->sfActiveSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1496
1497	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,  "Restoring Admitted Set ");
1498	ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAdmittedSet, (PUCHAR)&pstAddIndicationDest->sfAdmittedSet);
1499	if (ulStatus != 1)
1500		goto failed_restore_sf_param;
1501
1502	if (pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1503		pstAddIndicationDest->sfAdmittedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1504
1505	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,  "Restoring Authorized Set ");
1506	ulStatus = RestoreSFParam(Adapter, (ULONG)pstAddIndication->psfAuthorizedSet, (PUCHAR)&pstAddIndicationDest->sfAuthorizedSet);
1507	if (ulStatus != 1)
1508		goto failed_restore_sf_param;
1509
1510	if (pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers > MAX_CLASSIFIERS_IN_SF)
1511		pstAddIndicationDest->sfAuthorizedSet.u8TotalClassifiers = MAX_CLASSIFIERS_IN_SF;
1512
1513	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Dumping the whole raw packet");
1514	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1515	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " pstAddIndicationDest->sfActiveSet size  %zx %p", sizeof(*pstAddIndicationDest), pstAddIndicationDest);
1516	/* BCM_DEBUG_PRINT_BUFFER(Adapter,DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, (unsigned char *)pstAddIndicationDest, sizeof(*pstAddIndicationDest)); */
1517	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "============================================================");
1518	return pstAddIndicationDest;
1519failed_restore_sf_param:
1520	kfree(pstAddIndicationDest);
1521	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "<=====");
1522	return NULL;
1523}
1524
1525ULONG SetUpTargetDsxBuffers(struct bcm_mini_adapter *Adapter)
1526{
1527	ULONG ulTargetDsxBuffersBase = 0;
1528	ULONG ulCntTargetBuffers;
1529	ULONG i;
1530	int Status;
1531
1532	if (!Adapter) {
1533		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Adapter was NULL!!!");
1534		return 0;
1535	}
1536
1537	if (Adapter->astTargetDsxBuffer[0].ulTargetDsxBuffer)
1538		return 1;
1539
1540	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Size of Each DSX Buffer(Also size of connection manager parameters): %zx ", sizeof(struct bcm_connect_mgr_params));
1541	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Reading DSX buffer From Target location %x ", DSX_MESSAGE_EXCHANGE_BUFFER);
1542
1543	Status = rdmalt(Adapter, DSX_MESSAGE_EXCHANGE_BUFFER, (PUINT)&ulTargetDsxBuffersBase, sizeof(UINT));
1544	if (Status < 0) {
1545		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "RDM failed!!");
1546		return 0;
1547	}
1548
1549	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Base Address Of DSX  Target Buffer : 0x%lx", ulTargetDsxBuffersBase);
1550	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL,  "Tgt Buffer is Now %lx :", ulTargetDsxBuffersBase);
1551	ulCntTargetBuffers = DSX_MESSAGE_EXCHANGE_BUFFER_SIZE / sizeof(struct bcm_connect_mgr_params);
1552
1553	Adapter->ulTotalTargetBuffersAvailable =
1554		ulCntTargetBuffers > MAX_TARGET_DSX_BUFFERS ?
1555		MAX_TARGET_DSX_BUFFERS : ulCntTargetBuffers;
1556
1557	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " Total Target DSX Buffer setup %lx ", Adapter->ulTotalTargetBuffersAvailable);
1558
1559	for (i = 0; i < Adapter->ulTotalTargetBuffersAvailable; i++) {
1560		Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer = ulTargetDsxBuffersBase;
1561		Adapter->astTargetDsxBuffer[i].valid = 1;
1562		Adapter->astTargetDsxBuffer[i].tid = 0;
1563		ulTargetDsxBuffersBase += sizeof(struct bcm_connect_mgr_params);
1564		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "  Target DSX Buffer %lx setup at 0x%lx",
1565				i, Adapter->astTargetDsxBuffer[i].ulTargetDsxBuffer);
1566	}
1567	Adapter->ulCurrentTargetBuffer = 0;
1568	Adapter->ulFreeTargetBufferCnt = Adapter->ulTotalTargetBuffersAvailable;
1569	return 1;
1570}
1571
1572static ULONG GetNextTargetBufferLocation(struct bcm_mini_adapter *Adapter, B_UINT16 tid)
1573{
1574	ULONG dsx_buf;
1575	ULONG idx, max_try;
1576
1577	if ((Adapter->ulTotalTargetBuffersAvailable == 0) || (Adapter->ulFreeTargetBufferCnt == 0)) {
1578		ClearTargetDSXBuffer(Adapter, tid, false);
1579		return 0;
1580	}
1581
1582	idx = Adapter->ulCurrentTargetBuffer;
1583	max_try = Adapter->ulTotalTargetBuffersAvailable;
1584	while ((max_try) && (Adapter->astTargetDsxBuffer[idx].valid != 1)) {
1585		idx = (idx+1) % Adapter->ulTotalTargetBuffersAvailable;
1586		max_try--;
1587	}
1588
1589	if (max_try == 0) {
1590		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "\n GetNextTargetBufferLocation : Error No Free Target DSX Buffers FreeCnt : %lx ", Adapter->ulFreeTargetBufferCnt);
1591		ClearTargetDSXBuffer(Adapter, tid, false);
1592		return 0;
1593	}
1594
1595	dsx_buf = Adapter->astTargetDsxBuffer[idx].ulTargetDsxBuffer;
1596	Adapter->astTargetDsxBuffer[idx].valid = 0;
1597	Adapter->astTargetDsxBuffer[idx].tid = tid;
1598	Adapter->ulFreeTargetBufferCnt--;
1599	idx = (idx+1)%Adapter->ulTotalTargetBuffersAvailable;
1600	Adapter->ulCurrentTargetBuffer = idx;
1601	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "GetNextTargetBufferLocation :Returning address %lx tid %d\n", dsx_buf, tid);
1602
1603	return dsx_buf;
1604}
1605
1606int AllocAdapterDsxBuffer(struct bcm_mini_adapter *Adapter)
1607{
1608	/*
1609	 * Need to Allocate memory to contain the SUPER Large structures
1610	 * Our driver can't create these structures on Stack
1611	 */
1612	Adapter->caDsxReqResp = kmalloc(sizeof(struct bcm_add_indication_alt)+LEADER_SIZE, GFP_KERNEL);
1613	if (!Adapter->caDsxReqResp)
1614		return -ENOMEM;
1615
1616	return 0;
1617}
1618
1619int FreeAdapterDsxBuffer(struct bcm_mini_adapter *Adapter)
1620{
1621	kfree(Adapter->caDsxReqResp);
1622	return 0;
1623}
1624
1625/*
1626 * @ingroup ctrl_pkt_functions
1627 * This routinue would process the Control responses
1628 * for the Connection Management.
1629 * @return - Queue index for the free SFID else returns Invalid Index.
1630 */
1631bool CmControlResponseMessage(struct bcm_mini_adapter *Adapter,  /* <Pointer to the Adapter structure */
1632				PVOID pvBuffer /* Starting Address of the Buffer, that contains the AddIndication Data */)
1633{
1634	struct bcm_connect_mgr_params *psfLocalSet = NULL;
1635	struct bcm_add_indication_alt *pstAddIndication = NULL;
1636	struct bcm_change_indication *pstChangeIndication = NULL;
1637	struct bcm_leader *pLeader = NULL;
1638	INT uiSearchRuleIndex = 0;
1639	ULONG ulSFID;
1640
1641	/*
1642	 * Otherwise the message contains a target address from where we need to
1643	 * read out the rest of the service flow param structure
1644	 */
1645	pstAddIndication = RestoreCmControlResponseMessage(Adapter, pvBuffer);
1646	if (pstAddIndication == NULL) {
1647		ClearTargetDSXBuffer(Adapter, ((struct bcm_add_indication *)pvBuffer)->u16TID, false);
1648		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "Error in restoring Service Flow param structure from DSx message");
1649		return false;
1650	}
1651
1652	DumpCmControlPacket(pstAddIndication);
1653	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "====>");
1654	pLeader = (struct bcm_leader *)Adapter->caDsxReqResp;
1655
1656	pLeader->Status = CM_CONTROL_NEWDSX_MULTICLASSIFIER_REQ;
1657	pLeader->Vcid = 0;
1658
1659	ClearTargetDSXBuffer(Adapter, pstAddIndication->u16TID, false);
1660	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "### TID RECEIVED %d\n", pstAddIndication->u16TID);
1661	switch (pstAddIndication->u8Type) {
1662	case DSA_REQ:
1663		pLeader->PLength = sizeof(struct bcm_add_indication_alt);
1664		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Sending DSA Response....\n");
1665		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA RESPONSE TO MAC %d", pLeader->PLength);
1666		*((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1667			= *pstAddIndication;
1668		((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_RSP;
1669
1670		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, " VCID = %x", ntohs(pstAddIndication->u16VCID));
1671		CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1672		kfree(pstAddIndication);
1673		break;
1674	case DSA_RSP:
1675		pLeader->PLength = sizeof(struct bcm_add_indication_alt);
1676		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSA ACK TO MAC %d",
1677				pLeader->PLength);
1678		*((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))
1679			= *pstAddIndication;
1680		((struct bcm_add_indication_alt *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSA_ACK;
1681		/* FALLTHROUGH */
1682	case DSA_ACK:
1683		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "VCID:0x%X",
1684				ntohs(pstAddIndication->u16VCID));
1685		uiSearchRuleIndex = SearchFreeSfid(Adapter);
1686		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "uiSearchRuleIndex:0x%X ",
1687				uiSearchRuleIndex);
1688		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Direction:0x%X ",
1689				pstAddIndication->u8Direction);
1690		if (uiSearchRuleIndex < NO_OF_QUEUES) {
1691			Adapter->PackInfo[uiSearchRuleIndex].ucDirection =
1692				pstAddIndication->u8Direction;
1693			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "bValid:0x%X ",
1694					pstAddIndication->sfActiveSet.bValid);
1695			if (pstAddIndication->sfActiveSet.bValid == TRUE)
1696				Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1697
1698			if (pstAddIndication->sfAuthorizedSet.bValid == TRUE)
1699				Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1700
1701			if (pstAddIndication->sfAdmittedSet.bValid == TRUE)
1702				Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1703
1704			if (pstAddIndication->sfActiveSet.bValid == false) {
1705				Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1706				Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = false;
1707				if (pstAddIndication->sfAdmittedSet.bValid)
1708					psfLocalSet = &pstAddIndication->sfAdmittedSet;
1709				else if (pstAddIndication->sfAuthorizedSet.bValid)
1710					psfLocalSet = &pstAddIndication->sfAuthorizedSet;
1711			} else {
1712				psfLocalSet = &pstAddIndication->sfActiveSet;
1713				Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1714			}
1715
1716			if (!psfLocalSet) {
1717				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1718				Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1719				Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1720				Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1721				kfree(pstAddIndication);
1722			} else if (psfLocalSet->bValid && (pstAddIndication->u8CC == 0)) {
1723				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSA ACK");
1724				Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstAddIndication->u16VCID);
1725				Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstAddIndication->u16CID);
1726
1727				if (UPLINK_DIR == pstAddIndication->u8Direction)
1728					atomic_set(&Adapter->PackInfo[uiSearchRuleIndex].uiPerSFTxResourceCount, DEFAULT_PERSFCOUNT);
1729
1730				CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSA_ACK, pstAddIndication);
1731				/* don't free pstAddIndication */
1732
1733				/* Inside CopyToAdapter, Sorting of all the SFs take place.
1734				 * Hence any access to the newly added SF through uiSearchRuleIndex is invalid.
1735				 * SHOULD BE STRICTLY AVOIDED.
1736				 */
1737				/* *(PULONG)(((PUCHAR)pvBuffer)+1)=psfLocalSet->u32SFID; */
1738				memcpy((((PUCHAR)pvBuffer)+1), &psfLocalSet->u32SFID, 4);
1739
1740				if (pstAddIndication->sfActiveSet.bValid == TRUE) {
1741					if (UPLINK_DIR == pstAddIndication->u8Direction) {
1742						if (!Adapter->LinkUpStatus) {
1743							netif_carrier_on(Adapter->dev);
1744							netif_start_queue(Adapter->dev);
1745							Adapter->LinkUpStatus = 1;
1746							if (netif_msg_link(Adapter))
1747								pr_info(PFX "%s: link up\n", Adapter->dev->name);
1748							atomic_set(&Adapter->TxPktAvail, 1);
1749							wake_up(&Adapter->tx_packet_wait_queue);
1750							Adapter->liTimeSinceLastNetEntry = get_seconds();
1751						}
1752					}
1753				}
1754			} else {
1755				Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1756				Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1757				Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1758				kfree(pstAddIndication);
1759			}
1760		} else {
1761			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSA ACK did not get valid SFID");
1762			kfree(pstAddIndication);
1763			return false;
1764		}
1765		break;
1766	case DSC_REQ:
1767		pLeader->PLength = sizeof(struct bcm_change_indication);
1768		pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1769		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC RESPONSE TO MAC %d", pLeader->PLength);
1770
1771		*((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1772		((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_RSP;
1773
1774		CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1775		kfree(pstAddIndication);
1776		break;
1777	case DSC_RSP:
1778		pLeader->PLength = sizeof(struct bcm_change_indication);
1779		pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1780		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSC ACK TO MAC %d", pLeader->PLength);
1781		*((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *pstChangeIndication;
1782		((struct bcm_change_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSC_ACK;
1783		/* FALLTHROUGH */
1784	case DSC_ACK:
1785		pstChangeIndication = (struct bcm_change_indication *)pstAddIndication;
1786		uiSearchRuleIndex = SearchSfid(Adapter, ntohl(pstChangeIndication->sfActiveSet.u32SFID));
1787		if (uiSearchRuleIndex > NO_OF_QUEUES-1)
1788			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "SF doesn't exist for which DSC_ACK is received");
1789
1790		if (uiSearchRuleIndex < NO_OF_QUEUES) {
1791			Adapter->PackInfo[uiSearchRuleIndex].ucDirection = pstChangeIndication->u8Direction;
1792			if (pstChangeIndication->sfActiveSet.bValid == TRUE)
1793				Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1794
1795			if (pstChangeIndication->sfAuthorizedSet.bValid == TRUE)
1796				Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1797
1798			if (pstChangeIndication->sfAdmittedSet.bValid == TRUE)
1799				Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1800
1801			if (pstChangeIndication->sfActiveSet.bValid == false) {
1802				Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1803				Adapter->PackInfo[uiSearchRuleIndex].bActivateRequestSent = false;
1804
1805				if (pstChangeIndication->sfAdmittedSet.bValid)
1806					psfLocalSet = &pstChangeIndication->sfAdmittedSet;
1807				else if (pstChangeIndication->sfAuthorizedSet.bValid)
1808					psfLocalSet = &pstChangeIndication->sfAuthorizedSet;
1809			} else {
1810				psfLocalSet = &pstChangeIndication->sfActiveSet;
1811				Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1812			}
1813
1814			if (!psfLocalSet) {
1815				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "No set is valid\n");
1816				Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1817				Adapter->PackInfo[uiSearchRuleIndex].bValid = false;
1818				Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = 0;
1819				kfree(pstAddIndication);
1820			} else if (psfLocalSet->bValid && (pstChangeIndication->u8CC == 0)) {
1821				Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pstChangeIndication->u16VCID);
1822				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "CC field is %d bvalid = %d\n",
1823						pstChangeIndication->u8CC, psfLocalSet->bValid);
1824				BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "VCID= %d\n", ntohs(pstChangeIndication->u16VCID));
1825				Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pstChangeIndication->u16CID);
1826				CopyToAdapter(Adapter, psfLocalSet, uiSearchRuleIndex, DSC_ACK, pstAddIndication);
1827
1828				*(PULONG)(((PUCHAR)pvBuffer)+1) = psfLocalSet->u32SFID;
1829			} else if (pstChangeIndication->u8CC == 6) {
1830				deleteSFBySfid(Adapter, uiSearchRuleIndex);
1831				kfree(pstAddIndication);
1832			}
1833		} else {
1834			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "DSC ACK did not get valid SFID");
1835			kfree(pstAddIndication);
1836			return false;
1837		}
1838		break;
1839	case DSD_REQ:
1840		pLeader->PLength = sizeof(struct bcm_del_indication);
1841		*((struct bcm_del_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE])) = *((struct bcm_del_indication *)pstAddIndication);
1842
1843		ulSFID = ntohl(((struct bcm_del_indication *)pstAddIndication)->u32SFID);
1844		uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1845		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD - Removing connection %x", uiSearchRuleIndex);
1846
1847		if (uiSearchRuleIndex < NO_OF_QUEUES) {
1848			/* Delete All Classifiers Associated with this SFID */
1849			deleteSFBySfid(Adapter, uiSearchRuleIndex);
1850			Adapter->u32TotalDSD++;
1851		}
1852
1853		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SENDING DSD RESPONSE TO MAC");
1854		((struct bcm_del_indication *)&(Adapter->caDsxReqResp[LEADER_SIZE]))->u8Type = DSD_RSP;
1855		CopyBufferToControlPacket(Adapter, (PVOID)Adapter->caDsxReqResp);
1856		/* FALLTHROUGH */
1857	case DSD_RSP:
1858		/* Do nothing as SF has already got Deleted */
1859		break;
1860	case DSD_ACK:
1861		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "DSD ACK Rcd, let App handle it\n");
1862		break;
1863	default:
1864		kfree(pstAddIndication);
1865		return false;
1866	}
1867	return TRUE;
1868}
1869
1870int get_dsx_sf_data_to_application(struct bcm_mini_adapter *Adapter, UINT uiSFId, void __user *user_buffer)
1871{
1872	int status = 0;
1873	struct bcm_packet_info *psSfInfo = NULL;
1874
1875	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1876	status = SearchSfid(Adapter, uiSFId);
1877	if (status >= NO_OF_QUEUES) {
1878		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID %d not present in queue !!!", uiSFId);
1879		return -EINVAL;
1880	}
1881	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "status =%d", status);
1882	psSfInfo = &Adapter->PackInfo[status];
1883	if (psSfInfo->pstSFIndication && copy_to_user(user_buffer,
1884							psSfInfo->pstSFIndication, sizeof(struct bcm_add_indication_alt))) {
1885		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_PRINTK, 0, 0, "copy to user failed SFID %d, present in queue !!!", uiSFId);
1886		status = -EFAULT;
1887		return status;
1888	}
1889	return STATUS_SUCCESS;
1890}
1891
1892VOID OverrideServiceFlowParams(struct bcm_mini_adapter *Adapter, PUINT puiBuffer)
1893{
1894	B_UINT32 u32NumofSFsinMsg = ntohl(*(puiBuffer + 1));
1895	struct bcm_stim_sfhostnotify *pHostInfo = NULL;
1896	UINT uiSearchRuleIndex = 0;
1897	ULONG ulSFID = 0;
1898
1899	puiBuffer += 2;
1900	BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "u32NumofSFsinMsg: 0x%x\n", u32NumofSFsinMsg);
1901
1902	while (u32NumofSFsinMsg != 0 && u32NumofSFsinMsg < NO_OF_QUEUES) {
1903		u32NumofSFsinMsg--;
1904		pHostInfo = (struct bcm_stim_sfhostnotify *)puiBuffer;
1905		puiBuffer = (PUINT)(pHostInfo + 1);
1906
1907		ulSFID = ntohl(pHostInfo->SFID);
1908		uiSearchRuleIndex = SearchSfid(Adapter, ulSFID);
1909		BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "SFID: 0x%lx\n", ulSFID);
1910
1911		if (uiSearchRuleIndex >= NO_OF_QUEUES || uiSearchRuleIndex == HiPriority) {
1912			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "The SFID <%lx> doesn't exist in host entry or is Invalid\n", ulSFID);
1913			continue;
1914		}
1915
1916		if (pHostInfo->RetainSF == false) {
1917			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "Going to Delete SF");
1918			deleteSFBySfid(Adapter, uiSearchRuleIndex);
1919		} else {
1920			Adapter->PackInfo[uiSearchRuleIndex].usVCID_Value = ntohs(pHostInfo->VCID);
1921			Adapter->PackInfo[uiSearchRuleIndex].usCID = ntohs(pHostInfo->newCID);
1922			Adapter->PackInfo[uiSearchRuleIndex].bActive = false;
1923
1924			BCM_DEBUG_PRINT(Adapter, DBG_TYPE_OTHERS, CONN_MSG, DBG_LVL_ALL, "pHostInfo->QoSParamSet: 0x%x\n", pHostInfo->QoSParamSet);
1925
1926			if (pHostInfo->QoSParamSet & 0x1)
1927				Adapter->PackInfo[uiSearchRuleIndex].bAuthorizedSet = TRUE;
1928			if (pHostInfo->QoSParamSet & 0x2)
1929				Adapter->PackInfo[uiSearchRuleIndex].bAdmittedSet = TRUE;
1930			if (pHostInfo->QoSParamSet & 0x4) {
1931				Adapter->PackInfo[uiSearchRuleIndex].bActiveSet = TRUE;
1932				Adapter->PackInfo[uiSearchRuleIndex].bActive = TRUE;
1933			}
1934		}
1935	}
1936}