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@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies