📄 rtmp_main.c
字号:
if (pAd->RTUSBCmdThr_pid>= 0) { RTUSBCmd_kill = 1; RTUSBCMDUp(pAd); wmb(); // need to check ret = kill_proc (pAd->RTUSBCmdThr_pid, SIGTERM, 1); if (ret) { printk (KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d\n", pAd->net_dev->name, pAd->RTUSBCmdThr_pid); } wait_for_completion (&pAd->CmdThreadNotify); // reset cmd thread pAd->RTUSBCmdThr_pid= -1; } RTUSBHalt(pAd, TRUE); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); tasklet_kill(&pAd->rx_bh); DBGPRINT(RT_DEBUG_TRACE,"<--usb_rtusb_close_device \n"); return 0;}static int usb_rtusb_open(struct net_device *net_dev){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; UCHAR TmpPhy; NDIS_STATUS Status = NDIS_STATUS_SUCCESS;// if (!pAd->ProbeFinish)// return -1; DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__);#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) if (!try_module_get(THIS_MODULE)) { DBGPRINT(RT_DEBUG_ERROR, "%s: cannot reserve module\n", __FUNCTION__); return -1; }#else MOD_INC_USE_COUNT;#endif//iverson PortCfgInit(pAd); // Wait for hardware stable { ULONG MacCsr0 = 0, Index = 0; do { Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacCsr0); if (MacCsr0 != 0) break; RTMPusecDelay(1000); } while (Index++ < 1000); DBGPRINT(RT_DEBUG_TRACE, "Init: MAC_CSR0=0x%08x, Status=0x%08x\n", MacCsr0, Status); } // Load 8051 firmware // Read RaConfig profile parameters #ifdef READ_PROFILE_FROM_FILE RTMPReadParametersFromFile(pAd);#endif // // Read additional info from NIC such as MAC address // This function must called after register CSR base address //#ifdef INIT_FROM_EEPROM NICReadEEPROMParameters(pAd); NICInitAsicFromEEPROM(pAd);#endif RTUSBWriteHWMACAddress(pAd); // external LNA has different R17 base if (pAd->NicConfig2.field.ExternalLNA) { pAd->BbpTuning.R17LowerBoundA += 0x10; pAd->BbpTuning.R17UpperBoundA += 0x10; pAd->BbpTuning.R17LowerBoundG += 0x10; pAd->BbpTuning.R17UpperBoundG += 0x10; } // hardware initialization after all parameters are acquired from // Registry or E2PROM#if 1 TmpPhy = pAd->PortCfg.PhyMode;// pAd->PortCfg.PhyMode = 0xff; RTMPSetPhyMode(pAd, TmpPhy);#endif // max desired rate might be reset as call phymode setup, so set TxRate again if (pAd->PortCfg.DefaultMaxDesiredRate == 0) RTMPSetDesiredRates(pAd, -1); else RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[pAd->PortCfg.DefaultMaxDesiredRate - 1] * 1000000)); printk("=> usb_rtusb_open\n"); if (VIRTUAL_IF_NUM(pAd) == 0) { RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x0718); // Clear Reset Flag before starting receiving/transmitting RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) { RTUSBBulkReceive(pAd); RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x025eb032); // enable RX of MAC block, Staion not drop control frame } AsicSwitchChannel(pAd, pAd->PortCfg.Channel); AsicLockChannel(pAd, pAd->PortCfg.Channel); } VIRTUAL_IF_INC(pAd); netif_start_queue(net_dev); netif_carrier_on(net_dev); netif_wake_queue(net_dev); DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return 0;}static int usb_rtusb_close(struct net_device *net_dev){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; int i = 0; MLME_DISASSOC_REQ_STRUCT DisReq; MLME_QUEUE_ELEM MsgElem; wait_queue_head_t wait;// if (!pAd->ProbeFinish)// return -1; init_waitqueue_head(&wait); DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__); netif_carrier_off(pAd->net_dev); netif_stop_queue(pAd->net_dev); if (INFRA_ON(pAd)) { COPY_MAC_ADDR(DisReq.Addr, pAd->PortCfg.Bssid); DisReq.Reason = REASON_DISASSOC_STA_LEAVING; MsgElem.Machine = ASSOC_STATE_MACHINE; MsgElem.MsgType = MT2_MLME_DISASSOC_REQ; MsgElem.MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); NdisMoveMemory(MsgElem.Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); MlmeDisassocReqAction(pAd, &MsgElem); wait_event_interruptible_timeout(wait,0,HZ/1000); } VIRTUAL_IF_DEC(pAd); if (VIRTUAL_IF_NUM(pAd) == 0) { for(i=0;i<10 || pAd->CmdHandlerIsRunning==TRUE;i++) wait_event_interruptible_timeout(wait,0,HZ/1000); for(i=0;i<10 || pAd->Mlme.bRunning==TRUE;i++) wait_event_interruptible_timeout(wait,0,HZ/1000); // // Patch to fully turn off BBP, need to send a fake NULL frame. // RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x0018); for (i=0; i<10; i++) { RTMPSendNullFrame(pAd, RATE_6); RTMPusecDelay(1000); } AsicDisableSync(pAd); RTMPSetLED(pAd, LED_HALT); atomic_set(&pAd->PendingRx, 0); }#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT{ // TODO: Shall we send wireless event to notfiy user space that if-down??}#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) module_put(THIS_MODULE);#else MOD_DEC_USE_COUNT;#endif DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return 0;}static INT usb_rtusb_sendpkt( IN struct sk_buff *pSkb, IN struct net_device *net_dev){ /* transmit the packet */ return RTMPSendPackets(pSkb, net_dev);}static int usb_rtusb_init_device(struct net_device *net_dev){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; NDIS_STATUS Status = NDIS_STATUS_SUCCESS; UCHAR TmpPhy; DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__); // init mediastate to disconnected OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); //bottom half data is assign at each task_scheduler tasklet_init(&pAd->rx_bh, RTUSBBulkRxHandle, (unsigned long)pAd); // Initialize pAd->PortCfg to manufacture default PortCfgInit(pAd); // Init RTMP_ADAPTER CmdQElements Status = RTMPInitAdapterBlock(pAd); //always success if (Status != NDIS_STATUS_SUCCESS) { return Status; } // // Init send data structures and related parameters // Status = NICInitTransmit(pAd); //if fail clean itself if (Status != NDIS_STATUS_SUCCESS) { return Status; } // // Init receive data structures and related parameters // Status = NICInitRecv(pAd); if (Status != NDIS_STATUS_SUCCESS) { goto out; } // Wait for hardware stable { ULONG MacCsr0 = 0, Index = 0; do { Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacCsr0); if (MacCsr0 != 0) break; RTMPusecDelay(1000); } while (Index++ < 1000); DBGPRINT(RT_DEBUG_TRACE, "Init: MAC_CSR0=0x%08x, Status=0x%08x\n", MacCsr0, Status); } // Load 8051 firmware Status = NICLoadFirmware(pAd); if(Status != NDIS_STATUS_SUCCESS) { goto out; } // Initialize Asics NICInitializeAsic(pAd);#ifdef BLOCK_NET_IF initblockQueueTab(pAd);#endif // BLOCK_NET_IF // // Read RaConfig profile parameters #ifdef READ_PROFILE_FROM_FILE RTMPReadParametersFromFile(pAd);#endif // // Read additional info from NIC such as MAC address // This function must called after register CSR base address //#ifdef INIT_FROM_EEPROM NICReadEEPROMParameters(pAd); NICInitAsicFromEEPROM(pAd);#endif RTUSBWriteHWMACAddress(pAd); // external LNA has different R17 base if (pAd->NicConfig2.field.ExternalLNA) { pAd->BbpTuning.R17LowerBoundA += 0x10; pAd->BbpTuning.R17UpperBoundA += 0x10; pAd->BbpTuning.R17LowerBoundG += 0x10; pAd->BbpTuning.R17UpperBoundG += 0x10; } // hardware initialization after all parameters are acquired from // Registry or E2PROM TmpPhy = pAd->PortCfg.PhyMode; pAd->PortCfg.PhyMode = 0xff; RTMPSetPhyMode(pAd, TmpPhy); // max desired rate might be reset as call phymode setup, so set TxRate again if (pAd->PortCfg.DefaultMaxDesiredRate == 0) RTMPSetDesiredRates(pAd, -1); else RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[pAd->PortCfg.DefaultMaxDesiredRate - 1] * 1000000)); // // initialize MLME // Status = MlmeInit(pAd); if(Status != NDIS_STATUS_SUCCESS) { goto out; } // mlmethread & RTUSBCmd flag restart mlme_kill = 0; RTUSBCmd_kill =0; CreateThreads(net_dev); // at every open handler, copy mac address. COPY_MAC_ADDR(pAd->net_dev->dev_addr, pAd->CurrentAddress); // USB_ID info for UI pAd->VendorDesc = 0x148F2573; DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__); return 0;out: ReleaseAdapter(pAd, TRUE, FALSE); return Status;}INT MlmeThread( IN void * Context){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)Context;//2007/12/11:KH modified to fix compiled failed#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) daemonize();#else daemonize("rt73");#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) allow_signal(SIGTERM);#endif current->flags |= PF_NOFREEZE; /* signal that we've started the thread */ complete(&(pAd->MlmeThreadNotify)); while (1) { int status; status = down_interruptible(&pAd->mlme_semaphore); if (status != 0) continue; if (mlme_kill) break; MlmeHandler(pAd); } /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure * is getting deleted in a parallel mode of execution (i.e. just * after the down() -- that's necessary for the thread-shutdown * case. * * complete_and_exit() goes even further than this -- it is safe in * the case that the thread of the caller is going away (not just * the structure) -- this is necessary for the module-remove case. * This is important in preemption kernels, which transfer the flow * of execution immediately upon a complete(). */ complete_and_exit (&pAd->MlmeThreadNotify, 0); DBGPRINT(RT_DEBUG_TRACE, "<---MlmeThread\n");}INT RTUSBCmdThread( IN void * Context){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)Context;//2007/12/11:KH modified to fix compiled failed#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) daemonize();#else daemonize("rt73");#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) allow_signal(SIGTERM);#endif current->flags |= PF_NOFREEZE; /* signal that we've started the thread */ complete(&(pAd->CmdThreadNotify)); while (1) { int status; status = down_interruptible(&(pAd->RTUSBCmd_semaphore)); if (status != 0) continue; if (RTUSBCmd_kill) break; pAd->CmdHandlerIsRunning=TRUE; CMDHandler(pAd); pAd->CmdHandlerIsRunning=FALSE; } /* notify the exit routine that we're actually exiting now * * complete()/wait_for_completion() is similar to up()/down(), * except that complete() is safe in the case where the structure * is getting deleted in a parallel mode of execution (i.e. just * after the down() -- that's necessary for the thread-shutdown * case. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -