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 + -
显示快捷键?