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

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

?? atmel.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 5 頁
字號:
		return 0;	}		if (priv->station_state != STATION_STATE_READY) {		priv->stats.tx_errors++;		dev_kfree_skb(skb);		return 0;	}		/* first ensure the timer func cannot run */	spin_lock_bh(&priv->timerlock); 	/* then stop the hardware ISR */	spin_lock_irqsave(&priv->irqlock, flags); 	/* nb doing the above in the opposite order will deadlock */		/* The Wireless Header is 30 bytes. In the Ethernet packet we "cut" the	   12 first bytes (containing DA/SA) and put them in the appropriate fields of	   the Wireless Header. Thus the packet length is then the initial + 18 (+30-12) */		if (!(buff = find_tx_buff(priv, len + 18))) {		priv->stats.tx_dropped++;		spin_unlock_irqrestore(&priv->irqlock, flags);		spin_unlock_bh(&priv->timerlock);		netif_stop_queue(dev);		return 1;	}		frame_ctl = IEEE80211_FTYPE_DATA;	header.duration_id = 0;	header.seq_ctl = 0;	if (priv->wep_is_on)		frame_ctl |= IEEE80211_FCTL_PROTECTED;	if (priv->operating_mode == IW_MODE_ADHOC) {		memcpy(&header.addr1, skb->data, 6);		memcpy(&header.addr2, dev->dev_addr, 6);		memcpy(&header.addr3, priv->BSSID, 6);	} else {		frame_ctl |= IEEE80211_FCTL_TODS;		memcpy(&header.addr1, priv->CurrentBSSID, 6);		memcpy(&header.addr2, dev->dev_addr, 6);		memcpy(&header.addr3, skb->data, 6);	}		if (priv->use_wpa)		memcpy(&header.addr4, SNAP_RFC1024, 6);	header.frame_ctl = cpu_to_le16(frame_ctl);	/* Copy the wireless header into the card */	atmel_copy_to_card(dev, buff, (unsigned char *)&header, DATA_FRAME_WS_HEADER_SIZE);	/* Copy the packet sans its 802.3 header addresses which have been replaced */	atmel_copy_to_card(dev, buff + DATA_FRAME_WS_HEADER_SIZE, skb->data + 12, len - 12);	priv->tx_buff_tail += len - 12 + DATA_FRAME_WS_HEADER_SIZE;		/* low bit of first byte of destination tells us if broadcast */	tx_update_descriptor(priv, *(skb->data) & 0x01, len + 18, buff, TX_PACKET_TYPE_DATA);	dev->trans_start = jiffies;	priv->stats.tx_bytes += len;		spin_unlock_irqrestore(&priv->irqlock, flags);	spin_unlock_bh(&priv->timerlock);	dev_kfree_skb(skb);		return 0;	}static void atmel_transmit_management_frame(struct atmel_private *priv, 					    struct ieee80211_hdr *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 *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->dev = priv->dev;	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 *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->dev = priv->dev;				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 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 pt_regs *regs){	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 < sizeof(irq_order)/sizeof(u8); 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);			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品久久久| 蜜臀va亚洲va欧美va天堂 | 在线看国产一区二区| 国产精品视频一区二区三区不卡| 国产一区视频网站| 国产欧美视频一区二区三区| 国产不卡高清在线观看视频| 中文av一区二区| 一本一道综合狠狠老| 亚洲h精品动漫在线观看| 欧美一区二区三区四区高清| 蜜臀久久久久久久| 久久色视频免费观看| 丁香激情综合国产| 一个色在线综合| 日韩一卡二卡三卡| 国产激情91久久精品导航 | 亚洲精品国产无天堂网2021| 在线视频你懂得一区| 美美哒免费高清在线观看视频一区二区 | 亚洲韩国一区二区三区| 欧美一区二区三区视频在线| 国产一区高清在线| 一区二区在线免费观看| 欧美一区二区三区成人| 国产成人精品免费| 亚洲一区二区三区国产| 日韩视频在线你懂得| 丁香一区二区三区| 亚洲国产精品麻豆| 久久久天堂av| 欧美日韩国产另类不卡| 国产精品一区二区久激情瑜伽| 亚洲欧美国产77777| 日韩欧美一二区| 99re成人精品视频| 久久精品免费看| 亚洲人成7777| 精品国产一区二区三区久久久蜜月 | 亚洲午夜激情av| 久久久久久久久久久久电影| 91老师片黄在线观看| 久久国产精品露脸对白| 一区二区三区不卡视频在线观看| 精品国产一区二区精华| 欧美亚一区二区| 成人免费黄色大片| 九九热在线视频观看这里只有精品| 亚洲欧美在线aaa| 亚洲精品一区二区三区四区高清| 色婷婷精品大在线视频| 国产成人在线观看| 日韩在线一区二区三区| 亚洲激情成人在线| 欧美国产精品v| 精品国产三级a在线观看| 91精彩视频在线| www.亚洲在线| 国产成人亚洲综合a∨婷婷| 欧美aaaaaa午夜精品| 亚洲福利一二三区| 亚洲精品高清在线观看| 中文久久乱码一区二区| 国产区在线观看成人精品 | 国产一区二区三区免费观看| 午夜精品一区二区三区电影天堂| 亚洲免费在线观看视频| 亚洲国产高清在线观看视频| 2020国产精品久久精品美国| 欧美一区二区成人| 欧美日本国产视频| 国产精品久久久久久户外露出| 欧美zozo另类异族| 日韩免费看网站| 日韩一级免费观看| 欧美一级淫片007| 91精品国产色综合久久不卡电影| 欧美日韩电影在线| 欧美日本国产视频| 欧美一级片在线| 欧美电影精品一区二区| 欧美一区二区三区四区久久| 欧美一区二区三区视频免费播放| 日韩片之四级片| 精品盗摄一区二区三区| ww久久中文字幕| 国产亚洲精品bt天堂精选| 久久久久久久久久久久久女国产乱 | 欧美亚洲一区二区在线观看| 色琪琪一区二区三区亚洲区| 欧美少妇bbb| 在线不卡一区二区| 欧美本精品男人aⅴ天堂| 久久蜜桃av一区精品变态类天堂| 久久精品日韩一区二区三区| 欧美激情一区二区三区四区| 亚洲欧洲精品一区二区三区 | 欧美高清视频一二三区| 91精品国产美女浴室洗澡无遮挡| 欧美一区二区视频在线观看2022| 精品美女在线播放| 亚洲国产精品成人综合| 亚洲欧美日韩中文播放| 亚洲电影你懂得| 久久99久久久久久久久久久| 国产成人午夜精品影院观看视频| 福利视频网站一区二区三区| 91免费看片在线观看| 5月丁香婷婷综合| 国产亚洲女人久久久久毛片| 亚洲天天做日日做天天谢日日欢 | 国产精品中文字幕欧美| 91在线无精精品入口| 欧美另类z0zxhd电影| 国产亚洲欧美日韩在线一区| 亚洲天堂av老司机| 热久久国产精品| 成人网男人的天堂| 欧美高清www午色夜在线视频| 精品国产乱码久久久久久牛牛| 中文字幕亚洲精品在线观看| 午夜精品福利一区二区蜜股av | 亚洲chinese男男1069| 极品少妇一区二区三区精品视频| 99综合影院在线| 日韩三级视频中文字幕| 亚洲人成网站影音先锋播放| 精品一区二区三区免费| 色偷偷88欧美精品久久久| 欧美xxx久久| 亚洲成人在线网站| 成人av资源站| 日韩欧美高清在线| 亚洲一区二区三区四区在线观看| 国模冰冰炮一区二区| 欧美三级日本三级少妇99| 国产香蕉久久精品综合网| 亚洲成人777| 91美女蜜桃在线| 国产色婷婷亚洲99精品小说| 蜜臀av性久久久久av蜜臀妖精| 91丨porny丨首页| 国产欧美精品在线观看| 欧美aⅴ一区二区三区视频| 91精彩视频在线观看| 国产精品热久久久久夜色精品三区| 视频一区国产视频| 欧亚洲嫩模精品一区三区| 国产精品女主播在线观看| 国内久久精品视频| 日韩视频在线永久播放| 日韩精品免费视频人成| 91官网在线免费观看| 亚洲欧洲日产国码二区| 成人免费视频免费观看| 久久影音资源网| 久久疯狂做爰流白浆xx| 91精品国产综合久久久蜜臀粉嫩 | 国产成+人+日韩+欧美+亚洲| 日韩欧美三级在线| 日韩福利视频导航| 777午夜精品免费视频| 亚洲成年人影院| 欧美卡1卡2卡| 亚洲成人av一区二区三区| 欧美色大人视频| 亚洲一二三四久久| 欧美日韩在线一区二区| 亚洲影院理伦片| 欧美日韩一区二区三区在线| 夜夜夜精品看看| 在线观看免费一区| 亚洲最色的网站| 欧美日韩一区中文字幕| 亚洲mv在线观看| 日韩欧美在线网站| 狠狠色丁香久久婷婷综合丁香| 精品久久99ma| 国产精一品亚洲二区在线视频| 久久综合久色欧美综合狠狠| 国产在线精品视频| 欧美国产日本韩| 91网站黄www| 亚洲成年人网站在线观看| 欧美一区二区三区公司| 国产精品一品视频| 国产精品电影一区二区| 91色视频在线| 丝瓜av网站精品一区二区| 欧美一二三区在线| 国产乱码精品一品二品| 国产精品久久三| 欧美三级日韩三级国产三级| 美女网站在线免费欧美精品| 久久色中文字幕| 91黄色免费看| 国产最新精品免费| 亚洲精选视频免费看| 日韩一区二区在线免费观看| 国产精品一区二区在线观看不卡 |