kernelnewbies.kernelnewbies.org archive mirror
 help / color / mirror / Atom feed
From: Gregory Anders <greg@gpanders.com>
To: kernelnewbies@kernelnewbies.org
Subject: Device file not appearing
Date: Tue, 16 Mar 2021 14:25:07 -0600	[thread overview]
Message-ID: <YFEUI1OWtOQ7HcSy@gpanders.com> (raw)

Hi all,

I'm writing a char device driver and am having trouble getting the file 
to appear under /dev.

This isn't my first rodeo: in fact, I've written a few other drivers in 
the past and they have all worked as expected. This driver is based on 
the source code of those other drivers, so I'm fairly confident I'm 
doing everything correctly. So I'm stumped and looking for help.

Here is what I have in my init function:

     #define DRIVER_NAME "foo"

     static int __init mod_init(void)
     {
         dev_t devno;
         my_class = class_create(THIS_MODULE, DRIVER_NAME);
         ret = alloc_chrdev_region(&devno, 0, MAX_DEVICES, DRIVER_NAME);

         my_major = MAJOR(devno);

         ...
     }

(Note that for brevity I'm omitting a lot of boilerplate/error handling, 
etc. But you can assume it's all there).

My driver is also a network driver; in fact, it's *primarily* a network 
driver and it provides a char device file that is used to configure the 
hardware. I am creating the char device whenever the network device is 
first opened (e.g. 'netdev_open' below is the 'ndo_open' field of the 
'struct netdev_ops'):

     struct private_data {
         struct cdev cdev;
         ...
     }

     static int netdev_open(struct net_device *dev)
     {
         struct private_data *priv = netdev_priv(dev);
         dev_t devno;
         int minor;
         struct device *d;

         minor = ida_alloc_max(&ida, MAX_DEVICES, GFP_KERNEL);

         devno = MKDEV(my_major, minor);
         cdev_init(&priv->cdev, &my_fops);
         cdev_add(&priv->cdev, devno, 1);

         /* This should create a device node with the same name as the
          * network interface, e.g. foo0
          */
         d = device_create(my_class, NULL, devno, priv, dev->name);
         if (IS_ERR(d)) {
             ...
         }

         ...
     }

Again, I'm omitting the error checking for the sake of brevity, but it 
is there in the actual code. This function runs successfully and the 
network device is successfully opened. The 'device_create' function does 
not return an error, but there is nothing beneath /dev as I would 
expect.

I'm really stumped here because everything I've been able to find online 
says that 'device_create' ought to create that device file. I can see my 
class under /sys/class/ and that directory contains a directory with the 
name of the device:

     $ ls -1 /sys/class/my_class/
     foo0

so it looks like the char device *is* being created, there's just no 
corresponding entry under /dev.

Anyway, I know that's a lot of info. If you've made it this far, thanks 
for reading. If you have any insight/advice/suggestions for me I'd 
greatly appreciate it!

Thanks,

Greg

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

             reply	other threads:[~2021-03-21 18:48 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-16 20:25 Gregory Anders [this message]
2021-03-17 15:52 Device file not appearing Gregory Anders
2021-03-17 15:59 ` Greg KH
2021-03-17 16:13   ` Gregory Anders
2021-03-17 16:16     ` Greg KH
2021-03-17 16:56       ` Gregory Anders
2021-03-17 17:05         ` Gregory Anders
2021-03-17 17:15         ` Greg KH
2021-03-17 18:26           ` Gregory Anders

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YFEUI1OWtOQ7HcSy@gpanders.com \
    --to=greg@gpanders.com \
    --cc=kernelnewbies@kernelnewbies.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).