From: Greg KH <greg@kroah.com>
To: kernelnewbies@kernelnewbies.org
Subject: Re: Device file not appearing
Date: Wed, 17 Mar 2021 16:59:08 +0100 [thread overview]
Message-ID: <YFInTGEanJC4ibgv@kroah.com> (raw)
In-Reply-To: <YFIlwECOQR8uJbgf@gpanders.com>
On Wed, Mar 17, 2021 at 09:52:32AM -0600, Gregory Anders wrote:
> 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.
Is your char device listed in /sys/dev/char/ ?
If not, then you have something wrong with your call to device_create().
If so, then you need to look at whatever tool is creating your device
nodes in /dev. Usually the kernel handles this with devtmpfs, but I do
not know what your system uses for this.
Do you have a pointer to the real source code anywhere to be able to see
it better to see if you are doing something wrong with the call to
device_create()?
Also, why a full major? Why not just use the misc_dev api instead that
does all of the above "housekeeping" for you automagically?
thanks,
greg k-h
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
next prev parent reply other threads:[~2021-03-17 15:59 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-17 15:52 Device file not appearing Gregory Anders
2021-03-17 15:59 ` Greg KH [this message]
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
-- strict thread matches above, loose matches on Subject: below --
2021-03-16 20:25 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=YFInTGEanJC4ibgv@kroah.com \
--to=greg@kroah.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.