?? r8180_pci_init.c
字號:
/* r8180_pci_init.c: Part of Linux wireless lan driver for RTL8180. *//* Written 2002-2003 by ShuChen. This software may be used and distributed according to the terms of the GNU General Public License (GPL), incorporated herein by reference. Drivers based on or derived from this code fall under the GPL and must retain the authorship, copyright and license notice. This file is not a complete program and may only be used when the entire operating system is licensed under the GPL. The original author may be reached as shuchen@realtek.com.tw Versions: 1.0 - first release 1.1 - second release 1.2 - 2003-06-10*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/config.h>#include <linux/init.h>#include <linux/ioport.h>#include <linux/sched.h>#include <linux/types.h>#include <linux/slab.h>#include <linux/netdevice.h>#include <linux/pci.h>#include <linux/etherdevice.h>#include <linux/delay.h>#include <linux/rtnetlink.h> //for rtnl_lock()#include <linux/wireless.h>#include <linux/timer.h>#include <linux/proc_fs.h> // Necessary because we use the proc fs#include <asm/io.h>#include "r8180_type.h"#include "r8180_pci_init.h"#include "r8180_if.h"#define RTL8180_DRIVER_DATE "2003-11-24"#define RTL8180_MODULE_NAME "RTL8180"#define RTL8180_DRIVER_NAME "RTL8180 Wireless Lan Driver " RTL8180_DRIVER_DATE//----------------------------------------------------------------------------------------// Driver name//----------------------------------------------------------------------------------------char rtl8180_driver_name[] = "rtl8180";//----------------------------------------------------------------------------------------// PCI Device_ID table//----------------------------------------------------------------------------------------static struct pci_device_id rtl8180_pci_id_tbl[] = { { 0x10EC, 0x8180 /*0x8139*/, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, {0,},};//----------------------------------------------------------------------------------------// rtl8180 probe function *///----------------------------------------------------------------------------------------static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);static void __devexit rtl8180_pci_remove(struct pci_dev *pdev);//----------------------------------------------------------------------------------------// PCI_driver table//----------------------------------------------------------------------------------------static struct pci_driver rtl8180_pci_driver = { name: "rtl8180", /* Driver name */ id_table: rtl8180_pci_id_tbl, /* PCI_ID table */ probe: rtl8180_pci_probe, /* probe function */ remove: rtl8180_pci_remove, /* remove function */ suspend: NULL, /* suspend function */ resume: NULL, /* resume function */};MODULE_LICENSE("GPL");MODULE_DEVICE_TABLE(pci, rtl8180_pci_id_tbl);/***************************************************************************************************************************************************************************************/static int __devinit rtl8180_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id){ unsigned long ioaddr = 0; struct net_device *dev = NULL; struct rtl8180_priv *priv = NULL;#ifdef RTL_IO_MAP unsigned long pio_start, pio_len, pio_flags;#else unsigned long pmem_start, pmem_len, pmem_flags;#endif //end #ifdef RTL_IO_MAP //----------------------------------------------------------------------------- // PCI Enable device //----------------------------------------------------------------------------- if( pci_enable_device (pdev) ){ DPRINTK_OUTINFO("pci_enable_device() failed!\n"); return -EIO; } //----------------------------------------------------------------------------- // Enable PCI bus-mastering //----------------------------------------------------------------------------- pci_set_master(pdev); //----------------------------------------------------------------------------- // Enable net_device // (1)Allocate net_device and rtl8180 private area. // (2)Initialize net_device // (3)Register net_device //----------------------------------------------------------------------------- dev = rtl_alloc_wlandev( dev, sizeof(struct rtl8180_priv)); if( dev == NULL ){ DPRINTK_OUTINFO("Initialize net_device failed!\n"); goto fail; } SET_MODULE_OWNER(dev); //----------------------------------------------------------------------------- // Set private driver data pointer(dev) for a pci_dev //----------------------------------------------------------------------------- pci_set_drvdata(pdev, dev); // pdev->driver_data = data; //----------------------------------------------------------------------------- // PCI resources: including PCI configuration space and IRQ number. //-----------------------------------------------------------------------------#ifdef RTL_IO_MAP pio_start = (unsigned long)pci_resource_start (pdev, 0); pio_len = (unsigned long)pci_resource_len (pdev, 0); pio_flags = (unsigned long)pci_resource_flags (pdev, 0); if (!(pio_flags & IORESOURCE_IO)) { DPRINTK_OUTINFO("%s: region #0 not a PIO resource, aborting\n", pdev->slot_name); goto fail; } else{ DPRINTK_OUTINFO("%s: region #0 IS a PIO resource!\n", pdev->slot_name); } DPRINTK_OUTINFO("request_region(0x%08lx,0x%08lx) !\n", pio_start,pio_len ); if( ! request_region( pio_start, pio_len, rtl8180_driver_name ) ){ DPRINTK_OUTINFO("request_region failed!\n"); goto fail; } ioaddr = pio_start; dev->base_addr = ioaddr; // device I/O address#else pmem_start = pci_resource_start(pdev, 1); pmem_len = pci_resource_len(pdev, 1); pmem_flags = pci_resource_flags (pdev, 1); if (!(pmem_flags & IORESOURCE_MEM)) { DPRINTK_OUTINFO("%s: region #1 not a MMIO resource, aborting\n", pdev->slot_name); goto fail; } else{ DPRINTK_OUTINFO("%s: region #0 IS a MMIO resource!\n", pdev->slot_name); } DPRINTK_OUTINFO("request_mem_region(0x%08lx,0x%08lx) !\n", pmem_start,pmem_len ); if( ! request_mem_region( pmem_start, pmem_len, rtl8180_driver_name ) ) { DPRINTK_OUTINFO("request_mem_region failed!\n"); goto fail; } DPRINTK_OUTINFO("ioremap(0x%08lx,0x%08lx) !\n", pmem_start, pmem_len ); ioaddr = (unsigned long)ioremap( pmem_start, pmem_len); //in prism2 pio_len=1K if( ioaddr == (unsigned long)NULL ){ DPRINTK_OUTINFO("ioremap failed! release_mem_region(0x%08lx,0x%08lx)\n", pmem_start, pmem_len); release_mem_region( pmem_start, pmem_len ); goto fail; } dev->mem_start = ioaddr; // shared mem start dev->mem_end = ioaddr + pci_resource_len(pdev, 0); // shared mem end#endif //end #ifdef RTL_IO_MAP //----------------------------------------------------------------------------- // Set fields in net_device //----------------------------------------------------------------------------- dev->irq = pdev->irq; // callbacks // dev->open = rtl8180_open; dev->stop = rtl8180_close; dev->hard_start_xmit = rtl8180_xmit; dev->get_stats = rtl8180_get_stats; //dev->get_wireless_stats = rtl8180_get_wireless_stats; dev->do_ioctl = rtl8180_ioctl; dev->set_multicast_list = rtl8180_set_multicast_list; //dev->change_mtu = rtl8180_change_mtu; //dev->tx_timeout = rtl8180_tx_timeout; //dev->watchdog_timeo = TX_TIMEOUT; priv = dev->priv; strcpy(priv->name,"rtl8180_pci_driver"); //priv->pdev = pdev; priv->ioaddr = ioaddr; //----------------------------------------------------------------------------- // Disable Debugging message on PC. //----------------------------------------------------------------------------- wlan_debug = RTL_DDEBUG_NONE; //----------------------------------------------------------------------------- // Wireless Lan MAC initialization (Rx, Tx, Mlme) //----------------------------------------------------------------------------- rtl8180_init( dev ); //----------------------------------------------------------------------------- // Register IRQ handler in rtl8180_init() in r8180_if.c //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Register the net device once everything initializes. //----------------------------------------------------------------------------- rtl_register_netdev(dev); //----------------------------------------------------------------------------- // Print card information, io-memory address and irq number. //----------------------------------------------------------------------------- DPRINTK_OUTINFO("wlan driver loaded. ioaddr=0x%lx, irq=%d, MAC_addr=%x:%x:%x:%x:%x:%x\n", ioaddr, dev->irq, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] ); return 0; // return if rtl8180_pci_probe succeed!//-----------------------------------------------------------------------------fail: if(dev){ //----------------------------------------------------------------------------- // Free resources: PCI configuration space and IRQ <in rtl8180_remove() in r8180_if.c>. //-----------------------------------------------------------------------------#ifdef RTL_IO_MAP if( dev->base_addr != 0 ){ DPRINTK_OUTINFO("release_region(0x%08lx,0x%08lx) !\n", dev->base_addr, pci_resource_len(pdev, 0) ); release_region( dev->base_addr, pci_resource_len(pdev, 0) ); }#else if( dev->mem_start != (unsigned long)NULL ){ iounmap( (void *)dev->mem_start ); DPRINTK_OUTINFO("release_region(0x%08lx,0x%08lx) !\n", pci_resource_start(pdev, 1), pci_resource_len(pdev, 1) ); release_mem_region( pci_resource_start(pdev, 1), pci_resource_len(pdev, 1) ); }#endif //end #ifdef RTL_IO_MAP rtl_unregister_netdev(dev); //----------------------------------------------------------------------------- // Free net_device and rtl8180 private area //----------------------------------------------------------------------------- kfree(dev); } DPRINTK_OUTINFO("wlan driver load failed\n"); return -ENOMEM;}//end of rtl8180_pci_probe()/***************************************************************************************************************************************************************************************/static void __devexit rtl8180_pci_remove(struct pci_dev *pdev){ //----------------------------------------------------------------------------- // Return private driver data pointer(dev) for a pci_dev //----------------------------------------------------------------------------- struct net_device *dev = pci_get_drvdata(pdev); assert( dev != NULL ); assert( priv != NULL ); //----------------------------------------------------------------------------- // Unregister the net device. //----------------------------------------------------------------------------- rtl_unregister_netdev(dev); //----------------------------------------------------------------------------- // disable rtl8180_hw_interrupt, free rtl8180 memory //----------------------------------------------------------------------------- rtl8180_remove( dev );#ifdef RTL_IO_MAP if( dev->base_addr != 0 ){ DPRINTK_OUTINFO("release_region(0x%08lx,0x%08lx) !\n", dev->base_addr, pci_resource_len(pdev, 0) ); release_region( dev->base_addr, pci_resource_len(pdev, 0) ); }#else if( dev->mem_start != (unsigned long)NULL ){ iounmap( (void *)dev->mem_start ); DPRINTK_OUTINFO("release_region(0x%08lx,0x%08lx) !\n", pci_resource_start(pdev, 1), pci_resource_len(pdev, 1) ); release_mem_region( pci_resource_start(pdev, 1), pci_resource_len(pdev, 1) ); }#endif //end #ifdef RTL_IO_MAP //----------------------------------------------------------------------------- // Free resources: IRQ <in rtl8180_remove() in r8180_if.c> //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // Free net_device and rtl8180 private area //----------------------------------------------------------------------------- kfree(dev); DPRINTK_OUTINFO("wlan driver removed\n"); //----------------------------------------------------------------------------- // PCI Disable device //-----------------------------------------------------------------------------// pci_disable_device(pdev);}/***************************************************************************************************************************************************************************************/static int __init rtl8180_pci_module_init(void){ printk(KERN_INFO "\n\n******** "RTL8180_DRIVER_NAME " loaded********\n"); if (pci_register_driver(&rtl8180_pci_driver) <= 0) { printk("rtl8180: No devices found, " RTL8180_DRIVER_NAME " unregistered\n"); pci_unregister_driver (&rtl8180_pci_driver); return -ENODEV; } return 0;}/***************************************************************************************************************************************************************************************/static void __exit rtl8180_pci_module_exit(void){ pci_unregister_driver (&rtl8180_pci_driver); printk(KERN_INFO "******** "RTL8180_DRIVER_NAME " removed ********\n\n");}/***************************************************************************************************************************************************************************************/module_init(rtl8180_pci_module_init);module_exit(rtl8180_pci_module_exit);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -