Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db283364 authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Greg Kroah-Hartman
Browse files

Staging: rtl8192su: remove USB_RX_AGGREGATION_SUPPORT ifdefs

parent a7e3c1d6
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@ EXTRA_CFLAGS += -DRTL8190_Download_Firmware_From_Header=1
EXTRA_CFLAGS += -DRTL8192S_PREPARE_FOR_NORMAL_RELEASE
EXTRA_CFLAGS += -DRTL8192SU_DISABLE_IQK=1

#EXTRA_CFLAGS += -DUSB_RX_AGGREGATION_SUPPORT=0
#EXTRA_CFLAGS += -DUSB_TX_DRIVER_AGGREGATION_ENABLE=0
#EXTRA_CFLAGS += -DRTL8192SU_DISABLE_CCK_RATE=0
EXTRA_CFLAGS += -DRTL8192S_DISABLE_FW_DM=0
+0 −6
Original line number Diff line number Diff line
@@ -327,12 +327,6 @@ typedef struct _RT_HIGH_THROUGHPUT{
#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
	u8				UsbTxAggrNum;
#endif
#ifdef USB_RX_AGGREGATION_SUPPORT
	u8				UsbRxFwAggrEn;
	u8				UsbRxFwAggrPageNum;
	u8				UsbRxFwAggrPacketNum;
	u8				UsbRxFwAggrTimeout;
#endif

	// Add for Broadcom(Linksys) IOT. Joseph
	u8				bIsPeerBcm;
+0 −15
Original line number Diff line number Diff line
@@ -105,21 +105,6 @@ void HTUpdateDefaultSetting(struct ieee80211_device* ieee)
#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
	pHTInfo->UsbTxAggrNum = 4;
#endif
#ifdef USB_RX_AGGREGATION_SUPPORT
#ifdef RTL8192SU
	pHTInfo->UsbRxFwAggrEn = 1;
	pHTInfo->UsbRxFwAggrPageNum = 16;
	pHTInfo->UsbRxFwAggrPacketNum = 8;
	pHTInfo->UsbRxFwAggrTimeout = 4; ////usb rx FW aggregation timeout threshold.It's in units of 64us
	// For page size of receive packet buffer.
	pHTInfo->UsbRxPageSize= 128;
#else
	pHTInfo->UsbRxFwAggrEn = 1;
	pHTInfo->UsbRxFwAggrPageNum = 24;
	pHTInfo->UsbRxFwAggrPacketNum = 8;
	pHTInfo->UsbRxFwAggrTimeout = 16; ////usb rx FW aggregation timeout threshold.It's in units of 64us
#endif
#endif


}
+0 −32
Original line number Diff line number Diff line
@@ -693,11 +693,7 @@ typedef struct rx_desc_819x_usb{
	//DWORD 2
	u16		Seq:12;
	u16		Frag:4;
#ifdef USB_RX_AGGREGATION_SUPPORT
	u8		UsbAggPktNum;//:8;
#else
	u8		NextPktLen;//:8;
#endif
	u8		Rsvd0:6;
	u8		NextIND:1;
	u8		Rsvd1:1;
@@ -751,27 +747,6 @@ typedef struct rx_desc_819x_usb{
}rx_desc_819x_usb, *prx_desc_819x_usb;
#endif

#ifdef USB_RX_AGGREGATION_SUPPORT
typedef struct _rx_desc_819x_usb_aggr_subframe{
	//DOWRD 0
	u16			Length:14;
	u16			CRC32:1;
	u16			ICV:1;
	u8			Offset;
	u8			RxDrvInfoSize;
	//DOWRD 1
	u8			Shift:2;
	u8			PHYStatus:1;
	u8			SWDec:1;
	u8			Reserved1:4;
	u8			Reserved2;
	u16			Reserved3;
	//DWORD 2
	//u4Byte		Reserved3;
	//DWORD 3
	//u4Byte           	BufferAddress;
}rx_desc_819x_usb_aggr_subframe, *prx_desc_819x_usb_aggr_subframe;
#endif

#ifdef RTL8192SU
//
@@ -1896,13 +1871,6 @@ typedef struct r8192_priv
//#endif


#ifdef USB_RX_AGGREGATION_SUPPORT
	bool		bCurrentRxAggrEnable;
	bool		bForcedUsbRxAggr;
	u32		ForcedUsbRxAggrInfo;
	u32		LastUsbRxAggrInfoSetting;
	u32		RegUsbRxAggrInfo;
#endif



+0 −471
Original line number Diff line number Diff line
@@ -1601,12 +1601,6 @@ static void rtl8192_rx_isr(struct urb *urb);
u32 get_rxpacket_shiftbytes_819xusb(struct ieee80211_rx_stats *pstats)
{

#ifdef USB_RX_AGGREGATION_SUPPORT
	if (pstats->bisrxaggrsubframe)
		return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
			+ pstats->RxBufShift + 8);
	else
#endif
		return (sizeof(rx_desc_819x_usb) + pstats->RxDrvInfoSize
				+ pstats->RxBufShift);

@@ -6780,20 +6774,6 @@ void rtl8192_hwconfig(struct net_device* dev)
}

#ifdef RTL8192SU
#ifdef USB_RX_AGGREGATION_SUPPORT
u8 rtl8192SU_MapRxPageSizeToIdx(u16 RxPktSize	)
{
	switch(RxPktSize)
	{
		case 64:		return 0; break;
		case 128	:	return 1; break;
		case 256:		return 2; break;
		case 512:		return 3; break;
		case 1024:	return 4; break;
		default:		return 0;	// We use 64bytes in defult.
	}
}
#endif

//
//	Description:
@@ -6951,164 +6931,7 @@ static void rtl8192SU_MacConfigBeforeFwDownloadASIC(struct net_device *dev)

	RT_TRACE(COMP_INIT, "<---MacConfigBeforeFwDownloadASIC()\n");
}
#ifdef USB_RX_AGGREGATION_SUPPORT
void rtl8192SU_HalUsbRxAggr8192SUsb(struct net_device *dev, bool Value)
{
	struct r8192_priv *priv = ieee80211_priv((struct net_device *)dev);
	PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;;


	//
	// <Roger_Notes> We decrease Rx page aggregated threshold in B/G mode.
	// 2008.10.29
	//
	if(priv->ieee80211->mode == WIRELESS_MODE_B ||  priv->ieee80211->mode == WIRELESS_MODE_G)
	{// Overwrite current settings to disable Rx Aggregation.
		Value = false;
	}

	// Alway set Rx Aggregation to Disable if current platform is Win2K USB 1.1, by Emily
	//if(PLATFORM_LIMITED_RX_BUF_SIZE(Adapter))
	//	Value = FALSE;

	// Always set Rx Aggregation to Disable if connected AP is Realtek AP, by Joseph
	//if(pHTInfo->bCurrentRT2RTAggregation)
	//	Value = FALSE;

	// The RX aggregation may be enabled/disabled dynamically according current traffic stream.
	//Enable Rx aggregation if downlink traffic is busier than uplink traffic. by Guangan
	if(priv->bCurrentRxAggrEnable != Value)
	{
		priv->bCurrentRxAggrEnable = Value;
		//Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_USB_RX_AGGR, (pu1Byte)&pHalData->bCurrentRxAggrEnable);
		{
			//u8 	Setting = ((pu1Byte)(val))[0];
			u8 	Setting = priv->bCurrentRxAggrEnable
			u32 	ulValue;

			if(Setting==0)
			{
				//
				// <Roger_Notes> Reduce aggregated page threshold to 0x01 and set minimal threshold 0x0a.
				// i.e., disable Rx aggregation.
				//
				ulValue = 0x0001000a;
			}
			else
			{
				//PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;
				//HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);

				if (priv->bForcedUsbRxAggr)
				{// Using forced settings.
					ulValue = priv->ForcedUsbRxAggrInfo;
				}
				else
				{// Using default settings.

					ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
							(pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
				}
			}

			write_nic_byte(dev, RXDMA_AGG_PG_TH, (u8)((ulValue&0xff0000)>>16));
			write_nic_byte_E(dev, USB_RX_AGG_TIMEOUT, (u8)(ulValue&0xff));

			priv->LastUsbRxAggrInfoSetting = ulValue;

			RT_TRACE(COMP_HT|COMP_RECV, "Set HW_VAR_USB_RX_AGGR: ulValue(%#x)\n", ulValue);
		}
		RT_TRACE(COMP_RECV, "HalUsbRxAggr8192SUsb() :  Set RxAggregation to %s\n", Value?"ON":"OFF");
	}

}
#endif

#ifdef USB_RX_AGGREGATION_SUPPORT
void rtl8192SU_HalUsbRxAggr8192SUsb(struct net_device *dev, bool Value)
{
	struct r8192_priv *priv = ieee80211_priv((struct net_device *)dev);
	PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;;


	//
	// <Roger_Notes> We decrease Rx page aggregated threshold in B/G mode.
	// 2008.10.29
	//
	if((priv->ieee80211->mode & WIRELESS_MODE_B) || (priv->ieee80211->mode & WIRELESS_MODE_G))
	{// Overwrite current settings to disable Rx Aggregation.
		Value = false;
	}

	// Alway set Rx Aggregation to Disable if current platform is Win2K USB 1.1, by Emily
	//if(PLATFORM_LIMITED_RX_BUF_SIZE(Adapter))
	//	Value = FALSE;

	// Always set Rx Aggregation to Disable if connected AP is Realtek AP, by Joseph
	//if(pHTInfo->bCurrentRT2RTAggregation)
	//	Value = FALSE;

	// The RX aggregation may be enabled/disabled dynamically according current traffic stream.
	//Enable Rx aggregation if downlink traffic is busier than uplink traffic. by Guangan
	if(priv->bCurrentRxAggrEnable != Value)
	{
		priv->bCurrentRxAggrEnable = Value;
		//Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_USB_RX_AGGR, (pu1Byte)&pHalData->bCurrentRxAggrEnable);
		{
			//u8 	Setting = ((pu1Byte)(val))[0];
			u8 	Setting = priv->bCurrentRxAggrEnable
			u32 	ulValue;

			if(Setting==0)
			{
				//
				// <Roger_Notes> Reduce aggregated page threshold to 0x01 and set minimal threshold 0x0a.
				// i.e., disable Rx aggregation.
				//
				ulValue = 0x0001000a;
			}
			else
			{
				//PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;
				//HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);

				if (priv->bForcedUsbRxAggr)
				{// Using forced settings.
					ulValue = priv->ForcedUsbRxAggrInfo;
				}
				else
				{// Using default settings.

					ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
							(pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
				}
			}

			write_nic_byte(dev, RXDMA_AGG_PG_TH, (u8)((ulValue&0xff0000)>>16));
			write_nic_byte_E(dev, USB_RX_AGG_TIMEOUT, (u8)(ulValue&0xff));

			priv->LastUsbRxAggrInfoSetting = ulValue;

			RT_TRACE(COMP_HT|COMP_RECV, "Set HW_VAR_USB_RX_AGGR: ulValue(%#x)\n", ulValue);
		}
		RT_TRACE(COMP_RECV, "HalUsbRxAggr8192SUsb() :  Set RxAggregation to %s\n", Value?"ON":"OFF");
	}

}

u8 rtl8192SU_MapRxPageSizeToIdx(u16 RxPktSize	)
{
	switch(RxPktSize)
	{
		case 64:		return 0; break;
		case 128	:	return 1; break;
		case 256:		return 2; break;
		case 512:		return 3; break;
		case 1024:	return 4; break;
		default:		return 0;	// We use 64bytes in defult.
	}
}
#endif

#if 0
static void rtl8192SU_SetHwRegAmpduMinSpace(struct net_device *dev, u8 MinSpaceCfg)
@@ -7224,19 +7047,6 @@ static void rtl8192SU_MacConfigAfterFwDownload(struct net_device *dev)
#endif
#endif

#ifdef USB_RX_AGGREGATION_SUPPORT
	// Size of Tx/Rx packet buffer.
	tmpU1b = read_nic_byte(dev, PBP);
	RxPageCfg = rtl8192SU_MapRxPageSizeToIdx(priv->ieee80211->pHTInfo.UsbRxPageSize);
	write_nic_byte(dev, PBP, tmpU1b|RxPageCfg); // Set page size of Rx packet buffer to 128 bytes.
	tmpU1b = read_nic_byte(dev, RXDMA);

	write_nic_byte(dev, RXDMA, tmpU1b|RXDMA_AGG_EN); // Rx aggregation enable.
	//PlatformIOWrite1Byte(Adapter, RXDMA_AGG_PG_TH, 0x14);	// Set page size of RxDMA aggregation threshold, default: 20.
	//write_nic_byte(dev, RXDMA_AGG_PG_TH, 0x40); // By Scott's suggestion, 2008.09.30.//92su del
	//write_nic_byte(dev, USB_RX_AGG_TIMEOUT, RXDMA_AGG_TIMEOUT_17_4_MS); // Set aggregation time-out to 17ms/4.
	rtl8192SU_HalUsbRxAggr8192SUsb(dev, true);
#endif

	// Fix the RX FIFO issue(USB error), Rivesed by Roger, 2008-06-14
	tmpU1b = read_nic_byte_E(dev, 0x5C);
@@ -7961,23 +7771,6 @@ bool rtl8192_adapter_start(struct net_device *dev)
		for (i=0; i<QOS_QUEUE_NUM; i++)
		write_nic_dword(dev, WDCAPARA_ADD[i], DEFAULT_EDCA);
	}
#ifdef USB_RX_AGGREGATION_SUPPORT
	//3 For usb rx firmware aggregation control
	if(priv->ResetProgress == RESET_TYPE_NORESET)
	{
		u32 ulValue;
		PRT_HIGH_THROUGHPUT	pHTInfo = priv->ieee80211->pHTInfo;
		ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
					(pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
		/*
		 * If usb rx firmware aggregation is enabled,
		 * when anyone of three threshold conditions above is reached,
		 * firmware will send aggregated packet to driver.
		 */
		write_nic_dword(dev, 0x1a8, ulValue);
		priv->bCurrentRxAggrEnable = true;
	}
#endif

	rtl8192_phy_configmac(dev);

@@ -10496,11 +10289,6 @@ void rtl8192SU_query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stat
	//pu1Byte		pDesc = (pu1Byte)pDescIn;
	//PRX_DRIVER_INFO_8192S		pDrvInfo;

#ifdef USB_RX_AGGREGATION_SUPPORT//FIXLZM
	//if (bIsRxAggrSubframe)
		rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
	else
#endif
	rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;

	if(0)
@@ -10637,19 +10425,6 @@ void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats,
	//
	//Get Rx Descriptor Information
	//
#ifdef USB_RX_AGGREGATION_SUPPORT
	if (bIsRxAggrSubframe)
	{
		rx_desc_819x_usb_aggr_subframe *desc = (rx_desc_819x_usb_aggr_subframe *)skb->data;
		stats->Length = desc->Length ;
		stats->RxDrvInfoSize = desc->RxDrvInfoSize;
		stats->RxBufShift = 0; //RxBufShift = 2 in RxDesc, but usb didn't shift bytes in fact.
		stats->bICV = desc->ICV;
		stats->bCRC = desc->CRC32;
		stats->bHwError = stats->bCRC|stats->bICV;
		stats->Decrypted = !desc->SWDec;//RTL8190 set this bit to indicate that Hw does not decrypt packet
	} else
#endif
	{
		rx_desc_819x_usb *desc = (rx_desc_819x_usb *)skb->data;

@@ -10738,12 +10513,6 @@ void query_rxdesc_status(struct sk_buff *skb, struct ieee80211_rx_stats *stats,
		skb_pull(skb,stats->RxBufShift + stats->RxDrvInfoSize);
	}

#ifdef USB_RX_AGGREGATION_SUPPORT
	/* for the rx aggregated sub frame, the redundant space truelly contained in the packet */
	if(bIsRxAggrSubframe) {
		skb_pull(skb, 8);
	}
#endif
	/* for debug 2008.5.29 */
#if 0
	{
@@ -10906,27 +10675,6 @@ void rtl8192SU_rx_nomal(struct sk_buff* skb)
	struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
	bool unicast_packet = false;

#ifdef USB_RX_AGGREGATION_SUPPORT
	struct sk_buff *agg_skb = NULL;
	u32  TotalLength = 0;//Total packet length for all aggregated packets.
	u32  TempDWord = 0;
	u32  PacketLength = 0;// Per-packet length include size of RxDesc.
	u32  PacketOccupiedLendth = 0;
	u8   TempByte = 0;
	u32  PacketShiftBytes = 0;
	rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
	u8  PaddingBytes = 0;
	//add just for testing
	u8   testing;

	u8	TotalAggPkt = 0;
	PRT_HIGH_THROUGHPUT	pHTInfo =priv-> ieee80211->pHTInfo;
	u16	RxPageSize = pHTInfo->UsbRxPageSize;

	stats->nTotalAggPkt = 0;
	//stats->bIsRxAggrSubframe = FALSE;

#endif
	//printk("**********skb->len = %d\n", skb->len);
	/* 20 is for ps-poll */
	if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
@@ -10936,14 +10684,6 @@ void rtl8192SU_rx_nomal(struct sk_buff* skb)
		/* TODO */

		/* hardware related info */
#ifdef USB_RX_AGGREGATION_SUPPORT
		TotalAggPkt = stats->nTotalAggPkt;
		PacketLength = stats->Length + GetRxPacketShiftBytes8192SU(&stats, false);

		agg_skb = skb;
		skb = dev_alloc_skb(PacketLength);
		memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
#endif
		priv->stats.rxoktotal++;  //YJ,test,090108

		/* Process the MPDU recevied */
@@ -10971,106 +10711,6 @@ void rtl8192SU_rx_nomal(struct sk_buff* skb)
		}

		//up is firs pkt, follow is next and next
#ifdef USB_RX_AGGREGATION_SUPPORT
		//
		// The following operations are for processing Rx aggregated packets.
		//
		if(TotalAggPkt>0)
			TotalAggPkt--;

		while ( TotalAggPkt>0 )
		{// More aggregated packets need to process.

			u8 tmpCRC = 0, tmpICV = 0;

			//Page size must align to multiple of 128-Bytes.
			if((PacketLength%RxPageSize) != 0)
				//PacketLength = ((PacketLength/RxPageSize)+1)*RxPageSize;
				PacketLength = ((PacketLength>>7)+1)*RxPageSize; // RxPageSize is 128bytes as default.

			// Current total packet occupied length in this buffer.
			PacketOccupiedLendth += PacketLength;

#if (defined (RTL8192SU_FPGA_2MAC_VERIFICATION)||defined (RTL8192SU_ASIC_VERIFICATION))
			//if(PacketOccupiedLendth>pContext->BufLenUsed)
			if(PacketOccupiedLendth>skb->len)
			{
				RT_TRACE(COMP_RECV, "(1)HalUsbInMpduComplete8192SUsb(): pRtRfdStatus->Length(%#x)!!\n", stats->Length);
				RT_TRACE(COMP_RECV, "(1)HalUsbInMpduComplete8192SUsb(): Invalid PacketOccupiedLendth(%#x)!!, BufLenUsed(%#x)\n", PacketOccupiedLendth, stats->BufLenUsed);
				break;
			}
#endif

			skb_pull(agg_skb, PacketLength);

			//
			// Process the MPDU recevied.
			//
			//RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
			RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);

#if 0//92SU del
			tmpCRC = RxDescr->CRC32;
			tmpICV = RxDescr->ICV;
			memcpy(agg_skb->data, &agg_skb->data[44], 2);
			RxDescr->CRC32 = tmpCRC;
			RxDescr->ICV = tmpICV;
#endif
			memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
			stats.signal = 0;
			stats.noise = -98;
			stats.rate = 0;
			stats.freq = IEEE80211_24GHZ_BAND;

			rtl8192SU_query_rxdesc_status(agg_skb, &stats, true);
			//PacketLength = stats.Length;
			PacketLength = stats.Length +  GetRxPacketShiftBytes8192SU(&stats, true);

#if (defined (RTL8192SU_FPGA_2MAC_VERIFICATION)||defined (RTL8192SU_ASIC_VERIFICATION))
			if((PacketOccupiedLendth+PacketLength)>skb->len)
			{
				RT_TRACE(COMP_RECV, "(2)HalUsbInMpduComplete8192SUsb(): Invalid PacketOccupiedLendth(%#x)+PacketLength(%#x)!!, BufLenUsed(%#x)\n",
					PacketOccupiedLendth, PacketLength, pContext->BufLenUsed);
				break;
			}
#endif

			if(PacketLength > agg_skb->len) {
				break;
			}

			/* Process the MPDU recevied */
			skb = dev_alloc_skb(PacketLength);
			memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
			skb_trim(skb, skb->len - 4/*sCrcLng*/);

			rx_pkt_len = skb->len;
			ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
			unicast_packet = false;
			if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
				//TODO
			}else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
				//TODO
			}else {
				/* unicast packet */
				unicast_packet = true;
			}
			if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
				dev_kfree_skb_any(skb);
			} else {
				priv->stats.rxoktotal++;
				if(unicast_packet) {
					priv->stats.rxbytesunicast += rx_pkt_len;
				}
			}

			TotalAggPkt--;

			skb_pull(agg_skb, TempDWord);
		}

		dev_kfree_skb(agg_skb);
#endif
	}
	else
	{
@@ -11083,12 +10723,6 @@ void rtl8192SU_rx_nomal(struct sk_buff* skb)
#else
u32 GetRxPacketShiftBytes819xUsb(struct ieee80211_rx_stats  *Status, bool bIsRxAggrSubframe)
{
#ifdef USB_RX_AGGREGATION_SUPPORT
	if (bIsRxAggrSubframe)
		return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
			+ Status->RxBufShift + 8);
	else
#endif
		return (sizeof(rx_desc_819x_usb) + Status->RxDrvInfoSize
				+ Status->RxBufShift);
}
@@ -11108,44 +10742,13 @@ void rtl8192_rx_nomal(struct sk_buff* skb)
	u32 rx_pkt_len = 0;
	struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
	bool unicast_packet = false;
#ifdef USB_RX_AGGREGATION_SUPPORT
	struct sk_buff *agg_skb = NULL;
	u32  TotalLength = 0;
	u32  TempDWord = 0;
	u32  PacketLength = 0;
	u32  PacketOccupiedLendth = 0;
	u8   TempByte = 0;
	u32  PacketShiftBytes = 0;
	rx_desc_819x_usb_aggr_subframe *RxDescr = NULL;
	u8  PaddingBytes = 0;
	//add just for testing
	u8   testing;

#endif

	/* 20 is for ps-poll */
	if((skb->len >=(20 + sizeof(rx_desc_819x_usb))) && (skb->len < RX_URB_SIZE)) {
#ifdef USB_RX_AGGREGATION_SUPPORT
		TempByte = *(skb->data + sizeof(rx_desc_819x_usb));
#endif
		/* first packet should not contain Rx aggregation header */
		query_rxdesc_status(skb, &stats, false);
		/* TODO */
		/* hardware related info */
#ifdef USB_RX_AGGREGATION_SUPPORT
		if (TempByte & BIT0) {
			agg_skb = skb;
			//TotalLength = agg_skb->len - 4; /*sCrcLng*/
			TotalLength = stats.Length - 4; /*sCrcLng*/
			//RT_TRACE(COMP_RECV, "%s:first aggregated packet!Length=%d\n",__FUNCTION__,TotalLength);
			/* though the head pointer has passed this position  */
			TempDWord = *(u32 *)(agg_skb->data - 4);
			PacketLength = (u16)(TempDWord & 0x3FFF); /*sCrcLng*/
			skb = dev_alloc_skb(PacketLength);
			memcpy(skb_put(skb,PacketLength),agg_skb->data,PacketLength);
			PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, false);
		}
#endif
		/* Process the MPDU recevied */
		skb_trim(skb, skb->len - 4/*sCrcLng*/);

@@ -11169,80 +10772,6 @@ void rtl8192_rx_nomal(struct sk_buff* skb)
				priv->stats.rxbytesunicast += rx_pkt_len;
			}
		}
#ifdef USB_RX_AGGREGATION_SUPPORT
		testing = 1;
		// (PipeIndex == 0) && (TempByte & BIT0) => TotalLength > 0.
		if (TotalLength > 0) {
			PacketOccupiedLendth = PacketLength + (PacketShiftBytes + 8);
			if ((PacketOccupiedLendth & 0xFF) != 0)
				PacketOccupiedLendth = (PacketOccupiedLendth & 0xFFFFFF00) + 256;
			PacketOccupiedLendth -= 8;
			TempDWord = PacketOccupiedLendth - PacketShiftBytes; /*- PacketLength */
			if (agg_skb->len > TempDWord)
				skb_pull(agg_skb, TempDWord);
			else
				agg_skb->len = 0;

			while (agg_skb->len>=GetRxPacketShiftBytes819xUsb(&stats, true)) {
				u8 tmpCRC = 0, tmpICV = 0;
				//RT_TRACE(COMP_RECV,"%s:aggred pkt,total_len = %d\n",__FUNCTION__,agg_skb->len);
				RxDescr = (rx_desc_819x_usb_aggr_subframe *)(agg_skb->data);
				tmpCRC = RxDescr->CRC32;
				tmpICV = RxDescr->ICV;
				memcpy(agg_skb->data, &agg_skb->data[44], 2);
				RxDescr->CRC32 = tmpCRC;
				RxDescr->ICV = tmpICV;

				memset(&stats, 0, sizeof(struct ieee80211_rx_stats));
				stats.signal = 0;
				stats.noise = -98;
				stats.rate = 0;
				stats.freq = IEEE80211_24GHZ_BAND;
				query_rxdesc_status(agg_skb, &stats, true);
				PacketLength = stats.Length;

				if(PacketLength > agg_skb->len) {
					break;
				}
				/* Process the MPDU recevied */
				skb = dev_alloc_skb(PacketLength);
				memcpy(skb_put(skb,PacketLength),agg_skb->data, PacketLength);
				skb_trim(skb, skb->len - 4/*sCrcLng*/);

				rx_pkt_len = skb->len;
				ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
				unicast_packet = false;
				if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
					//TODO
				}else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
					//TODO
				}else {
					/* unicast packet */
					unicast_packet = true;
				}
				if(!ieee80211_rx(priv->ieee80211,skb, &stats)) {
					dev_kfree_skb_any(skb);
				} else {
					priv->stats.rxoktotal++;
					if(unicast_packet) {
						priv->stats.rxbytesunicast += rx_pkt_len;
					}
				}
				/* should trim the packet which has been copied to target skb */
				skb_pull(agg_skb, PacketLength);
				PacketShiftBytes = GetRxPacketShiftBytes819xUsb(&stats, true);
				PacketOccupiedLendth = PacketLength + PacketShiftBytes;
				if ((PacketOccupiedLendth & 0xFF) != 0) {
					PaddingBytes = 256 - (PacketOccupiedLendth & 0xFF);
					if (agg_skb->len > PaddingBytes)
						skb_pull(agg_skb, PaddingBytes);
					else
						agg_skb->len = 0;
				}
			}
			dev_kfree_skb(agg_skb);
		}
#endif
	} else {
		priv->stats.rxurberr++;
		printk("actual_length:%d\n", skb->len);
Loading