rt_main_dev.c
来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,801 行 · 第 1/4 页
C
1,801 行
dev_p = usb_get_dev(dev_p);#endif // LINUX_VERSION_CODE //#endif // RT2870 //#ifdef CONFIG_STA_SUPPORT DBGPRINT(RT_DEBUG_TRACE, ("STA Driver version-%s\n", STA_DRIVER_VERSION));#endif // CONFIG_STA_SUPPORT // // Check chipset vendor/product ID// if (RT28XXChipsetCheck(_dev_p) == FALSE)// goto err_out;#if LINUX_VERSION_CODE <= 0x20402 // Red Hat 7.1 net_dev = alloc_netdev(sizeof(PRTMP_ADAPTER), "eth%d", ether_setup);#else net_dev = alloc_etherdev(sizeof(PRTMP_ADAPTER));#endif if (net_dev == NULL) { printk("alloc_netdev failed\n");#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) module_put(THIS_MODULE);#endif //LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)#else MOD_DEC_USE_COUNT;#endif goto err_out; }// sample// if (rt_ieee80211_if_setup(net_dev) != NDIS_STATUS_SUCCESS)// goto err_out;#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) SET_MODULE_OWNER(net_dev);#endif netif_stop_queue(net_dev);#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT/* for supporting Network Manager *//* Set the sysfs physical device reference for the network logical device * if set prior to registration will cause a symlink during initialization. */#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) SET_NETDEV_DEV(net_dev, &(dev_p->dev));#endif#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // // Allocate RTMP_ADAPTER miniport adapter structure handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p); status = RTMPAllocAdapterBlock(handle, &pAd); if (status != NDIS_STATUS_SUCCESS) goto err_out_free_netdev; net_dev->priv = (PVOID)pAd; pAd->net_dev = net_dev; // must be before RT28XXNetDevInit() RT28XXNetDevInit(_dev_p, net_dev, pAd);#ifdef CONFIG_STA_SUPPORT pAd->StaCfg.OriDevType = net_dev->type;#endif // CONFIG_STA_SUPPORT // // Find and assign a free interface name, raxx// RT28XXAvailRANameAssign(net_dev->name); // Post config#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) if (RT28XXProbePostConfig(_dev_p, pAd, argc) == FALSE) goto err_out_unmap;#else if (RT28XXProbePostConfig(_dev_p, pAd, 0) == FALSE) goto err_out_unmap;#endif // LINUX_VERSION_CODE //#ifdef CONFIG_STA_SUPPORT pAd->OpMode = OPMODE_STA;#endif // CONFIG_STA_SUPPORT //#ifdef MULTIPLE_CARD_SUPPORT // find its profile path pAd->MC_RowID = -1; // use default profile path RTMP_CardInfoRead(pAd); if (pAd->MC_RowID == -1)#ifdef CONFIG_STA_SUPPORT strcpy(pAd->MC_FileName, STA_PROFILE_PATH);#endif // CONFIG_STA_SUPPORT // DBGPRINT(RT_DEBUG_TRACE, ("MC> ROW = %d, PATH = %s\n", pAd->MC_RowID, pAd->MC_FileName));#endif // MULTIPLE_CARD_SUPPORT // // sample move if (rt_ieee80211_if_setup(net_dev, pAd) != NDIS_STATUS_SUCCESS) goto err_out_unmap; // Register this device status = register_netdev(net_dev); if (status) goto err_out_unmap; // Set driver data RT28XX_DRVDATA_SET(_dev_p); *ppAd = pAd; return 0; // probe ok /* --------------------------- ERROR HANDLE --------------------------- */err_out_unmap: RTMPFreeAdapter(pAd); RT28XX_UNMAP(); err_out_free_netdev:#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) free_netdev(net_dev);#else kfree(net_dev);#endiferr_out: RT28XX_PUT_DEVICE(dev_p);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) return (LONG)NULL;#else return -ENODEV; /* probe fail */#endif // LINUX_VERSION_CODE //} /* End of rt28xx_probe *//*========================================================================Routine Description: The entry point for Linux kernel sent packet to our driver.Arguments: sk_buff *skb the pointer refer to a sk_buffer.Return Value: 0 Note: This function is the entry point of Tx Path for Os delivery packet to our driver. You only can put OS-depened & STA/AP common handle procedures in here.========================================================================*/int rt28xx_packet_xmit(struct sk_buff *skb){ struct net_device *net_dev = skb->dev; PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; int status = 0; PNDIS_PACKET pPacket = (PNDIS_PACKET) skb; /* RT2870STA does this in RTMPSendPackets() */#ifdef RALINK_ATE if (ATE_ON(pAd)) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES); return 0; }#endif // RALINK_ATE //#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { // Drop send request since we are in monitor mode if (MONITOR_ON(pAd)) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); goto done; } }#endif // CONFIG_STA_SUPPORT // // EapolStart size is 18 if (skb->len < 14) { //printk("bad packet size: %d\n", pkt->len); hex_dump("bad packet", skb->data, skb->len); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); goto done; } RTMP_SET_PACKET_5VT(pPacket, 0);// MiniportMMRequest(pAd, pkt->data, pkt->len);#ifdef CONFIG_5VT_ENHANCE if (*(int*)(skb->cb) == BRIDGE_TAG) { RTMP_SET_PACKET_5VT(pPacket, 1); }#endif#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { STASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1); }#endif // CONFIG_STA_SUPPORT // status = 0;done: return status;}/*========================================================================Routine Description: Send a packet to WLAN.Arguments: skb_p points to our adapter dev_p which WLAN network interfaceReturn Value: 0: transmit successfully otherwise: transmit failNote:========================================================================*/INT rt28xx_send_packets( IN struct sk_buff *skb_p, IN struct net_device *net_dev){ RTMP_ADAPTER *pAd = net_dev->priv; if (!(net_dev->flags & IFF_UP)) { RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE); return 0; } NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15); RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID); return rt28xx_packet_xmit(skb_p);} /* End of MBSS_VirtualIF_PacketSend */#if LINUX_VERSION_CODE <= 0x20402 // Red Hat 7.1//static struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) //samplestruct net_device *alloc_netdev( int sizeof_priv, const char *mask, void (*setup)(struct net_device *)){ struct net_device *dev; INT alloc_size; /* ensure 32-byte alignment of the private area */ alloc_size = sizeof (*dev) + sizeof_priv + 31; dev = (struct net_device *) kmalloc(alloc_size, GFP_KERNEL); if (dev == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("alloc_netdev: Unable to allocate device memory.\n")); return NULL; } memset(dev, 0, alloc_size); if (sizeof_priv) dev->priv = (void *) (((long)(dev + 1) + 31) & ~31); setup(dev); strcpy(dev->name, mask); return dev;}#endif // LINUX_VERSION_CODE //void CfgInitHook(PRTMP_ADAPTER pAd){ pAd->bBroadComHT = TRUE;} /* End of CfgInitHook */#if WIRELESS_EXT >= 12// This function will be called when query /procstruct iw_statistics *rt28xx_get_wireless_stats( IN struct net_device *net_dev){ PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv; DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_get_wireless_stats --->\n")); pAd->iw_stats.status = 0; // Status - device dependent for now // link quality pAd->iw_stats.qual.qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); if(pAd->iw_stats.qual.qual > 100) pAd->iw_stats.qual.qual = 100;#ifdef CONFIG_STA_SUPPORT if (pAd->OpMode == OPMODE_STA) pAd->iw_stats.qual.level = RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2);#endif // CONFIG_STA_SUPPORT // pAd->iw_stats.qual.noise = pAd->BbpWriteLatch[66]; // noise level (dBm) pAd->iw_stats.qual.noise += 256 - 143; pAd->iw_stats.qual.updated = 1; // Flags to know if updated#ifdef IW_QUAL_DBM pAd->iw_stats.qual.updated |= IW_QUAL_DBM; // Level + Noise are dBm#endif // IW_QUAL_DBM // pAd->iw_stats.discard.nwid = 0; // Rx : Wrong nwid/essid pAd->iw_stats.miss.beacon = 0; // Missed beacons/superframe DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n")); return &pAd->iw_stats;} /* End of rt28xx_get_wireless_stats */#endif // WIRELESS_EXT //void tbtt_tasklet(unsigned long data){#define MAX_TX_IN_TBTT (16)}INT rt28xx_ioctl( IN struct net_device *net_dev, IN OUT struct ifreq *rq, IN INT cmd){ VIRTUAL_ADAPTER *pVirtualAd = NULL; RTMP_ADAPTER *pAd = NULL; INT ret = 0; if (net_dev->priv_flags == INT_MAIN) { pAd = net_dev->priv; } else { pVirtualAd = net_dev->priv; pAd = pVirtualAd->RtmpDev->priv; } if (pAd == NULL) { /* if 1st open fail, pAd will be free; So the net_dev->priv will be NULL in 2rd open */ return -ENETDOWN; }#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { ret = rt28xx_sta_ioctl(net_dev, rq, cmd); }#endif // CONFIG_STA_SUPPORT // return ret;}/* ======================================================================== Routine Description: return ethernet statistics counter Arguments: net_dev Pointer to net_device Return Value: net_device_stats* Note: ========================================================================*/struct net_device_stats *RT28xx_get_ether_stats( IN struct net_device *net_dev){ RTMP_ADAPTER *pAd = NULL; if (net_dev) pAd = net_dev->priv; if (pAd) { pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount; pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount; pAd->stats.rx_errors = pAd->Counters8023.RxErrors; pAd->stats.tx_errors = pAd->Counters8023.TxErrors; pAd->stats.rx_dropped = 0; pAd->stats.tx_dropped = 0; pAd->stats.multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; // multicast packets received pAd->stats.collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions; // Collision packets pAd->stats.rx_length_errors = 0; pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow pAd->stats.rx_crc_errors = 0;//pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun pAd->stats.rx_missed_errors = 0; // receiver missed packet // detailed tx_errors pAd->stats.tx_aborted_errors = 0; pAd->stats.tx_carrier_errors = 0; pAd->stats.tx_fifo_errors = 0; pAd->stats.tx_heartbeat_errors = 0; pAd->stats.tx_window_errors = 0; // for cslip etc pAd->stats.rx_compressed = 0; pAd->stats.tx_compressed = 0; return &pAd->stats; } else return NULL;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?