⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wlan_rx.c

📁 marvell wifi driver GSPI-8385-LINUX-OMAP1510-5.0.10.p0-144-src.rar
💻 C
字号:
/*
 * File : wlan_rx.c 
 */

#include	"include.h"

/*
 * If we recieve the rx data process and push them to the above layers 
 */

static int wlan_compute_rssi(wlan_private * priv, RxPD * pRxPD)
{
	wlan_adapter   *Adapter = priv->adapter;

	ENTER();

	PRINTK1("RxPD: SNR = %d, NF = %d\n", pRxPD->SNR, pRxPD->NF);
	PRINTK1("Before computing SNR and NF\n");
	PRINTK1("Adapter: SNR- avg = %d, NF-avg = %d\n",
		Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, 
		Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);

	Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPD->SNR;
	Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;

	Adapter->RxPDSNRAge = os_time_get();

	/*
	 * Average out the SNR from the received packet 
	 */
	Adapter->SNR[TYPE_RXPD][TYPE_AVG] =
		CAL_AVG_SNR_NF(Adapter->SNR[TYPE_RXPD][TYPE_AVG], pRxPD->SNR, Adapter->data_avg_factor);

	/*
	 * Average out the NF value 
	 */
	Adapter->NF[TYPE_RXPD][TYPE_AVG] = 
		CAL_AVG_SNR_NF(Adapter->NF[TYPE_RXPD][TYPE_AVG], pRxPD->NF, Adapter->data_avg_factor);

	PRINTK1("After computing SNR and NF\n");
	PRINTK1("Adapter: SNR-avg = %d, NF-avg = %d\n",
		Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, 
		Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);

	Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] = 
		CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
			Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);

	Adapter->RSSI[TYPE_RXPD][TYPE_AVG] = 
		CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
			Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
	
	LEAVE();
	return 0;
}

int ProcessRxed_802_3_Packet(wlan_private * priv, struct sk_buff *skb)
{
    	wlan_adapter	*Adapter = priv->adapter;
	RxPD		*pRxPD = (RxPD *) skb->data;
    	u8  		*ptr = skb->data;
    	int             i;

    	ENTER();

 	HEXDUMP("Before chop RxPD", ptr, MIN(skb->len, 100));

	if (skb->len < (ETH_HLEN + 8 + sizeof(RxPD))) {
		PRINTK1("WARNING!! FRAME RECEIVED WITH BAD LENGTH\n");
		priv->stats.rx_length_errors++;
		LEAVE();
		return 0;
	}

#ifdef BIG_ENDIAN
	endian_convert_RxPD(pRxPD);
#endif

	// Check RxPD status and update 802.3 stat,
	// we should have more bits to test
	if (!(pRxPD->Status & MRVDRV_RXPD_STATUS_OK)) {
		PRINTK1("WARNING: frame received with bad status\n");
		priv->stats.rx_errors++;
		LEAVE();
		return 0;
	}

	ptr += sizeof(RxPD);

	HEXDUMP("After chop RxPD", ptr, skb->len-sizeof(RxPD));

	HEXDUMP("Dest   Mac", ptr, MRVDRV_ETH_ADDR_LEN);
	HEXDUMP("Source Mac", (ptr + MRVDRV_ETH_ADDR_LEN), MRVDRV_ETH_ADDR_LEN);

#ifndef FW_REMOVED_SNAP_HEADER
	// Shift everything after the DEST/SRC 8 bytes forward...
	// to take care of the SNAP header that is somewhere here...
	for (i = 11; i >= 0; i--)
		ptr[MRVDRV_SNAP_HEADER_LEN + i] = ptr[i];

	ptr += MRVDRV_SNAP_HEADER_LEN;
#endif

	/* Take the data rate from the RxPD structure 
	 * only if the rate is auto */
	if (Adapter->Is_DataRate_Auto)
		Adapter->DataRate = index_to_data_rate(pRxPD->RxRate);

	wlan_compute_rssi(priv, pRxPD);

#ifndef FW_REMOVED_SNAP_HEADER
	/* Compute actual packet size */
	i = MRVDRV_SNAP_HEADER_LEN + sizeof(RxPD);
#else
	i = sizeof(RxPD);
#endif
	skb_pull(skb, i);
	
	PRINTK1("Size of actual 802.3 packet = %d\n", skb->len);

	if (!os_upload_rx_packet(priv, skb)) {
		priv->stats.rx_bytes += skb->len; 
		priv->stats.rx_packets++;
		LEAVE();
		return 0;
	} else {
		LEAVE();
		return WLAN_STATUS_FAILURE;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -