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 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).