From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg KH Date: Thu, 16 Jun 2005 17:27:20 +0000 Subject: Re: sysfs attribute example Message-Id: <20050616172720.GA10637@kroah.com> 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 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_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