rt_main_dev.c

来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,801 行 · 第 1/4 页

C
1,801
字号
	for (i = 0; i < 8; i++)	{#ifdef MULTIPLE_CARD_SUPPORT		if (pAd->MC_RowID >= 0)			sprintf(slot_name, "ra%02d_%d", pAd->MC_RowID, i);		else#endif // MULTIPLE_CARD_SUPPORT //		sprintf(slot_name, "ra%d", i);	    #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)        device = dev_get_by_name(dev_net(dev), slot_name);#else        device = dev_get_by_name(dev->nd_net, slot_name);#endif#else		device = dev_get_by_name(slot_name);#endif		if (device != NULL) dev_put(device);#else		for (device = dev_base; device != NULL; device = device->next)		{			if (strncmp(device->name, slot_name, 4) == 0)				break;		}#endif		if(device == NULL)  			break;	}		if(i == 8)	{		DBGPRINT(RT_DEBUG_ERROR, ("No available slot name\n"));		Status = NDIS_STATUS_FAILURE;	} 	else 	{#ifdef MULTIPLE_CARD_SUPPORT		if (pAd->MC_RowID >= 0)	        sprintf(dev->name, "ra%02d_%d", pAd->MC_RowID, i);		else#endif // MULTIPLE_CARD_SUPPORT //		sprintf(dev->name, "ra%d", i);		Status = NDIS_STATUS_SUCCESS;	}	return Status;	}#ifdef MULTIPLE_CARD_SUPPORT/*========================================================================Routine Description:    Get card profile path.Arguments:    pAdReturn Value:    TRUE		- Find a card profile	FALSE		- use default profileNote:========================================================================*/extern INT RTMPGetKeyParameter(    IN  PCHAR   key,    OUT PCHAR   dest,       IN  INT     destsize,    IN  PCHAR   buffer);BOOLEAN RTMP_CardInfoRead(	IN	PRTMP_ADAPTER pAd){#define MC_SELECT_CARDID		0	/* use CARD ID (0 ~ 31) to identify different cards */#define MC_SELECT_MAC			1	/* use CARD MAC to identify different cards */#define MC_SELECT_CARDTYPE		2	/* use CARD type (abgn or bgn) to identify different cards */#define LETTER_CASE_TRANSLATE(txt_p, card_id)			\	{	UINT32 _len; char _char;						\		for(_len=0; _len<strlen(card_id); _len++) {		\			_char = *(txt_p + _len);					\			if (('A' <= _char) && (_char <= 'Z'))		\				*(txt_p+_len) = 'a'+(_char-'A');		\		} }	struct file *srcf;	INT retval, orgfsuid, orgfsgid;   	mm_segment_t orgfs;	CHAR *buffer, *tmpbuf, card_id_buf[30], RFIC_word[30];	BOOLEAN flg_match_ok = FALSE;	INT32 card_select_method;	INT32 card_free_id, card_nouse_id, card_same_mac_id, card_match_id;	EEPROM_ANTENNA_STRUC antenna;	USHORT addr01, addr23, addr45;	UINT8 mac[6];	UINT32 data, card_index;	UCHAR *start_ptr;	// init	buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG);	if (buffer == NULL)        return FALSE;	tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG);	if(tmpbuf == NULL)	{		kfree(buffer);        return NDIS_STATUS_FAILURE;	}	orgfsuid = current->fsuid;	orgfsgid = current->fsgid;	current->fsuid = current->fsgid = 0;    orgfs = get_fs();    set_fs(KERNEL_DS);	// get RF IC type	RTMP_IO_READ32(pAd, E2PROM_CSR, &data);	if ((data & 0x30) == 0)		pAd->EEPROMAddressNum = 6;	// 93C46	else if ((data & 0x30) == 0x10)		pAd->EEPROMAddressNum = 8;	// 93C66	else		pAd->EEPROMAddressNum = 8;	// 93C86	//antenna.word = RTMP_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET);	RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, antenna.word);	if ((antenna.field.RfIcType == RFIC_2850) ||		(antenna.field.RfIcType == RFIC_2750))	{		/* ABGN card */		strcpy(RFIC_word, "abgn");	}	else	{		/* BGN card */		strcpy(RFIC_word, "bgn");	}	// get MAC address	//addr01 = RTMP_EEPROM_READ16(pAd, 0x04);		//addr23 = RTMP_EEPROM_READ16(pAd, 0x06);	//addr45 = RTMP_EEPROM_READ16(pAd, 0x08);	RT28xx_EEPROM_READ16(pAd, 0x04, addr01);	RT28xx_EEPROM_READ16(pAd, 0x06, addr23);	RT28xx_EEPROM_READ16(pAd, 0x08, addr45);	mac[0] = (UCHAR)(addr01 & 0xff);	mac[1] = (UCHAR)(addr01 >> 8);	mac[2] = (UCHAR)(addr23 & 0xff);	mac[3] = (UCHAR)(addr23 >> 8);	mac[4] = (UCHAR)(addr45 & 0xff);	mac[5] = (UCHAR)(addr45 >> 8);	// open card information file	srcf = filp_open(CARD_INFO_PATH, O_RDONLY, 0);	if (IS_ERR(srcf)) 	{		/* card information file does not exist */			DBGPRINT(RT_DEBUG_TRACE,				("--> Error %ld opening %s\n", -PTR_ERR(srcf), CARD_INFO_PATH));		return FALSE;	}	if (srcf->f_op && srcf->f_op->read)	{		/* card information file exists so reading the card information */		memset(buffer, 0x00, MAX_INI_BUFFER_SIZE);		retval = srcf->f_op->read(srcf, buffer, MAX_INI_BUFFER_SIZE, &srcf->f_pos);		if (retval < 0)		{			/* read fail */				DBGPRINT(RT_DEBUG_TRACE,					("--> Read %s error %d\n", CARD_INFO_PATH, -retval));		}		else		{			/* get card selection method */			memset(tmpbuf, 0x00, MAX_PARAM_BUFFER_SIZE);			card_select_method = MC_SELECT_CARDTYPE; // default			if (RTMPGetKeyParameter("SELECT", tmpbuf, 256, buffer))			{				if (strcmp(tmpbuf, "CARDID") == 0)					card_select_method = MC_SELECT_CARDID;				else if (strcmp(tmpbuf, "MAC") == 0)					card_select_method = MC_SELECT_MAC;				else if (strcmp(tmpbuf, "CARDTYPE") == 0)					card_select_method = MC_SELECT_CARDTYPE;			}			DBGPRINT(RT_DEBUG_TRACE,					("MC> Card Selection = %d\n", card_select_method));			// init			card_free_id = -1;			card_nouse_id = -1;			card_same_mac_id = -1;			card_match_id = -1;			// search current card information records			for(card_index=0;				card_index<MAX_NUM_OF_MULTIPLE_CARD;				card_index++)			{				if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&					(*(UINT16 *)&MC_CardMac[card_index][4] == 0))				{					// MAC is all-0 so the entry is available					MC_CardUsed[card_index] = 0;					if (card_free_id < 0)						card_free_id = card_index; // 1st free entry				}				else				{					if (memcmp(MC_CardMac[card_index], mac, 6) == 0)					{						// we find the entry with same MAC						if (card_same_mac_id < 0)							card_same_mac_id = card_index; // 1st same entry					}					else					{						// MAC is not all-0 but used flag == 0						if ((MC_CardUsed[card_index] == 0) &&							(card_nouse_id < 0))						{							card_nouse_id = card_index; // 1st available entry						}					}				}			}			DBGPRINT(RT_DEBUG_TRACE,					("MC> Free = %d, Same = %d, NOUSE = %d\n",					card_free_id, card_same_mac_id, card_nouse_id));			if ((card_same_mac_id >= 0) &&				((card_select_method == MC_SELECT_CARDID) ||				(card_select_method == MC_SELECT_CARDTYPE)))			{				// same MAC entry is found				card_match_id = card_same_mac_id;				if (card_select_method == MC_SELECT_CARDTYPE)				{					// for CARDTYPE					sprintf(card_id_buf, "%02dCARDTYPE%s",							card_match_id, RFIC_word);					if ((start_ptr=rtstrstruncasecmp(buffer, card_id_buf)) != NULL)					{						// we found the card ID						LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);					}				}			}			else			{				// the card is 1st plug-in, try to find the match card profile				switch(card_select_method)				{					case MC_SELECT_CARDID: // CARDID					default:						if (card_free_id >= 0)							card_match_id = card_free_id;						else							card_match_id = card_nouse_id;						break;					case MC_SELECT_MAC: // MAC						sprintf(card_id_buf, "MAC%02x:%02x:%02x:%02x:%02x:%02x",								mac[0], mac[1], mac[2],								mac[3], mac[4], mac[5]);						/* try to find the key word in the card file */						if ((start_ptr=rtstrstruncasecmp(buffer, card_id_buf)) != NULL)						{							LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);							/* get the row ID (2 ASCII characters) */							start_ptr -= 2;							card_id_buf[0] = *(start_ptr);							card_id_buf[1] = *(start_ptr+1);							card_id_buf[2] = 0x00;							card_match_id = simple_strtol(card_id_buf, 0, 10);						}						break;					case MC_SELECT_CARDTYPE: // CARDTYPE						card_nouse_id = -1;						for(card_index=0;							card_index<MAX_NUM_OF_MULTIPLE_CARD;							card_index++)						{							sprintf(card_id_buf, "%02dCARDTYPE%s",									card_index, RFIC_word);							if ((start_ptr=rtstrstruncasecmp(buffer,														card_id_buf)) != NULL)							{								LETTER_CASE_TRANSLATE(start_ptr, card_id_buf);								if (MC_CardUsed[card_index] == 0)								{									/* current the card profile is not used */									if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) &&										(*(UINT16 *)&MC_CardMac[card_index][4] == 0))									{										// find it and no previous card use it										card_match_id = card_index;										break;									}									else									{										// ever a card use it										if (card_nouse_id < 0)											card_nouse_id = card_index;									}								}							}						}						// if not find a free one, use the available one						if (card_match_id < 0)							card_match_id = card_nouse_id;						break;				}			}			if (card_match_id >= 0)			{				// make up search keyword				switch(card_select_method)				{					case MC_SELECT_CARDID: // CARDID						sprintf(card_id_buf, "%02dCARDID", card_match_id);						break;					case MC_SELECT_MAC: // MAC						sprintf(card_id_buf,								"%02dmac%02x:%02x:%02x:%02x:%02x:%02x",								card_match_id,								mac[0], mac[1], mac[2],								mac[3], mac[4], mac[5]);						break;					case MC_SELECT_CARDTYPE: // CARDTYPE					default:						sprintf(card_id_buf, "%02dcardtype%s",								card_match_id, RFIC_word);						break;				}				DBGPRINT(RT_DEBUG_TRACE, ("Search Keyword = %s\n", card_id_buf));				// read card file path				if (RTMPGetKeyParameter(card_id_buf, tmpbuf, 256, buffer))				{					if (strlen(tmpbuf) < sizeof(pAd->MC_FileName))					{						// backup card information						pAd->MC_RowID = card_match_id; /* base 0 */						MC_CardUsed[card_match_id] = 1;						memcpy(MC_CardMac[card_match_id], mac, sizeof(mac));						// backup card file path						NdisMoveMemory(pAd->MC_FileName, tmpbuf , strlen(tmpbuf));						pAd->MC_FileName[strlen(tmpbuf)] = '\0';						flg_match_ok = TRUE;							DBGPRINT(RT_DEBUG_TRACE,								("Card Profile Name = %s\n", pAd->MC_FileName));					}					else					{						DBGPRINT(RT_DEBUG_ERROR,								("Card Profile Name length too large!\n"));					}				}				else				{					DBGPRINT(RT_DEBUG_ERROR,							("Can not find search key word in card.dat!\n"));				}				if ((flg_match_ok != TRUE) &&					(card_match_id < MAX_NUM_OF_MULTIPLE_CARD))				{					MC_CardUsed[card_match_id] = 0;					memset(MC_CardMac[card_match_id], 0, sizeof(mac));				}			} // if (card_match_id >= 0)		}	}	// close file	retval = filp_close(srcf, NULL);	set_fs(orgfs);	current->fsuid = orgfsuid;	current->fsgid = orgfsgid;	kfree(buffer);	kfree(tmpbuf);	return flg_match_ok;}#endif // MULTIPLE_CARD_SUPPORT ///*========================================================================Routine Description:    Probe RT28XX chipset.Arguments:    _dev_p				Point to the PCI or USB device	_dev_id_p			Point to the PCI or USB device IDReturn Value:    0					Probe OK	-ENODEV				Probe FailNote:========================================================================*/INT __devinit   rt28xx_probe(    IN  void *_dev_p,    IN  void *_dev_id_p,	IN  UINT argc,	OUT PRTMP_ADAPTER *ppAd){    struct  net_device	*net_dev;    PRTMP_ADAPTER       pAd = (PRTMP_ADAPTER) NULL;    INT                 status;	PVOID				handle;#ifdef RT2870#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	/* kernel 2.4 series */	struct usb_device *dev_p = (struct usb_device *)_dev_p;#else	struct usb_interface *intf = (struct usb_interface *)_dev_p;	struct usb_device *dev_p = interface_to_usbdev(intf);

⌨️ 快捷键说明

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