From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Stephen Morgan" Date: Thu, 16 Jun 2005 17:09:56 +0000 Subject: RE: sysfs attribute example Message-Id: List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-hotplug@vger.kernel.org > -----Original Message----- > From: Greg KH [mailto:greg@kroah.com] > Sent: Monday, June 13, 2005 6:54 PM > To: Stephen Morgan > Cc: Kay Sievers; linux-hotplug-devel > Subject: Re: sysfs attribute example > > > On Mon, Jun 13, 2005 at 06:01:26PM -0500, Stephen Morgan wrote: > > > -----Original Message----- > > > From: Kay Sievers [mailto:kay.sievers@vrfy.org] > > > Sent: Friday, June 10, 2005 11:10 AM > > > To: Stephen Morgan > > > Cc: linux-hotplug-devel > > > Subject: Re: sysfs attribute example > > > > > > > > > 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)); > > > > > > > > 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. > > 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): ********************************************** 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)); ************************************************ Thanks, Stephen ------------------------------------------------------- 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_id492&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