On Mon, Mar 07, 2016 at 03:21:44PM -0500, Kenneth Adam Miller wrote: > > > 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 *, There is no such "thing" in the kernel (think of symlinks, or different names for the same major:minor pair). > 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; Those are all different things, none of them get passed into open(). I don't think you have thought this through very far, where is your source code to take a look at it? > 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. Again, it's all provided directly to you in your open() call, what's wrong with that? thanks, greg k-h _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies