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

📄 aironet4500_core.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
   	//priv->stats.tx_fifo_errors++;   	UP(&priv->tx_buff_semaphore);	AWC_ENTRY_EXIT_DEBUG("NoSpaceExit\n");   	return 1 ;  final:	priv->stats.tx_errors++;	UP(&priv->tx_buff_semaphore);	if (!netif_running(dev)) 		netif_start_queue(dev);	dev_kfree_skb(skb);	AWC_ENTRY_EXIT_DEBUG("BADExit\n");	return -1;  };/*	called from low level driver->card tx copy routine  	probably wants to free skbuf if failed transmits won't be	resubmitted to another device (if more than one path)	or tried again (if tx buffer in card needs to be filled again)*/      voidawc_802_11_after_tx_packet_to_card_write(struct net_device * dev,					 struct awc_fid * tx_buff){	AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_tx_packet_to_card_write");	if (!tx_buff){		DEBUG(1,"%s no damn tx_buff in awc_802_11_after_tx_packet_to_card_write \n",dev->name);	};	if(tx_buff->skb){		dev_kfree_skb(tx_buff->skb);		tx_buff->skb = NULL;	}	AWC_ENTRY_EXIT_DEBUG("exit\n");};/*        called from low level driver->card tx copy routine        probably wants to free skbuf if failed writes won't be        resubmitted to another device (if more than one path)         or tried again (if tx buffer in card needs to be filled again)*/                        voidawc_802_11_after_failed_tx_packet_to_card_write(struct net_device * dev,                                         struct awc_fid * tx_buff){        struct awc_private * priv = (struct awc_private *)dev->priv;	AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_failed_tx_packet_to_card_write");	if (!tx_buff){		DEBUG(1,"%s no damn tx_buff in awc_802_11_after_failed_tx_packet_to_card_write \n",dev->name);	};	if(tx_buff->skb){		dev_kfree_skb(tx_buff->skb);		tx_buff->skb = NULL;		tx_buff->busy =0;		printk(KERN_ERR "%s packet to card write failed \n",dev->name);	}		awc_fid_queue_remove(&priv->tx_in_transmit,tx_buff);		if (tx_buff->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE)		awc_fid_queue_push_tail(&priv->tx_small_ready,tx_buff);	else 		awc_fid_queue_push_tail(&priv->tx_large_ready,tx_buff);	AWC_ENTRY_EXIT_DEBUG("exit\n");};                                         inline void awc_802_11_after_tx_complete(struct net_device * dev, struct awc_fid * tx_buff){        struct awc_private * priv = (struct awc_private *)dev->priv;	AWC_ENTRY_EXIT_DEBUG("awc_802_11_after_tx_complete");                	DEBUG(32,"tx complete status %x \n ",tx_buff->u.tx.radio_tx.Status);	#ifdef AWC_DEBUG	 if (tx_buff->u.tx.radio_tx.Status)	 	printk("tf%x ",tx_buff->u.tx.radio_tx.Status);	#endif	if (tx_buff->u.tx.fid_size <= AWC_TX_ALLOC_SMALL_SIZE){		awc_fid_queue_push_tail(&priv->tx_small_ready,tx_buff);		priv->tx_small_buffs_in_use--;	} else { 		awc_fid_queue_push_tail(&priv->tx_large_ready,tx_buff);		priv->tx_buffs_in_use--;	}	tx_buff->busy = 0;//	netif_wake_queue (dev);	AWC_ENTRY_EXIT_DEBUG("exit\n");};                                                 /********************************	R X	***********************/inline intawc_receive_packet(struct net_device * dev){	    struct awc_command cmd;    u16	Fid;//    struct sk_buff *skb = NULL;    struct awc_fid * rx_buff;    struct awc_private * priv ;	int i;            	priv= (struct awc_private *)dev->priv;      	rx_buff = priv->rx_ready.head        ;     AWC_ENTRY_EXIT_DEBUG(" entry awc_receive_packet ");     	Fid = awc_Rx_Fid(dev->base_addr);		DEBUG(128," RX FID  %x	\n",Fid);	if (!Fid){		printk(KERN_CRIT "No RxFid when rx event \n");		return -1;	}		if (!rx_buff){		printk(KERN_CRIT "No rx_buff in rx event \n");		return -1;	}	rx_buff->type   = 0;	                	AWC_INIT_COMMAND(AWC_CLI,cmd,dev,0,0,			Fid, 0, 0x14 , &(rx_buff->u.rx.radio_rx));// header reading , order is important	AWC_BAP_LOCK_UNDER_CLI(cmd);	if (awc_bap_setup(&cmd))		goto final;	if (awc_bap_read(&cmd))		goto final;	DEBUG(128, "rx receive radio header, length %x \n",rx_buff->u.rx.radio_rx.PayloadLength);	cmd.buff 	= &(rx_buff->u.rx.ieee_802_11);	cmd.len		= 0x20;	if (awc_bap_read(&cmd))		goto final;	DEBUG(128, "rx receive 802_11 header, framecontrol %x \n",rx_buff->u.rx.ieee_802_11.frame_control);	if (rx_buff->u.rx.ieee_802_11.gapLen > 8) {		printk(KERN_ERR "%s: 802.11 gap lenght huge %d \n",dev->name,rx_buff->u.rx.ieee_802_11.gapLen);		goto final;	}	DEBUG(128,"SeqCtl %x, 802_11 macs: ",rx_buff->u.rx.ieee_802_11.SeqCtl);	if (awc_debug & 0x7000){		DEBUG(0x7000, " %s mac1 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac1[i] )) ;		DEBUG(0x7000, " %s mac2 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac2[i] )) ;		DEBUG(0x7000, " %s mac3 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac3[i] )) ;		DEBUG(0x7000, " %s mac4 ",dev->name); for (i = 0; i < 6; i++) DEBUG(0x7000, "%02x:",((unsigned char)rx_buff->u.rx.ieee_802_11.mac4[i] )) ;	}		DEBUG(128,"\n GapLen %d ",rx_buff->u.rx.ieee_802_11.gapLen );		if (rx_buff->u.rx.ieee_802_11.gapLen > 0) {		cmd.buff     = rx_buff->u.rx.ieee_802_11.gap;		cmd.len      = rx_buff->u.rx.ieee_802_11.gapLen;		if (awc_bap_read(&cmd))	     goto final;		DEBUG(128, "rx receive gap header , gap length %x \n",rx_buff->u.rx.gap_length);	}	for (i = 0; i < rx_buff->u.rx.ieee_802_11.gapLen ; i++) DEBUG(128,"%x",((unsigned char)rx_buff->u.rx.ieee_802_11.gap[i] )) ;        	if ( !(priv->config.ReceiveMode & RXMODE_DISABLE_802_3_HEADER ) 	     ){		cmd.buff     	 = &(rx_buff->u.rx.ieee_802_3);		cmd.len      	 = 0x10;		rx_buff->type 	|= p80211_8023;		if (awc_bap_read(&cmd))				goto final;		DEBUG(128, "rx receive 802_3 header, payload length %x \n",rx_buff->u.rx.ieee_802_3.payload_length);        	DEBUG(128,"\n 802_3 status %x ",rx_buff->u.rx.ieee_802_3.status );		DEBUG(128," RX payloadLen %x, dst,src: ",rx_buff->u.rx.ieee_802_3.payload_length);		if (awc_debug & 0x7000){			for (i = 0; i < 6; i++) printk("%02x:",((unsigned char)rx_buff->u.rx.ieee_802_3.dst_mac[i] )) ;			for (i = 0; i < 6; i++) printk("%02x:",((unsigned char)rx_buff->u.rx.ieee_802_3.src_mac[i] )) ;		}	};	rx_buff->pkt_len = rx_buff->u.rx.radio_rx.PayloadLength;		if (priv->config.OperatingMode & MODE_LLC_HOST)		rx_buff->type   |= p80211_llc_snap;		if (awc_802_11_find_copy_path(dev,rx_buff))		goto final;	if (rx_buff->u.rx.payload ){			cmd.buff = rx_buff->u.rx.payload;		cmd.len	 = rx_buff->pkt_len;		if (awc_bap_read(&cmd))				goto final;		DEBUG(128, "rx payload read %x \n",rx_buff->u.rx.ieee_802_3.payload_length);	};		AWC_RELEASE_COMMAND(cmd);        DEBUG(128,"\n payload hdr %x ",rx_buff->u.rx.ieee_802_3.status );        if (awc_debug && rx_buff->u.rx.payload)		for (i = 0; i < 20; i++) DEBUG(128,"%x",((unsigned char)rx_buff->u.rx.payload[i] )) ;	DEBUG(128,"%c",'\n');	awc_802_11_router_rx(dev,rx_buff);	AWC_ENTRY_EXIT_DEBUG(" exit \n");  	return 0;     final:             awc_802_11_failed_rx_copy(dev,rx_buff);     	// if (skb) dev_kfree_skb(skb, FREE_WRITE);     	AWC_RELEASE_COMMAND(cmd);     	AWC_ENTRY_EXIT_DEBUG("  BAD exit \n");	return -1; ;     	};intawc_transmit_packet(struct net_device * dev, struct awc_fid * tx_buff) {		struct awc_command cmd;	u16 size ;//	unsigned long flags;	int i;    struct awc_private * priv= (struct awc_private *)dev->priv;     AWC_ENTRY_EXIT_DEBUG(" entry awc_transmit_packet ");     	if (priv->link_status_changed ){		priv->link_status_changed =0;  		awc_readrid_dir(dev,&priv->rid_dir[7]);	}	        AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0xB, tx_buff->u.tx.fid,          	tx_buff->u.tx.fid, 0, 0x14 , &(tx_buff->u.tx.radio_tx));		AWC_BAP_LOCK_NOT_CLI(cmd);#ifdef AWC_BY_BOOK#warning  By books is bad, AWC_BY_BOOK  #error cli sti bad here	if (    !(tx_buff->type &(p80211_llc_snap|p80211_8021H) ) 	     && !(tx_buff->u.tx.radio_tx.TX_Control &	                   aironet4500_tx_control_header_type_802_11 )){			cmd.buff=&(tx_buff->u.tx.radio_tx.TX_Control);		cmd.len = 0x2 ;        	cmd.offset = 0x8;        	save_flags(flags);        	cli();        	if (awc_bap_setup(&cmd))		goto final;                	if (awc_bap_write(&cmd))		goto final;		cmd.buff=&(tx_buff->u.tx.ieee_802_3.payload_length);		cmd.len = 14;        	cmd.offset = 0x36;        	if (awc_bap_setup(&cmd))		goto final;             		if (awc_bap_write(&cmd))		goto final;     		restore_flags(flags);	} else {#endif			        	if (awc_bap_setup(&cmd))		goto final;                	if (awc_bap_write(&cmd))		goto final;                	DEBUG(64," wrote radio tx header for fid %x \n",tx_buff->u.tx.fid);		// 802.11        	cmd.buff=&(tx_buff->u.tx.ieee_802_11);        	cmd.len = 0x20;        	if (awc_bap_write(&cmd))                goto final;		// Gap		if (tx_buff->u.tx.ieee_802_11.gapLen) {        		cmd.buff=&(tx_buff->u.tx.ieee_802_11.gap);        		cmd.len = tx_buff->u.tx.ieee_802_11.gapLen;        		if (awc_bap_write(&cmd))	goto final;        	}	        // 802.3	        if ( !	(tx_buff->u.tx.radio_tx.TX_Control & 	      	 	aironet4500_tx_control_header_type_802_11 )){	       		        			cmd.buff=&(tx_buff->u.tx.ieee_802_3);			if (awc_debug & 0x7000){				printk("%s TX dst ",dev->name);				for (i=0; i < 6; i++) printk ("%02x:",(unsigned char) tx_buff->u.tx.ieee_802_3.dst_mac[i]);				printk(" src ");				for (i=0; i < 6; i++) printk ("%02x:",(unsigned char) tx_buff->u.tx.ieee_802_3.src_mac[i]);				printk(" \n ");			}       			cmd.len = 0x10;        			if (awc_bap_write(&cmd))	goto final;       		};       	 	       		if (tx_buff->type & p80211_llc_snap) {       			cmd.buff=	& tx_buff->snap;       			cmd.len =	sizeof(tx_buff->snap);       			if (awc_bap_write(&cmd))		goto final;        	};	 	  	if (tx_buff->type & p80211_8021H) {       	 		size = htons(tx_buff->bridge_size);          	//	size = tx_buff->bridge_size;// to seasure raw speed of f** UC         			cmd.buff=	& size;       			cmd.len =	2 ;        		if (awc_bap_write(&cmd))                goto final;        		       			cmd.buff=	& tx_buff->bridge;       			cmd.len =	sizeof(tx_buff->bridge);       			if (awc_bap_write(&cmd))		goto final;        	};	       	 #ifdef AWC_BY_BOOK	       	 	       	 	}#endif       	cmd.buff=	tx_buff->u.tx.payload;       	cmd.len =	tx_buff->pkt_len;       	if (awc_bap_write(&cmd))			goto final;	AWC_RELEASE_COMMAND(cmd);// locking probs,  these two lines below and above, swithc order 	if (awc_issue_command_and_block(&cmd))		goto final_unlocked;      	tx_buff->transmit_start_time = jiffies;	awc_802_11_after_tx_packet_to_card_write(dev,tx_buff);         		           // issue the transmit command        AWC_ENTRY_EXIT_DEBUG(" exit \n"); 	return 0;     final:	awc_802_11_after_failed_tx_packet_to_card_write(dev,tx_buff);     	             	printk(KERN_CRIT "%s awc tx command failed \n",dev->name);     	AWC_RELEASE_COMMAND(cmd);     	AWC_ENTRY_EXIT_DEBUG("  BAD exit \n");	return -1; ;     final_unlocked:	awc_802_11_after_failed_tx_packet_to_card_write(dev,tx_buff);     	             	printk(KERN_CRIT "%s awc tx command failed \n",dev->name);     	AWC_ENTRY_EXIT_DEBUG("  BAD exit \n");	return -1; ;}inline intawc_tx_complete_check(struct net_device * dev){	struct awc_fid	* fid;	struct awc_command cmd;     AWC_ENTRY_EXIT_DEBUG(" entry awc_tx_complete_check ");     			fid = awc_fid_queue_pop_head(&((struct awc_private *)dev->priv)->tx_post_process);		if (!fid) {		printk("awc_tx_complete_check with empty queue \n ");		return -1;	}	DEBUG(64," tx_complete fid %x \n",fid->u.tx.fid);	        AWC_INIT_COMMAND(AWC_NOT_CLI,cmd,dev,0,0, fid->u.tx.fid,          			0, 0x14 , &(fid->u.tx.radio_tx));	fid->state  |= awc_tx_fid_complete_read;	AWC_BAP_LOCK_NOT_CLI(cmd);        if (awc_bap_setup(&cmd))		goto final;        if (awc_bap_read(&cmd))			goto final;	AWC_RELEASE_COMMAND(cmd);        	awc_802_11_after_tx_complete(dev,fid);         			        AWC_ENTRY_EXIT_DEBUG(" exit \n");  	return 0;             final:        awc_802_11_after_tx_complete(dev,fid);        printk(KERN_ERR "%s awc_tx_complete_check failed \n",dev->name);     	AWC_RELEASE_COMMAND(cmd);     	AWC_ENTRY_EXIT_DEBUG("  BAD exit \n");	return -1; ;}#define AWC_QUEUE_BH {\	if (!priv->bh_active && !priv->bh_running){\		priv->bh_active = 1;\		queue_task(&priv->immediate_bh, &tq_immediate);\		mark_bh(IMMEDIATE_BH);\	}\	}voidawc_bh(struct net_device *dev){        struct awc_private * priv = (struct awc_private *)dev->priv;      	int  active_interrupts;	int enabled_interrupts;//	u16	tx_status;	int 	multi_ints = 0;//	u16	tx_fid = 0;//	unsigned long flags;	DEBUG(8, "awc_bh awoken on jiffie %ld \n",jiffies);	priv->bh_r

⌨️ 快捷键说明

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