亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? atmel.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
static void atmel_transmit_management_frame(struct atmel_private *priv,					    struct ieee80211_hdr_4addr *header,					    u8 *body, int body_len){	u16 buff;	int len = MGMT_FRAME_BODY_OFFSET + body_len;	if (!(buff = find_tx_buff(priv, len)))		return;	atmel_copy_to_card(priv->dev, buff, (u8 *)header, MGMT_FRAME_BODY_OFFSET);	atmel_copy_to_card(priv->dev, buff + MGMT_FRAME_BODY_OFFSET, body, body_len);	priv->tx_buff_tail += len;	tx_update_descriptor(priv, header->addr1[0] & 0x01, len, buff, TX_PACKET_TYPE_MGMT);}static void fast_rx_path(struct atmel_private *priv,			 struct ieee80211_hdr_4addr *header,			 u16 msdu_size, u16 rx_packet_loc, u32 crc){	/* fast path: unfragmented packet copy directly into skbuf */	u8 mac4[6];	struct sk_buff	*skb;	unsigned char *skbp;	/* get the final, mac 4 header field, this tells us encapsulation */	atmel_copy_to_host(priv->dev, mac4, rx_packet_loc + 24, 6);	msdu_size -= 6;	if (priv->do_rx_crc) {		crc = crc32_le(crc, mac4, 6);		msdu_size -= 4;	}	if (!(skb = dev_alloc_skb(msdu_size + 14))) {		priv->stats.rx_dropped++;		return;	}	skb_reserve(skb, 2);	skbp = skb_put(skb, msdu_size + 12);	atmel_copy_to_host(priv->dev, skbp + 12, rx_packet_loc + 30, msdu_size);	if (priv->do_rx_crc) {		u32 netcrc;		crc = crc32_le(crc, skbp + 12, msdu_size);		atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + 30 + msdu_size, 4);		if ((crc ^ 0xffffffff) != netcrc) {			priv->stats.rx_crc_errors++;			dev_kfree_skb(skb);			return;		}	}	memcpy(skbp, header->addr1, 6); /* destination address */	if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS)		memcpy(&skbp[6], header->addr3, 6);	else		memcpy(&skbp[6], header->addr2, 6); /* source address */	priv->dev->last_rx = jiffies;	skb->protocol = eth_type_trans(skb, priv->dev);	skb->ip_summed = CHECKSUM_NONE;	netif_rx(skb);	priv->stats.rx_bytes += 12 + msdu_size;	priv->stats.rx_packets++;}/* Test to see if the packet in card memory at packet_loc has a valid CRC   It doesn't matter that this is slow: it is only used to proble the first few   packets. */static int probe_crc(struct atmel_private *priv, u16 packet_loc, u16 msdu_size){	int i = msdu_size - 4;	u32 netcrc, crc = 0xffffffff;	if (msdu_size < 4)		return 0;	atmel_copy_to_host(priv->dev, (void *)&netcrc, packet_loc + i, 4);	atmel_writeAR(priv->dev, packet_loc);	while (i--) {		u8 octet = atmel_read8(priv->dev, DR);		crc = crc32_le(crc, &octet, 1);	}	return (crc ^ 0xffffffff) == netcrc;}static void frag_rx_path(struct atmel_private *priv,			 struct ieee80211_hdr_4addr *header,			 u16 msdu_size, u16 rx_packet_loc, u32 crc, u16 seq_no,			 u8 frag_no, int more_frags){	u8 mac4[6];	u8 source[6];	struct sk_buff *skb;	if (le16_to_cpu(header->frame_ctl) & IEEE80211_FCTL_FROMDS)		memcpy(source, header->addr3, 6);	else		memcpy(source, header->addr2, 6);	rx_packet_loc += 24; /* skip header */	if (priv->do_rx_crc)		msdu_size -= 4;	if (frag_no == 0) { /* first fragment */		atmel_copy_to_host(priv->dev, mac4, rx_packet_loc, 6);		msdu_size -= 6;		rx_packet_loc += 6;		if (priv->do_rx_crc)			crc = crc32_le(crc, mac4, 6);		priv->frag_seq = seq_no;		priv->frag_no = 1;		priv->frag_len = msdu_size;		memcpy(priv->frag_source, source, 6);		memcpy(&priv->rx_buf[6], source, 6);		memcpy(priv->rx_buf, header->addr1, 6);		atmel_copy_to_host(priv->dev, &priv->rx_buf[12], rx_packet_loc, msdu_size);		if (priv->do_rx_crc) {			u32 netcrc;			crc = crc32_le(crc, &priv->rx_buf[12], msdu_size);			atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);			if ((crc ^ 0xffffffff) != netcrc) {				priv->stats.rx_crc_errors++;				memset(priv->frag_source, 0xff, 6);			}		}	} else if (priv->frag_no == frag_no &&		   priv->frag_seq == seq_no &&		   memcmp(priv->frag_source, source, 6) == 0) {		atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len],				   rx_packet_loc, msdu_size);		if (priv->do_rx_crc) {			u32 netcrc;			crc = crc32_le(crc,				       &priv->rx_buf[12 + priv->frag_len],				       msdu_size);			atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);			if ((crc ^ 0xffffffff) != netcrc) {				priv->stats.rx_crc_errors++;				memset(priv->frag_source, 0xff, 6);				more_frags = 1; /* don't send broken assembly */			}		}		priv->frag_len += msdu_size;		priv->frag_no++;		if (!more_frags) { /* last one */			memset(priv->frag_source, 0xff, 6);			if (!(skb = dev_alloc_skb(priv->frag_len + 14))) {				priv->stats.rx_dropped++;			} else {				skb_reserve(skb, 2);				memcpy(skb_put(skb, priv->frag_len + 12),				       priv->rx_buf,				       priv->frag_len + 12);				priv->dev->last_rx = jiffies;				skb->protocol = eth_type_trans(skb, priv->dev);				skb->ip_summed = CHECKSUM_NONE;				netif_rx(skb);				priv->stats.rx_bytes += priv->frag_len + 12;				priv->stats.rx_packets++;			}		}	} else		priv->wstats.discard.fragment++;}static void rx_done_irq(struct atmel_private *priv){	int i;	struct ieee80211_hdr_4addr header;	for (i = 0;	     atmel_rmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head)) == RX_DESC_FLAG_VALID &&		     i < priv->host_info.rx_desc_count;	     i++) {		u16 msdu_size, rx_packet_loc, frame_ctl, seq_control;		u8 status = atmel_rmem8(priv, atmel_rx(priv, RX_DESC_STATUS_OFFSET, priv->rx_desc_head));		u32 crc = 0xffffffff;		if (status != RX_STATUS_SUCCESS) {			if (status == 0xc1) /* determined by experiment */				priv->wstats.discard.nwid++;			else				priv->stats.rx_errors++;			goto next;		}		msdu_size = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_SIZE_OFFSET, priv->rx_desc_head));		rx_packet_loc = atmel_rmem16(priv, atmel_rx(priv, RX_DESC_MSDU_POS_OFFSET, priv->rx_desc_head));		if (msdu_size < 30) {			priv->stats.rx_errors++;			goto next;		}		/* Get header as far as end of seq_ctl */		atmel_copy_to_host(priv->dev, (char *)&header, rx_packet_loc, 24);		frame_ctl = le16_to_cpu(header.frame_ctl);		seq_control = le16_to_cpu(header.seq_ctl);		/* probe for CRC use here if needed  once five packets have		   arrived with the same crc status, we assume we know what's		   happening and stop probing */		if (priv->probe_crc) {			if (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED)) {				priv->do_rx_crc = probe_crc(priv, rx_packet_loc, msdu_size);			} else {				priv->do_rx_crc = probe_crc(priv, rx_packet_loc + 24, msdu_size - 24);			}			if (priv->do_rx_crc) {				if (priv->crc_ok_cnt++ > 5)					priv->probe_crc = 0;			} else {				if (priv->crc_ko_cnt++ > 5)					priv->probe_crc = 0;			}		}		/* don't CRC header when WEP in use */		if (priv->do_rx_crc && (!priv->wep_is_on || !(frame_ctl & IEEE80211_FCTL_PROTECTED))) {			crc = crc32_le(0xffffffff, (unsigned char *)&header, 24);		}		msdu_size -= 24; /* header */		if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) {			int more_fragments = frame_ctl & IEEE80211_FCTL_MOREFRAGS;			u8 packet_fragment_no = seq_control & IEEE80211_SCTL_FRAG;			u16 packet_sequence_no = (seq_control & IEEE80211_SCTL_SEQ) >> 4;			if (!more_fragments && packet_fragment_no == 0) {				fast_rx_path(priv, &header, msdu_size, rx_packet_loc, crc);			} else {				frag_rx_path(priv, &header, msdu_size, rx_packet_loc, crc,					     packet_sequence_no, packet_fragment_no, more_fragments);			}		}		if ((frame_ctl & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT) {			/* copy rest of packet into buffer */			atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size);			/* we use the same buffer for frag reassembly and control packets */			memset(priv->frag_source, 0xff, 6);			if (priv->do_rx_crc) {				/* last 4 octets is crc */				msdu_size -= 4;				crc = crc32_le(crc, (unsigned char *)&priv->rx_buf, msdu_size);				if ((crc ^ 0xffffffff) != (*((u32 *)&priv->rx_buf[msdu_size]))) {					priv->stats.rx_crc_errors++;					goto next;				}			}			atmel_management_frame(priv, &header, msdu_size,					       atmel_rmem8(priv, atmel_rx(priv, RX_DESC_RSSI_OFFSET, priv->rx_desc_head)));		}next:		/* release descriptor */		atmel_wmem8(priv, atmel_rx(priv, RX_DESC_FLAGS_OFFSET, priv->rx_desc_head), RX_DESC_FLAG_CONSUMED);		if (priv->rx_desc_head < (priv->host_info.rx_desc_count - 1))			priv->rx_desc_head++;		else			priv->rx_desc_head = 0;	}}static irqreturn_t service_interrupt(int irq, void *dev_id){	struct net_device *dev = (struct net_device *) dev_id;	struct atmel_private *priv = netdev_priv(dev);	u8 isr;	int i = -1;	static u8 irq_order[] = {		ISR_OUT_OF_RANGE,		ISR_RxCOMPLETE,		ISR_TxCOMPLETE,		ISR_RxFRAMELOST,		ISR_FATAL_ERROR,		ISR_COMMAND_COMPLETE,		ISR_IBSS_MERGE,		ISR_GENERIC_IRQ	};	if (priv->card && priv->present_callback &&	    !(*priv->present_callback)(priv->card))		return IRQ_HANDLED;	/* In this state upper-level code assumes it can mess with	   the card unhampered by interrupts which may change register state.	   Note that even though the card shouldn't generate interrupts	   the inturrupt line may be shared. This allows card setup	   to go on without disabling interrupts for a long time. */	if (priv->station_state == STATION_STATE_DOWN)		return IRQ_NONE;	atmel_clear_gcr(dev, GCR_ENINT); /* disable interrupts */	while (1) {		if (!atmel_lock_mac(priv)) {			/* failed to contact card */			printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name);			return IRQ_HANDLED;		}		isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET));		atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0);		if (!isr) {			atmel_set_gcr(dev, GCR_ENINT); /* enable interrupts */			return i == -1 ? IRQ_NONE : IRQ_HANDLED;		}		atmel_set_gcr(dev, GCR_ACKINT); /* acknowledge interrupt */		for (i = 0; i < ARRAY_SIZE(irq_order); i++)			if (isr & irq_order[i])				break;		if (!atmel_lock_mac(priv)) {			/* failed to contact card */			printk(KERN_ALERT "%s: failed to contact MAC.\n", dev->name);			return IRQ_HANDLED;		}		isr = atmel_rmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET));		isr ^= irq_order[i];		atmel_wmem8(priv, atmel_hi(priv, IFACE_INT_STATUS_OFFSET), isr);		atmel_wmem8(priv, atmel_hi(priv, IFACE_LOCKOUT_MAC_OFFSET), 0);		switch (irq_order[i]) {		case ISR_OUT_OF_RANGE:			if (priv->operating_mode == IW_MODE_INFRA &&			    priv->station_state == STATION_STATE_READY) {				priv->station_is_associated = 0;				atmel_scan(priv, 1);			}			break;		case ISR_RxFRAMELOST:			priv->wstats.discard.misc++;			/* fall through */		case ISR_RxCOMPLETE:			rx_done_irq(priv);			break;		case ISR_TxCOMPLETE:			tx_done_irq(priv);			break;		case ISR_FATAL_ERROR:			printk(KERN_ALERT "%s: *** FATAL error interrupt ***\n", dev->name);			atmel_enter_state(priv, STATION_STATE_MGMT_ERROR);			break;		case ISR_COMMAND_COMPLETE:			atmel_command_irq(priv);			break;		case ISR_IBSS_MERGE:			atmel_get_mib(priv, Mac_Mgmt_Mib_Type, MAC_MGMT_MIB_CUR_BSSID_POS,				      priv->CurrentBSSID, 6);			/* The WPA stuff cares about the current AP address */			if (priv->use_wpa)				build_wpa_mib(priv);			break;		case ISR_GENERIC_IRQ:			printk(KERN_INFO "%s: Generic_irq received.\n", dev->name);			break;		}	}}static struct net_device_stats *atmel_get_stats(struct net_device *dev){	struct atmel_private *priv = netdev_priv(dev);	return &priv->stats;}static struct iw_statistics *atmel_get_wireless_stats(struct net_device *dev){	struct atmel_private *priv = netdev_priv(dev);	/* update the link quality here in case we are seeing no beacons	   at all to drive the process */	atmel_smooth_qual(priv);	priv->wstats.status = priv->station_state;	if (priv->operating_mode == IW_MODE_INFRA) {		if (priv->station_state != STATION_STATE_READY) {			priv->wstats.qual.qual = 0;			priv->wstats.qual.level = 0;			priv->wstats.qual.updated = (IW_QUAL_QUAL_INVALID					| IW_QUAL_LEVEL_INVALID);		}		priv->wstats.qual.noise = 0;		priv->wstats.qual.updated |= IW_QUAL_NOISE_INVALID;	} else {		/* Quality levels cannot be determined in ad-hoc mode,		   because we can 'hear' more that one remote station. */		priv->wstats.qual.qual = 0;		priv->wstats.qual.level	= 0;		priv->wstats.qual.noise	= 0;		priv->wstats.qual.updated = IW_QUAL_QUAL_INVALID					| IW_QUAL_LEVEL_INVALID					| IW_QUAL_NOISE_INVALID;		priv->wstats.miss.beacon = 0;	}	return &priv->wstats;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一级二级| 欧美日韩精品系列| 欧美日韩国产小视频| 久久久精品国产免费观看同学| 亚洲私人黄色宅男| 韩国v欧美v日本v亚洲v| 欧美日韩在线免费视频| 久久精品男人的天堂| 无码av免费一区二区三区试看 | 精品国产网站在线观看| 日韩一区欧美一区| 国产剧情一区在线| 91麻豆精品国产91久久久使用方法| 成人免费小视频| 国产高清精品网站| 精品久久五月天| 肉色丝袜一区二区| 欧美中文字幕一区二区三区 | 欧美久久久久免费| 亚洲毛片av在线| 成人国产精品视频| 久久久亚洲精华液精华液精华液| 琪琪久久久久日韩精品| 欧美三级电影网站| 亚洲影视资源网| 色悠悠亚洲一区二区| 国产精品麻豆久久久| 国产综合色精品一区二区三区| 欧美精品丝袜久久久中文字幕| 亚洲一区二区在线免费观看视频| 99re6这里只有精品视频在线观看| 久久久99久久| 国产91富婆露脸刺激对白| 精品国产乱码久久久久久浪潮| 蜜桃视频第一区免费观看| 91麻豆精品国产91久久久久久久久 | 亚洲午夜久久久久久久久久久| 91亚洲大成网污www| 中文字幕一区二区三| av不卡一区二区三区| 国产精品免费aⅴ片在线观看| 国产成人高清在线| 国产精品欧美极品| 91视频观看免费| 亚洲国产精品视频| 欧美精品 日韩| 久久爱另类一区二区小说| 精品国产青草久久久久福利| 国产一区二区三区四区在线观看| 久久精品一区二区三区不卡 | 欧美日韩精品系列| 另类人妖一区二区av| 欧美精品一区二区精品网| 国产剧情av麻豆香蕉精品| 亚洲国产高清不卡| 色999日韩国产欧美一区二区| 亚洲国产日韩一级| 精品少妇一区二区三区日产乱码 | 日本欧洲一区二区| 久久亚洲一级片| 91视频观看视频| 日韩成人dvd| 国产色一区二区| 日本精品视频一区二区| 免费在线视频一区| 国产精品素人一区二区| 欧美日韩久久久| 国产精品一二三四区| 亚洲精品国产无天堂网2021| 欧美一级爆毛片| 99久久久久久99| 美女任你摸久久| 亚洲黄色小视频| 精品99999| 欧洲生活片亚洲生活在线观看| 美女精品自拍一二三四| 国产精品高潮久久久久无| 欧美日韩电影在线播放| 风间由美性色一区二区三区| 亚洲一区成人在线| 国产欧美日韩在线看| 欧美高清精品3d| 91碰在线视频| 国产在线不卡一区| 亚洲123区在线观看| 国产精品污网站| 欧美精品一区二区精品网| 一本高清dvd不卡在线观看| 久久99精品久久久久久久久久久久| 亚洲欧美在线aaa| 久久久久久亚洲综合影院红桃| 欧美性受极品xxxx喷水| 成人不卡免费av| 国产精品一区二区男女羞羞无遮挡| 亚洲伦在线观看| 欧美激情一二三区| 精品99久久久久久| 日韩欧美的一区二区| 欧美久久一区二区| 欧洲另类一二三四区| 91网站最新地址| 大陆成人av片| 国产精品456| 国产一区二区影院| 另类小说一区二区三区| 日韩成人精品在线| 视频在线在亚洲| 午夜精品久久久久久久久久 | 国产精品私房写真福利视频| 久久色.com| 久久久九九九九| 久久亚洲免费视频| 久久精品视频在线免费观看| 欧美成人vps| 久久久国产午夜精品| 精品少妇一区二区| 精品国产乱码91久久久久久网站| 91精品国产综合久久精品性色| 欧美日韩久久一区| 91精品一区二区三区在线观看| 欧美日韩国产高清一区二区三区 | 日韩精品中文字幕一区 | 国产精品福利一区二区| 国产精品国产成人国产三级| 国产精品久久久久久久久图文区 | 国产一区二区伦理| 国产91精品精华液一区二区三区 | 亚洲成年人网站在线观看| 亚洲v日本v欧美v久久精品| 午夜视黄欧洲亚洲| 久久国产精品色婷婷| 国产精品一级片在线观看| fc2成人免费人成在线观看播放| caoporn国产精品| 欧亚一区二区三区| 日韩一区二区视频在线观看| 日韩一区二区三区四区| 久久免费视频色| 亚洲欧美激情视频在线观看一区二区三区 | 欧美午夜精品一区二区蜜桃| 欧美日韩国产影片| 精品国产免费视频| 亚洲欧美日韩综合aⅴ视频| 午夜精品aaa| 国产精品99久| 色呦呦日韩精品| 精品日本一线二线三线不卡| 国产日产欧产精品推荐色| 亚洲欧美色综合| 美脚の诱脚舐め脚责91| 成人午夜电影小说| 欧美片网站yy| 国产女人aaa级久久久级| 一区二区三区在线播放| 免费在线观看精品| 91在线播放网址| 欧美zozozo| 一区二区视频在线| 极品尤物av久久免费看| 色拍拍在线精品视频8848| 91麻豆精品国产91久久久久久 | 91精品国产色综合久久不卡蜜臀 | 粉嫩蜜臀av国产精品网站| 欧美日韩一级视频| 国产精品三级久久久久三级| 亚洲成人午夜影院| 波多野结衣的一区二区三区| 欧美一区二区在线免费播放| 国产精品久久久久毛片软件| 日韩国产精品91| 91黄色激情网站| 国产欧美日韩久久| 捆绑调教美女网站视频一区| 在线观看视频一区二区| 国产女人aaa级久久久级 | 亚洲成人在线观看视频| 丁香天五香天堂综合| 精品国产免费一区二区三区四区| 亚洲亚洲人成综合网络| 成人黄色国产精品网站大全在线免费观看| 欧美片网站yy| 亚洲国产精品影院| 一本大道久久a久久综合 | 亚洲精品一区二区三区精华液| 亚洲电影在线播放| 91在线丨porny丨国产| 国产亚洲短视频| 国产一区二区在线免费观看| 3d动漫精品啪啪一区二区竹菊| 亚洲伦理在线精品| 91免费看`日韩一区二区| 国产日本欧洲亚洲| 国产电影一区二区三区| 欧美va日韩va| 老司机精品视频一区二区三区| 91精品一区二区三区久久久久久 | 亚洲综合久久av| 欧美色综合影院| 夜夜揉揉日日人人青青一国产精品| 91麻豆精东视频|