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

📄 device_main.c

📁 VIA VT6655 x86下的Linux Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
        pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
#ifdef PRIVATE_OBJ 
        ref_set_rx_jiffies(pDevice->dev);        
#else        
        pDevice->dev->last_rx = jiffies;
#endif        
    }
    
    pDevice->pCurrRD[uIdx]=pRD;
    
    return works;
}


static BOOL device_alloc_rx_buf(PSDevice pDevice, PSRxDesc pRD) {
    
    PDEVICE_RD_INFO pRDInfo=pRD->pRDInfo;
    
#ifdef PRIVATE_OBJ

    pRDInfo->skb=dev_alloc_skb(pDevice->rx_buf_sz);
    if (pRDInfo->skb==NULL)
        return FALSE;
    ref_skb_remap(pDevice->dev, &(pRDInfo->ref_skb), pRDInfo->skb);
    pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->ref_skb.tail, pDevice->rx_buf_sz, 
                        PCI_DMA_FROMDEVICE);
#else        
        
    pRDInfo->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
    if (pRDInfo->skb==NULL)
        return FALSE;
    ASSERT(pRDInfo->skb);
    pRDInfo->skb->dev = pDevice->dev;
    pRDInfo->skb_dma = pci_map_single(pDevice->pcid, pRDInfo->skb->tail, pDevice->rx_buf_sz, 
                        PCI_DMA_FROMDEVICE);
#endif                        
    *((PU32) &(pRD->m_rd0RD0)) = 0;
    
    pRD->m_rd0RD0.wResCount = cpu_to_le16(pDevice->rx_buf_sz);
    pRD->m_rd0RD0.f1Owner = OWNED_BY_NIC;
    pRD->m_rd1RD1.wReqCount = cpu_to_le16(pDevice->rx_buf_sz);
    pRD->buff_addr = cpu_to_le32(pRDInfo->skb_dma);
    
    return TRUE;    
}



BOOL device_alloc_frag_buf(PSDevice pDevice, PSDeFragControlBlock pDeF) {
    
#ifdef PRIVATE_OBJ 

    pDeF->skb=dev_alloc_skb(pDevice->rx_buf_sz);
    if (pDeF->skb==NULL)
        return FALSE;
    ref_skb_remap(pDevice->dev, &(pDeF->ref_skb), pDeF->skb);    
    
#else            
    pDeF->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
    if (pDeF->skb == NULL)
        return FALSE;
    ASSERT(pDeF->skb);
    pDeF->skb->dev = pDevice->dev;
#endif    

    return TRUE;    
}



static int device_tx_srv(PSDevice pDevice, UINT uIdx) {
    PSTxDesc                 pTD;
    BOOL                     bFull=FALSE;        
    int                      works = 0;
    BYTE                     byTsr0;
    BYTE                     byTsr1;
    UINT                     uFrameSize, uFIFOHeaderSize;
    PSTxBufHead              pTxBufHead;
    struct net_device_stats* pStats = &pDevice->stats;
    struct sk_buff*          skb;
    UINT                     uNodeIndex;
    PSMgmtObject             pMgmt = pDevice->pMgmt;    
#ifdef PRIVATE_OBJ
    ref_sk_buff              ref_skb;
#endif            

    
    for (pTD = pDevice->apTailTD[uIdx]; pDevice->iTDUsed[uIdx] >0; pTD = pTD->next) {
        
        if (pTD->m_td0TD0.f1Owner == OWNED_BY_NIC)
            break;
        if (works++>15)
            break;
            
        byTsr0 = pTD->m_td0TD0.byTSR0;
        byTsr1 = pTD->m_td0TD0.byTSR1;
        
        //Only the status of first TD in the chain is correct
        if (pTD->m_td1TD1.byTCR & TCR_STP) {
            
            if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
                uFIFOHeaderSize = pTD->pTDInfo->dwHeaderLength;
                uFrameSize = pTD->pTDInfo->dwReqCount - uFIFOHeaderSize;
                pTxBufHead = (PSTxBufHead) (pTD->pTDInfo->buf);
#ifdef PRIVATE_OBJ
                ref_skb_remap(pDevice->dev, &ref_skb, pTD->pTDInfo->skb);
#endif                
                // Update the statistics based on the Transmit status
                // now, we DO'NT check TSR0_CDH
                
                STAvUpdateTDStatCounter(&pDevice->scStatistic,
                        byTsr0, byTsr1,
                        (PBYTE)(pTD->pTDInfo->buf + uFIFOHeaderSize),
                        uFrameSize, uIdx);
                        

                BSSvUpdateNodeTxCounter(pDevice,
                         byTsr0, byTsr1,
                         (PBYTE)(pTD->pTDInfo->buf),
                         uFIFOHeaderSize
                         );
                         
                if (BITbIsBitOff(byTsr1, TSR1_TERR)) {
                    if (byTsr0 != 0) {
                        DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X].\n",
                           (INT)uIdx, byTsr1, byTsr0);
                    }
                    if ((pTxBufHead->wFragCtl & FRAGCTL_ENDFRAG) != FRAGCTL_NONFRAG) {
                        pDevice->s802_11Counter.TransmittedFragmentCount ++;
                    }
                    pStats->tx_packets++;
#ifdef PRIVATE_OBJ  
                    pStats->tx_bytes += *(ref_skb.len);
#else                                     
                    pStats->tx_bytes += pTD->pTDInfo->skb->len;
#endif                    
                }
                else {
                     DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] dropped & tsr1[%02X] tsr0[%02X].\n",
                           (INT)uIdx, byTsr1, byTsr0);                     
                    pStats->tx_errors++;
                    pStats->tx_dropped++;                    
                }    
            }
            
            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
                if (pDevice->bEnableHostapd) {                
                    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx call back netif.. \n");
#ifdef PRIVATE_OBJ
                    ref_skb_remap(pDevice->apdev, &(ref_skb), pTD->pTDInfo->skb);
	                ref_skb.mac.raw = ref_skb.data;
	                *(ref_skb.pkt_type) = PACKET_OTHERHOST;
    	            //*(ref_skb.protocol) = htons(ETH_P_802_2);
	                memset(ref_skb.cb, 0, sizeof(ref_skb.cb));
	                netif_rx(ref_skb.skb);                    
#else
                    skb = pTD->pTDInfo->skb;
	                skb->dev = pDevice->apdev;
	                skb->mac.raw = skb->data;
	                skb->pkt_type = PACKET_OTHERHOST;
    	            //skb->protocol = htons(ETH_P_802_2);
	                memset(skb->cb, 0, sizeof(skb->cb));
	                netif_rx(skb);
#endif	                
	            }
            }
            
            if (BITbIsBitOn(byTsr1, TSR1_TERR)) {
            if ((pTD->pTDInfo->byFlags & TD_FLAGS_PRIV_SKB) != 0) {
                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
                          (INT)uIdx, byTsr1, byTsr0);
            }              
                                
//                DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Tx[%d] fail has error. tsr1[%02X] tsr0[%02X].\n",
//                          (INT)uIdx, byTsr1, byTsr0);
                          
                if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
                    (pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)) {
                    WORD    wAID;
                    BYTE    byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
                    
                    skb = pTD->pTDInfo->skb;
                    if (BSSDBbIsSTAInNodeDB(pMgmt, (PBYTE)(skb->data), &uNodeIndex)) {
                        if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) {
                            skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb);
                            pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++;
                            // set tx map
                            wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID;
                            pMgmt->abyPSTxMap[wAID >> 3] |=  byMask[wAID & 7];
                            pTD->pTDInfo->byFlags &= ~(TD_FLAGS_NETIF_SKB);
                            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "tx_srv:tx fail re-queue sta index= %d, QueCnt= %d\n" 
                                    ,(INT)uNodeIndex, pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt);
                            pStats->tx_errors--;
                            pStats->tx_dropped--;                                    
                        }
                    }
                }
            }
            device_free_tx_buf(pDevice,pTD);
            pDevice->iTDUsed[uIdx]--;
        }
    }
    

    if (uIdx == TYPE_AC0DMA) {
        // RESERV_AC0DMA reserved for relay
        
        if (AVAIL_TD(pDevice, uIdx) < RESERV_AC0DMA) {
            bFull = TRUE;
            DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO " AC0DMA is Full = %d\n", pDevice->iTDUsed[uIdx]);
        }
        if (netif_queue_stopped(pDevice->dev) && (bFull==FALSE)){
            netif_wake_queue(pDevice->dev);
        }
    }

       
    pDevice->apTailTD[uIdx] = pTD;

    return works;       
}


static void device_error(PSDevice pDevice, WORD status) {

    if (status & ISR_FETALERR) {
        DEVICE_PRT(MSG_LEVEL_ERR, KERN_ERR
            "%s: Hardware fatal error.\n", 
            pDevice->dev->name);
        netif_stop_queue(pDevice->dev);
        del_timer(&pDevice->sTimerCommand);    
        del_timer(&(pDevice->pMgmt->sTimerSecondCallback));
        pDevice->bCmdRunning = FALSE;        
        MACbShutdown(pDevice->PortOffset);
        return;     
    }

}

static void device_free_tx_buf(PSDevice pDevice, PSTxDesc pDesc) {
    PDEVICE_TD_INFO  pTDInfo=pDesc->pTDInfo;
    struct sk_buff* skb=pTDInfo->skb;
    
    // pre-allocated buf_dma can't be unmapped.
    if (pTDInfo->skb_dma && (pTDInfo->skb_dma != pTDInfo->buf_dma)) {
        pci_unmap_single(pDevice->pcid,pTDInfo->skb_dma,skb->len, 
              PCI_DMA_TODEVICE);
    }
    
    if ((pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0)
        dev_kfree_skb_irq(skb);

    pTDInfo->skb_dma = 0;
    pTDInfo->skb = 0;
    pTDInfo->byFlags = 0;
}

#ifdef PRIVATE_OBJ
    
int __device_open(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;    
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);
    
#else 

static int  device_open(struct net_device *dev) {
    PSDevice    pDevice=(PSDevice) dev->priv;    
    int i;
#endif

    
    pDevice->rx_buf_sz = PKT_BUF_SZ;
    
    if (!device_init_rings(pDevice)) {
        return -ENOMEM;
    }

#ifndef PRIVATE_OBJ
    i=request_irq(pDevice->pcid->irq, &device_intr, SA_SHIRQ, dev->name, dev);
    if (i)
        return i;
#endif
    device_init_rd0_ring(pDevice);
    device_init_rd1_ring(pDevice);    
    device_init_defrag_cb(pDevice);
    device_init_td0_ring(pDevice);
    device_init_td1_ring(pDevice);
//    VNTWIFIvSet11h(pDevice->pMgmt, pDevice->b11hEnable);
    if (pDevice->bDiversityRegCtlON) {
        device_init_diversity_timer(pDevice);
    }
    vMgrObjectInit(pDevice);
    vMgrTimerInit(pDevice);
    if (( SROMbyReadEmbedded(pDevice->PortOffset, EEP_OFS_RADIOCTL)&0x06)==0x04)
        return -ENOMEM;        
    device_init_registers(pDevice, DEVICE_INIT_COLD);    
    MACvReadEtherAddress(pDevice->PortOffset, pDevice->abyCurrentNetAddr);
    memcpy(pDevice->pMgmt->abyMACAddr, pDevice->abyCurrentNetAddr, U_ETHER_ADDR_LEN);    
#ifdef PRIVATE_OBJ
    __device_set_multi(pExDevice);
#else        
    device_set_multi(pDevice->dev); 
#endif        
    
    // Init for Key Management
    KeyvInitTable(&pDevice->sKey, pDevice->PortOffset);
    add_timer(&(pDevice->pMgmt->sTimerSecondCallback));    
    
    // Patch: if WEP key already set by iwconfig but device not yet open
    if ((pDevice->bEncryptionEnable == TRUE) && (pDevice->bTransmitKey == TRUE)) {
        KeybSetDefaultKey(&(pDevice->sKey),
                            (DWORD)(pDevice->byKeyIndex | (1 << 31)),
                            pDevice->uKeyLength,
                            NULL,
                            pDevice->abyKey,
                            KEY_CTL_WEP,
                            pDevice->PortOffset,
                            pDevice->byLocalID
                          );
         pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled;
    }        
    
    MACvIntEnable(pDevice->PortOffset, IMR_MASK_VALUE);   

    if (pDevice->pMgmt->eConfigMode == WMAC_CONFIG_AP) {
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RUN_AP, NULL);
	}
	else {    
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BSSID_SCAN, NULL);
        bScheduleCommand((HANDLE)pDevice, WLAN_CMD_SSID, NULL);
    } 
    pDevice->flags |=DEVICE_FLAGS_OPENED;       
    
#ifndef PRIVATE_OBJ    
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
    MOD_INC_USE_COUNT;
#endif    
#endif

    DEVICE_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success.. \n");
    return 0;
}


#ifdef PRIVATE_OBJ
    
int  __device_close(HANDLE pExDevice) {
    PSDevice_info pDevice_info = (PSDevice_info)pExDevice;    
    struct net_device *dev = pDevice_info->dev;    
    PSDevice    pDevice = (PSDevice)(pDevice_info->pWDevice);

#else 
static int  device_close(struct net_device *dev) {
    PSDevice  pDevice=(PSDevice) dev->priv;  
#endif            
    PSMgmtObject     pMgmt = pDevice->pMgmt;
    
   
    del_timer(&pDevice->sTimerCommand);
    del_timer(&pMgmt->sTimerSecondCallback); 
    if (pDevice->bDiversityRegCtlON) {
        del_timer(&pDevice->TimerSQ3Tmax1);
        del_timer(&pDevice->TimerSQ3Tmax2);
        del_timer(&pDevice->TimerSQ3Tmax3);        
    }        
    netif_stop_queue(dev);
    pDevice->bCmdRunning = FALSE;    
    MACbShutdown(pDevice->PortOffset);
    MACbSoftwareReset(pDevice->PortOffset);    
    CARDbRadioPowe

⌨️ 快捷键说明

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