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