Re: problem in initilisation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



u r trying to register netdev
>>i = register_netdevice((pTestStruct->dev));

 and trying to unregister chardev....
>>unregister_chrdev(16,"test");


so check out which device u want to regiter this perticular driver for
netdev or chardev.....

Megharaj.

----- Original Message -----
From: "Ravi Kumar" <ravivsn@rocsys.com>
To: <kernelnewbies@nl.linux.org>
Sent: Monday, April 19, 2004 10:53 AM
Subject: problem in initilisation


> HI,
>  I wrote one character device which should create network device. When I
> do insmod it gave a segmentation fault and lsmod shows initializing.
>
> A dmesg shows:
>
> EIP is at init_module [testdriver] 0xa6 (2.4.18-14)
> eax: 00000000   ebx: ffffffea   ecx: c05b6000   edx: c8e7f4d3
> esi: 00000000   edi: 00000000   ebp: c672df18   esp: c672df00
> ds: 0018   es: 0018   ss: 0018
> Process insmod (pid: 9922, stackpage=c672d000)
> Stack: 00200206 ffffffff 00002f3f c05b6940 00000000 00000000 c8e7f000
> c011bf79
>        c8e7f060 08075228 00000908 00000000 080756f4 0000052c 00000060
> 00000060
>        0000000a c05b6c40 c6231000 c6e7e000 00000060 c8def000 c8e7f060
> 00000968
> Call Trace: [<c011bf79>] sys_init_module [kernel] 0x4d9 (0xc672df1c))
> [<c8e7f060>] test_open [testdriver] 0x0 (0xc672df20))
> [<c8e7f060>] test_open [testdriver] 0x0 (0xc672df58))
> [<c010910f>] system_call [kernel] 0x33 (0xc672dfc0))
>
>
> Code: c7 40 34 fe f0 e7 c8 83 ec 08 68 d4 f4 e7 c8 8b 45 f4 ff 30
>
>
> I am attaching the code, pls help me to solve this problem.
> Thanks a lot,
> -Ravi
>


----------------------------------------------------------------------------
----


> #ifndef __KERNEL__
> #   define __KERNEL__
> #endif
>
> #ifndef MODULE
> #  define MODULE
> #endif
>
> #define DEVNAME "testdev"
>
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/fs.h>
> #include <linux/slab.h>
>
> #include <linux/netdevice.h>
> #include <linux/if_ether.h>
>
>
>
> int test_open(struct inode *,struct file *);
> int test_release(struct inode *,struct file*);
>
>
> struct test_struct{
> struct net_device *dev;
> char name[IFNAMSIZ];
> };
>
>
>
> struct file_operations test_fop={
> llseek: NULL,
> read:   NULL,
> write:  NULL,
> ioctl:  NULL,
> open:   test_open,
> release: test_release,
> };
>
>
>
> int test_open(struct inode *inode, struct file *filep)
> {
> MOD_INC_USE_COUNT;
> return 0;
> }
>
> int test_release(struct inode *inode, struct file *filep)
> {
> MOD_DEC_USE_COUNT;
> return 0;
> }
>
> int testdev_open(struct net_device *dev)
> {
> MOD_INC_USE_COUNT;
> return 0;
> }
>
> int testdev_close(struct net_device *dev)
> {
> unregister_netdev(dev);
> MOD_DEC_USE_COUNT;
> return 0;
> }
>
> static int test_init_dev(struct net_device *dev)
> {
> struct test_struct *c;
>
> dev->priv = kmalloc(sizeof(struct net_device),GFP_KERNEL);
> if(!dev->priv)
> {
> printk(KERN_ERR "out of memory while allocating to dev->priv\n");
> return -ENOMEM;
> }
> c = (struct test_struct *)dev->priv;
> if(!c)
> return -ENODEV;
>
> memset(c,0,sizeof(struct test_struct));
>         c->dev = dev;
>         ether_setup(dev);
>
> dev->open  = testdev_open;
> dev->stop  = testdev_close;
> dev->mtu   = ETH_DATA_LEN;
> dev_init_buffers(dev);
> return 0;
> }
>
>
> int init_module(void)
> {
> int result,i;
>
>         struct test_struct *pTestStruct;
> result = register_chrdev(16,"test",&test_fop);
> if( result < 0 ){
> printk(KERN_WARNING "test: cant get major\n");
> return result;
> }
>         pTestStruct = (struct test_struct *)kmalloc(sizeof( struct
test_struct),GFP_KERNEL);
> if(!pTestStruct)
> {
> printk(KERN_ERR "failed to allocate memory\n");
> return -ENOMEM;
> }
>
>         memset((void *)pTestStruct,0,sizeof(pTestStruct));
> sprintf(pTestStruct->name, DEVNAME);
>         //pTestStruct->dev->priv = pTestStruct;
> pTestStruct->dev->init = test_init_dev;
>
> i = dev_alloc_name(pTestStruct->dev,"testdev%d");
> if(i < 0 )
> {
> printk(KERN_ERR "cant allocate device\n");
> return -ENODEV;
> }
> i = register_netdevice((pTestStruct->dev));
> if( i < 0 )
> printk(KERN_ERR "register netdevice failed\n");
>
> return 0;
> }
>
> void cleanup_module(void)
> {
>
> unregister_chrdev(16,"test");
> }
>
>
>
>
>
>
>




--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux