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

📄 xmit.c

📁 linux内核源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		} else {			ieee80211_rts_get(dev->wl->hw,					  dev->wl->if_id,					  fragment_data, fragment_len, txctl,					  (struct ieee80211_rts *)					  (txhdr->rts_frame));			mac_ctl |= B43legacy_TX4_MAC_SENDRTS;			len = sizeof(struct ieee80211_rts);		}		len += FCS_LEN;		b43legacy_generate_plcp_hdr((struct b43legacy_plcp_hdr4 *)					    (&txhdr->rts_plcp),					    len, rts_rate);		b43legacy_generate_plcp_hdr((struct b43legacy_plcp_hdr4 *)					    (&txhdr->rts_plcp_fb),					    len, rts_rate_fb);		hdr = (struct ieee80211_hdr *)(&txhdr->rts_frame);		txhdr->rts_dur_fb = hdr->duration_id;		mac_ctl |= B43legacy_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);	return 0;}int b43legacy_generate_txhdr(struct b43legacy_wldev *dev,			      u8 *txhdr,			      const unsigned char *fragment_data,			      unsigned int fragment_len,			      const struct ieee80211_tx_control *txctl,			      u16 cookie){	return generate_txhdr_fw3(dev, (struct b43legacy_txhdr_fw3 *)txhdr,			   fragment_data, fragment_len,			   txctl, cookie);}static s8 b43legacy_rssi_postprocess(struct b43legacy_wldev *dev,				     u8 in_rssi, int ofdm,				     int adjust_2053, int adjust_2050){	struct b43legacy_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			    & B43legacy_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 == B43legacy_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;}void b43legacy_rx(struct b43legacy_wldev *dev,		  struct sk_buff *skb,		  const void *_rxhdr){	struct ieee80211_rx_status status;	struct b43legacy_plcp_hdr6 *plcp;	struct ieee80211_hdr *wlhdr;	const struct b43legacy_rxhdr_fw3 *rxhdr = _rxhdr;	u16 fctl;	u16 phystat0;	u16 phystat3;	u16 chanstat;	u16 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 = le16_to_cpu(rxhdr->mac_status);	mactime = le16_to_cpu(rxhdr->mac_time);	chanstat = le16_to_cpu(rxhdr->channel);	if (macstat & B43legacy_RX_MAC_FCSERR)		dev->wl->ieee_stats.dot11FCSErrorCount++;	/* Skip PLCP and padding */	padding = (macstat & B43legacy_RX_MAC_PADDING) ? 2 : 0;	if (unlikely(skb->len < (sizeof(struct b43legacy_plcp_hdr6) +	    padding))) {		b43legacydbg(dev->wl, "RX: Packet size underrun (1)\n");		goto drop;	}	plcp = (struct b43legacy_plcp_hdr6 *)(skb->data + padding);	skb_pull(skb, sizeof(struct b43legacy_plcp_hdr6) + padding);	/* The skb contains the Wireless Header + payload data now */	if (unlikely(skb->len < (2+2+6/*minimum hdr*/ + FCS_LEN))) {		b43legacydbg(dev->wl, "RX: Packet size underrun (2)\n");		goto drop;	}	wlhdr = (struct ieee80211_hdr *)(skb->data);	fctl = le16_to_cpu(wlhdr->frame_control);	if ((macstat & B43legacy_RX_MAC_DEC) &&	    !(macstat & B43legacy_RX_MAC_DECERR)) {		unsigned int keyidx;		int wlhdr_len;		int iv_len;		int icv_len;		keyidx = ((macstat & B43legacy_RX_MAC_KEYIDX)			  >> B43legacy_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 = b43legacy_kidx_to_raw(dev, keyidx);		B43legacy_WARN_ON(keyidx >= dev->max_nr_keys);		if (dev->key[keyidx].algorithm != B43legacy_SEC_ALGO_NONE) {			/* Remove PROTECTED flag to mark it as decrypted. */			B43legacy_WARN_ON(!(fctl & IEEE80211_FCTL_PROTECTED));			fctl &= ~IEEE80211_FCTL_PROTECTED;			wlhdr->frame_control = cpu_to_le16(fctl);			wlhdr_len = ieee80211_get_hdrlen(fctl);			if (unlikely(skb->len < (wlhdr_len + 3))) {				b43legacydbg(dev->wl, "RX: Packet size"					     " underrun3\n");				goto drop;			}			if (skb->data[wlhdr_len + 3] & (1 << 5)) {				/* The Ext-IV Bit is set in the "KeyID"				 * octet of the IV.				 */				iv_len = 8;				icv_len = 8;			} else {				iv_len = 4;				icv_len = 4;			}			if (unlikely(skb->len < (wlhdr_len + iv_len +			    icv_len))) {				b43legacydbg(dev->wl, "RX: Packet size"					     " underrun4\n");				goto drop;			}			/* Remove the IV */			memmove(skb->data + iv_len, skb->data, wlhdr_len);			skb_pull(skb, iv_len);			/* Remove the ICV */			skb_trim(skb, skb->len - icv_len);			status.flag |= RX_FLAG_DECRYPTED;		}	}	status.ssi = b43legacy_rssi_postprocess(dev, jssi,				      (phystat0 & B43legacy_RX_PHYST0_OFDM),				      (phystat0 & B43legacy_RX_PHYST0_GAINCTL),				      (phystat3 & B43legacy_RX_PHYST3_TRSTATE));	status.noise = dev->stats.link_noise;	status.signal = (jssi * 100) / B43legacy_RX_MAX_SSI;	if (phystat0 & B43legacy_RX_PHYST0_OFDM)		status.rate = b43legacy_plcp_get_bitrate_ofdm(plcp);	else		status.rate = b43legacy_plcp_get_bitrate_cck(plcp);	status.antenna = !!(phystat0 & B43legacy_RX_PHYST0_ANT);	status.mactime = mactime;	chanid = (chanstat & B43legacy_RX_CHAN_ID) >>		  B43legacy_RX_CHAN_ID_SHIFT;	switch (chanstat & B43legacy_RX_CHAN_PHYTYPE) {	case B43legacy_PHYTYPE_B:		status.phymode = MODE_IEEE80211B;		status.freq = chanid + 2400;		status.channel = b43legacy_freq_to_channel_bg(chanid + 2400);		break;	case B43legacy_PHYTYPE_G:		status.phymode = MODE_IEEE80211G;		status.freq = chanid + 2400;		status.channel = b43legacy_freq_to_channel_bg(chanid + 2400);		break;	default:		b43legacywarn(dev->wl, "Unexpected value for chanstat (0x%X)\n",		       chanstat);	}	dev->stats.last_rx = jiffies;	ieee80211_rx_irqsafe(dev->wl->hw, skb, &status);	return;drop:	b43legacydbg(dev->wl, "RX: Packet dropped\n");	dev_kfree_skb_any(skb);}void b43legacy_handle_txstatus(struct b43legacy_wldev *dev,			     const struct b43legacy_txstatus *status){	b43legacy_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 (b43legacy_using_pio(dev))		b43legacy_pio_handle_txstatus(dev, status);	else		b43legacy_dma_handle_txstatus(dev, status);}/* Handle TX status report as received through DMA/PIO queues */void b43legacy_handle_hwtxstatus(struct b43legacy_wldev *dev,				 const struct b43legacy_hwtxstatus *hw){	struct b43legacy_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);	b43legacy_handle_txstatus(dev, &status);}/* Stop any TX operation on the device (suspend the hardware queues) */void b43legacy_tx_suspend(struct b43legacy_wldev *dev){	if (b43legacy_using_pio(dev))		b43legacy_pio_freeze_txqueues(dev);	else		b43legacy_dma_tx_suspend(dev);}/* Resume any TX operation on the device (resume the hardware queues) */void b43legacy_tx_resume(struct b43legacy_wldev *dev){	if (b43legacy_using_pio(dev))		b43legacy_pio_thaw_txqueues(dev);	else		b43legacy_dma_tx_resume(dev);}/* Initialize the QoS parameters */void b43legacy_qos_init(struct b43legacy_wldev *dev){	/* FIXME: This function must probably be called from the mac80211	 * config callback. */return;	b43legacy_hf_write(dev, b43legacy_hf_read(dev) | B43legacy_HF_EDCF);	/* FIXME kill magic */	b43legacy_write16(dev, 0x688,			  b43legacy_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 + -