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

📄 xmit.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
							       rts_plcp), len,				      rts_rate);		b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->							       rts_plcp_fb),				      len, rts_rate_fb);		hdr = (struct ieee80211_hdr *)(&txhdr->rts_frame);		txhdr->rts_dur_fb = hdr->duration_id;		if (rts_rate_ofdm) {			extra_ft |= B43_TX4_EFT_RTSOFDM;			txhdr->phy_rate_rts =			    b43_plcp_get_ratecode_ofdm(rts_rate);		} else			txhdr->phy_rate_rts =			    b43_plcp_get_ratecode_cck(rts_rate);		if (rts_rate_fb_ofdm)			extra_ft |= B43_TX4_EFT_RTSFBOFDM;		mac_ctl |= B43_TX4_MAC_LONGFRAME;	}	/* Magic cookie */	txhdr->cookie = cpu_to_le16(cookie);	/* Apply the bitfields */	txhdr->mac_ctl = cpu_to_le32(mac_ctl);	txhdr->phy_ctl = cpu_to_le16(phy_ctl);	txhdr->extra_ft = extra_ft;	return 0;}int b43_generate_txhdr(struct b43_wldev *dev,			u8 * txhdr,			const unsigned char *fragment_data,			unsigned int fragment_len,			const struct ieee80211_tx_control *txctl, u16 cookie){	return generate_txhdr_fw4(dev, (struct b43_txhdr_fw4 *)txhdr,				  fragment_data, fragment_len, txctl, cookie);}static s8 b43_rssi_postprocess(struct b43_wldev *dev,			       u8 in_rssi, int ofdm,			       int adjust_2053, int adjust_2050){	struct b43_phy *phy = &dev->phy;	s32 tmp;	switch (phy->radio_ver) {	case 0x2050:		if (ofdm) {			tmp = in_rssi;			if (tmp > 127)				tmp -= 256;			tmp *= 73;			tmp /= 64;			if (adjust_2050)				tmp += 25;			else				tmp -= 3;		} else {			if (dev->dev->bus->sprom.r1.			    boardflags_lo & B43_BFL_RSSI) {				if (in_rssi > 63)					in_rssi = 63;				tmp = phy->nrssi_lt[in_rssi];				tmp = 31 - tmp;				tmp *= -131;				tmp /= 128;				tmp -= 57;			} else {				tmp = in_rssi;				tmp = 31 - tmp;				tmp *= -149;				tmp /= 128;				tmp -= 68;			}			if (phy->type == B43_PHYTYPE_G && adjust_2050)				tmp += 25;		}		break;	case 0x2060:		if (in_rssi > 127)			tmp = in_rssi - 256;		else			tmp = in_rssi;		break;	default:		tmp = in_rssi;		tmp -= 11;		tmp *= 103;		tmp /= 64;		if (adjust_2053)			tmp -= 109;		else			tmp -= 83;	}	return (s8) tmp;}//TODO#if 0static s8 b43_rssinoise_postprocess(struct b43_wldev *dev, u8 in_rssi){	struct b43_phy *phy = &dev->phy;	s8 ret;	if (phy->type == B43_PHYTYPE_A) {		//TODO: Incomplete specs.		ret = 0;	} else		ret = b43_rssi_postprocess(dev, in_rssi, 0, 1, 1);	return ret;}#endifvoid b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr){	struct ieee80211_rx_status status;	struct b43_plcp_hdr6 *plcp;	struct ieee80211_hdr *wlhdr;	const struct b43_rxhdr_fw4 *rxhdr = _rxhdr;	u16 fctl;	u16 phystat0, phystat3, chanstat, mactime;	u32 macstat;	u16 chanid;	u8 jssi;	int padding;	memset(&status, 0, sizeof(status));	/* Get metadata about the frame from the header. */	phystat0 = le16_to_cpu(rxhdr->phy_status0);	phystat3 = le16_to_cpu(rxhdr->phy_status3);	jssi = rxhdr->jssi;	macstat = le32_to_cpu(rxhdr->mac_status);	mactime = le16_to_cpu(rxhdr->mac_time);	chanstat = le16_to_cpu(rxhdr->channel);	if (macstat & B43_RX_MAC_FCSERR)		dev->wl->ieee_stats.dot11FCSErrorCount++;	if (macstat & B43_RX_MAC_DECERR) {		/* Decryption with the given key failed.		 * Drop the packet. We also won't be able to decrypt it with		 * the key in software. */		goto drop;	}	/* Skip PLCP and padding */	padding = (macstat & B43_RX_MAC_PADDING) ? 2 : 0;	if (unlikely(skb->len < (sizeof(struct b43_plcp_hdr6) + padding))) {		b43dbg(dev->wl, "RX: Packet size underrun (1)\n");		goto drop;	}	plcp = (struct b43_plcp_hdr6 *)(skb->data + padding);	skb_pull(skb, sizeof(struct b43_plcp_hdr6) + padding);	/* The skb contains the Wireless Header + payload data now */	if (unlikely(skb->len < (2 + 2 + 6 /*minimum hdr */  + FCS_LEN))) {		b43dbg(dev->wl, "RX: Packet size underrun (2)\n");		goto drop;	}	wlhdr = (struct ieee80211_hdr *)(skb->data);	fctl = le16_to_cpu(wlhdr->frame_control);	skb_trim(skb, skb->len - FCS_LEN);	if (macstat & B43_RX_MAC_DEC) {		unsigned int keyidx;		int wlhdr_len;		keyidx = ((macstat & B43_RX_MAC_KEYIDX)			  >> B43_RX_MAC_KEYIDX_SHIFT);		/* We must adjust the key index here. We want the "physical"		 * key index, but the ucode passed it slightly different.		 */		keyidx = b43_kidx_to_raw(dev, keyidx);		B43_WARN_ON(keyidx >= dev->max_nr_keys);		if (dev->key[keyidx].algorithm != B43_SEC_ALGO_NONE) {			wlhdr_len = ieee80211_get_hdrlen(fctl);			if (unlikely(skb->len < (wlhdr_len + 3))) {				b43dbg(dev->wl,				       "RX: Packet size underrun (3)\n");				goto drop;			}			status.flag |= RX_FLAG_DECRYPTED;		}	}	status.ssi = b43_rssi_postprocess(dev, jssi,					  (phystat0 & B43_RX_PHYST0_OFDM),					  (phystat0 & B43_RX_PHYST0_GAINCTL),					  (phystat3 & B43_RX_PHYST3_TRSTATE));	status.noise = dev->stats.link_noise;	/* the next line looks wrong, but is what mac80211 wants */	status.signal = (jssi * 100) / B43_RX_MAX_SSI;	if (phystat0 & B43_RX_PHYST0_OFDM)		status.rate = b43_plcp_get_bitrate_ofdm(plcp);	else		status.rate = b43_plcp_get_bitrate_cck(plcp);	status.antenna = !!(phystat0 & B43_RX_PHYST0_ANT);	status.mactime = mactime;	chanid = (chanstat & B43_RX_CHAN_ID) >> B43_RX_CHAN_ID_SHIFT;	switch (chanstat & B43_RX_CHAN_PHYTYPE) {	case B43_PHYTYPE_A:		status.phymode = MODE_IEEE80211A;		B43_WARN_ON(1);		/* FIXME: We don't really know which value the "chanid" contains.		 *        So the following assignment might be wrong. */		status.channel = chanid;		status.freq = b43_channel_to_freq_5ghz(status.channel);		break;	case B43_PHYTYPE_G:		status.phymode = MODE_IEEE80211G;		/* chanid is the radio channel cookie value as used		 * to tune the radio. */		status.freq = chanid + 2400;		status.channel = b43_freq_to_channel_2ghz(status.freq);		break;	case B43_PHYTYPE_N:		status.phymode = 0xDEAD /*FIXME MODE_IEEE80211N*/;		/* chanid is the SHM channel cookie. Which is the plain		 * channel number in b43. */		status.channel = chanid;		if (chanstat & B43_RX_CHAN_5GHZ)			status.freq = b43_freq_to_channel_5ghz(status.freq);		else			status.freq = b43_freq_to_channel_2ghz(status.freq);		break;	default:		B43_WARN_ON(1);		goto drop;	}	dev->stats.last_rx = jiffies;	ieee80211_rx_irqsafe(dev->wl->hw, skb, &status);	return;drop:	b43dbg(dev->wl, "RX: Packet dropped\n");	dev_kfree_skb_any(skb);}void b43_handle_txstatus(struct b43_wldev *dev,			 const struct b43_txstatus *status){	b43_debugfs_log_txstat(dev, status);	if (status->intermediate)		return;	if (status->for_ampdu)		return;	if (!status->acked)		dev->wl->ieee_stats.dot11ACKFailureCount++;	if (status->rts_count) {		if (status->rts_count == 0xF)	//FIXME			dev->wl->ieee_stats.dot11RTSFailureCount++;		else			dev->wl->ieee_stats.dot11RTSSuccessCount++;	}	if (b43_using_pio(dev))		b43_pio_handle_txstatus(dev, status);	else		b43_dma_handle_txstatus(dev, status);}/* Handle TX status report as received through DMA/PIO queues */void b43_handle_hwtxstatus(struct b43_wldev *dev,			   const struct b43_hwtxstatus *hw){	struct b43_txstatus status;	u8 tmp;	status.cookie = le16_to_cpu(hw->cookie);	status.seq = le16_to_cpu(hw->seq);	status.phy_stat = hw->phy_stat;	tmp = hw->count;	status.frame_count = (tmp >> 4);	status.rts_count = (tmp & 0x0F);	tmp = hw->flags;	status.supp_reason = ((tmp & 0x1C) >> 2);	status.pm_indicated = !!(tmp & 0x80);	status.intermediate = !!(tmp & 0x40);	status.for_ampdu = !!(tmp & 0x20);	status.acked = !!(tmp & 0x02);	b43_handle_txstatus(dev, &status);}/* Stop any TX operation on the device (suspend the hardware queues) */void b43_tx_suspend(struct b43_wldev *dev){	if (b43_using_pio(dev))		b43_pio_freeze_txqueues(dev);	else		b43_dma_tx_suspend(dev);}/* Resume any TX operation on the device (resume the hardware queues) */void b43_tx_resume(struct b43_wldev *dev){	if (b43_using_pio(dev))		b43_pio_thaw_txqueues(dev);	else		b43_dma_tx_resume(dev);}#if 0static void upload_qos_parms(struct b43_wldev *dev,			     const u16 * parms, u16 offset){	int i;	for (i = 0; i < B43_NR_QOSPARMS; i++) {		b43_shm_write16(dev, B43_SHM_SHARED,				offset + (i * 2), parms[i]);	}}#endif/* Initialize the QoS parameters */void b43_qos_init(struct b43_wldev *dev){	/* FIXME: This function must probably be called from the mac80211	 * config callback. */	return;	b43_hf_write(dev, b43_hf_read(dev) | B43_HF_EDCF);	//FIXME kill magic	b43_write16(dev, 0x688, b43_read16(dev, 0x688) | 0x4);	/*TODO: We might need some stack support here to get the values. */}

⌨️ 快捷键说明

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