linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg KH <greg@kroah.com>
To: linux-hotplug@vger.kernel.org
Subject: Re: sysfs attribute example
Date: Thu, 16 Jun 2005 17:27:20 +0000	[thread overview]
Message-ID: <20050616172720.GA10637@kroah.com> (raw)
In-Reply-To: <NDBBIKDDCLAGMMFDHHDBGEODDAAA.stephenm@glw.com>

On Thu, Jun 16, 2005 at 12:09:56PM -0500, Stephen Morgan wrote:
> > On Mon, Jun 13, 2005 at 06:01:26PM -0500, Stephen Morgan wrote:
> > > > On Fri, Jun 10, 2005 at 12:05:07PM -0500, Stephen Morgan wrote:
> > > > > Hello all,
> > > > >
> > > > > Can someone point me to an example of exporting a sysfs
> > attribute from a
> > > > > driver?  (Or tell me if I shouldn't.)  I'm trying to get a
> > > > value from my USB
> > > > > device driver's probe() into an attribute so my udev .rules
> > > > file can pick it
> > > > > up.
> > > > >
> > > > > I've tried to follow what's in LDD 3rd ed. (page 374)
> > > > "...simply fill in an
> > > > > attribute and pass it to sysfs_create_file()"
> > > > >
> > > > > From my probe() function:
> > > > >
> > > > >   mydev->my_attribute.name = "my_attribute_name";
> > > > >   mydev->my_attribute.owner = THIS_MODULE;
> > > > >   mydev->my_attribute.mode = S_IRUGO;
> > > > >
> > > > >   sysfs_create_file(&(interface->class_dev->kobj),
> > > > &(mydev->my_attribute));
Z> > > > >
> > > > > When a device is probed, the file "my_attribute_name" shows up
> > > > in sysfs, but
> > > > > I get a "kernel NULL pointer dereference at virtual address
> > 00000004"
> > > > > (address changes with the USB port I plug into).
> > > > >
> > > > > I'm also not seeing how to attach a value to the attribute.
> > > > So, clearly,
> > > > > I'm missing something crucial here :-)
> > > >
> > > > Sure, you do. :)
> > > >
> > > > Look for: DEVICE_ATTR() in the kernel code.
> > > >
> > > > Good luck,
> > > > Kay
> > > >
> > >
> > > Hi Kay,
> > >
> > > Thanks for your help.
> > >
> > > This has gotten me much closer.  However, the show() function
> > seems to be
> > > receiving a pointer to the usb_interface's class_device instead of its
> > > device.  Any ideas why?
> >
> > Because that's where you registered the attribute?  :)
> 
> Okay, but if you register with the device (as opposed to the class_device),
> you don't get the SYSFS attribute created.

Not true, are you sure you are looking in the proper place in sysfs?

> >
> > Care to show us your patch?
> 
> Here are the pertinent lines (the interim solution used here is to cast the
> device pointer to a class_device pointer):

ick ick ick, don't do that, it's wrong.

> **********************************************
>   static ssize_t mydev_number_show(struct device *dev, char *buf)
>   {
>     int retval = 0;
>     struct my_dev *mydev = NULL;
>     int index;
>     struct class_device * cdev = (struct class_device *) dev;
> 
>     printk(" dev pointer: %p\n", cdev->dev);
>     printk(" kobject name: %s\n", cdev->dev->kobj.k_name);
>     printk(" bus_id: %s\n", cdev->dev->bus_id);
> 
>     mydev = cdev->dev->driver_data;
>     index = mydev->index;
>     printk(" my device index: %d\n", index);
> 
>     return sprintf(buf, "%d\n",index);
>   }
> 
>   static DEVICE_ATTR(mydev_number, S_IRUGO, mydev_number_show, NULL);
> 
> And in my probe() function:
> 
>   usb_register_dev(interface, &my_class);
>   usb_set_intfdata(interface, mydev);
>   sysfs_create_file(&(interface->class_dev->kobj),
> &(dev_attr_mydev_number.attr));

Do:
	device_create_file(&interface->dev, &dev_attr_mydev_number.attr);
instead.

Or if you want it to show up in the class device directory, use
CLASS_DEVICE_ATTR() and call class_device_create_file() instead.  No
casting is needed in your show function, that's a big sign that
something is wrong.

I'd really suggest you read the driver model chapter in the Linux Device
Drivers, Third edition book.  It's free online if you don't want to buy
it.

thanks,

greg k-h


-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_idt77&alloc_id\x16492&op=click
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

  parent reply	other threads:[~2005-06-16 17:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-06-10 17:05 sysfs attribute example Stephen Morgan
2005-06-10 17:10 ` Kay Sievers
2005-06-13 23:01 ` Stephen Morgan
2005-06-14  0:54 ` Greg KH
2005-06-16 17:09 ` Stephen Morgan
2005-06-16 17:27 ` Greg KH [this message]
2005-06-16 21:14 ` Stephen Morgan

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=20050616172720.GA10637@kroah.com \
    --to=greg@kroah.com \
    --cc=linux-hotplug@vger.kernel.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).