📄 wt_hotplug_mem.c
字号:
/***************************************************************************** *This file realize device probe & remove functions *Version: *Copyright(c) 2004-2005 Beijing LHET Microelectronics Inc,All Right Reserved. *****************************************************************************/ #include "wtprecomp.h"//#include <asm/arch/regs-mem.h>/****************************************************************************/#ifdef WT4_DEBUGint debug=0;//int debug=L_FUNC;int wt4_debug_func_indent=0;#endif/*****************************************************************************/#define DRV_NAME "wt4"#define DRV_VERSION "1.0"static unsigned int wtwlan_mem_addr[] /*__initdata*/ = {SMDK2410_WTWLAN_BASE, 0};static unsigned int wtwlan_irq_map[] = {SMDK2410_WTWLAN_ETH_IRQ, 0, 0, 0};#define NETCARD_IO_EXTENT 64MODULE_AUTHOR("LHWT");MODULE_DESCRIPTION("The WT 802.11 Wireless LAN adapter");MODULE_LICENSE("GPL");static int WtProbe(struct net_device *ndev, int mem_addr);//static void WtRemove(struct pci_dev *);void WtRemove(struct net_device *ndev);//static int WtSuspend(struct pci_dev *, u32 state);//static int WtResume(struct pci_dev *);static struct net_device *dev_wlanwt4;/****************************************************************************** Module initialization functions******************************************************************************/intWtProbe(struct net_device *ndev, int mem_addr){ int rvalue; int *base ; WT_ADAPTER *Adapter; unsigned long reg0,reg1,reg2,reg3,reg4,reg5; UINT32 bwscon; FN_ENTER; /* request the device I/O regions */ rvalue = request_mem_region(mem_addr, 64*1024, DRV_NAME); if (rvalue) { printk(KERN_ERR "%s: request_regions failure (rc=%d)\n", DRV_NAME, rvalue); return rvalue; } //base = 0xea000000; printk("<0>The value in address 0xEA000000 is: %08x\n\r",*base); //Dump( (char *)base,600, TRUE, 1 ); /* setup the network device interface and its structure */ if (!(ndev = WtNdevSetupMem(ndev))) { /* error configuring the driver as a network device */ printk(KERN_ERR "%s: could not configure network device\n",DRV_NAME); goto do_release_regions; } Adapter = netdev_priv(ndev); Adapter->MainMemAddress = mem_addr; /* card is in unknown state yet, might have some interrupts pending */ WtDisableInterrupts(Adapter); Adapter->CSRAddress->IntMaskCtrl = 0xfff; /* request for the interrupt before uploading the firmware */ rvalue = request_irq(SMDK2410_WTWLAN_ETH_IRQ, &WtInterrupt, SA_SHIRQ, ndev->name, Adapter); if (rvalue) { /* error, could not hook the handler to the irq */ printk("%s: could not install IRQ handler\n", ndev->name); goto do_unregister_netdev; } reg0 = __raw_readl((void *)0xF0000008); reg1 = __raw_readl((void *)0xF0E00088); reg2 = __raw_readl((void *)0xF0E0008C); reg3 = __raw_readl((void *)0xF0E00068); reg4 = __raw_readl((void *)0xF0E000A4); reg5 = __raw_readl((void *)0xF0E00060);#if 0 printk("<0> INIMSK register in address 0x4a000008 is: %08x\r\n",reg0); printk("<0> EXINIT register in address 0x56000088 is: %08x\r\n",reg1); printk("<0> EXINIT register in address 0x5600008c is: %08x\r\n",reg2); printk("<0> CPGVP register in address 0x56000068 is: %08x\r\n",reg3); printk("<0> CPGVP register in address 0x5600004A is: %08x\r\n",reg4); printk("<0> CPGVP register in address 0x56000060 is: %08x\r\n",reg5);#endif reg2 &= (~(unsigned long )0xF); reg3 &= (~(unsigned long )0x1); reg5 &= (~(unsigned long )0x1); reg5 |= 0x2; __raw_writel(reg2,(void *)0xF0E0008C); __raw_writel(reg3,(void *)0xF0E00068); __raw_writel(reg5,(void *)0xF0E00060); reg5 = __raw_readl((void *)0xF0100014); printk("<0> 48000014 is: %08x\r\n",reg5); reg5 &= 0xffff9fff; reg5 |= 4000; __raw_writel(reg5,(void *)0xF0100014); reg5 = __raw_readl((void *)0xF0100014); printk("<0> 48000014 is: %08x\r\n",reg5); #if 0 printk("<0> INIMSK register in address 0x4a000008 is: %08x\r\n",__raw_readl(0xF0000008)); printk("<0> EXINIT register in address 0x56000088 is: %08x\r\n",__raw_readl(0xF0E00088)); printk("<0> EXINIT register in address 0x5600008c is: %08x\r\n",__raw_readl(0xF0E0008C)); printk("<0> CPGVP register in address 0x56000068 is: %08x\r\n",__raw_readl(0xF0E00068)); printk("<0> CPGVP register in address 0x5600004A is: %08x\r\n",__raw_readl(0xF0E000A4)); printk("<0> CPGVP register in address 0x56000060 is: %08x\r\n",__raw_readl(0xF0E00060));#endif//read and write s3c2410 register bwscon bwscon = __raw_readl(S3C2410_BWSCON); printk("<0>************************the value =%x\n",bwscon);#ifdef WT_11B_SCO __raw_writel(0x2210d110,S3C2410_BWSCON); udelay(100); bwscon = __raw_readl(S3C2410_BWSCON); printk("<0>************************the value =%x\n",bwscon);#endif //WtWlanInitWtRf(Adapter); FN_EXIT(0,0); return 0;do_unregister_netdev: unregister_netdev(ndev); WtFreeMemory(Adapter); free_netdev(ndev); Adapter = NULL; do_release_regions: release_region(ndev->base_addr, NETCARD_IO_EXTENT); ndev->base_addr = NULL; }/* set by cleanup_module */static volatile int __in_cleanup_module = 0;/* this one removes one(!!) instance only */voidWtRemove(struct net_device *ndev){ WT_ADAPTER *Adapter = ndev ? netdev_priv(ndev) : NULL; FN_ENTER; printk(" %s: removing device\n", ndev->name); unregister_netdev(ndev); WtDisableInterrupts(Adapter);//we moved it from the above if clause!!! free_irq(ndev->irq, Adapter); /* free the PCI memory and unmap the remapped page */ WtFreeMemory(Adapter); //pci_set_drvdata(pdev, NULL); free_netdev(ndev); Adapter = NULL; FN_EXIT(0,0); }#if 0 //2005.8.29intWtSuspend(struct pci_dev *pdev, u32 state){ return 0;}intWtResume(struct pci_dev *pdev){ return 0;}#endifstatic int __initWtModuleInit(void){ int err; struct net_device *ndev = alloc_etherdev(sizeof(WT_ADAPTER)); if (!ndev) return ndev; FN_ENTER; printk(" Loaded %s driver, version %s\n",DRV_NAME, DRV_VERSION); __bug_on_wrong_struct_sizes (); err = WtProbe(ndev, *wtwlan_mem_addr); if (err) goto out; dev_wlanwt4 = ndev; FN_EXIT(0,0); return 0;out: return err; } static void __exitWtModuleExit(void){ FN_ENTER; __in_cleanup_module = 1; printk(KERN_INFO "Unloaded %s driver\n", DRV_NAME); WtRemove(dev_wlanwt4); __in_cleanup_module = 0; FN_EXIT(0,0);}/* register entry points */module_init(WtModuleInit);module_exit(WtModuleExit);/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -