📄 zdpci_pcmcia.c
字号:
#include <linux/version.h>
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>
#include <linux/pci.h>
#include <pcmcia/driver_ops.h>
#include "zd1205.h"
#include "zddebug.h"
#include "zdpci_pcmcia.h"
#include "zdversion.h"
/******************************************************************************
Global variable definition section
******************************************************************************/
MODULE_AUTHOR("Yarco Yang");
MODULE_DESCRIPTION("ZyDAS 802.11 Wireless LAN adapter");
MODULE_LICENSE("GPL");
extern struct net_device *g_dev;
struct driver_operations zdpci_ops =
{
"zd1205", zdpci_attach, zdpci_suspend, zdpci_resume, zdpci_detach
};
/******************************************************************************
Module initialization functions
******************************************************************************/
dev_node_t *zdpci_attach(dev_locator_t * loc)
{
u32 io;
u16 dev_id;
u8 bus, devfn, irq, latency_tmr;
struct pci_dev *pci_device;
dev_node_t *node;
struct zd1205_private *macp;
// perform some initial setting checks
if (loc->bus != LOC_PCI)
return NULL;
bus = loc->b.pci.bus;
devfn = loc->b.pci.devfn;
// get some pci settings for verification
pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io);
pcibios_read_config_byte(bus, devfn, PCI_INTERRUPT_LINE, &irq);
pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id);
// check whether the latency timer is set correctly
pcibios_read_config_byte(bus, devfn, PCI_LATENCY_TIMER, &latency_tmr);
if (io &= ~3, io == 0 || irq == 0)
{
printk(KERN_ERR "The interface was not assigned\n");
return NULL;
}
// get pci device information by loading the pci_dev structure
if (pci_device = pci_find_slot(bus, devfn), pci_device == NULL)
{
// error reading the pci device structure
printk(KERN_ERR "ERROR: %s could not get PCI device "
"information \n", DRIVER_NAME );
return NULL;
}
zd1205_found1(pci_device, NULL);
// finally setup the node structure with the device information
node = kmalloc(sizeof(dev_node_t), GFP_KERNEL);
strcpy(node->dev_name, macp->device->name);
node->major = 0;
node->minor = 0;
node->next = NULL;
MOD_INC_USE_COUNT;
return node;
}
void zdpci_suspend(dev_node_t * node)
{
}
void zdpci_resume(dev_node_t * node)
{
}
void zdpci_detach(dev_node_t * node)
{
struct zd1205_private *macp = g_dev->priv;
unregister_netdev(g_dev);
zd1205_remove_proc_subdir(macp);
zd1205_clear_structs(g_dev);
//--zd1205nics;
// free the node
kfree(node);
MOD_DEC_USE_COUNT;
}
int init_module(void)
{
printk(KERN_NOTICE "%s - version %s\n", DRIVER_NAME, VERSIONID);
//register_driver(&zdpci_ops);
register_pcmcia_driver();
return 0;
}
void cleanup_module(void)
{
unregister_driver(&zdpci_ops);
printk(KERN_NOTICE "Unloaded %s \n", DRIVER_NAME);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -