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

📄 wt_ioctl.c

📁 mini-PCI driver for LHWT chipsets
💻 C
📖 第 1 页 / 共 3 页
字号:
    #include "wtprecomp.h"#define dbg_info_str(x) printk("<0>In function %s in line %d the pramater x = %s \n\r",__FUNCTION__,__LINE__,x);#define dbg_info_num(x) printk("<0>In function %s in line %d the pramater x = %d \n\r",__FUNCTION__,__LINE__,x);const int frequency_list_bg[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442,	2447, 2452, 2457, 2462, 2467, 2472, 2484};const int frequency_list_a[] = { 5170, 5180, 5190, 5200, 5210, 5220, 5230,	5240, 5260, 5280, 5300, 5320};intwt4_mib_mode_helper(WT_ADAPTER *priv, u32 iw_mode){	WTWLAN_MACMODE mode;	FN_ENTER;	/*check valide check */	if (iw_mode == IW_MODE_REPEAT  || iw_mode == IW_MODE_SECOND 		|| iw_mode == IW_MODE_MONITOR  || iw_mode == IW_MODE_MASTER ) {		printk(KERN_DEBUG		       "%s(): Sorry, Repeater mode , Secondary mode, Master mode and  Monitor mode"		       "are not yet supported by this driver.\n", __FUNCTION__);		return -EOPNOTSUPP;	}	/*swap linux mode to our define*/	switch (iw_mode) {	case IW_MODE_AUTO:		mode = WLAN_MACMODE_NONE;		break;	case IW_MODE_ADHOC:		mode = WLAN_MACMODE_IBSS_STA;		break;	case IW_MODE_INFRA:		mode = WLAN_MACMODE_ESS_STA;		break;	case IW_MODE_MASTER:		mode = WLAN_MACMODE_ESS_AP;		break;	case IW_MODE_SECOND:		mode = WLAN_MACMODE_SECOND;		break;	case IW_MODE_MONITOR:		mode = WLAN_MACMODE_MONITOR;		break;	default:		return -EINVAL;	} 	/*commit to global*/	if( mode != priv->MacParameter.macmode )	{				// init mac stat when change mode		InitMacStat( priv );		LoadDefaultFlag( priv );		priv->MacParameter.macmode = mode;		priv->Ndis80211Parameter.ABGMode = priv->RegMacParameter.ABGMode;	}		//RegParaDefault.TxRate		FN_EXIT(0,0);	return 0;	}/* map this function to register restore in windows */voidwt4_mib_init(WT_ADAPTER *priv){	REG_MAC_PARAMETER RegParaDefault;        FN_ENTER;	 	memset( 	&RegParaDefault, 0, sizeof( REG_MAC_PARAMETER ) );		RegParaDefault.ABGMode = CARD_DEFAULT_ABGMODE;	RegParaDefault.AIFS = CARD_DEFAULT_AIFS;	RegParaDefault.BeaconPeriod = CARD_DEFAULT_BEACON_PEROID;	RegParaDefault.Channel = CARD_DEFAULT_CHANNEL;	RegParaDefault.CWMax = CARD_DEFAULT_CWMAX;	RegParaDefault.CWMin = CARD_DEFAULT_CWMIN;	RegParaDefault.EncryptionType = CARD_DEFAULT_CRYPTTYPE;	RegParaDefault.FragThreshold = CARD_DEFAULT_FRAGTHRESHOLD;	RegParaDefault.IsPassiveScan = CARD_DEFAULT_ISPASSIVESCAN;	RegParaDefault.IsProtectionEnable = CARD_DEFAULT_PROTECTION_MODE;	RegParaDefault.IsQosEnable = CARD_DEFAULT_QOSMODE;	RegParaDefault.PreambleType = CARD_DEFAULT_PREAMBLETYPE;	RegParaDefault.ProtectionMode = CARD_DEFAULT_PROTECTION_MODE;	RegParaDefault.RetryNum = CARD_DEFAULT_RETRYNUM;	RegParaDefault.RfType = CARD_DEFAULT_RFTYPE;	RegParaDefault.RtsThreshold = CARD_DEFAULT_RTSTHRESHOLD;	RegParaDefault.TxPower = CARD_DEFAULT_TXPOWER;	RegParaDefault.TxRate = CARD_DEFAULT_TXRATE;	RegParaDefault.Country = CARD_DEFAULT_COUNTRY;		/*swap to macparameter*/	memcpy( &priv->RegMacParameter,  &RegParaDefault, sizeof( REG_MAC_PARAMETER ) );	/* This sets all of the mode-dependent values */	//printk("In File %s Function %s Line %d abgmode  = %d\n",  __FILE__, __FUNCTION__, __LINE__, priv->RegMacParameter.ABGMode);		wt4_mib_mode_helper(priv, IW_MODE_INFRA );	FN_EXIT(0,0);	}/* this will be executed outside of atomic context thanks to * schedule_work(), thus we can as well use sleeping semaphore * locking */voidwt4_update_stats(WT_ADAPTER *priv){         FN_ENTER;		if (down_interruptible(&priv->stats_sem))	return;	/* Noise floor. * I'm not sure if the unit is dBm. * Note : If we are not connected, this value seems to be irrelevant. */	 //printk("In wt4_update_stats\n");	priv->local_iwstatistics.qual.noise = 0;  // maybe configure of RSSI_L_Threash or RSSI_L_Threash, check later/* Get the rssi of the link. To do this we need to retrieve a bss. */	priv->local_iwstatistics.qual.level = wtwlan_get_level_from_dbm( priv, priv->Ndis80211Parameter.RSSI );#if 0	if( ( priv->Ndis80211Parameter.RSSI <= 0 ) || (( priv->Ndis80211Parameter.RSSI > 100 )) )	{		priv->local_iwstatistics.qual.level = 80;	}	else	{		priv->local_iwstatistics.qual.level = priv->Ndis80211Parameter.RSSI;		}#endif	priv->local_iwstatistics.qual.qual = priv->local_iwstatistics.qual.level  - priv->iwstatistics.qual.noise;	/* report that the stats are new */	priv->local_iwstatistics.qual.updated = 0x7;    // updated	priv->local_iwstatistics.discard.nwid = 0;   	priv->local_iwstatistics.discard.code = 0;    // unable code/decode need soft counter,check later	priv->local_iwstatistics.discard.fragment = 0;    // defrag error counter ,soft counter check later	priv->local_iwstatistics.discard.retries = 0;  // need soft counter in txsenddone, check later	priv->local_iwstatistics.discard.misc = priv->MainMemAddress->HwCSMem.HwStatistic.RcvMissedCounter;	priv->local_iwstatistics.miss.beacon = 0;  // should be 0 in our system.			up(&priv->stats_sem);	 	FN_EXIT(0,0);	return;}struct iw_statistics *wt4_get_wireless_stats(struct net_device *ndev){	WT_ADAPTER *priv = netdev_priv(ndev);	 FN_ENTER;	// printk("<0>  In function %s Line %d ",__FUNCTION__,__LINE__);	/* If the stats are being updated return old data */	if (down_trylock(&priv->stats_sem) == 0) 	{		memcpy(&priv->iwstatistics, &priv->local_iwstatistics,		       sizeof (struct iw_statistics));		/* They won't be marked updated for the next time */		priv->local_iwstatistics.qual.updated = 0;				up(&priv->stats_sem);			} 	else		priv->iwstatistics.qual.updated = 0;	/* Update our wireless stats, but do not schedule to often 	 * (max 1 HZ) */	if ((priv->stats_timestamp == 0) ||	    time_after(jiffies, priv->stats_timestamp + 1 * HZ)) {		//schedule_work(&priv->stats_work);		priv->stats_timestamp = jiffies;	}        	FN_EXIT(0,0);	return &priv->iwstatistics;}static intwt4_commit(struct net_device *ndev, struct iw_request_info *info,	       char *cwrq, char *extra){	//WT_ADAPTER *priv = netdev_priv(ndev);		// we donot need commit	// set ssid proc set here	FN_ENTER;	FN_EXIT(0,0);	return 0;}/**************************get name from driver**************************/static intwt4_get_name(struct net_device *ndev, struct iw_request_info *info,		 char *cwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);	char *capabilities;	 FN_ENTER; 	switch ( priv->Ndis80211Parameter.ABGMode )	{		case IEEE80211A_ONLY:			capabilities = "WT4abg a mode";			break;		case IEEE80211B_AND_G:			capabilities = "WT4abg bg mode";			break;		case IEEE80211G_ONLY:			capabilities = "WT4abg g mode";			break;		case IEEE80211B_ONLY:		default:			capabilities = "WT4abg b mode";	/* Default */			break;	}	strncpy(cwrq, capabilities, IFNAMSIZ);	//	dbg_info_str(cwrq)	 	FN_EXIT(0,0);	return 0;}// for ibss use onlystatic intwt4_set_freq(struct net_device *ndev, struct iw_request_info *info,		 struct iw_freq *fwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);	u32 c = 0;	 FN_ENTER;	 	dbg_info_num(fwrq->m)		 	if (fwrq->m < 1000)		/* we have a channel number */		c = fwrq->m;	else		c = (fwrq->e == 1) ? channel_of_freq(fwrq->m / 100000) : 0;	priv->RegMacParameter.Channel = c ;//	printk(" <0>  priv->RegMacParameter.Channel= %d \r\n",c);	 	//added by hk 2006.7.12	SwChnl( priv,  c);	FN_EXIT(0,0);	return 0;}static intwt4_get_freq(struct net_device *ndev, struct iw_request_info *info,		 struct iw_freq *fwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);         FN_ENTER;//	printk("<0>In function %s in line %d\n\r",__FUNCTION__,__LINE__); 	fwrq->i = priv->NdisCurNet.WlanDesc.ie_ds.curr_channel ;	if((fwrq->i>=14)&&(fwrq->i<36))		fwrq->i=1;	//	printk("<0> Function %s Line %d CurrChannel = %d\r\n",__FUNCTION__,__LINE__,fwrq->i);	fwrq->m = freq_of_channel(fwrq->i );	fwrq->e = 6;//	printk(" <0>  priv->RegMacParameter.Channel= %d ,fwrq->m = =%d\r\n",fwrq->i, fwrq->m  );	//dbg_info_num(fwrq->m)			  	FN_EXIT(0,0);	return 0;}static intwt4_set_mode(struct net_device *ndev, struct iw_request_info *info,		 __u32 * uwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);	u32 iw_mode;	int result = 0;		iw_mode = *uwrq;		//dbg_info_num(iw_mode)	result = ( wt4_mib_mode_helper( priv,  iw_mode ) );		return result;}static int wt_swap_mode( __u32 mode ){	return mode;}/* Use mib cache */static intwt4_get_mode(struct net_device *ndev, struct iw_request_info *info,		 __u32 * uwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);	u32 iw_mode;	*uwrq=	wt_swap_mode(priv->MacParameter.macmode);	iw_mode = *uwrq;	 	//dbg_info_num(iw_mode)	return 0;}/* we use DOT11_OID_EDTHRESHOLD. From what I guess the card will not try to * emit data if (sensitivity > rssi - noise) (in dBm). * prism54_set_sens does not seem to work. */static intwt4_set_sens(struct net_device *ndev, struct iw_request_info *info,		 struct iw_param *vwrq, char *extra){//	WT_ADAPTER *priv = netdev_priv(ndev);	u32 sens;        FN_ENTER;	 	/* by default  the card sets this to 20. */	sens = vwrq->disabled ? 20 : vwrq->value;       //dbg_info_num(sens)	// can use this value to set rssi_thresh, need swap, check later	//priv->MainMemAddress->HwCSMem.BBCSMem.RGBRSSILThresh= vwrq->value;		// 	 	FN_EXIT(0,0);	return 0;}static intwt4_get_sens(struct net_device *ndev, struct iw_request_info *info,		 struct iw_param *vwrq, char *extra){	WT_ADAPTER *priv = netdev_priv(ndev);         FN_ENTER;	//printk("<0>*******Function %s Line %d******** \n\r",__FUNCTION__,__LINE__);	 	vwrq->value=priv->MainMemAddress->HwCSMem.BBCSMem.RGBRSSILThresh ;	vwrq->disabled = (vwrq->value == 0);	vwrq->fixed = 1;	//dbg_info_num(vwrq->value)	  	FN_EXIT(0,0);	return 0;}static int wt4_get_support_freq( IN PWT_ADAPTER priv,  struct obj_frequencies *freq ){	u16 nr_a, nr_b, nr;	int i;         FN_ENTER;	 	nr_b = sizeof( frequency_list_bg )/sizeof( frequency_list_bg[0]);	nr_a = sizeof( frequency_list_a ) / sizeof( frequency_list_a[0] );	nr = nr_a + nr_b;		nr = min( IW_MAX_FREQUENCIES, ( int )nr );		freq->nr = nr;		for( i = 0; i < nr ; i++ )	{		if( i < nr_b )			{				freq->mhz[ i ] = frequency_list_bg[i];			}		else			{				freq->mhz[  i ] = frequency_list_a[ i - nr_b];			}	}	 	FN_EXIT(0,0);	return 0;}static int rates_string[]={ 2,4,11,22, 12, 18, 24,36, 48,72,96,108 };static int wt4_get_support_rates( IN PWT_ADAPTER priv,  u32 *rates ){	u32 n_rates ;	int i;	int result = -EINVAL;        	 FN_ENTER;	 	do{		if( priv->NdisCurNet.WlanDesc.ie_rates.length != 0 )		{			if( ( priv->NdisCurNet.WlanDesc.ie_rates.length >= ELE_LEN_SUPPORT_RATES ) ||				( priv->NdisCurNet.WlanDesc.ie_extendrates.len >= MAX_EXTEND_RATES ) )				break;							if( IW_MAX_BITRATES < ( priv->NdisCurNet.WlanDesc.ie_rates.length +				priv->NdisCurNet.WlanDesc.ie_extendrates.len ) )				break;		n_rates = 0;		for( i = 0; i < priv->NdisCurNet.WlanDesc.ie_rates.length ; i++ )		{			rates[ n_rates++] = priv->NdisCurNet.WlanDesc.ie_rates.sup_rates[ i ];//			printk("in function %s rates[%d]=%d \n",__FUNCTION__,i,rates[ n_rates ]);		}				for( i = 0; i < priv->NdisCurNet.WlanDesc.ie_extendrates.len; i++ )		{			rates[ n_rates++] = priv->NdisCurNet.WlanDesc.ie_extendrates.extrates[ i ];		}		result = 0;					}	   }while( 0 );//	printk("in function %s ie_rates.length=%d \n",__FUNCTION__,priv->NdisCurNet.WlanDesc.ie_rates.length);//	printk("in function %s ie_rates.length=%d \n",__FUNCTION__,priv->NdisCurNet.WlanDesc.ie_extendrates.len);//	printk("in function %s n_rates=%d \n",__FUNCTION__,n_rates );	   if( result != 0 )	   	{// default rates, or not in net//			printk("in function %s using default rates \n",__FUNCTION__ );			memcpy( rates, rates_string, (sizeof(rates_string)/sizeof(rates_string[0]))*sizeof(u32)); 	   	}          	FN_EXIT(0,0);	return 0;}static intwt4_get_range(struct net_device *ndev, struct iw_request_info *info,		  struct iw_point *dwrq, char *extra){	struct iw_range *range = (struct iw_range *) extra;	WT_ADAPTER *priv = netdev_priv(ndev);	//u8 *data;	int i, m/*, rvalue*/;	struct obj_frequencies *freq;	char obj_freq_buf[(IW_MAX_BITRATES+2)*sizeof(u16)];	u32 supportrates[IW_MAX_BITRATES];        	 FN_ENTER;	  	if( range == NULL )		return 0;	memset(range, 0, sizeof (struct iw_range));	dwrq->length = sizeof (struct iw_range);	/* set the wireless extension version number */	range->we_version_source = SUPPORTED_WIRELESS_EXT;	range->we_version_compiled = WIRELESS_EXT;	/* Now the encoding capabilities */	range->num_encoding_sizes = 3;	/* 64(40) bits WEP */	range->encoding_size[0] = 5;	/* 128(104) bits WEP */	range->encoding_size[1] = 13;	/* 256 bits for WPA-PSK */	range->encoding_size[2] = 32;	/* 4 keys are allowed */	range->max_encoding_tokens = 4;	/* we don't know the quality range... */	//range->max_qual.level = 100;	//range->max_qual.noise = 100;	//range->max_qual.qual = 100;	range->max_qual.level = (unsigned char)(-20);	range->max_qual.noise = (unsigned char)(-90);	range->max_qual.qual = 70;	/* these value describe an average quality. Needs more tweaking... */	//range->avg_qual.level = 50;		//range->avg_qual.noise = 10;		//range->avg_qual.qual = 90;	range->avg_qual.level = (unsigned char)(-40);		range->avg_qual.noise = (unsigned char)(-90);		range->avg_qual.qual = 50;	range->sensitivity = 80;	/* retry limit capabilities */	range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME;	range->retry_flags = IW_RETRY_LIMIT;	range->r_time_flags = IW_RETRY_LIFETIME;	/* I don't know the range. Put stupid things here */	// read from our life register	range->min_retry = 1;	range->max_retry = 15;	range->min_r_time = 1024;	range->max_r_time = 30 * 1024;	/* txpower is supported in dBm's */	range->txpower_capa = IW_TXPOW_DBM;	range->min_rts = 256;	range->max_rts = 2346;	range->min_frag = 256;	range->max_frag = 2346;#if WIRELESS_EXT > 16	/* Event capability (kernel + driver) */	range->event_capa[0] = (IW_EVENT_CAPA_K_0 |	IW_EVENT_CAPA_MASK(SIOCGIWTHRSPY) |	IW_EVENT_CAPA_MASK(SIOCGIWAP));	range->event_capa[1] = IW_EVENT_CAPA_K_1;	range->event_capa[4] = IW_EVENT_CAPA_MASK(IWEVCUSTOM);#endif /* WIRELESS_EXT > 16 */	freq = (struct obj_frequencies *)obj_freq_buf;	wt4_get_support_freq(  priv,  freq );	range->num_channels = freq->nr;	range->num_frequency = freq->nr;	m = min(IW_MAX_FREQUENCIES, (int) freq->nr);	for (i = 0; i < m; i++) {		range->freq[i].m = freq->mhz[i];		range->freq[i].e = 6;		range->freq[i].i = channel_of_freq(freq->mhz[i]);	}	memset( supportrates, 0, sizeof(supportrates) );	wt4_get_support_rates(  priv,  (__u32 *)supportrates );	/* We got an array of char. It is NULL terminated. */	i = 0;	while ((i < IW_MAX_BITRATES) && (supportrates[i] != 0)) {		/*       the result must be in bps. The card gives us 500Kbps */		range->bitrate[i] = (supportrates[i]&0x7f) * 500000;		i++;	}	range->num_bitrates = i;	//printk("in function %s i=%d\n",__FUNCTION__,i);         	FN_EXIT(0,0);	return 0;}/* Set AP address*/static intwt4_set_wap(struct net_device *ndev, struct iw_request_info *info,		struct sockaddr *awrq, char *extra)

⌨️ 快捷键说明

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