Linux Audio

Check our new training course

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