<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 7, 2016 at 3:17 PM, Greg KH <span dir="ltr">&lt;<a href="mailto:greg@kroah.com" target="_blank">greg@kroah.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">On Mon, Mar 07, 2016 at 03:00:50PM -0500, Kenneth Adam Miller wrote:<br>
&gt; I have a driver that manages three sets of identical data structures that<br>
&gt; differ only in address values. Currently, I pray that the device file to which<br>
&gt; I have callbacks mapped for the driver gets called sequentially, because there<br>
&gt; are pairs of mmap&#39;s that need to be made. I know that this isn&#39;t the most ideal<br>
&gt; way to do it, so I&#39;m searching for a better way rather than to swap out the<br>
&gt; values on each method call. <br>
&gt;<br>
&gt; There are several things I am aware of but for each one I have questions:<br>
&gt; 1) there are kernel module parameters<br>
&gt; If I use kernel module parameters, I need to be able to insert the kernel<br>
&gt; module three times in order to have each one have a distinct set of global<br>
&gt; memory and mapped callbacks to distinct files. Can that be done? Second, I will<br>
&gt; need to compile the driver statically later. How can I pass those parameters<br>
&gt; that would otherwise be on the command line in statically?<br>
<br>
</span>Never use kernel module parameters for a driver, nor for any other<br>
kernel module you create.  They are global and don&#39;t work for<br>
device-specific issues.<br>
<span class=""><br>
&gt; 2) I can compile the driver in three times with a compile time flag. This is<br>
&gt; the simplest and easiest, but it requires some buildroot and makefile foo that<br>
&gt; I think is a dirty hack.<br>
<br>
</span>It&#39;s also never accepted, don&#39;t do that.<br>
<span class=""><br>
&gt; 3) I could have the init function create three separate files, since it is on<br>
&gt; init that I discover what my values are. But then I have to also associate<br>
&gt; identical functions that reference global variables in the kernel object.<br>
&gt; Duplicating the code would be worse that compiling the same code three times<br>
&gt; with a kernel parameter, even though that would help me solve my distinct<br>
&gt; globals problem. So how could I parameterisze a char device with data specific<br>
&gt; to the instance?<br>
<br>
</span>open() gives you the hook to do so, please just do that.  There&#39;s a<br>
whole kernel tree full of examples of how to do this, take a look at<br>
existing code please.<br></blockquote><div><br></div><div>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.<br><div><br></div><div>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:</div></div><div><div><br></div><div>static dev_t LSKSMM_dev;</div><div>static struct cdev LSKSMM_cdev;</div><div>static struct class *LSKSMM_class;</div><div>static struct device *LSKSMM_device;</div></div><div><br></div><div>which are also created on module init, it would really make things convenient and easy. I&#39;m currently digging around in the kernel headers, but I think probably somebody somewhere knows what I&#39;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.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
thanks,<br>
<br>
greg k-h<br>
</blockquote></div><br></div></div>