Re: Driver duplicate?

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

 





On Mon, Mar 7, 2016 at 3:17 PM, Greg KH <greg@xxxxxxxxx> wrote:
On Mon, Mar 07, 2016 at 03:00:50PM -0500, Kenneth Adam Miller wrote:
> I have a driver that manages three sets of identical data structures that
> differ only in address values. Currently, I pray that the device file to which
> I have callbacks mapped for the driver gets called sequentially, because there
> are pairs of mmap's that need to be made. I know that this isn't the most ideal
> way to do it, so I'm searching for a better way rather than to swap out the
> values on each method call. 
>
> There are several things I am aware of but for each one I have questions:
> 1) there are kernel module parameters
> If I use kernel module parameters, I need to be able to insert the kernel
> module three times in order to have each one have a distinct set of global
> memory and mapped callbacks to distinct files. Can that be done? Second, I will
> need to compile the driver statically later. How can I pass those parameters
> that would otherwise be on the command line in statically?

Never use kernel module parameters for a driver, nor for any other
kernel module you create.  They are global and don't work for
device-specific issues.

> 2) I can compile the driver in three times with a compile time flag. This is
> the simplest and easiest, but it requires some buildroot and makefile foo that
> I think is a dirty hack.

It's also never accepted, don't do that.

> 3) I could have the init function create three separate files, since it is on
> init that I discover what my values are. But then I have to also associate
> identical functions that reference global variables in the kernel object.
> Duplicating the code would be worse that compiling the same code three times
> with a kernel parameter, even though that would help me solve my distinct
> globals problem. So how could I parameterisze a char device with data specific
> to the instance?

open() gives you the hook to do so, please just do that.  There's a
whole kernel tree full of examples of how to do this, take a look at
existing code please.

After I had the idea in the second email, I think that using the kernel api to distinguish which char device a callback maps to in order to utilize the corresponding data is the best way.

If I could do something along the lines of retrieving the file name, as in a char *, from the file * that is passed in with the callback, or distinguish any one of these:

static dev_t LSKSMM_dev;
static struct cdev LSKSMM_cdev;
static struct class *LSKSMM_class;
static struct device *LSKSMM_device;

which are also created on module init, it would really make things convenient and easy. I'm currently digging around in the kernel headers, but I think probably somebody somewhere knows what I'm looking for. Some unique field that I can retain on init that I can get back in my mmap/ioctl call to recognize what data to use.
 

thanks,

greg k-h

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

[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