]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Oct 2008 19:40:26 +0000 (12:40 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 16 Oct 2008 19:40:26 +0000 (12:40 -0700)
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (46 commits)
  UIO: Fix mapping of logical and virtual memory
  UIO: add automata sercos3 pci card support
  UIO: Change driver name of uio_pdrv
  UIO: Add alignment warnings for uio-mem
  Driver core: add bus_sort_breadthfirst() function
  NET: convert the phy_device file to use bus_find_device_by_name
  kobject: Cleanup kobject_rename and !CONFIG_SYSFS
  kobject: Fix kobject_rename and !CONFIG_SYSFS
  sysfs: Make dir and name args to sysfs_notify() const
  platform: add new device registration helper
  sysfs: use ilookup5() instead of ilookup5_nowait()
  PNP: create device attributes via default device attributes
  Driver core: make bus_find_device_by_name() more robust
  usb: turn dev_warn+WARN_ON combos into dev_WARN
  debug: use dev_WARN() rather than WARN_ON() in device_pm_add()
  debug: Introduce a dev_WARN() function
  sysfs: fix deadlock
  device model: Do a quickcheck for driver binding before doing an expensive check
  Driver core: Fix cleanup in device_create_vargs().
  Driver core: Clarify device cleanup.
  ...

131 files changed:
Documentation/kernel-parameters.txt
Documentation/kobject.txt
arch/mips/kernel/rtlx.c
arch/mips/sibyte/common/sb_tbprof.c
arch/x86/kernel/cpuid.c
arch/x86/kernel/dumpstack_32.c
arch/x86/kernel/dumpstack_64.c
arch/x86/kernel/msr.c
block/bsg.c
drivers/base/bus.c
drivers/base/core.c
drivers/base/dd.c
drivers/base/platform.c
drivers/base/power/main.c
drivers/block/aoe/aoechr.c
drivers/block/paride/pg.c
drivers/block/paride/pt.c
drivers/block/pktcdvd.c
drivers/char/bsr.c
drivers/char/dsp56k.c
drivers/char/ip2/ip2main.c
drivers/char/ipmi/ipmi_devintf.c
drivers/char/istallion.c
drivers/char/lp.c
drivers/char/mem.c
drivers/char/misc.c
drivers/char/pcmcia/cm4000_cs.c
drivers/char/pcmcia/cm4040_cs.c
drivers/char/ppdev.c
drivers/char/raw.c
drivers/char/snsc.c
drivers/char/stallion.c
drivers/char/tty_io.c
drivers/char/vc_screen.c
drivers/char/viotape.c
drivers/char/xilinx_hwicap/xilinx_hwicap.c
drivers/dca/dca-sysfs.c
drivers/firmware/iscsi_ibft.c
drivers/hid/hidraw.c
drivers/hwmon/hwmon.c
drivers/i2c/i2c-dev.c
drivers/ide/ide-probe.c
drivers/ide/ide-tape.c
drivers/ieee1394/dv1394.c
drivers/ieee1394/raw1394.c
drivers/ieee1394/video1394.c
drivers/infiniband/core/cm.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/ipath/ipath_file_ops.c
drivers/isdn/capi/capi.c
drivers/leds/led-class.c
drivers/macintosh/adb.c
drivers/media/dvb/dvb-core/dvbdev.c
drivers/misc/phantom.c
drivers/mtd/mtdchar.c
drivers/net/phy/phy_device.c
drivers/net/ppp_generic.c
drivers/net/wan/cosa.c
drivers/net/wireless/mac80211_hwsim.c
drivers/pci/probe.c
drivers/pnp/base.h
drivers/pnp/core.c
drivers/pnp/driver.c
drivers/pnp/interface.c
drivers/power/power_supply_core.c
drivers/s390/char/raw3270.c
drivers/s390/char/tape_class.c
drivers/s390/char/vmlogrdr.c
drivers/s390/char/vmur.c
drivers/scsi/ch.c
drivers/scsi/dpt_i2o.c
drivers/scsi/osst.c
drivers/scsi/sg.c
drivers/scsi/st.c
drivers/spi/spidev.c
drivers/uio/Kconfig
drivers/uio/Makefile
drivers/uio/uio.c
drivers/uio/uio_pdrv.c
drivers/uio/uio_sercos3.c [new file with mode: 0644]
drivers/usb/core/devio.c
drivers/usb/core/file.c
drivers/usb/core/hcd.c
drivers/usb/gadget/Makefile
drivers/usb/gadget/cdc2.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/f_ecm.c
drivers/usb/gadget/f_loopback.c
drivers/usb/gadget/f_subset.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/gmidi.c
drivers/usb/gadget/printer.c
drivers/usb/gadget/rndis.c
drivers/usb/gadget/serial.c
drivers/usb/gadget/u_ether.c
drivers/usb/gadget/zero.c
drivers/usb/host/uhci-q.c
drivers/usb/misc/phidgetkit.c
drivers/usb/misc/phidgetmotorcontrol.c
drivers/usb/misc/phidgetservo.c
drivers/usb/mon/mon_bin.c
drivers/video/console/fbcon.c
drivers/video/display/display-sysfs.c
drivers/video/fbmem.c
fs/coda/psdev.c
fs/sysfs/bin.c
fs/sysfs/dir.c
fs/sysfs/file.c
fs/sysfs/mount.c
fs/sysfs/sysfs.h
include/asm-generic/vmlinux.lds.h
include/linux/device.h
include/linux/dynamic_printk.h [new file with mode: 0644]
include/linux/kernel.h
include/linux/module.h
include/linux/platform_device.h
include/linux/sysfs.h
kernel/module.c
lib/Kconfig.debug
lib/Makefile
lib/dynamic_printk.c [new file with mode: 0644]
lib/kobject.c
net/netfilter/nf_conntrack_pptp.c
scripts/Makefile.lib
scripts/basic/Makefile
scripts/basic/hash.c [new file with mode: 0644]
sound/core/init.c
sound/core/sound.c
sound/oss/soundcard.c
sound/sound_core.c

index 82c561f3abbd684bce78849fd9c535974e439d7f..dd28a0d56981e4e0376fb5010086c817633a6a3b 100644 (file)
@@ -1714,6 +1714,11 @@ and is between 256 and 4096 characters. It is defined in the file
                        autoconfiguration.
                        Ranges are in pairs (memory base and size).
 
+       dynamic_printk
+                       Enables pr_debug()/dev_dbg() calls if
+                       CONFIG_DYNAMIC_PRINTK_DEBUG has been enabled. These can also
+                       be switched on/off via <debugfs>/dynamic_printk/modules
+
        print-fatal-signals=
                        [KNL] debug: print fatal signals
                        print-fatal-signals=1: print segfault info to
index 51a8021ee532bc03e4e530dd724f3e42ae737bc4..f5d2aad65a672ce65082769b835d621bac11e59a 100644 (file)
@@ -118,6 +118,10 @@ the name of the kobject, call kobject_rename():
 
     int kobject_rename(struct kobject *kobj, const char *new_name);
 
+Note kobject_rename does perform any locking or have a solid notion of
+what names are valid so the provide must provide their own sanity checking
+and serialization.
+
 There is a function called kobject_set_name() but that is legacy cruft and
 is being removed.  If your code needs to call this function, it is
 incorrect and needs to be fixed.
index dfd868b683640634f7d128f883f53165b73595fb..4ce93aa7b37259f24299791a7a793230de5a79a6 100644 (file)
@@ -522,8 +522,8 @@ static int __init rtlx_module_init(void)
                atomic_set(&channel_wqs[i].in_open, 0);
                mutex_init(&channel_wqs[i].mutex);
 
-               dev = device_create_drvdata(mt_class, NULL, MKDEV(major, i),
-                                           NULL, "%s%d", module_name, i);
+               dev = device_create(mt_class, NULL, MKDEV(major, i), NULL,
+                                   "%s%d", module_name, i);
                if (IS_ERR(dev)) {
                        err = PTR_ERR(dev);
                        goto out_chrdev;
index 66e3e3fb311f9a413ffb3dbc58aa9174fe101fe5..637a194e5cd5f95e0ee2de2687ddbab05ac45cec 100644 (file)
@@ -576,8 +576,7 @@ static int __init sbprof_tb_init(void)
 
        tb_class = tbc;
 
-       dev = device_create_drvdata(tbc, NULL, MKDEV(SBPROF_TB_MAJOR, 0),
-                                   NULL, "tb");
+       dev = device_create(tbc, NULL, MKDEV(SBPROF_TB_MAJOR, 0), NULL, "tb");
        if (IS_ERR(dev)) {
                err = PTR_ERR(dev);
                goto out_class;
index 6a44d646599156cc5910cce8f503832688c973a5..72cefd1e649ba4be254b5ec497f442160dab1752 100644 (file)
@@ -147,8 +147,8 @@ static __cpuinit int cpuid_device_create(int cpu)
 {
        struct device *dev;
 
-       dev = device_create_drvdata(cpuid_class, NULL, MKDEV(CPUID_MAJOR, cpu),
-                                   NULL, "cpu%d", cpu);
+       dev = device_create(cpuid_class, NULL, MKDEV(CPUID_MAJOR, cpu), NULL,
+                           "cpu%d", cpu);
        return IS_ERR(dev) ? PTR_ERR(dev) : 0;
 }
 
index 201ee359a1a98c2d33049b4325da5a86d5b68fda..1a78180f08d39aa2a87a2b2738e7a6b488a4d5dc 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kexec.h>
 #include <linux/bug.h>
 #include <linux/nmi.h>
+#include <linux/sysfs.h>
 
 #include <asm/stacktrace.h>
 
@@ -343,6 +344,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
        printk("DEBUG_PAGEALLOC");
 #endif
        printk("\n");
+       sysfs_printk_last_file();
        if (notify_die(DIE_OOPS, str, regs, err,
                        current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
                return 1;
index 086cc8118e391e00b196ddf5dd53f285643f5789..96a5db7da8a747e5192f410c60fe9494e8d8e8d1 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/kexec.h>
 #include <linux/bug.h>
 #include <linux/nmi.h>
+#include <linux/sysfs.h>
 
 #include <asm/stacktrace.h>
 
@@ -489,6 +490,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
        printk("DEBUG_PAGEALLOC");
 #endif
        printk("\n");
+       sysfs_printk_last_file();
        if (notify_die(DIE_OOPS, str, regs, err,
                        current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
                return 1;
index 2e2af5d1819160c6047b82a06b6f141e5a23f39c..82a7c7ed6d456401ef1776a53030a4db7890443e 100644 (file)
@@ -163,8 +163,8 @@ static int __cpuinit msr_device_create(int cpu)
 {
        struct device *dev;
 
-       dev = device_create_drvdata(msr_class, NULL, MKDEV(MSR_MAJOR, cpu),
-                                   NULL, "msr%d", cpu);
+       dev = device_create(msr_class, NULL, MKDEV(MSR_MAJOR, cpu), NULL,
+                           "msr%d", cpu);
        return IS_ERR(dev) ? PTR_ERR(dev) : 0;
 }
 
index 56cb343c76d8d4c507e80a7a08743b695d863756..034112bfe1f32a3876449533530edc0ed875e677 100644 (file)
@@ -1024,8 +1024,7 @@ int bsg_register_queue(struct request_queue *q, struct device *parent,
        bcd->release = release;
        kref_init(&bcd->ref);
        dev = MKDEV(bsg_major, bcd->minor);
-       class_dev = device_create_drvdata(bsg_class, parent, dev, NULL,
-                                         "%s", devname);
+       class_dev = device_create(bsg_class, parent, dev, NULL, "%s", devname);
        if (IS_ERR(class_dev)) {
                ret = PTR_ERR(class_dev);
                goto put_dev;
index ef522ae5548092f83ddabcbf36d7a54ad56f7282..5aee1c0169eafed102c699281b5bb4875fefd20c 100644 (file)
@@ -333,9 +333,7 @@ static int match_name(struct device *dev, void *data)
 {
        const char *name = data;
 
-       if (strcmp(name, dev->bus_id) == 0)
-               return 1;
-       return 0;
+       return sysfs_streq(name, dev->bus_id);
 }
 
 /**
@@ -982,6 +980,56 @@ struct klist *bus_get_device_klist(struct bus_type *bus)
 }
 EXPORT_SYMBOL_GPL(bus_get_device_klist);
 
+/*
+ * Yes, this forcably breaks the klist abstraction temporarily.  It
+ * just wants to sort the klist, not change reference counts and
+ * take/drop locks rapidly in the process.  It does all this while
+ * holding the lock for the list, so objects can't otherwise be
+ * added/removed while we're swizzling.
+ */
+static void device_insertion_sort_klist(struct device *a, struct list_head *list,
+                                       int (*compare)(const struct device *a,
+                                                       const struct device *b))
+{
+       struct list_head *pos;
+       struct klist_node *n;
+       struct device *b;
+
+       list_for_each(pos, list) {
+               n = container_of(pos, struct klist_node, n_node);
+               b = container_of(n, struct device, knode_bus);
+               if (compare(a, b) <= 0) {
+                       list_move_tail(&a->knode_bus.n_node,
+                                      &b->knode_bus.n_node);
+                       return;
+               }
+       }
+       list_move_tail(&a->knode_bus.n_node, list);
+}
+
+void bus_sort_breadthfirst(struct bus_type *bus,
+                          int (*compare)(const struct device *a,
+                                         const struct device *b))
+{
+       LIST_HEAD(sorted_devices);
+       struct list_head *pos, *tmp;
+       struct klist_node *n;
+       struct device *dev;
+       struct klist *device_klist;
+
+       device_klist = bus_get_device_klist(bus);
+
+       spin_lock(&device_klist->k_lock);
+       list_for_each_safe(pos, tmp, &device_klist->k_list) {
+               n = container_of(pos, struct klist_node, n_node);
+               dev = container_of(n, struct device, knode_bus);
+               device_insertion_sort_klist(dev, &sorted_devices, compare);
+       }
+       list_splice(&sorted_devices, &device_klist->k_list);
+       spin_unlock(&device_klist->k_lock);
+}
+EXPORT_SYMBOL_GPL(bus_sort_breadthfirst);
+
 int __init buses_init(void)
 {
        bus_kset = kset_create_and_add("bus", &bus_uevent_ops, NULL);
index b98cb1416a2d7a8a74dd5f64e4d1f1abcc35fbf2..8c2cc2648f5a5c0ec330df4991f75b6be07131ae 100644 (file)
@@ -523,11 +523,16 @@ static void klist_children_put(struct klist_node *n)
  * device_initialize - init device structure.
  * @dev: device.
  *
- * This prepares the device for use by other layers,
- * including adding it to the device hierarchy.
+ * This prepares the device for use by other layers by initializing
+ * its fields.
  * It is the first half of device_register(), if called by
- * that, though it can also be called separately, so one
- * may use @dev's fields (e.g. the refcount).
+ * that function, though it can also be called separately, so one
+ * may use @dev's fields. In particular, get_device()/put_device()
+ * may be used for reference counting of @dev after calling this
+ * function.
+ *
+ * NOTE: Use put_device() to give up your reference instead of freeing
+ * @dev directly once you have called this function.
  */
 void device_initialize(struct device *dev)
 {
@@ -835,9 +840,13 @@ static void device_remove_sys_dev_entry(struct device *dev)
  * This is part 2 of device_register(), though may be called
  * separately _iff_ device_initialize() has been called separately.
  *
- * This adds it to the kobject hierarchy via kobject_add(), adds it
+ * This adds @dev to the kobject hierarchy via kobject_add(), adds it
  * to the global and sibling lists for the device, then
  * adds it to the other relevant subsystems of the driver model.
+ *
+ * NOTE: _Never_ directly free @dev after calling this function, even
+ * if it returned an error! Always use put_device() to give up your
+ * reference instead.
  */
 int device_add(struct device *dev)
 {
@@ -965,6 +974,10 @@ done:
  * I.e. you should only call the two helpers separately if
  * have a clearly defined need to use and refcount the device
  * before it is added to the hierarchy.
+ *
+ * NOTE: _Never_ directly free @dev after calling this function, even
+ * if it returned an error! Always use put_device() to give up the
+ * reference initialized in this function instead.
  */
 int device_register(struct device *dev)
 {
@@ -1243,7 +1256,7 @@ struct device *device_create_vargs(struct class *class, struct device *parent,
        return dev;
 
 error:
-       kfree(dev);
+       put_device(dev);
        return ERR_PTR(retval);
 }
 EXPORT_SYMBOL_GPL(device_create_vargs);
@@ -1314,6 +1327,11 @@ EXPORT_SYMBOL_GPL(device_destroy);
  * device_rename - renames a device
  * @dev: the pointer to the struct device to be renamed
  * @new_name: the new name of the device
+ *
+ * It is the responsibility of the caller to provide mutual
+ * exclusion between two different calls of device_rename
+ * on the same device to ensure that new_name is valid and
+ * won't conflict with other devices.
  */
 int device_rename(struct device *dev, char *new_name)
 {
index 3ac443b2ac08579b978b7f49de2a2b73034a88cf..20febc00a5258e253aeb9a309a9447660df40a38 100644 (file)
@@ -257,6 +257,9 @@ static int __driver_attach(struct device *dev, void *data)
         * is an error.
         */
 
+       if (drv->bus->match && !drv->bus->match(dev, drv))
+               return 0;
+
        if (dev->parent)        /* Needed for USB */
                down(&dev->parent->sem);
        down(&dev->sem);
index 66b710c2881223dac67a102bb227df0e63e2cec2..dfcbfe504867e9db43ea944c55cda9eae9328556 100644 (file)
@@ -394,6 +394,53 @@ error:
 }
 EXPORT_SYMBOL_GPL(platform_device_register_simple);
 
+/**
+ * platform_device_register_data
+ * @parent: parent device for the device we're adding
+ * @name: base name of the device we're adding
+ * @id: instance id
+ * @data: platform specific data for this platform device
+ * @size: size of platform specific data
+ *
+ * This function creates a simple platform device that requires minimal
+ * resource and memory management. Canned release function freeing memory
+ * allocated for the device allows drivers using such devices to be
+ * unloaded without waiting for the last reference to the device to be
+ * dropped.
+ */
+struct platform_device *platform_device_register_data(
+               struct device *parent,
+               const char *name, int id,
+               const void *data, size_t size)
+{
+       struct platform_device *pdev;
+       int retval;
+
+       pdev = platform_device_alloc(name, id);
+       if (!pdev) {
+               retval = -ENOMEM;
+               goto error;
+       }
+
+       pdev->dev.parent = parent;
+
+       if (size) {
+               retval = platform_device_add_data(pdev, data, size);
+               if (retval)
+                       goto error;
+       }
+
+       retval = platform_device_add(pdev);
+       if (retval)
+               goto error;
+
+       return pdev;
+
+error:
+       platform_device_put(pdev);
+       return ERR_PTR(retval);
+}
+
 static int platform_drv_probe(struct device *_dev)
 {
        struct platform_driver *drv = to_platform_driver(_dev->driver);
@@ -865,7 +912,7 @@ static int platform_pm_restore_noirq(struct device *dev)
 
 #endif /* !CONFIG_HIBERNATION */
 
-struct pm_ext_ops platform_pm_ops = {
+static struct pm_ext_ops platform_pm_ops = {
        .base = {
                .prepare = platform_pm_prepare,
                .complete = platform_pm_complete,
index 03bde7524bc33fd32530ed37bf31240c8d36b8a8..692c20ba51444acaafe4ca2e1c63237afa3e42bf 100644 (file)
@@ -83,7 +83,7 @@ void device_pm_add(struct device *dev)
                 * transition is in progress in order to avoid leaving them
                 * unhandled down the road
                 */
-               WARN_ON(true);
+               dev_WARN(dev, "Parentless device registered during a PM transaction\n");
        }
 
        list_add_tail(&dev->power.entry, &dpm_list);
index 1f56d2c5b7fc67acb83899494c9376297a030f6c..200efc4d2c1e756cd9a7182709bbfb2328a57140 100644 (file)
@@ -284,9 +284,9 @@ aoechr_init(void)
                return PTR_ERR(aoe_class);
        }
        for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
-               device_create_drvdata(aoe_class, NULL,
-                                     MKDEV(AOE_MAJOR, chardevs[i].minor),
-                                     NULL, chardevs[i].name);
+               device_create(aoe_class, NULL,
+                             MKDEV(AOE_MAJOR, chardevs[i].minor), NULL,
+                             chardevs[i].name);
 
        return 0;
 }
index d731ca42f8024f48a12214b064ed5ff3d13b8543..9dfa27163001e9d31de36f5196be7db0f2334a2d 100644 (file)
@@ -686,9 +686,8 @@ static int __init pg_init(void)
        for (unit = 0; unit < PG_UNITS; unit++) {
                struct pg *dev = &devices[unit];
                if (dev->present)
-                       device_create_drvdata(pg_class, NULL,
-                                             MKDEV(major, unit), NULL,
-                                             "pg%u", unit);
+                       device_create(pg_class, NULL, MKDEV(major, unit), NULL,
+                                     "pg%u", unit);
        }
        err = 0;
        goto out;
index 673b8b2fd337a1e22b442eba939aa4c90a407b86..5ae229656eaa0114e6d80508d1b3ad4417726fd8 100644 (file)
@@ -979,12 +979,10 @@ static int __init pt_init(void)
 
        for (unit = 0; unit < PT_UNITS; unit++)
                if (pt[unit].present) {
-                       device_create_drvdata(pt_class, NULL,
-                                             MKDEV(major, unit), NULL,
-                                             "pt%d", unit);
-                       device_create_drvdata(pt_class, NULL,
-                                             MKDEV(major, unit + 128), NULL,
-                                             "pt%dn", unit);
+                       device_create(pt_class, NULL, MKDEV(major, unit), NULL,
+                                     "pt%d", unit);
+                       device_create(pt_class, NULL, MKDEV(major, unit + 128),
+                                     NULL, "pt%dn", unit);
                }
        goto out;
 
index 0e077150568bbc78b5f44323019dd8a9bf643f87..195ca7c720f584efd0592e072096547423773357 100644 (file)
@@ -302,9 +302,8 @@ static struct kobj_type kobj_pkt_type_wqueue = {
 static void pkt_sysfs_dev_new(struct pktcdvd_device *pd)
 {
        if (class_pktcdvd) {
-               pd->dev = device_create_drvdata(class_pktcdvd, NULL,
-                                               pd->pkt_dev, NULL,
-                                               "%s", pd->name);
+               pd->dev = device_create(class_pktcdvd, NULL, pd->pkt_dev, NULL,
+                                       "%s", pd->name);
                if (IS_ERR(pd->dev))
                        pd->dev = NULL;
        }
index b650b4e48e5042654c139ea0777befe7bbebab4a..456f54db73e2aa0fa395ede67cad3b2b80a40feb 100644 (file)
@@ -229,9 +229,8 @@ static int bsr_create_devs(struct device_node *bn)
                if (result)
                        goto out_err;
 
-               cur->bsr_device = device_create_drvdata(bsr_class, NULL,
-                                                       cur->bsr_dev,
-                                                       cur, cur->bsr_name);
+               cur->bsr_device = device_create(bsr_class, NULL, cur->bsr_dev,
+                                               cur, cur->bsr_name);
                if (!cur->bsr_device) {
                        printk(KERN_ERR "device_create failed for %s\n",
                               cur->bsr_name);
index ca7c72a486b2f1391d57b07621c19e28cb37d65d..85832ab924e662ffa3f1d4cf588c1b5fb7becab2 100644 (file)
@@ -508,8 +508,8 @@ static int __init dsp56k_init_driver(void)
                err = PTR_ERR(dsp56k_class);
                goto out_chrdev;
        }
-       device_create_drvdata(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0),
-                             NULL, "dsp56k");
+       device_create(dsp56k_class, NULL, MKDEV(DSP56K_MAJOR, 0), NULL,
+                     "dsp56k");
 
        printk(banner);
        goto out;
index 6774572d3759e19e2c25fca4e623088cf426643a..70e0ebc30bd08d5b9e034b2b22c341475c761252 100644 (file)
@@ -745,12 +745,12 @@ static int __init ip2_loadmain(void)
 
                pB = i2BoardPtrTable[i];
                if (pB != NULL) {
-                       device_create_drvdata(ip2_class, NULL,
-                                             MKDEV(IP2_IPL_MAJOR, 4 * i),
-                                             NULL, "ipl%d", i);
-                       device_create_drvdata(ip2_class, NULL,
-                                             MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
-                                             NULL, "stat%d", i);
+                       device_create(ip2_class, NULL,
+                                     MKDEV(IP2_IPL_MAJOR, 4 * i),
+                                     NULL, "ipl%d", i);
+                       device_create(ip2_class, NULL,
+                                     MKDEV(IP2_IPL_MAJOR, 4 * i + 1),
+                                     NULL, "stat%d", i);
 
                        for (box = 0; box < ABS_MAX_BOXES; box++)
                                for (j = 0; j < ABS_BIGGEST_BOX; j++)
index 64e1c169e826814c922c6937f738424ba819891b..835a33c8d5f510c7ff0ae3e0360e6ef8ec7f2551 100644 (file)
@@ -871,7 +871,7 @@ static void ipmi_new_smi(int if_num, struct device *device)
        entry->dev = dev;
 
        mutex_lock(&reg_list_mutex);
-       device_create_drvdata(ipmi_class, device, dev, NULL, "ipmi%d", if_num);
+       device_create(ipmi_class, device, dev, NULL, "ipmi%d", if_num);
        list_add(&entry->link, &reg_list);
        mutex_unlock(&reg_list_mutex);
 }
index 505d7a1f6b8cc39a37c0b9b3e0d04e06f796aba2..44e5d60f517ebd504c0161d516442c76a42f5e57 100644 (file)
@@ -4600,9 +4600,8 @@ static int __init istallion_module_init(void)
 
        istallion_class = class_create(THIS_MODULE, "staliomem");
        for (i = 0; i < 4; i++)
-               device_create_drvdata(istallion_class, NULL,
-                                     MKDEV(STL_SIOMEMMAJOR, i),
-                                     NULL, "staliomem%d", i);
+               device_create(istallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
+                             NULL, "staliomem%d", i);
 
        return 0;
 err_deinit:
index 3f2719b9f77b5fca364477dfa7d096c66be759cb..e444c2dba160870658b8ac45910ba79b85d12419 100644 (file)
@@ -813,8 +813,8 @@ static int lp_register(int nr, struct parport *port)
        if (reset)
                lp_reset(nr);
 
-       device_create_drvdata(lp_class, port->dev, MKDEV(LP_MAJOR, nr), NULL,
-                             "lp%d", nr);
+       device_create(lp_class, port->dev, MKDEV(LP_MAJOR, nr), NULL,
+                     "lp%d", nr);
 
        printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, 
               (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
index 672b08e694d05cd041e8a3bbac17264f3ca2fb4e..6431f6921a67acde3c214f784904c4ebd0f62678 100644 (file)
@@ -992,9 +992,9 @@ static int __init chr_dev_init(void)
 
        mem_class = class_create(THIS_MODULE, "mem");
        for (i = 0; i < ARRAY_SIZE(devlist); i++)
-               device_create_drvdata(mem_class, NULL,
-                                     MKDEV(MEM_MAJOR, devlist[i].minor),
-                                     NULL, devlist[i].name);
+               device_create(mem_class, NULL,
+                             MKDEV(MEM_MAJOR, devlist[i].minor), NULL,
+                             devlist[i].name);
 
        return 0;
 }
index 999aa779c08a710601fabc93cacb6f52229c53ba..a5e0db9d7662d4a060ff167260753b193a64ee9f 100644 (file)
@@ -217,8 +217,8 @@ int misc_register(struct miscdevice * misc)
                misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
        dev = MKDEV(MISC_MAJOR, misc->minor);
 
-       misc->this_device = device_create_drvdata(misc_class, misc->parent,
-                                                 dev, NULL, "%s", misc->name);
+       misc->this_device = device_create(misc_class, misc->parent, dev, NULL,
+                                         "%s", misc->name);
        if (IS_ERR(misc->this_device)) {
                err = PTR_ERR(misc->this_device);
                goto out;
index 1c5bf99895edda84f0571ff91851b828aa988f79..dbb912574569ef49375866a5053e429bf6d38831 100644 (file)
@@ -1871,7 +1871,7 @@ static int cm4000_probe(struct pcmcia_device *link)
                return ret;
        }
 
-       device_create_drvdata(cmm_class, NULL, MKDEV(major, i), NULL, "cmm%d", i);
+       device_create(cmm_class, NULL, MKDEV(major, i), NULL, "cmm%d", i);
 
        return 0;
 }
index 2d7c906435b7be8a6b60e9e4e19ec2a727578304..4f0723b07974615f5177134b49deb671580e8813 100644 (file)
@@ -637,8 +637,7 @@ static int reader_probe(struct pcmcia_device *link)
                return ret;
        }
 
-       device_create_drvdata(cmx_class, NULL, MKDEV(major, i), NULL,
-                             "cmx%d", i);
+       device_create(cmx_class, NULL, MKDEV(major, i), NULL, "cmx%d", i);
 
        return 0;
 }
index bee39fdfba738de8a11429a1d2c57caa7b99cc26..c84c34fb123116d0b43b0ec491aacce84342f5bc 100644 (file)
@@ -760,9 +760,8 @@ static const struct file_operations pp_fops = {
 
 static void pp_attach(struct parport *port)
 {
-       device_create_drvdata(ppdev_class, port->dev,
-                             MKDEV(PP_MAJOR, port->number),
-                             NULL, "parport%d", port->number);
+       device_create(ppdev_class, port->dev, MKDEV(PP_MAJOR, port->number),
+                     NULL, "parport%d", port->number);
 }
 
 static void pp_detach(struct parport *port)
index 47b8cf281d4a79766c0717dec1ea4380d2bf9717..e139372d0e6913f1d09a385a8d60617b3e25e089 100644 (file)
@@ -131,8 +131,8 @@ raw_ioctl(struct inode *inode, struct file *filp,
 static void bind_device(struct raw_config_request *rq)
 {
        device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor));
-       device_create_drvdata(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor),
-                             NULL, "raw%d", rq->raw_minor);
+       device_create(raw_class, NULL, MKDEV(RAW_MAJOR, rq->raw_minor), NULL,
+                     "raw%d", rq->raw_minor);
 }
 
 /*
@@ -283,8 +283,7 @@ static int __init raw_init(void)
                ret = PTR_ERR(raw_class);
                goto error_region;
        }
-       device_create_drvdata(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL,
-                             "rawctl");
+       device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
 
        return 0;
 
index 3ce60df14c0a623f5aff950148f034938988a5f9..32b74de18f5face7e590ac25fc955aef373c6247 100644 (file)
@@ -444,8 +444,8 @@ scdrv_init(void)
                                continue;
                        }
 
-                       device_create_drvdata(snsc_class, NULL, dev, NULL,
-                                             "%s", devname);
+                       device_create(snsc_class, NULL, dev, NULL,
+                                     "%s", devname);
 
                        ia64_sn_irtr_intr_enable(scd->scd_nasid,
                                                 0 /*ignored */ ,
index 8b8f07a7f50529f1e67eaac40f0a4c43f4f1b0ed..963b03fb29e5583aa45e83f056c6cf1ff412ba43 100644 (file)
@@ -4743,8 +4743,8 @@ static int __init stallion_module_init(void)
        if (IS_ERR(stallion_class))
                printk("STALLION: failed to create class\n");
        for (i = 0; i < 4; i++)
-               device_create_drvdata(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
-                                     NULL, "staliomem%d", i);
+               device_create(stallion_class, NULL, MKDEV(STL_SIOMEMMAJOR, i),
+                             NULL, "staliomem%d", i);
 
        return 0;
 err_unrtty:
index 3f48d88cffc046445202cdaece8c346cb272add7..59f472143f087d9486d62bd9f3842c2a9aee7eb6 100644 (file)
@@ -2850,7 +2850,7 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,
        else
                tty_line_name(driver, index, name);
 
-       return device_create_drvdata(tty_class, device, dev, NULL, name);
+       return device_create(tty_class, device, dev, NULL, name);
 }
 EXPORT_SYMBOL(tty_register_device);
 
index c2ae52dd53d1a6447affa697afaa53c9f9f9f7f7..4f3b3f95fc42b4bb7bcf03a561aa5f69c48a393d 100644 (file)
@@ -481,10 +481,10 @@ static struct class *vc_class;
 
 void vcs_make_sysfs(struct tty_struct *tty)
 {
-       device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1),
-                             NULL, "vcs%u", tty->index + 1);
-       device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129),
-                             NULL, "vcsa%u", tty->index + 1);
+       device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 1), NULL,
+                     "vcs%u", tty->index + 1);
+       device_create(vc_class, NULL, MKDEV(VCS_MAJOR, tty->index + 129), NULL,
+                     "vcsa%u", tty->index + 1);
 }
 
 void vcs_remove_sysfs(struct tty_struct *tty)
@@ -499,7 +499,7 @@ int __init vcs_init(void)
                panic("unable to get major %d for vcs device", VCS_MAJOR);
        vc_class = class_create(THIS_MODULE, "vc");
 
-       device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
-       device_create_drvdata(vc_class, NULL, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
+       device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 0), NULL, "vcs");
+       device_create(vc_class, NULL, MKDEV(VCS_MAJOR, 128), NULL, "vcsa");
        return 0;
 }
index 7a70a40ad639855b4f3880386ef7b34f47d71f46..ffc9254f7e029d26c7cd0d0d38f75d7f32570e2c 100644 (file)
@@ -886,10 +886,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        state[i].cur_part = 0;
        for (j = 0; j < MAX_PARTITIONS; ++j)
                state[i].part_stat_rwi[j] = VIOT_IDLE;
-       device_create_drvdata(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i),
-                             NULL, "iseries!vt%d", i);
-       device_create_drvdata(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80),
-                             NULL, "iseries!nvt%d", i);
+       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i), NULL,
+                     "iseries!vt%d", i);
+       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80), NULL,
+                     "iseries!nvt%d", i);
        printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries "
                        "resource %10.10s type %4.4s, model %3.3s\n",
                        i, viotape_unitinfo[i].rsrcname,
index 278c9857bcf548c14de1c8b7fed133530c6e82f4..ed132fe55d3d35aad97339593d5a131fc601b8ba 100644 (file)
@@ -657,8 +657,7 @@ static int __devinit hwicap_setup(struct device *dev, int id,
                goto failed3;
        }
 
-       device_create_drvdata(icap_class, dev, devt, NULL,
-                             "%s%d", DRIVER_NAME, id);
+       device_create(icap_class, dev, devt, NULL, "%s%d", DRIVER_NAME, id);
        return 0;               /* success */
 
  failed3:
index 7af4b403bd2d12a6f3219f8f8d6615f5de69def1..bb538b9690e08186ae6c7d73240901b95b6b9ee3 100644 (file)
@@ -15,9 +15,8 @@ int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot)
        struct device *cd;
        static int req_count;
 
-       cd = device_create_drvdata(dca_class, dca->cd,
-                                  MKDEV(0, slot + 1), NULL,
-                                  "requester%d", req_count++);
+       cd = device_create(dca_class, dca->cd, MKDEV(0, slot + 1), NULL,
+                          "requester%d", req_count++);
        if (IS_ERR(cd))
                return PTR_ERR(cd);
        return 0;
@@ -48,8 +47,7 @@ idr_try_again:
                return err;
        }
 
-       cd = device_create_drvdata(dca_class, dev, MKDEV(0, 0), NULL,
-                                  "dca%d", dca->id);
+       cd = device_create(dca_class, dev, MKDEV(0, 0), NULL, "dca%d", dca->id);
        if (IS_ERR(cd)) {
                spin_lock(&dca_idr_lock);
                idr_remove(&dca_idr, dca->id);
index b91ef63126ede7decff0bdbbbd475f03a07bd219..deb154aa47c412be66f4ee68281f053cf7a4c241 100644 (file)
@@ -334,9 +334,9 @@ static void ibft_release(struct kobject *kobj)
 /*
  *  Routines for parsing the iBFT data to be human readable.
  */
-ssize_t ibft_attr_show_initiator(struct ibft_kobject *entry,
-                                 struct ibft_attribute *attr,
-                                 char *buf)
+static ssize_t ibft_attr_show_initiator(struct ibft_kobject *entry,
+                                       struct ibft_attribute *attr,
+                                       char *buf)
 {
        struct ibft_initiator *initiator = entry->initiator;
        void *ibft_loc = entry->header;
@@ -376,9 +376,9 @@ ssize_t ibft_attr_show_initiator(struct ibft_kobject *entry,
        return str - buf;
 }
 
-ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,
-                           struct ibft_attribute *attr,
-                           char *buf)
+static ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,
+                                 struct ibft_attribute *attr,
+                                 char *buf)
 {
        struct ibft_nic *nic = entry->nic;
        void *ibft_loc = entry->header;
@@ -440,9 +440,9 @@ ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,
        return str - buf;
 };
 
-ssize_t ibft_attr_show_target(struct ibft_kobject *entry,
-                              struct ibft_attribute *attr,
-                              char *buf)
+static ssize_t ibft_attr_show_target(struct ibft_kobject *entry,
+                                    struct ibft_attribute *attr,
+                                    char *buf)
 {
        struct ibft_tgt *tgt = entry->tgt;
        void *ibft_loc = entry->header;
index 497e0d1dd3c374c7f65129a487f11bb4c807364a..af3edb98df435f2c3fa22fde81350d4f15dcd286 100644 (file)
@@ -326,9 +326,8 @@ int hidraw_connect(struct hid_device *hid)
                goto out;
        }
 
-       dev->dev = device_create_drvdata(hidraw_class, NULL,
-                                        MKDEV(hidraw_major, minor), NULL,
-                                        "%s%d", "hidraw", minor);
+       dev->dev = device_create(hidraw_class, NULL, MKDEV(hidraw_major, minor),
+                                NULL, "%s%d", "hidraw", minor);
 
        if (IS_ERR(dev->dev)) {
                spin_lock(&minors_lock);
index 7321a88a51128adef8ba40016e03f0648b7e4a97..076a59cdabe9f7a205cedd3883d40416e2e9b9c7 100644 (file)
@@ -55,8 +55,8 @@ again:
                return ERR_PTR(err);
 
        id = id & MAX_ID_MASK;
-       hwdev = device_create_drvdata(hwmon_class, dev, MKDEV(0, 0), NULL,
-                                     HWMON_ID_FORMAT, id);
+       hwdev = device_create(hwmon_class, dev, MKDEV(0, 0), NULL,
+                             HWMON_ID_FORMAT, id);
 
        if (IS_ERR(hwdev)) {
                spin_lock(&idr_lock);
index 307d976c9b69b977c389e62abfbe43682b1d3e24..c171988a9f517d7009319674265c47a10859a8c3 100644 (file)
@@ -521,9 +521,9 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap)
                return PTR_ERR(i2c_dev);
 
        /* register this i2c device with the driver core */
-       i2c_dev->dev = device_create_drvdata(i2c_dev_class, &adap->dev,
-                                            MKDEV(I2C_MAJOR, adap->nr),
-                                            NULL, "i2c-%d", adap->nr);
+       i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,
+                                    MKDEV(I2C_MAJOR, adap->nr), NULL,
+                                    "i2c-%d", adap->nr);
        if (IS_ERR(i2c_dev->dev)) {
                res = PTR_ERR(i2c_dev->dev);
                goto error;
index f27baa5f140e903cff37678d6be157be55f4decd..19f8c7770a25d7449486b3df07b56cf536ee5b76 100644 (file)
@@ -657,8 +657,8 @@ static int ide_register_port(ide_hwif_t *hwif)
                goto out;
        }
 
-       hwif->portdev = device_create_drvdata(ide_port_class, &hwif->gendev,
-                                             MKDEV(0, 0), hwif, hwif->name);
+       hwif->portdev = device_create(ide_port_class, &hwif->gendev,
+                                     MKDEV(0, 0), hwif, hwif->name);
        if (IS_ERR(hwif->portdev)) {
                ret = PTR_ERR(hwif->portdev);
                device_unregister(&hwif->gendev);
index 25ac60f532730a0d19edfdf923f660f7c8b4e0dc..d879c7797cde3a6ab961088f65ac17ca441f4120 100644 (file)
@@ -2420,12 +2420,11 @@ static int ide_tape_probe(ide_drive_t *drive)
 
        idetape_setup(drive, tape, minor);
 
-       device_create_drvdata(idetape_sysfs_class, &drive->gendev,
-                             MKDEV(IDETAPE_MAJOR, minor), NULL,
-                             "%s", tape->name);
-       device_create_drvdata(idetape_sysfs_class, &drive->gendev,
-                             MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
-                             "n%s", tape->name);
+       device_create(idetape_sysfs_class, &drive->gendev,
+                     MKDEV(IDETAPE_MAJOR, minor), NULL, "%s", tape->name);
+       device_create(idetape_sysfs_class, &drive->gendev,
+                     MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
+                     "n%s", tape->name);
 
        g->fops = &idetape_block_ops;
        ide_register_region(g);
index b6eb2cf25914479667439fa51e181fca1e986fbd..9236c0d5a12242120e11a7bd95b6c10617d0b480 100644 (file)
@@ -2296,10 +2296,10 @@ static void dv1394_add_host(struct hpsb_host *host)
 
        ohci = (struct ti_ohci *)host->hostdata;
 
-       device_create_drvdata(hpsb_protocol_class, NULL,
-                             MKDEV(IEEE1394_MAJOR,
-                                   IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)), NULL,
-                             "dv1394-%d", id);
+       device_create(hpsb_protocol_class, NULL,
+                     MKDEV(IEEE1394_MAJOR,
+                           IEEE1394_MINOR_BLOCK_DV1394 * 16 + (id<<2)),
+                     NULL, "dv1394-%d", id);
 
        dv1394_init(ohci, DV1394_NTSC, MODE_RECEIVE);
        dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);
index 6fa9e4a21840b5f0cad2ce28b3754b293913e8fc..c7833bb37ae1e134eea46034e5cdda13765f49ab 100644 (file)
@@ -3010,10 +3010,10 @@ static int __init init_raw1394(void)
        hpsb_register_highlevel(&raw1394_highlevel);
 
        if (IS_ERR
-           (device_create_drvdata(
-             hpsb_protocol_class, NULL,
-             MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16),
-             NULL, RAW1394_DEVICE_NAME))) {
+           (device_create(hpsb_protocol_class, NULL,
+                          MKDEV(IEEE1394_MAJOR,
+                                IEEE1394_MINOR_BLOCK_RAW1394 * 16),
+                          NULL, RAW1394_DEVICE_NAME))) {
                ret = -EFAULT;
                goto out_unreg;
        }
index 25db6e67fa4ea6d123f9a71df2e9c44616e84c3d..6e73b06eed4f3afdb7e39342c64b8d82c2cc5a2c 100644 (file)
@@ -1341,9 +1341,8 @@ static void video1394_add_host (struct hpsb_host *host)
        hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
 
        minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->host->id;
-       device_create_drvdata(hpsb_protocol_class, NULL,
-                             MKDEV(IEEE1394_MAJOR, minor), NULL,
-                             "%s-%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
+       device_create(hpsb_protocol_class, NULL, MKDEV(IEEE1394_MAJOR, minor),
+                     NULL, "%s-%d", VIDEO1394_DRIVER_NAME, ohci->host->id);
 }
 
 
index 3cab0cedfca21f54d83027a78f1f6c6a3c1a1b8e..a78d35aecee3de339520308358d6ca565d69cdd1 100644 (file)
@@ -3691,9 +3691,9 @@ static void cm_add_one(struct ib_device *ib_device)
        cm_dev->ib_device = ib_device;
        cm_get_ack_delay(cm_dev);
 
-       cm_dev->device = device_create_drvdata(&cm_class, &ib_device->dev,
-                                              MKDEV(0, 0), NULL,
-                                              "%s", ib_device->name);
+       cm_dev->device = device_create(&cm_class, &ib_device->dev,
+                                      MKDEV(0, 0), NULL,
+                                      "%s", ib_device->name);
        if (!cm_dev->device) {
                kfree(cm_dev);
                return;
index 268a2d23b7c9a8e9092877ca319989891e99e90d..8c46f2257098cf2d7e01ba472c31a48dc5ffb77a 100644 (file)
@@ -1016,9 +1016,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
        if (cdev_add(port->cdev, base_dev + port->dev_num, 1))
                goto err_cdev;
 
-       port->dev = device_create_drvdata(umad_class, device->dma_device,
-                                         port->cdev->dev, port,
-                                         "umad%d", port->dev_num);
+       port->dev = device_create(umad_class, device->dma_device,
+                                 port->cdev->dev, port,
+                                 "umad%d", port->dev_num);
        if (IS_ERR(port->dev))
                goto err_cdev;
 
@@ -1036,9 +1036,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,
        if (cdev_add(port->sm_cdev, base_dev + port->dev_num + IB_UMAD_MAX_PORTS, 1))
                goto err_sm_cdev;
 
-       port->sm_dev = device_create_drvdata(umad_class, device->dma_device,
-                                            port->sm_cdev->dev, port,
-                                            "issm%d", port->dev_num);
+       port->sm_dev = device_create(umad_class, device->dma_device,
+                                    port->sm_cdev->dev, port,
+                                    "issm%d", port->dev_num);
        if (IS_ERR(port->sm_dev))
                goto err_sm_cdev;
 
index aeee856c4060648f4898c4014d30ed2c73065bdd..d85af1b670274466f5ec13a518d8011da1cb7da0 100644 (file)
@@ -764,12 +764,9 @@ static void ib_uverbs_add_one(struct ib_device *device)
        if (cdev_add(uverbs_dev->cdev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
                goto err_cdev;
 
-       uverbs_dev->dev = device_create_drvdata(uverbs_class,
-                                               device->dma_device,
-                                               uverbs_dev->cdev->dev,
-                                               uverbs_dev,
-                                               "uverbs%d",
-                                               uverbs_dev->devnum);
+       uverbs_dev->dev = device_create(uverbs_class, device->dma_device,
+                                       uverbs_dev->cdev->dev, uverbs_dev,
+                                       "uverbs%d", uverbs_dev->devnum);
        if (IS_ERR(uverbs_dev->dev))
                goto err_cdev;
 
index 56c0eda3c0772816f09e9b975090707929b826f3..1af1f3a907c6eb25a7930a6fd2e22ca36ad7135b 100644 (file)
@@ -2455,7 +2455,7 @@ static int init_cdev(int minor, char *name, const struct file_operations *fops,
                goto err_cdev;
        }
 
-       device = device_create_drvdata(ipath_class, NULL, dev, NULL, name);
+       device = device_create(ipath_class, NULL, dev, NULL, name);
 
        if (IS_ERR(device)) {
                ret = PTR_ERR(device);
index 798d7f3e42efbcaad5e871b0590a6cc77933fbc1..1b5bf87c4cf4719cd66e75575d3b97250e368e06 100644 (file)
@@ -1553,8 +1553,7 @@ static int __init capi_init(void)
                return PTR_ERR(capi_class);
        }
 
-       device_create_drvdata(capi_class, NULL, MKDEV(capi_major, 0), NULL,
-                             "capi");
+       device_create(capi_class, NULL, MKDEV(capi_major, 0), NULL, "capi");
 
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
        if (capinc_tty_init() < 0) {
index 559a40861c39b2e8e8fd7531acb06dc00a20dde2..ee74ee7b2accab837fc43c0c8cda523795bed5ce 100644 (file)
@@ -103,8 +103,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev)
 {
        int rc;
 
-       led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
-                                             "%s", led_cdev->name);
+       led_cdev->dev = device_create(leds_class, parent, 0, led_cdev,
+                                     "%s", led_cdev->name);
        if (IS_ERR(led_cdev->dev))
                return PTR_ERR(led_cdev->dev);
 
index cae52485208aaf022bd57689dcf8a4b30173aa2e..23741cec45e3e43210fdbac7e11c6ecc9c4eb1d5 100644 (file)
@@ -862,8 +862,7 @@ adbdev_init(void)
        adb_dev_class = class_create(THIS_MODULE, "adb");
        if (IS_ERR(adb_dev_class))
                return;
-       device_create_drvdata(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL,
-                             "adb");
+       device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
 
        platform_device_register(&adb_pfdev);
        platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
index e7132770a3bfdd656117890d11ff4ee6c9195302..665776d72a48c0456b712b25894760e60f48e4e8 100644 (file)
@@ -233,7 +233,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 
        mutex_unlock(&dvbdev_register_lock);
 
-       clsdev = device_create_drvdata(dvb_class, adap->device,
+       clsdev = device_create(dvb_class, adap->device,
                               MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)),
                               NULL, "dvb%d.%s%d", adap->num, dnames[type], id);
        if (IS_ERR(clsdev)) {
index daf585689ce33a0e77a07bd3991e2165f8c04acb..abdebe347383903d93f43e59365a76ef2b6db48f 100644 (file)
@@ -399,9 +399,9 @@ static int __devinit phantom_probe(struct pci_dev *pdev,
                goto err_irq;
        }
 
-       if (IS_ERR(device_create_drvdata(phantom_class, &pdev->dev,
-                                        MKDEV(phantom_major, minor),
-                                        NULL, "phantom%u", minor)))
+       if (IS_ERR(device_create(phantom_class, &pdev->dev,
+                                MKDEV(phantom_major, minor), NULL,
+                                "phantom%u", minor)))
                dev_err(&pdev->dev, "can't create device\n");
 
        pci_set_drvdata(pdev, pht);
index e00d424e6575da02ed20246b44c6545c1cbe8b34..1c74762dec89c25f73c3d7ab7fa4fbdaf2e08688 100644 (file)
@@ -26,13 +26,11 @@ static void mtd_notify_add(struct mtd_info* mtd)
        if (!mtd)
                return;
 
-       device_create_drvdata(mtd_class, NULL,
-                             MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
-                             NULL, "mtd%d", mtd->index);
+       device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2),
+                     NULL, "mtd%d", mtd->index);
 
-       device_create_drvdata(mtd_class, NULL,
-                             MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
-                             NULL, "mtd%dro", mtd->index);
+       device_create(mtd_class, NULL, MKDEV(MTD_CHAR_MAJOR, mtd->index*2+1),
+                     NULL, "mtd%dro", mtd->index);
 }
 
 static void mtd_notify_remove(struct mtd_info* mtd)
index f11e900b437b66044b422da02e26fe4a4efdeff6..e11b03b2b25a776c2494951953feeb44777d2f84 100644 (file)
@@ -309,11 +309,6 @@ void phy_disconnect(struct phy_device *phydev)
 }
 EXPORT_SYMBOL(phy_disconnect);
 
-static int phy_compare_id(struct device *dev, void *data)
-{
-       return strcmp((char *)data, dev->bus_id) ? 0 : 1;
-}
-
 /**
  * phy_attach - attach a network device to a particular PHY device
  * @dev: network device to attach
@@ -337,8 +332,7 @@ struct phy_device *phy_attach(struct net_device *dev,
 
        /* Search the list of PHY devices on the mdio bus for the
         * PHY with the requested name */
-       d = bus_find_device(bus, NULL, (void *)bus_id, phy_compare_id);
-
+       d = bus_find_device_by_name(bus, NULL, bus_id);
        if (d) {
                phydev = to_phy_device(d);
        } else {
index 94818ee3cef5d3a8cb0cf62fbd960a128fb947b9..7e857e938adb582ae432b26d35114e8099d51eb2 100644 (file)
@@ -866,8 +866,8 @@ static int __init ppp_init(void)
                        err = PTR_ERR(ppp_class);
                        goto out_chrdev;
                }
-               device_create_drvdata(ppp_class, NULL, MKDEV(PPP_MAJOR, 0),
-                                     NULL, "ppp");
+               device_create(ppp_class, NULL, MKDEV(PPP_MAJOR, 0), NULL,
+                             "ppp");
        }
 
 out:
index f14051556c87d08098108f2f695a5bc2c6d35f5a..7f97f8d08c39eeba79eaa4da5cdfc5368d59487d 100644 (file)
@@ -388,8 +388,8 @@ static int __init cosa_init(void)
                goto out_chrdev;
        }
        for (i = 0; i < nr_cards; i++)
-               device_create_drvdata(cosa_class, NULL, MKDEV(cosa_major, i),
-                                     NULL, "cosa%d", i);
+               device_create(cosa_class, NULL, MKDEV(cosa_major, i), NULL,
+                             "cosa%d", i);
        err = 0;
        goto out;
 
index c9e4a435b2fc04d916ae61e6db150345027a568c..1a019e98dac3ee8ef0b7be504a6cee8af6a36369 100644 (file)
@@ -533,11 +533,11 @@ static int __init init_mac80211_hwsim(void)
                data = hw->priv;
                data->hw = hw;
 
-               data->dev = device_create_drvdata(hwsim_class, NULL, 0, hw,
-                                               "hwsim%d", i);
+               data->dev = device_create(hwsim_class, NULL, 0, hw,
+                                         "hwsim%d", i);
                if (IS_ERR(data->dev)) {
                        printk(KERN_DEBUG
-                              "mac80211_hwsim: device_create_drvdata "
+                              "mac80211_hwsim: device_create "
                               "failed (%ld)\n", PTR_ERR(data->dev));
                        err = -ENOMEM;
                        goto failed_drvdata;
index 36698e57b97f659dbc20f03f4f6df6fe0e718694..dd9161a054e1c1264891a918a634d5a60fa0d062 100644 (file)
@@ -1237,8 +1237,11 @@ EXPORT_SYMBOL(pci_scan_bridge);
 EXPORT_SYMBOL_GPL(pci_scan_child_bus);
 #endif
 
-static int __init pci_sort_bf_cmp(const struct pci_dev *a, const struct pci_dev *b)
+static int __init pci_sort_bf_cmp(const struct device *d_a, const struct device *d_b)
 {
+       const struct pci_dev *a = to_pci_dev(d_a);
+       const struct pci_dev *b = to_pci_dev(d_b);
+
        if      (pci_domain_nr(a->bus) < pci_domain_nr(b->bus)) return -1;
        else if (pci_domain_nr(a->bus) > pci_domain_nr(b->bus)) return  1;
 
@@ -1251,50 +1254,7 @@ static int __init pci_sort_bf_cmp(const struct pci_dev *a, const struct pci_dev
        return 0;
 }
 
-/*
- * Yes, this forcably breaks the klist abstraction temporarily.  It
- * just wants to sort the klist, not change reference counts and
- * take/drop locks rapidly in the process.  It does all this while
- * holding the lock for the list, so objects can't otherwise be
- * added/removed while we're swizzling.
- */
-static void __init pci_insertion_sort_klist(struct pci_dev *a, struct list_head *list)
-{
-       struct list_head *pos;
-       struct klist_node *n;
-       struct device *dev;
-       struct pci_dev *b;
-
-       list_for_each(pos, list) {
-               n = container_of(pos, struct klist_node, n_node);
-               dev = container_of(n, struct device, knode_bus);
-               b = to_pci_dev(dev);
-               if (pci_sort_bf_cmp(a, b) <= 0) {
-                       list_move_tail(&a->dev.knode_bus.n_node, &b->dev.knode_bus.n_node);
-                       return;
-               }
-       }
-       list_move_tail(&a->dev.knode_bus.n_node, list);
-}
-
 void __init pci_sort_breadthfirst(void)
 {
-       LIST_HEAD(sorted_devices);
-       struct list_head *pos, *tmp;
-       struct klist_node *n;
-       struct device *dev;
-       struct pci_dev *pdev;
-       struct klist *device_klist;
-
-       device_klist = bus_get_device_klist(&pci_bus_type);
-
-       spin_lock(&device_klist->k_lock);
-       list_for_each_safe(pos, tmp, &device_klist->k_list) {
-               n = container_of(pos, struct klist_node, n_node);
-               dev = container_of(n, struct device, knode_bus);
-               pdev = to_pci_dev(dev);
-               pci_insertion_sort_klist(pdev, &sorted_devices);
-       }
-       list_splice(&sorted_devices, &device_klist->k_list);
-       spin_unlock(&device_klist->k_lock);
+       bus_sort_breadthfirst(&pci_bus_type, &pci_sort_bf_cmp);
 }
index 7cc7bf5304aa040cef5d6132642b5dc21d47c347..3b8b9d3cb03d6cc2f8738e67abd145ff09a4285f 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 extern spinlock_t pnp_lock;
+extern struct device_attribute pnp_interface_attrs[];
 void *pnp_alloc(long size);
 
 int pnp_register_protocol(struct pnp_protocol *protocol);
@@ -16,7 +17,6 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);
 
 int pnp_add_device(struct pnp_dev *dev);
 struct pnp_id *pnp_add_id(struct pnp_dev *dev, char *id);
-int pnp_interface_attach_device(struct pnp_dev *dev);
 
 int pnp_add_card(struct pnp_card *card);
 void pnp_remove_card(struct pnp_card *card);
index cc0aeaed6179780e3ffb6b3cc4153f0729131110..817fe626e15b2d78a5cfa32ab7f26e761ee37009 100644 (file)
@@ -159,21 +159,13 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpid
 
 int __pnp_add_device(struct pnp_dev *dev)
 {
-       int ret;
-
        pnp_fixup_device(dev);
        dev->status = PNP_READY;
        spin_lock(&pnp_lock);
        list_add_tail(&dev->global_list, &pnp_global);
        list_add_tail(&dev->protocol_list, &dev->protocol->devices);
        spin_unlock(&pnp_lock);
-
-       ret = device_register(&dev->dev);
-       if (ret)
-               return ret;
-
-       pnp_interface_attach_device(dev);
-       return 0;
+       return device_register(&dev->dev);
 }
 
 /*
index d3f869ee1d92a5b8e90919b6df880efb7ec73ee8..e3f7e89c4dfb29a794a86a40a8bcf088550c032f 100644 (file)
@@ -206,6 +206,7 @@ struct bus_type pnp_bus_type = {
        .remove  = pnp_device_remove,
        .suspend = pnp_bus_suspend,
        .resume  = pnp_bus_resume,
+       .dev_attrs = pnp_interface_attrs,
 };
 
 int pnp_register_driver(struct pnp_driver *drv)
index a876ecf7028c06c003d5fc1aed974bb9f5f97f98..478a4a739c00dabdc3ccf3a4689b2e84c32d5ce6 100644 (file)
@@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,
        return ret;
 }
 
-static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL);
-
 static ssize_t pnp_show_current_resources(struct device *dmdev,
                                          struct device_attribute *attr,
                                          char *buf)
@@ -420,9 +418,6 @@ done:
        return count;
 }
 
-static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR,
-                  pnp_show_current_resources, pnp_set_current_resources);
-
 static ssize_t pnp_show_current_ids(struct device *dmdev,
                                    struct device_attribute *attr, char *buf)
 {
@@ -437,27 +432,11 @@ static ssize_t pnp_show_current_ids(struct device *dmdev,
        return (str - buf);
 }
 
-static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL);
-
-int pnp_interface_attach_device(struct pnp_dev *dev)
-{
-       int rc = device_create_file(&dev->dev, &dev_attr_options);
-
-       if (rc)
-               goto err;
-       rc = device_create_file(&dev->dev, &dev_attr_resources);
-       if (rc)
-               goto err_opt;
-       rc = device_create_file(&dev->dev, &dev_attr_id);
-       if (rc)
-               goto err_res;
-
-       return 0;
-
-err_res:
-       device_remove_file(&dev->dev, &dev_attr_resources);
-err_opt:
-       device_remove_file(&dev->dev, &dev_attr_options);
-err:
-       return rc;
-}
+struct device_attribute pnp_interface_attrs[] = {
+       __ATTR(resources, S_IRUGO | S_IWUSR,
+                  pnp_show_current_resources,
+                  pnp_set_current_resources),
+       __ATTR(options, S_IRUGO, pnp_show_options, NULL),
+       __ATTR(id, S_IRUGO, pnp_show_current_ids, NULL),
+       __ATTR_NULL,
+};
index cb1ccb4729210c1a3cfd8901bf7dea5c56117146..3007695f90c822e067a31e3c44da67d4598ff2e7 100644 (file)
@@ -91,8 +91,8 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
 {
        int rc = 0;
 
-       psy->dev = device_create_drvdata(power_supply_class, parent, 0,
-                                        psy, "%s", psy->name);
+       psy->dev = device_create(power_supply_class, parent, 0, psy,
+                                "%s", psy->name);
        if (IS_ERR(psy->dev)) {
                rc = PTR_ERR(psy->dev);
                goto dev_create_failed;
index 1792b2c0130e2c3948ddab8e4798790a7af7b99c..0b15cf107ec97d9162506d1acc23d678416692a3 100644 (file)
@@ -1168,19 +1168,17 @@ static int raw3270_create_attributes(struct raw3270 *rp)
        if (rc)
                goto out;
 
-       rp->clttydev = device_create_drvdata(class3270, &rp->cdev->dev,
-                                            MKDEV(IBM_TTY3270_MAJOR, rp->minor),
-                                            NULL,
-                                            "tty%s", dev_name(&rp->cdev->dev));
+       rp->clttydev = device_create(class3270, &rp->cdev->dev,
+                                    MKDEV(IBM_TTY3270_MAJOR, rp->minor), NULL,
+                                    "tty%s", dev_name(&rp->cdev->dev));
        if (IS_ERR(rp->clttydev)) {
                rc = PTR_ERR(rp->clttydev);
                goto out_ttydev;
        }
 
-       rp->cltubdev = device_create_drvdata(class3270, &rp->cdev->dev,
-                                            MKDEV(IBM_FS3270_MAJOR, rp->minor),
-                                            NULL,
-                                            "tub%s", dev_name(&rp->cdev->dev));
+       rp->cltubdev = device_create(class3270, &rp->cdev->dev,
+                                    MKDEV(IBM_FS3270_MAJOR, rp->minor), NULL,
+                                    "tub%s", dev_name(&rp->cdev->dev));
        if (!IS_ERR(rp->cltubdev))
                goto out;
 
index 12c2a5aaf31b47e88587957b7f31cb6a24edff7b..ddc914ccea8fccef284bd467cd9a4fe7eb4c625a 100644 (file)
@@ -69,9 +69,9 @@ struct tape_class_device *register_tape_dev(
        if (rc)
                goto fail_with_cdev;
 
-       tcd->class_device = device_create_drvdata(tape_class, device,
-                                                 tcd->char_device->dev,
-                                                 NULL, "%s", tcd->device_name);
+       tcd->class_device = device_create(tape_class, device,
+                                         tcd->char_device->dev, NULL,
+                                         "%s", tcd->device_name);
        rc = IS_ERR(tcd->class_device) ? PTR_ERR(tcd->class_device) : 0;
        if (rc)
                goto fail_with_cdev;
index 42173cc34610f41417b877387dd052517638b6b8..24762727bc27ff80243951dd47a984128af3ed61 100644 (file)
@@ -747,10 +747,10 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
                device_unregister(dev);
                return ret;
        }
-       priv->class_device = device_create_drvdata(vmlogrdr_class, dev,
-                                                  MKDEV(vmlogrdr_major,
-                                                        priv->minor_num),
-                                                  priv, "%s", dev_name(dev));
+       priv->class_device = device_create(vmlogrdr_class, dev,
+                                          MKDEV(vmlogrdr_major,
+                                                priv->minor_num),
+                                          priv, "%s", dev_name(dev));
        if (IS_ERR(priv->class_device)) {
                ret = PTR_ERR(priv->class_device);
                priv->class_device=NULL;
index 6fdfa5ddeca8f686938f0b52d4bb28b504bfcddc..9020eba620eee22fe8ae36bd0716596c38ae9a7f 100644 (file)
@@ -896,9 +896,8 @@ static int ur_set_online(struct ccw_device *cdev)
                goto fail_free_cdev;
        }
 
-       urd->device = device_create_drvdata(vmur_class, NULL,
-                                           urd->char_device->dev, NULL,
-                                           "%s", node_id);
+       urd->device = device_create(vmur_class, NULL, urd->char_device->dev,
+                                   NULL, "%s", node_id);
        if (IS_ERR(urd->device)) {
                rc = PTR_ERR(urd->device);
                TRACE("ur_set_online: device_create rc=%d\n", rc);
index 3c257fe0893e51c9740f226b752a559321cb95a4..88ecf94ad979f92d737fb24adb25ef0fe2a58125 100644 (file)
@@ -914,9 +914,9 @@ static int ch_probe(struct device *dev)
        ch->minor = minor;
        sprintf(ch->name,"ch%d",ch->minor);
 
-       class_dev = device_create_drvdata(ch_sysfs_class, dev,
-                                         MKDEV(SCSI_CHANGER_MAJOR, ch->minor),
-                                         ch, "s%s", ch->name);
+       class_dev = device_create(ch_sysfs_class, dev,
+                                 MKDEV(SCSI_CHANGER_MAJOR, ch->minor), ch,
+                                 "s%s", ch->name);
        if (IS_ERR(class_dev)) {
                printk(KERN_WARNING "ch%d: device_create failed\n",
                       ch->minor);
index 1fe0901e81192d91dad44c4773908c1f6492d39a..8aba4fdfb5222b40d93a8e231fd1b69858ddecdc 100644 (file)
@@ -271,7 +271,7 @@ rebuild_sys_tab:
                pHba->initialized = TRUE;
                pHba->state &= ~DPTI_STATE_RESET;
                if (adpt_sysfs_class) {
-                       struct device *dev = device_create_drvdata(adpt_sysfs_class,
+                       struct device *dev = device_create(adpt_sysfs_class,
                                NULL, MKDEV(DPTI_I2O_MAJOR, pHba->unit), NULL,
                                "dpti%d", pHba->unit);
                        if (IS_ERR(dev)) {
index 1c79f9794f4e82bf1e5f30da63bda2b9ace3418b..0ea78d9a37db1a6b0da5b0a18f93fba2aa826a4e 100644 (file)
@@ -5708,7 +5708,8 @@ static int osst_sysfs_add(dev_t dev, struct device *device, struct osst_tape * S
        struct device *osst_member;
        int err;
 
-       osst_member = device_create_drvdata(osst_sysfs_class, device, dev, STp, "%s", name);
+       osst_member = device_create(osst_sysfs_class, device, dev, STp,
+                                   "%s", name);
        if (IS_ERR(osst_member)) {
                printk(KERN_WARNING "osst :W: Unable to add sysfs class member %s\n", name);
                return PTR_ERR(osst_member);
index ba9b9bbd4e7385e8d83f3ed4f4a1151b96ab3a1f..93bd59a1ed79b80bde26a459b45b0a0d40ae7f83 100644 (file)
@@ -1450,12 +1450,10 @@ sg_add(struct device *cl_dev, struct class_interface *cl_intf)
        if (sg_sysfs_valid) {
                struct device *sg_class_member;
 
-               sg_class_member = device_create_drvdata(sg_sysfs_class,
-                                                       cl_dev->parent,
-                                                       MKDEV(SCSI_GENERIC_MAJOR,
-                                                             sdp->index),
-                                                       sdp,
-                                                       "%s", disk->disk_name);
+               sg_class_member = device_create(sg_sysfs_class, cl_dev->parent,
+                                               MKDEV(SCSI_GENERIC_MAJOR,
+                                                     sdp->index),
+                                               sdp, "%s", disk->disk_name);
                if (IS_ERR(sg_class_member)) {
                        printk(KERN_ERR "sg_add: "
                               "device_create failed\n");
index c2bb53e3d941faee5d29f5902ac757093102d772..5c28d08f18f46a1bc3f28c5451f84606af747f7c 100644 (file)
@@ -4428,13 +4428,10 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)
                snprintf(name, 10, "%s%s%s", rew ? "n" : "",
                         STp->disk->disk_name, st_formats[i]);
                st_class_member =
-                       device_create_drvdata(st_sysfs_class,
-                                             &STp->device->sdev_gendev,
-                                             MKDEV(SCSI_TAPE_MAJOR,
-                                                   TAPE_MINOR(dev_num,
-                                                             mode, rew)),
-                                             &STp->modes[mode],
-                                             "%s", name);
+                       device_create(st_sysfs_class, &STp->device->sdev_gendev,
+                                     MKDEV(SCSI_TAPE_MAJOR,
+                                           TAPE_MINOR(dev_num, mode, rew)),
+                                     &STp->modes[mode], "%s", name);
                if (IS_ERR(st_class_member)) {
                        printk(KERN_WARNING "st%d: device_create failed\n",
                               dev_num);
index e5e0cfed5e3b3fedff7f81983a73f4b94a9de8ca..89a43755a453bb265ebfa789adca222a8cce1ebe 100644 (file)
@@ -583,10 +583,9 @@ static int spidev_probe(struct spi_device *spi)
                struct device *dev;
 
                spidev->devt = MKDEV(SPIDEV_MAJOR, minor);
-               dev = device_create_drvdata(spidev_class, &spi->dev,
-                               spidev->devt, spidev,
-                               "spidev%d.%d",
-                               spi->master->bus_num, spi->chip_select);
+               dev = device_create(spidev_class, &spi->dev, spidev->devt,
+                                   spidev, "spidev%d.%d",
+                                   spi->master->bus_num, spi->chip_select);
                status = IS_ERR(dev) ? PTR_ERR(dev) : 0;
        } else {
                dev_dbg(&spi->dev, "no minor number available!\n");
index 4190be64917f416be6f4809929bf0e23b78a755d..04b954cfce7608827a821138df74db9caccb9f80 100644 (file)
@@ -58,4 +58,17 @@ config UIO_SMX
 
          If you compile this as a module, it will be called uio_smx.
 
+config UIO_SERCOS3
+       tristate "Automata Sercos III PCI card driver"
+       default n
+       help
+         Userspace I/O interface for the Sercos III PCI card from
+         Automata GmbH. The userspace part of this driver will be
+         available for download from the Automata GmbH web site.
+
+         Automata GmbH:        http://www.automataweb.com
+         Sercos III interface: http://www.sercos.com
+
+         If you compile this as a module, it will be called uio_sercos3.
+
 endif
index 8667bbdef904fc3ddd2df2d1208938f5fdcc2a7e..e69558149859f0dd36b1d0433190d6e06773aafa 100644 (file)
@@ -3,3 +3,4 @@ obj-$(CONFIG_UIO_CIF)   += uio_cif.o
 obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o
 obj-$(CONFIG_UIO_PDRV_GENIRQ)  += uio_pdrv_genirq.o
 obj-$(CONFIG_UIO_SMX)  += uio_smx.o
+obj-$(CONFIG_UIO_SERCOS3)      += uio_sercos3.o
index 3a6934bf713134edc3f53b68e25bf913ec3215e4..5dccf057a7dd41a5f31f69ec4d5d7982615655ec 100644 (file)
@@ -67,6 +67,11 @@ static ssize_t map_size_show(struct uio_mem *mem, char *buf)
        return sprintf(buf, "0x%lx\n", mem->size);
 }
 
+static ssize_t map_offset_show(struct uio_mem *mem, char *buf)
+{
+       return sprintf(buf, "0x%lx\n", mem->addr & ~PAGE_MASK);
+}
+
 struct uio_sysfs_entry {
        struct attribute attr;
        ssize_t (*show)(struct uio_mem *, char *);
@@ -77,10 +82,13 @@ static struct uio_sysfs_entry addr_attribute =
        __ATTR(addr, S_IRUGO, map_addr_show, NULL);
 static struct uio_sysfs_entry size_attribute =
        __ATTR(size, S_IRUGO, map_size_show, NULL);
+static struct uio_sysfs_entry offset_attribute =
+       __ATTR(offset, S_IRUGO, map_offset_show, NULL);
 
 static struct attribute *attrs[] = {
        &addr_attribute.attr,
        &size_attribute.attr,
+       &offset_attribute.attr,
        NULL,   /* need to NULL terminate the list of attributes */
 };
 
@@ -482,15 +490,23 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
 {
        struct uio_device *idev = vma->vm_private_data;
        struct page *page;
+       unsigned long offset;
 
        int mi = uio_find_mem_index(vma);
        if (mi < 0)
                return VM_FAULT_SIGBUS;
 
+       /*
+        * We need to subtract mi because userspace uses offset = N*PAGE_SIZE
+        * to use mem[N].
+        */
+       offset = (vmf->pgoff - mi) << PAGE_SHIFT;
+
        if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
-               page = virt_to_page(idev->info->mem[mi].addr);
+               page = virt_to_page(idev->info->mem[mi].addr + offset);
        else
-               page = vmalloc_to_page((void*)idev->info->mem[mi].addr);
+               page = vmalloc_to_page((void *)idev->info->mem[mi].addr
+                                                       + offset);
        get_page(page);
        vmf->page = page;
        return 0;
@@ -682,9 +698,9 @@ int __uio_register_device(struct module *owner,
        if (ret)
                goto err_get_minor;
 
-       idev->dev = device_create_drvdata(uio_class->class, parent,
-                                         MKDEV(uio_major, idev->minor), idev,
-                                         "uio%d", idev->minor);
+       idev->dev = device_create(uio_class->class, parent,
+                                 MKDEV(uio_major, idev->minor), idev,
+                                 "uio%d", idev->minor);
        if (IS_ERR(idev->dev)) {
                printk(KERN_ERR "UIO: device register failed\n");
                ret = PTR_ERR(idev->dev);
index 0b4ef39cd85d289d3aee60264dd6044bee1f0b8b..d494ce9288c37e9b59c34962c66b291f7185a313 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/uio_driver.h>
 #include <linux/stringify.h>
 
-#define DRIVER_NAME "uio"
+#define DRIVER_NAME "uio_pdrv"
 
 struct uio_platdata {
        struct uio_info *uioinfo;
diff --git a/drivers/uio/uio_sercos3.c b/drivers/uio/uio_sercos3.c
new file mode 100644 (file)
index 0000000..a6d1b2b
--- /dev/null
@@ -0,0 +1,243 @@
+/* sercos3: UIO driver for the Automata Sercos III PCI card
+
+   Copyright (C) 2008 Linutronix GmbH
+     Author: John Ogness <john.ogness@linutronix.de>
+
+   This is a straight-forward UIO driver, where interrupts are disabled
+   by the interrupt handler and re-enabled via a write to the UIO device
+   by the userspace-part.
+
+   The only part that may seem odd is the use of a logical OR when
+   storing and restoring enabled interrupts. This is done because the
+   userspace-part could directly modify the Interrupt Enable Register
+   at any time. To reduce possible conflicts, the kernel driver uses
+   a logical OR to make more controlled changes (rather than blindly
+   overwriting previous values).
+
+   Race conditions exist if the userspace-part directly modifies the
+   Interrupt Enable Register while in operation. The consequences are
+   that certain interrupts would fail to be enabled or disabled. For
+   this reason, the userspace-part should only directly modify the
+   Interrupt Enable Register at the beginning (to get things going).
+   The userspace-part can safely disable interrupts at any time using
+   a write to the UIO device.
+*/
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/uio_driver.h>
+#include <linux/io.h>
+
+/* ID's for SERCOS III PCI card (PLX 9030) */
+#define SERCOS_SUB_VENDOR_ID  0x1971
+#define SERCOS_SUB_SYSID_3530 0x3530
+#define SERCOS_SUB_SYSID_3535 0x3535
+#define SERCOS_SUB_SYSID_3780 0x3780
+
+/* Interrupt Enable Register */
+#define IER0_OFFSET 0x08
+
+/* Interrupt Status Register */
+#define ISR0_OFFSET 0x18
+
+struct sercos3_priv {
+       u32 ier0_cache;
+       spinlock_t ier0_cache_lock;
+};
+
+/* this function assumes ier0_cache_lock is locked! */
+static void sercos3_disable_interrupts(struct uio_info *info,
+                                      struct sercos3_priv *priv)
+{
+       void __iomem *ier0 = info->mem[3].internal_addr + IER0_OFFSET;
+
+       /* add enabled interrupts to cache */
+       priv->ier0_cache |= ioread32(ier0);
+
+       /* disable interrupts */
+       iowrite32(0, ier0);
+}
+
+/* this function assumes ier0_cache_lock is locked! */
+static void sercos3_enable_interrupts(struct uio_info *info,
+                                     struct sercos3_priv *priv)
+{
+       void __iomem *ier0 = info->mem[3].internal_addr + IER0_OFFSET;
+
+       /* restore previously enabled interrupts */
+       iowrite32(ioread32(ier0) | priv->ier0_cache, ier0);
+       priv->ier0_cache = 0;
+}
+
+static irqreturn_t sercos3_handler(int irq, struct uio_info *info)
+{
+       struct sercos3_priv *priv = info->priv;
+       void __iomem *isr0 = info->mem[3].internal_addr + ISR0_OFFSET;
+       void __iomem *ier0 = info->mem[3].internal_addr + IER0_OFFSET;
+
+       if (!(ioread32(isr0) & ioread32(ier0)))
+               return IRQ_NONE;
+
+       spin_lock(&priv->ier0_cache_lock);
+       sercos3_disable_interrupts(info, priv);
+       spin_unlock(&priv->ier0_cache_lock);
+
+       return IRQ_HANDLED;
+}
+
+static int sercos3_irqcontrol(struct uio_info *info, s32 irq_on)
+{
+       struct sercos3_priv *priv = info->priv;
+
+       spin_lock_irq(&priv->ier0_cache_lock);
+       if (irq_on)
+               sercos3_enable_interrupts(info, priv);
+       else
+               sercos3_disable_interrupts(info, priv);
+       spin_unlock_irq(&priv->ier0_cache_lock);
+
+       return 0;
+}
+
+static int sercos3_setup_iomem(struct pci_dev *dev, struct uio_info *info,
+                              int n, int pci_bar)
+{
+       info->mem[n].addr = pci_resource_start(dev, pci_bar);
+       if (!info->mem[n].addr)
+               return -1;
+       info->mem[n].internal_addr = ioremap(pci_resource_start(dev, pci_bar),
+                                            pci_resource_len(dev, pci_bar));
+       if (!info->mem[n].internal_addr)
+               return -1;
+       info->mem[n].size = pci_resource_len(dev, pci_bar);
+       info->mem[n].memtype = UIO_MEM_PHYS;
+       return 0;
+}
+
+static int __devinit sercos3_pci_probe(struct pci_dev *dev,
+                                      const struct pci_device_id *id)
+{
+       struct uio_info *info;
+       struct sercos3_priv *priv;
+       int i;
+
+       info = kzalloc(sizeof(struct uio_info), GFP_KERNEL);
+       if (!info)
+               return -ENOMEM;
+
+       priv = kzalloc(sizeof(struct sercos3_priv), GFP_KERNEL);
+       if (!priv)
+               goto out_free;
+
+       if (pci_enable_device(dev))
+               goto out_free_priv;
+
+       if (pci_request_regions(dev, "sercos3"))
+               goto out_disable;
+
+       /* we only need PCI BAR's 0, 2, 3, 4, 5 */
+       if (sercos3_setup_iomem(dev, info, 0, 0))
+               goto out_unmap;
+       if (sercos3_setup_iomem(dev, info, 1, 2))
+               goto out_unmap;
+       if (sercos3_setup_iomem(dev, info, 2, 3))
+               goto out_unmap;
+       if (sercos3_setup_iomem(dev, info, 3, 4))
+               goto out_unmap;
+       if (sercos3_setup_iomem(dev, info, 4, 5))
+               goto out_unmap;
+
+       spin_lock_init(&priv->ier0_cache_lock);
+       info->priv = priv;
+       info->name = "Sercos_III_PCI";
+       info->version = "0.0.1";
+       info->irq = dev->irq;
+       info->irq_flags = IRQF_DISABLED | IRQF_SHARED;
+       info->handler = sercos3_handler;
+       info->irqcontrol = sercos3_irqcontrol;
+
+       pci_set_drvdata(dev, info);
+
+       if (uio_register_device(&dev->dev, info))
+               goto out_unmap;
+
+       return 0;
+
+out_unmap:
+       for (i = 0; i < 5; i++) {
+               if (info->mem[i].internal_addr)
+                       iounmap(info->mem[i].internal_addr);
+       }
+       pci_release_regions(dev);
+out_disable:
+       pci_disable_device(dev);
+out_free_priv:
+       kfree(priv);
+out_free:
+       kfree(info);
+       return -ENODEV;
+}
+
+static void sercos3_pci_remove(struct pci_dev *dev)
+{
+       struct uio_info *info = pci_get_drvdata(dev);
+       int i;
+
+       uio_unregister_device(info);
+       pci_release_regions(dev);
+       pci_disable_device(dev);
+       pci_set_drvdata(dev, NULL);
+       for (i = 0; i < 5; i++) {
+               if (info->mem[i].internal_addr)
+                       iounmap(info->mem[i].internal_addr);
+       }
+       kfree(info->priv);
+       kfree(info);
+}
+
+static struct pci_device_id sercos3_pci_ids[] __devinitdata = {
+       {
+               .vendor =       PCI_VENDOR_ID_PLX,
+               .device =       PCI_DEVICE_ID_PLX_9030,
+               .subvendor =    SERCOS_SUB_VENDOR_ID,
+               .subdevice =    SERCOS_SUB_SYSID_3530,
+       },
+       {
+               .vendor =       PCI_VENDOR_ID_PLX,
+               .device =       PCI_DEVICE_ID_PLX_9030,
+               .subvendor =    SERCOS_SUB_VENDOR_ID,
+               .subdevice =    SERCOS_SUB_SYSID_3535,
+       },
+       {
+               .vendor =       PCI_VENDOR_ID_PLX,
+               .device =       PCI_DEVICE_ID_PLX_9030,
+               .subvendor =    SERCOS_SUB_VENDOR_ID,
+               .subdevice =    SERCOS_SUB_SYSID_3780,
+       },
+       { 0, }
+};
+
+static struct pci_driver sercos3_pci_driver = {
+       .name = "sercos3",
+       .id_table = sercos3_pci_ids,
+       .probe = sercos3_pci_probe,
+       .remove = sercos3_pci_remove,
+};
+
+static int __init sercos3_init_module(void)
+{
+       return pci_register_driver(&sercos3_pci_driver);
+}
+
+static void __exit sercos3_exit_module(void)
+{
+       pci_unregister_driver(&sercos3_pci_driver);
+}
+
+module_init(sercos3_init_module);
+module_exit(sercos3_exit_module);
+
+MODULE_DESCRIPTION("UIO driver for the Automata Sercos III PCI card");
+MODULE_AUTHOR("John Ogness <john.ogness@linutronix.de>");
+MODULE_LICENSE("GPL v2");
index 20290c5b15625c3b4272765ff95eefa3feb07b88..7a4fa791dc196f18a042e4c203ca21b5a0313e97 100644 (file)
@@ -1729,9 +1729,9 @@ static int usb_classdev_add(struct usb_device *dev)
 {
        struct device *cldev;
 
-       cldev = device_create_drvdata(usb_classdev_class, &dev->dev,
-                                     dev->dev.devt, NULL, "usbdev%d.%d",
-                                     dev->bus->busnum, dev->devnum);
+       cldev = device_create(usb_classdev_class, &dev->dev, dev->dev.devt,
+                             NULL, "usbdev%d.%d", dev->bus->busnum,
+                             dev->devnum);
        if (IS_ERR(cldev))
                return PTR_ERR(cldev);
        dev->usb_classdev = cldev;
index 6b1b229e38cd1d28790d5f29e54eebbe3efe2fb8..55f7f310924b99f434ba6201525c2b85b48e27ba 100644 (file)
@@ -196,9 +196,9 @@ int usb_register_dev(struct usb_interface *intf,
                ++temp;
        else
                temp = name;
-       intf->usb_dev = device_create_drvdata(usb_class->class, &intf->dev,
-                                             MKDEV(USB_MAJOR, minor), NULL,
-                                             "%s", temp);
+       intf->usb_dev = device_create(usb_class->class, &intf->dev,
+                                     MKDEV(USB_MAJOR, minor), NULL,
+                                     "%s", temp);
        if (IS_ERR(intf->usb_dev)) {
                down_write(&minor_rwsem);
                usb_minors[intf->minor] = NULL;
index 8ab389dca2b91c49bfdb75e900a1c5a5dde3d334..c8035a8216bdb5017435c7ad49a5d555b2cce8e9 100644 (file)
@@ -818,9 +818,8 @@ static int usb_register_bus(struct usb_bus *bus)
        set_bit (busnum, busmap.busmap);
        bus->busnum = busnum;
 
-       bus->dev = device_create_drvdata(usb_host_class, bus->controller,
-                                        MKDEV(0, 0), bus,
-                                        "usb_host%d", busnum);
+       bus->dev = device_create(usb_host_class, bus->controller, MKDEV(0, 0),
+                                bus, "usb_host%d", busnum);
        result = PTR_ERR(bus->dev);
        if (IS_ERR(bus->dev))
                goto error_create_class_dev;
index fcb5cb9094d905d7e26c35a7dae074fc28b633bd..2267fa0b51b20e28e230b9cd5a802a9b3ea44f5f 100644 (file)
@@ -22,24 +22,15 @@ obj-$(CONFIG_USB_M66592)    += m66592-udc.o
 #
 # USB gadget drivers
 #
-C_UTILS =      composite.o usbstring.o config.o epautoconf.o
-
-g_zero-objs                    := zero.o f_sourcesink.o f_loopback.o $(C_UTILS)
-g_ether-objs                   := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS)
-g_serial-objs                  := serial.o u_serial.o f_acm.o f_serial.o $(C_UTILS)
-g_midi-objs                    := gmidi.o usbstring.o config.o epautoconf.o
+g_zero-objs                    := zero.o
+g_ether-objs                   := ether.o
+g_serial-objs                  := serial.o
+g_midi-objs                    := gmidi.o
 gadgetfs-objs                  := inode.o
-g_file_storage-objs            := file_storage.o usbstring.o config.o \
-                                       epautoconf.o
-g_printer-objs                 := printer.o usbstring.o config.o \
-                                       epautoconf.o
-g_cdc-objs                     := cdc2.o u_ether.o f_ecm.o \
-                                       u_serial.o f_acm.o $(C_UTILS)
+g_file_storage-objs            := file_storage.o
+g_printer-objs                 := printer.o
+g_cdc-objs                     := cdc2.o
 
-ifeq ($(CONFIG_USB_ETH_RNDIS),y)
-       g_ether-objs            += f_rndis.o rndis.o
-endif
 obj-$(CONFIG_USB_ZERO)         += g_zero.o
 obj-$(CONFIG_USB_ETH)          += g_ether.o
 obj-$(CONFIG_USB_GADGETFS)     += gadgetfs.o
index a39a4b940c33c93aa129fb5aab06fd4c326e556d..a724fc149850ad30deef93e73b6da96879cadd99 100644 (file)
 
 /*-------------------------------------------------------------------------*/
 
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+
+#include "composite.c"
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+#include "u_serial.c"
+#include "f_acm.c"
+#include "f_ecm.c"
+#include "u_ether.c"
+
+/*-------------------------------------------------------------------------*/
+
 static struct usb_device_descriptor device_desc = {
        .bLength =              sizeof device_desc,
        .bDescriptorType =      USB_DT_DEVICE,
@@ -148,7 +167,8 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)
        int                     status;
 
        if (!can_support_ecm(cdev->gadget)) {
-               ERROR(cdev, "controller '%s' not usable\n", gadget->name);
+               dev_err(&gadget->dev, "controller '%s' not usable\n",
+                               gadget->name);
                return -EINVAL;
        }
 
@@ -203,7 +223,8 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)
        if (status < 0)
                goto fail1;
 
-       INFO(cdev, "%s, version: " DRIVER_VERSION "\n", DRIVER_DESC);
+       dev_info(&gadget->dev, "%s, version: " DRIVER_VERSION "\n",
+                       DRIVER_DESC);
 
        return 0;
 
index bcac2e68660d5ba51fd8c253fa136c4385e9c058..944c8e889ab4368bae56b96a679aeb590323648a 100644 (file)
@@ -96,6 +96,28 @@ static inline bool has_rndis(void)
 
 /*-------------------------------------------------------------------------*/
 
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "composite.c"
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
+#include "f_ecm.c"
+#include "f_subset.c"
+#ifdef CONFIG_USB_ETH_RNDIS
+#include "f_rndis.c"
+#include "rndis.c"
+#endif
+#include "u_ether.c"
+
+/*-------------------------------------------------------------------------*/
+
 /* DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
  * Instead:  allocate your own, using normal USB-IF procedures.
  */
@@ -293,7 +315,8 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
                 * but if the controller isn't recognized at all then
                 * that assumption is a bit more likely to be wrong.
                 */
-               WARNING(cdev, "controller '%s' not recognized; trying %s\n",
+               dev_warn(&gadget->dev,
+                               "controller '%s' not recognized; trying %s\n",
                                gadget->name,
                                eth_config_driver.label);
                device_desc.bcdDevice =
@@ -332,7 +355,8 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
        if (status < 0)
                goto fail;
 
-       INFO(cdev, "%s, version: " DRIVER_VERSION "\n", DRIVER_DESC);
+       dev_info(&gadget->dev, "%s, version: " DRIVER_VERSION "\n",
+                       DRIVER_DESC);
 
        return 0;
 
index a2b5c092bda039bdf0c1cd70b7d4bc2d6445cc99..4ae579948e54dc67288499cea56929b220e98ebe 100644 (file)
@@ -83,7 +83,7 @@ static inline struct f_ecm *func_to_ecm(struct usb_function *f)
 }
 
 /* peak (theoretical) bulk transfer rate in bits-per-second */
-static inline unsigned bitrate(struct usb_gadget *g)
+static inline unsigned ecm_bitrate(struct usb_gadget *g)
 {
        if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
                return 13 * 512 * 8 * 1000 * 8;
@@ -107,7 +107,7 @@ static inline unsigned bitrate(struct usb_gadget *g)
  */
 
 #define LOG2_STATUS_INTERVAL_MSEC      5       /* 1 << 5 == 32 msec */
-#define STATUS_BYTECOUNT               16      /* 8 byte header + data */
+#define ECM_STATUS_BYTECOUNT           16      /* 8 byte header + data */
 
 
 /* interface descriptor: */
@@ -125,8 +125,8 @@ static struct usb_interface_descriptor ecm_control_intf __initdata = {
        /* .iInterface = DYNAMIC */
 };
 
-static struct usb_cdc_header_desc header_desc __initdata = {
-       .bLength =              sizeof header_desc,
+static struct usb_cdc_header_desc ecm_header_desc __initdata = {
+       .bLength =              sizeof ecm_header_desc,
        .bDescriptorType =      USB_DT_CS_INTERFACE,
        .bDescriptorSubType =   USB_CDC_HEADER_TYPE,
 
@@ -141,8 +141,8 @@ static struct usb_cdc_union_desc ecm_union_desc __initdata = {
        /* .bSlaveInterface0 =  DYNAMIC */
 };
 
-static struct usb_cdc_ether_desc ether_desc __initdata = {
-       .bLength =              sizeof ether_desc,
+static struct usb_cdc_ether_desc ecm_desc __initdata = {
+       .bLength =              sizeof ecm_desc,
        .bDescriptorType =      USB_DT_CS_INTERFACE,
        .bDescriptorSubType =   USB_CDC_ETHERNET_TYPE,
 
@@ -186,17 +186,17 @@ static struct usb_interface_descriptor ecm_data_intf __initdata = {
 
 /* full speed support: */
 
-static struct usb_endpoint_descriptor fs_notify_desc __initdata = {
+static struct usb_endpoint_descriptor fs_ecm_notify_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
        .bEndpointAddress =     USB_DIR_IN,
        .bmAttributes =         USB_ENDPOINT_XFER_INT,
-       .wMaxPacketSize =       __constant_cpu_to_le16(STATUS_BYTECOUNT),
+       .wMaxPacketSize =       __constant_cpu_to_le16(ECM_STATUS_BYTECOUNT),
        .bInterval =            1 << LOG2_STATUS_INTERVAL_MSEC,
 };
 
-static struct usb_endpoint_descriptor fs_in_desc __initdata = {
+static struct usb_endpoint_descriptor fs_ecm_in_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -204,7 +204,7 @@ static struct usb_endpoint_descriptor fs_in_desc __initdata = {
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 };
 
-static struct usb_endpoint_descriptor fs_out_desc __initdata = {
+static struct usb_endpoint_descriptor fs_ecm_out_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -212,34 +212,34 @@ static struct usb_endpoint_descriptor fs_out_desc __initdata = {
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 };
 
-static struct usb_descriptor_header *eth_fs_function[] __initdata = {
+static struct usb_descriptor_header *ecm_fs_function[] __initdata = {
        /* CDC ECM control descriptors */
        (struct usb_descriptor_header *) &ecm_control_intf,
-       (struct usb_descriptor_header *) &header_desc,
+       (struct usb_descriptor_header *) &ecm_header_desc,
        (struct usb_descriptor_header *) &ecm_union_desc,
-       (struct usb_descriptor_header *) &ether_desc,
+       (struct usb_descriptor_header *) &ecm_desc,
        /* NOTE: status endpoint might need to be removed */
-       (struct usb_descriptor_header *) &fs_notify_desc,
+       (struct usb_descriptor_header *) &fs_ecm_notify_desc,
        /* data interface, altsettings 0 and 1 */
        (struct usb_descriptor_header *) &ecm_data_nop_intf,
        (struct usb_descriptor_header *) &ecm_data_intf,
-       (struct usb_descriptor_header *) &fs_in_desc,
-       (struct usb_descriptor_header *) &fs_out_desc,
+       (struct usb_descriptor_header *) &fs_ecm_in_desc,
+       (struct usb_descriptor_header *) &fs_ecm_out_desc,
        NULL,
 };
 
 /* high speed support: */
 
-static struct usb_endpoint_descriptor hs_notify_desc __initdata = {
+static struct usb_endpoint_descriptor hs_ecm_notify_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
        .bEndpointAddress =     USB_DIR_IN,
        .bmAttributes =         USB_ENDPOINT_XFER_INT,
-       .wMaxPacketSize =       __constant_cpu_to_le16(STATUS_BYTECOUNT),
+       .wMaxPacketSize =       __constant_cpu_to_le16(ECM_STATUS_BYTECOUNT),
        .bInterval =            LOG2_STATUS_INTERVAL_MSEC + 4,
 };
-static struct usb_endpoint_descriptor hs_in_desc __initdata = {
+static struct usb_endpoint_descriptor hs_ecm_in_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -248,7 +248,7 @@ static struct usb_endpoint_descriptor hs_in_desc __initdata = {
        .wMaxPacketSize =       __constant_cpu_to_le16(512),
 };
 
-static struct usb_endpoint_descriptor hs_out_desc __initdata = {
+static struct usb_endpoint_descriptor hs_ecm_out_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -257,19 +257,19 @@ static struct usb_endpoint_descriptor hs_out_desc __initdata = {
        .wMaxPacketSize =       __constant_cpu_to_le16(512),
 };
 
-static struct usb_descriptor_header *eth_hs_function[] __initdata = {
+static struct usb_descriptor_header *ecm_hs_function[] __initdata = {
        /* CDC ECM control descriptors */
        (struct usb_descriptor_header *) &ecm_control_intf,
-       (struct usb_descriptor_header *) &header_desc,
+       (struct usb_descriptor_header *) &ecm_header_desc,
        (struct usb_descriptor_header *) &ecm_union_desc,
-       (struct usb_descriptor_header *) &ether_desc,
+       (struct usb_descriptor_header *) &ecm_desc,
        /* NOTE: status endpoint might need to be removed */
-       (struct usb_descriptor_header *) &hs_notify_desc,
+       (struct usb_descriptor_header *) &hs_ecm_notify_desc,
        /* data interface, altsettings 0 and 1 */
        (struct usb_descriptor_header *) &ecm_data_nop_intf,
        (struct usb_descriptor_header *) &ecm_data_intf,
-       (struct usb_descriptor_header *) &hs_in_desc,
-       (struct usb_descriptor_header *) &hs_out_desc,
+       (struct usb_descriptor_header *) &hs_ecm_in_desc,
+       (struct usb_descriptor_header *) &hs_ecm_out_desc,
        NULL,
 };
 
@@ -329,14 +329,14 @@ static void ecm_do_notify(struct f_ecm *ecm)
                event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE;
                event->wValue = cpu_to_le16(0);
                event->wLength = cpu_to_le16(8);
-               req->length = STATUS_BYTECOUNT;
+               req->length = ECM_STATUS_BYTECOUNT;
 
                /* SPEED_CHANGE data is up/down speeds in bits/sec */
                data = req->buf + sizeof *event;
-               data[0] = cpu_to_le32(bitrate(cdev->gadget));
+               data[0] = cpu_to_le32(ecm_bitrate(cdev->gadget));
                data[1] = data[0];
 
-               DBG(cdev, "notify speed %d\n", bitrate(cdev->gadget));
+               DBG(cdev, "notify speed %d\n", ecm_bitrate(cdev->gadget));
                ecm->notify_state = ECM_NOTIFY_NONE;
                break;
        }
@@ -628,13 +628,13 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
        status = -ENODEV;
 
        /* allocate instance-specific endpoints */
-       ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
+       ep = usb_ep_autoconfig(cdev->gadget, &fs_ecm_in_desc);
        if (!ep)
                goto fail;
        ecm->port.in_ep = ep;
        ep->driver_data = cdev; /* claim */
 
-       ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
+       ep = usb_ep_autoconfig(cdev->gadget, &fs_ecm_out_desc);
        if (!ep)
                goto fail;
        ecm->port.out_ep = ep;
@@ -644,7 +644,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
         * don't treat it that way.  It's simpler, and some newer CDC
         * profiles (wireless handsets) no longer treat it as optional.
         */
-       ep = usb_ep_autoconfig(cdev->gadget, &fs_notify_desc);
+       ep = usb_ep_autoconfig(cdev->gadget, &fs_ecm_notify_desc);
        if (!ep)
                goto fail;
        ecm->notify = ep;
@@ -656,47 +656,47 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
        ecm->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
        if (!ecm->notify_req)
                goto fail;
-       ecm->notify_req->buf = kmalloc(STATUS_BYTECOUNT, GFP_KERNEL);
+       ecm->notify_req->buf = kmalloc(ECM_STATUS_BYTECOUNT, GFP_KERNEL);
        if (!ecm->notify_req->buf)
                goto fail;
        ecm->notify_req->context = ecm;
        ecm->notify_req->complete = ecm_notify_complete;
 
        /* copy descriptors, and track endpoint copies */
-       f->descriptors = usb_copy_descriptors(eth_fs_function);
+       f->descriptors = usb_copy_descriptors(ecm_fs_function);
        if (!f->descriptors)
                goto fail;
 
-       ecm->fs.in = usb_find_endpoint(eth_fs_function,
-                       f->descriptors, &fs_in_desc);
-       ecm->fs.out = usb_find_endpoint(eth_fs_function,
-                       f->descriptors, &fs_out_desc);
-       ecm->fs.notify = usb_find_endpoint(eth_fs_function,
-                       f->descriptors, &fs_notify_desc);
+       ecm->fs.in = usb_find_endpoint(ecm_fs_function,
+                       f->descriptors, &fs_ecm_in_desc);
+       ecm->fs.out = usb_find_endpoint(ecm_fs_function,
+                       f->descriptors, &fs_ecm_out_desc);
+       ecm->fs.notify = usb_find_endpoint(ecm_fs_function,
+                       f->descriptors, &fs_ecm_notify_desc);
 
        /* support all relevant hardware speeds... we expect that when
         * hardware is dual speed, all bulk-capable endpoints work at
         * both speeds
         */
        if (gadget_is_dualspeed(c->cdev->gadget)) {
-               hs_in_desc.bEndpointAddress =
-                               fs_in_desc.bEndpointAddress;
-               hs_out_desc.bEndpointAddress =
-                               fs_out_desc.bEndpointAddress;
-               hs_notify_desc.bEndpointAddress =
-                               fs_notify_desc.bEndpointAddress;
+               hs_ecm_in_desc.bEndpointAddress =
+                               fs_ecm_in_desc.bEndpointAddress;
+               hs_ecm_out_desc.bEndpointAddress =
+                               fs_ecm_out_desc.bEndpointAddress;
+               hs_ecm_notify_desc.bEndpointAddress =
+                               fs_ecm_notify_desc.bEndpointAddress;
 
                /* copy descriptors, and track endpoint copies */
-               f->hs_descriptors = usb_copy_descriptors(eth_hs_function);
+               f->hs_descriptors = usb_copy_descriptors(ecm_hs_function);
                if (!f->hs_descriptors)
                        goto fail;
 
-               ecm->hs.in = usb_find_endpoint(eth_hs_function,
-                               f->hs_descriptors, &hs_in_desc);
-               ecm->hs.out = usb_find_endpoint(eth_hs_function,
-                               f->hs_descriptors, &hs_out_desc);
-               ecm->hs.notify = usb_find_endpoint(eth_hs_function,
-                               f->hs_descriptors, &hs_notify_desc);
+               ecm->hs.in = usb_find_endpoint(ecm_hs_function,
+                               f->hs_descriptors, &hs_ecm_in_desc);
+               ecm->hs.out = usb_find_endpoint(ecm_hs_function,
+                               f->hs_descriptors, &hs_ecm_out_desc);
+               ecm->hs.notify = usb_find_endpoint(ecm_hs_function,
+                               f->hs_descriptors, &hs_ecm_notify_desc);
        }
 
        /* NOTE:  all that is done without knowing or caring about
@@ -795,7 +795,7 @@ int __init ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
                if (status < 0)
                        return status;
                ecm_string_defs[1].id = status;
-               ether_desc.iMACAddress = status;
+               ecm_desc.iMACAddress = status;
        }
 
        /* allocate and initialize one new instance */
index eda4cde72c824c1aac2de550cfe24e7ae2ca5929..87dde012dacc8d251e25fc1d23eb73eeb1cf684a 100644 (file)
@@ -70,7 +70,7 @@ static struct usb_interface_descriptor loopback_intf = {
 
 /* full speed support: */
 
-static struct usb_endpoint_descriptor fs_source_desc = {
+static struct usb_endpoint_descriptor fs_loop_source_desc = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -78,7 +78,7 @@ static struct usb_endpoint_descriptor fs_source_desc = {
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 };
 
-static struct usb_endpoint_descriptor fs_sink_desc = {
+static struct usb_endpoint_descriptor fs_loop_sink_desc = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -88,14 +88,14 @@ static struct usb_endpoint_descriptor fs_sink_desc = {
 
 static struct usb_descriptor_header *fs_loopback_descs[] = {
        (struct usb_descriptor_header *) &loopback_intf,
-       (struct usb_descriptor_header *) &fs_sink_desc,
-       (struct usb_descriptor_header *) &fs_source_desc,
+       (struct usb_descriptor_header *) &fs_loop_sink_desc,
+       (struct usb_descriptor_header *) &fs_loop_source_desc,
        NULL,
 };
 
 /* high speed support: */
 
-static struct usb_endpoint_descriptor hs_source_desc = {
+static struct usb_endpoint_descriptor hs_loop_source_desc = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -103,7 +103,7 @@ static struct usb_endpoint_descriptor hs_source_desc = {
        .wMaxPacketSize =       __constant_cpu_to_le16(512),
 };
 
-static struct usb_endpoint_descriptor hs_sink_desc = {
+static struct usb_endpoint_descriptor hs_loop_sink_desc = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -113,8 +113,8 @@ static struct usb_endpoint_descriptor hs_sink_desc = {
 
 static struct usb_descriptor_header *hs_loopback_descs[] = {
        (struct usb_descriptor_header *) &loopback_intf,
-       (struct usb_descriptor_header *) &hs_source_desc,
-       (struct usb_descriptor_header *) &hs_sink_desc,
+       (struct usb_descriptor_header *) &hs_loop_source_desc,
+       (struct usb_descriptor_header *) &hs_loop_sink_desc,
        NULL,
 };
 
@@ -152,7 +152,7 @@ loopback_bind(struct usb_configuration *c, struct usb_function *f)
 
        /* allocate endpoints */
 
-       loop->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_source_desc);
+       loop->in_ep = usb_ep_autoconfig(cdev->gadget, &fs_loop_source_desc);
        if (!loop->in_ep) {
 autoconf_fail:
                ERROR(cdev, "%s: can't autoconfigure on %s\n",
@@ -161,17 +161,17 @@ autoconf_fail:
        }
        loop->in_ep->driver_data = cdev;        /* claim */
 
-       loop->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_sink_desc);
+       loop->out_ep = usb_ep_autoconfig(cdev->gadget, &fs_loop_sink_desc);
        if (!loop->out_ep)
                goto autoconf_fail;
        loop->out_ep->driver_data = cdev;       /* claim */
 
        /* support high speed hardware */
        if (gadget_is_dualspeed(c->cdev->gadget)) {
-               hs_source_desc.bEndpointAddress =
-                               fs_source_desc.bEndpointAddress;
-               hs_sink_desc.bEndpointAddress =
-                               fs_sink_desc.bEndpointAddress;
+               hs_loop_source_desc.bEndpointAddress =
+                               fs_loop_source_desc.bEndpointAddress;
+               hs_loop_sink_desc.bEndpointAddress =
+                               fs_loop_sink_desc.bEndpointAddress;
                f->hs_descriptors = hs_loopback_descs;
        }
 
@@ -255,8 +255,10 @@ enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)
        struct usb_request                      *req;
        unsigned                                i;
 
-       src = ep_choose(cdev->gadget, &hs_source_desc, &fs_source_desc);
-       sink = ep_choose(cdev->gadget, &hs_sink_desc, &fs_sink_desc);
+       src = ep_choose(cdev->gadget,
+                       &hs_loop_source_desc, &fs_loop_source_desc);
+       sink = ep_choose(cdev->gadget,
+                       &hs_loop_sink_desc, &fs_loop_sink_desc);
 
        /* one endpoint writes data back IN to the host */
        ep = loop->in_ep;
index acb8d233aa1d24a02a5acc855a040755b809013b..fe1832875771539ec72d0fa693968a548a26fd79 100644 (file)
@@ -103,8 +103,8 @@ static struct usb_interface_descriptor subset_data_intf __initdata = {
        /* .iInterface = DYNAMIC */
 };
 
-static struct usb_cdc_header_desc header_desc __initdata = {
-       .bLength =              sizeof header_desc,
+static struct usb_cdc_header_desc mdlm_header_desc __initdata = {
+       .bLength =              sizeof mdlm_header_desc,
        .bDescriptorType =      USB_DT_CS_INTERFACE,
        .bDescriptorSubType =   USB_CDC_HEADER_TYPE,
 
@@ -152,7 +152,7 @@ static struct usb_cdc_ether_desc ether_desc __initdata = {
 
 /* full speed support: */
 
-static struct usb_endpoint_descriptor fs_in_desc __initdata = {
+static struct usb_endpoint_descriptor fs_subset_in_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -160,7 +160,7 @@ static struct usb_endpoint_descriptor fs_in_desc __initdata = {
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 };
 
-static struct usb_endpoint_descriptor fs_out_desc __initdata = {
+static struct usb_endpoint_descriptor fs_subset_out_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -170,18 +170,18 @@ static struct usb_endpoint_descriptor fs_out_desc __initdata = {
 
 static struct usb_descriptor_header *fs_eth_function[] __initdata = {
        (struct usb_descriptor_header *) &subset_data_intf,
-       (struct usb_descriptor_header *) &header_desc,
+       (struct usb_descriptor_header *) &mdlm_header_desc,
        (struct usb_descriptor_header *) &mdlm_desc,
        (struct usb_descriptor_header *) &mdlm_detail_desc,
        (struct usb_descriptor_header *) &ether_desc,
-       (struct usb_descriptor_header *) &fs_in_desc,
-       (struct usb_descriptor_header *) &fs_out_desc,
+       (struct usb_descriptor_header *) &fs_subset_in_desc,
+       (struct usb_descriptor_header *) &fs_subset_out_desc,
        NULL,
 };
 
 /* high speed support: */
 
-static struct usb_endpoint_descriptor hs_in_desc __initdata = {
+static struct usb_endpoint_descriptor hs_subset_in_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -189,7 +189,7 @@ static struct usb_endpoint_descriptor hs_in_desc __initdata = {
        .wMaxPacketSize =       __constant_cpu_to_le16(512),
 };
 
-static struct usb_endpoint_descriptor hs_out_desc __initdata = {
+static struct usb_endpoint_descriptor hs_subset_out_desc __initdata = {
        .bLength =              USB_DT_ENDPOINT_SIZE,
        .bDescriptorType =      USB_DT_ENDPOINT,
 
@@ -199,12 +199,12 @@ static struct usb_endpoint_descriptor hs_out_desc __initdata = {
 
 static struct usb_descriptor_header *hs_eth_function[] __initdata = {
        (struct usb_descriptor_header *) &subset_data_intf,
-       (struct usb_descriptor_header *) &header_desc,
+       (struct usb_descriptor_header *) &mdlm_header_desc,
        (struct usb_descriptor_header *) &mdlm_desc,
        (struct usb_descriptor_header *) &mdlm_detail_desc,
        (struct usb_descriptor_header *) &ether_desc,
-       (struct usb_descriptor_header *) &hs_in_desc,
-       (struct usb_descriptor_header *) &hs_out_desc,
+       (struct usb_descriptor_header *) &hs_subset_in_desc,
+       (struct usb_descriptor_header *) &hs_subset_out_desc,
        NULL,
 };
 
@@ -281,13 +281,13 @@ geth_bind(struct usb_configuration *c, struct usb_function *f)
        status = -ENODEV;
 
        /* allocate instance-specific endpoints */
-       ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
+       ep = usb_ep_autoconfig(cdev->gadget, &fs_subset_in_desc);
        if (!ep)
                goto fail;
        geth->port.in_ep = ep;
        ep->driver_data = cdev; /* claim */
 
-       ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
+       ep = usb_ep_autoconfig(cdev->gadget, &fs_subset_out_desc);
        if (!ep)
                goto fail;
        geth->port.out_ep = ep;
@@ -297,9 +297,9 @@ geth_bind(struct usb_configuration *c, struct usb_function *f)
        f->descriptors = usb_copy_descriptors(fs_eth_function);
 
        geth->fs.in = usb_find_endpoint(fs_eth_function,
-                       f->descriptors, &fs_in_desc);
+                       f->descriptors, &fs_subset_in_desc);
        geth->fs.out = usb_find_endpoint(fs_eth_function,
-                       f->descriptors, &fs_out_desc);
+                       f->descriptors, &fs_subset_out_desc);
 
 
        /* support all relevant hardware speeds... we expect that when
@@ -307,18 +307,18 @@ geth_bind(struct usb_configuration *c, struct usb_function *f)
         * both speeds
         */
        if (gadget_is_dualspeed(c->cdev->gadget)) {
-               hs_in_desc.bEndpointAddress =
-                               fs_in_desc.bEndpointAddress;
-               hs_out_desc.bEndpointAddress =
-                               fs_out_desc.bEndpointAddress;
+               hs_subset_in_desc.bEndpointAddress =
+                               fs_subset_in_desc.bEndpointAddress;
+               hs_subset_out_desc.bEndpointAddress =
+                               fs_subset_out_desc.bEndpointAddress;
 
                /* copy descriptors, and track endpoint copies */
                f->hs_descriptors = usb_copy_descriptors(hs_eth_function);
 
                geth->hs.in = usb_find_endpoint(hs_eth_function,
-                               f->hs_descriptors, &hs_in_desc);
+                               f->hs_descriptors, &hs_subset_in_desc);
                geth->hs.out = usb_find_endpoint(hs_eth_function,
-                               f->hs_descriptors, &hs_out_desc);
+                               f->hs_descriptors, &hs_subset_out_desc);
        }
 
        /* NOTE:  all that is done without knowing or caring about
index ea2c31d18080d2a23025979a4c798f5133ceba48..0c632d22a6315a116beb9bb28a06b0d273322478 100644 (file)
 #include "gadget_chips.h"
 
 
+
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
 /*-------------------------------------------------------------------------*/
 
 #define DRIVER_DESC            "File-backed Storage Gadget"
index ea8651e3da1a53a205ffe67e88889b87d5073a89..6eee760410d6c052492cc854ea11cbc1ac840ffa 100644 (file)
 
 #include "gadget_chips.h"
 
+
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
+/*-------------------------------------------------------------------------*/
+
+
 MODULE_AUTHOR("Ben Williamson");
 MODULE_LICENSE("GPL v2");
 
index e0090085b78ee74824ff2a3940a419a129e9570b..2b3b9e1dd2ee2987c3ee1420802a7544af2597f9 100644 (file)
 
 #include "gadget_chips.h"
 
+
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
+/*-------------------------------------------------------------------------*/
+
 #define DRIVER_DESC            "Printer Gadget"
 #define DRIVER_VERSION         "2007 OCT 06"
 
@@ -1360,8 +1374,8 @@ printer_bind(struct usb_gadget *gadget)
 
 
        /* Setup the sysfs files for the printer gadget. */
-       dev->pdev = device_create_drvdata(usb_gadget_class, NULL,
-                                         g_printer_devno, NULL, "g_printer");
+       dev->pdev = device_create(usb_gadget_class, NULL, g_printer_devno,
+                                 NULL, "g_printer");
        if (IS_ERR(dev->pdev)) {
                ERROR(dev, "Failed to create device: g_printer\n");
                goto fail;
index 7228e856223626dab7e568eb0f1252391758a95b..8c26f5ea2b839070fe2afb6d8a41c66a36aeaafa 100644 (file)
@@ -57,11 +57,6 @@ MODULE_PARM_DESC (rndis_debug, "enable debugging");
 #define rndis_debug            0
 #endif
 
-#define DBG(str,args...) do { \
-       if (rndis_debug) \
-               pr_debug(str , ## args); \
-       } while (0)
-
 #define RNDIS_MAX_CONFIGS      1
 
 
@@ -183,9 +178,9 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        if (!resp) return -ENOMEM;
 
        if (buf_len && rndis_debug > 1) {
-               DBG("query OID %08x value, len %d:\n", OID, buf_len);
+               pr_debug("query OID %08x value, len %d:\n", OID, buf_len);
                for (i = 0; i < buf_len; i += 16) {
-                       DBG("%03d: %08x %08x %08x %08x\n", i,
+                       pr_debug("%03d: %08x %08x %08x %08x\n", i,
                                get_unaligned_le32(&buf[i]),
                                get_unaligned_le32(&buf[i + 4]),
                                get_unaligned_le32(&buf[i + 8]),
@@ -209,7 +204,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_SUPPORTED_LIST:
-               DBG("%s: OID_GEN_SUPPORTED_LIST\n", __func__);
+               pr_debug("%s: OID_GEN_SUPPORTED_LIST\n", __func__);
                length = sizeof (oid_supported_list);
                count  = length / sizeof (u32);
                for (i = 0; i < count; i++)
@@ -219,7 +214,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_HARDWARE_STATUS:
-               DBG("%s: OID_GEN_HARDWARE_STATUS\n", __func__);
+               pr_debug("%s: OID_GEN_HARDWARE_STATUS\n", __func__);
                /* Bogus question!
                 * Hardware must be ready to receive high level protocols.
                 * BTW:
@@ -232,14 +227,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_MEDIA_SUPPORTED:
-               DBG("%s: OID_GEN_MEDIA_SUPPORTED\n", __func__);
+               pr_debug("%s: OID_GEN_MEDIA_SUPPORTED\n", __func__);
                *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium);
                retval = 0;
                break;
 
        /* mandatory */
        case OID_GEN_MEDIA_IN_USE:
-               DBG("%s: OID_GEN_MEDIA_IN_USE\n", __func__);
+               pr_debug("%s: OID_GEN_MEDIA_IN_USE\n", __func__);
                /* one medium, one transport... (maybe you do it better) */
                *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium);
                retval = 0;
@@ -247,7 +242,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_MAXIMUM_FRAME_SIZE:
-               DBG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__);
+               pr_debug("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__);
                if (rndis_per_dev_params [configNr].dev) {
                        *outbuf = cpu_to_le32 (
                                rndis_per_dev_params [configNr].dev->mtu);
@@ -258,7 +253,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_LINK_SPEED:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_LINK_SPEED\n", __func__);
+                       pr_debug("%s: OID_GEN_LINK_SPEED\n", __func__);
                if (rndis_per_dev_params [configNr].media_state
                                == NDIS_MEDIA_STATE_DISCONNECTED)
                        *outbuf = __constant_cpu_to_le32 (0);
@@ -270,7 +265,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_TRANSMIT_BLOCK_SIZE:
-               DBG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__);
+               pr_debug("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__);
                if (rndis_per_dev_params [configNr].dev) {
                        *outbuf = cpu_to_le32 (
                                rndis_per_dev_params [configNr].dev->mtu);
@@ -280,7 +275,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_RECEIVE_BLOCK_SIZE:
-               DBG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__);
+               pr_debug("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__);
                if (rndis_per_dev_params [configNr].dev) {
                        *outbuf = cpu_to_le32 (
                                rndis_per_dev_params [configNr].dev->mtu);
@@ -290,7 +285,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_VENDOR_ID:
-               DBG("%s: OID_GEN_VENDOR_ID\n", __func__);
+               pr_debug("%s: OID_GEN_VENDOR_ID\n", __func__);
                *outbuf = cpu_to_le32 (
                        rndis_per_dev_params [configNr].vendorID);
                retval = 0;
@@ -298,7 +293,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_VENDOR_DESCRIPTION:
-               DBG("%s: OID_GEN_VENDOR_DESCRIPTION\n", __func__);
+               pr_debug("%s: OID_GEN_VENDOR_DESCRIPTION\n", __func__);
                length = strlen (rndis_per_dev_params [configNr].vendorDescr);
                memcpy (outbuf,
                        rndis_per_dev_params [configNr].vendorDescr, length);
@@ -306,7 +301,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
                break;
 
        case OID_GEN_VENDOR_DRIVER_VERSION:
-               DBG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __func__);
+               pr_debug("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __func__);
                /* Created as LE */
                *outbuf = rndis_driver_version;
                retval = 0;
@@ -314,14 +309,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_CURRENT_PACKET_FILTER:
-               DBG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __func__);
+               pr_debug("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __func__);
                *outbuf = cpu_to_le32 (*rndis_per_dev_params[configNr].filter);
                retval = 0;
                break;
 
        /* mandatory */
        case OID_GEN_MAXIMUM_TOTAL_SIZE:
-               DBG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __func__);
+               pr_debug("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __func__);
                *outbuf = __constant_cpu_to_le32(RNDIS_MAX_TOTAL_SIZE);
                retval = 0;
                break;
@@ -329,14 +324,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_MEDIA_CONNECT_STATUS:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __func__);
+                       pr_debug("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __func__);
                *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr]
                                                .media_state);
                retval = 0;
                break;
 
        case OID_GEN_PHYSICAL_MEDIUM:
-               DBG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __func__);
+               pr_debug("%s: OID_GEN_PHYSICAL_MEDIUM\n", __func__);
                *outbuf = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
@@ -346,7 +341,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
         * versions emit undefined RNDIS messages. DOCUMENT ALL THESE!
         */
        case OID_GEN_MAC_OPTIONS:               /* from WinME */
-               DBG("%s: OID_GEN_MAC_OPTIONS\n", __func__);
+               pr_debug("%s: OID_GEN_MAC_OPTIONS\n", __func__);
                *outbuf = __constant_cpu_to_le32(
                          NDIS_MAC_OPTION_RECEIVE_SERIALIZED
                        | NDIS_MAC_OPTION_FULL_DUPLEX);
@@ -358,7 +353,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_XMIT_OK:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_XMIT_OK\n", __func__);
+                       pr_debug("%s: OID_GEN_XMIT_OK\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->tx_packets
                                - stats->tx_errors - stats->tx_dropped);
@@ -369,7 +364,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_RCV_OK:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_RCV_OK\n", __func__);
+                       pr_debug("%s: OID_GEN_RCV_OK\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->rx_packets
                                - stats->rx_errors - stats->rx_dropped);
@@ -380,7 +375,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_XMIT_ERROR:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_XMIT_ERROR\n", __func__);
+                       pr_debug("%s: OID_GEN_XMIT_ERROR\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->tx_errors);
                        retval = 0;
@@ -390,7 +385,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
        /* mandatory */
        case OID_GEN_RCV_ERROR:
                if (rndis_debug > 1)
-                       DBG("%s: OID_GEN_RCV_ERROR\n", __func__);
+                       pr_debug("%s: OID_GEN_RCV_ERROR\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->rx_errors);
                        retval = 0;
@@ -399,7 +394,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_GEN_RCV_NO_BUFFER:
-               DBG("%s: OID_GEN_RCV_NO_BUFFER\n", __func__);
+               pr_debug("%s: OID_GEN_RCV_NO_BUFFER\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->rx_dropped);
                        retval = 0;
@@ -410,7 +405,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_802_3_PERMANENT_ADDRESS:
-               DBG("%s: OID_802_3_PERMANENT_ADDRESS\n", __func__);
+               pr_debug("%s: OID_802_3_PERMANENT_ADDRESS\n", __func__);
                if (rndis_per_dev_params [configNr].dev) {
                        length = ETH_ALEN;
                        memcpy (outbuf,
@@ -422,7 +417,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_802_3_CURRENT_ADDRESS:
-               DBG("%s: OID_802_3_CURRENT_ADDRESS\n", __func__);
+               pr_debug("%s: OID_802_3_CURRENT_ADDRESS\n", __func__);
                if (rndis_per_dev_params [configNr].dev) {
                        length = ETH_ALEN;
                        memcpy (outbuf,
@@ -434,7 +429,7 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_802_3_MULTICAST_LIST:
-               DBG("%s: OID_802_3_MULTICAST_LIST\n", __func__);
+               pr_debug("%s: OID_802_3_MULTICAST_LIST\n", __func__);
                /* Multicast base address only */
                *outbuf = __constant_cpu_to_le32 (0xE0000000);
                retval = 0;
@@ -442,21 +437,21 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_802_3_MAXIMUM_LIST_SIZE:
-               DBG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __func__);
+               pr_debug("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __func__);
                /* Multicast base address only */
                *outbuf = __constant_cpu_to_le32 (1);
                retval = 0;
                break;
 
        case OID_802_3_MAC_OPTIONS:
-               DBG("%s: OID_802_3_MAC_OPTIONS\n", __func__);
+               pr_debug("%s: OID_802_3_MAC_OPTIONS\n", __func__);
                break;
 
        /* ieee802.3 statistics OIDs (table 4-4) */
 
        /* mandatory */
        case OID_802_3_RCV_ERROR_ALIGNMENT:
-               DBG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__);
+               pr_debug("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__);
                if (stats) {
                        *outbuf = cpu_to_le32(stats->rx_frame_errors);
                        retval = 0;
@@ -465,14 +460,14 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len,
 
        /* mandatory */
        case OID_802_3_XMIT_ONE_COLLISION:
-               DBG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __func__);
+               pr_debug("%s: OID_802_3_XMIT_ONE_COLLISION\n", __func__);
                *outbuf = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
 
        /* mandatory */
        case OID_802_3_XMIT_MORE_COLLISIONS:
-               DBG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __func__);
+               pr_debug("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __func__);
                *outbuf = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
@@ -504,9 +499,9 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
                return -ENOMEM;
 
        if (buf_len && rndis_debug > 1) {
-               DBG("set OID %08x value, len %d:\n", OID, buf_len);
+               pr_debug("set OID %08x value, len %d:\n", OID, buf_len);
                for (i = 0; i < buf_len; i += 16) {
-                       DBG("%03d: %08x %08x %08x %08x\n", i,
+                       pr_debug("%03d: %08x %08x %08x %08x\n", i,
                                get_unaligned_le32(&buf[i]),
                                get_unaligned_le32(&buf[i + 4]),
                                get_unaligned_le32(&buf[i + 8]),
@@ -525,7 +520,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
                 *      MULTICAST, ALL_MULTICAST, BROADCAST
                 */
                *params->filter = (u16)get_unaligned_le32(buf);
-               DBG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n",
+               pr_debug("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n",
                        __func__, *params->filter);
 
                /* this call has a significant side effect:  it's
@@ -547,7 +542,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
 
        case OID_802_3_MULTICAST_LIST:
                /* I think we can ignore this */
-               DBG("%s: OID_802_3_MULTICAST_LIST\n", __func__);
+               pr_debug("%s: OID_802_3_MULTICAST_LIST\n", __func__);
                retval = 0;
                break;
 
@@ -606,7 +601,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
        rndis_resp_t            *r;
        struct rndis_params     *params = rndis_per_dev_params + configNr;
 
-       // DBG("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID));
+       /* pr_debug("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); */
        if (!params->dev)
                return -ENOTSUPP;
 
@@ -659,15 +654,15 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
        BufOffset = le32_to_cpu (buf->InformationBufferOffset);
 
 #ifdef VERBOSE_DEBUG
-       DBG("%s: Length: %d\n", __func__, BufLength);
-       DBG("%s: Offset: %d\n", __func__, BufOffset);
-       DBG("%s: InfoBuffer: ", __func__);
+       pr_debug("%s: Length: %d\n", __func__, BufLength);
+       pr_debug("%s: Offset: %d\n", __func__, BufOffset);
+       pr_debug("%s: InfoBuffer: ", __func__);
 
        for (i = 0; i < BufLength; i++) {
-               DBG("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
+               pr_debug("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
        }
 
-       DBG("\n");
+       pr_debug("\n");
 #endif
 
        resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_SET_CMPLT);
@@ -821,14 +816,14 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
        /* For USB: responses may take up to 10 seconds */
        switch (MsgType) {
        case REMOTE_NDIS_INITIALIZE_MSG:
-               DBG("%s: REMOTE_NDIS_INITIALIZE_MSG\n",
+               pr_debug("%s: REMOTE_NDIS_INITIALIZE_MSG\n",
                        __func__ );
                params->state = RNDIS_INITIALIZED;
                return  rndis_init_response (configNr,
                                        (rndis_init_msg_type *) buf);
 
        case REMOTE_NDIS_HALT_MSG:
-               DBG("%s: REMOTE_NDIS_HALT_MSG\n",
+               pr_debug("%s: REMOTE_NDIS_HALT_MSG\n",
                        __func__ );
                params->state = RNDIS_UNINITIALIZED;
                if (params->dev) {
@@ -846,7 +841,7 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
                                        (rndis_set_msg_type *) buf);
 
        case REMOTE_NDIS_RESET_MSG:
-               DBG("%s: REMOTE_NDIS_RESET_MSG\n",
+               pr_debug("%s: REMOTE_NDIS_RESET_MSG\n",
                        __func__ );
                return rndis_reset_response (configNr,
                                        (rndis_reset_msg_type *) buf);
@@ -854,7 +849,7 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
        case REMOTE_NDIS_KEEPALIVE_MSG:
                /* For USB: host does this every 5 seconds */
                if (rndis_debug > 1)
-                       DBG("%s: REMOTE_NDIS_KEEPALIVE_MSG\n",
+                       pr_debug("%s: REMOTE_NDIS_KEEPALIVE_MSG\n",
                                __func__ );
                return rndis_keepalive_response (configNr,
                                                 (rndis_keepalive_msg_type *)
@@ -870,7 +865,7 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
                {
                        unsigned i;
                        for (i = 0; i < MsgLength; i += 16) {
-                               DBG("%03d: "
+                               pr_debug("%03d: "
                                        " %02x %02x %02x %02x"
                                        " %02x %02x %02x %02x"
                                        " %02x %02x %02x %02x"
@@ -905,18 +900,18 @@ int rndis_register(void (*resp_avail)(void *v), void *v)
                        rndis_per_dev_params [i].used = 1;
                        rndis_per_dev_params [i].resp_avail = resp_avail;
                        rndis_per_dev_params [i].v = v;
-                       DBG("%s: configNr = %d\n", __func__, i);
+                       pr_debug("%s: configNr = %d\n", __func__, i);
                        return i;
                }
        }
-       DBG("failed\n");
+       pr_debug("failed\n");
 
        return -ENODEV;
 }
 
 void rndis_deregister (int configNr)
 {
-       DBG("%s: \n", __func__ );
+       pr_debug("%s: \n", __func__);
 
        if (configNr >= RNDIS_MAX_CONFIGS) return;
        rndis_per_dev_params [configNr].used = 0;
@@ -926,7 +921,7 @@ void rndis_deregister (int configNr)
 
 int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter)
 {
-       DBG("%s:\n", __func__ );
+       pr_debug("%s:\n", __func__);
        if (!dev)
                return -EINVAL;
        if (configNr >= RNDIS_MAX_CONFIGS) return -1;
@@ -939,7 +934,7 @@ int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter)
 
 int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr)
 {
-       DBG("%s:\n", __func__ );
+       pr_debug("%s:\n", __func__);
        if (!vendorDescr) return -1;
        if (configNr >= RNDIS_MAX_CONFIGS) return -1;
 
@@ -951,7 +946,7 @@ int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr)
 
 int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed)
 {
-       DBG("%s: %u %u\n", __func__, medium, speed);
+       pr_debug("%s: %u %u\n", __func__, medium, speed);
        if (configNr >= RNDIS_MAX_CONFIGS) return -1;
 
        rndis_per_dev_params [configNr].medium = medium;
@@ -1114,7 +1109,7 @@ static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
                        break;
                default:
                        if (fl_speed) p->speed = speed;
-                       else DBG("%c is not valid\n", c);
+                       else pr_debug("%c is not valid\n", c);
                        break;
                }
 
@@ -1159,12 +1154,12 @@ int __init rndis_init (void)
                                        &rndis_proc_fops,
                                        (void *)(rndis_per_dev_params + i))))
                {
-                       DBG("%s :remove entries", __func__);
+                       pr_debug("%s :remove entries", __func__);
                        while (i) {
                                sprintf (name, NAME_TEMPLATE, --i);
                                remove_proc_entry (name, NULL);
                        }
-                       DBG("\n");
+                       pr_debug("\n");
                        return -EIO;
                }
 #endif
index b3699afff002f4115b4c3ffaf1b975638aa88f1f..3faa7a7022df24926270d27399cfa92c69062b0e 100644 (file)
 
 /*-------------------------------------------------------------------------*/
 
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "composite.c"
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
+#include "f_acm.c"
+#include "f_serial.c"
+#include "u_serial.c"
+
+/*-------------------------------------------------------------------------*/
+
 /* Thanks to NetChip Technologies for donating this product ID.
 *
 * DO NOT REUSE THESE IDs with a protocol-incompatible driver!!  Ever!!
index 3791e6271903e7384a2a6773281d323c9de4b833..dbd575a194f3c895e46827a605d9e8984e388fb1 100644 (file)
@@ -52,7 +52,7 @@
  * this single "physical" link to be used by multiple virtual links.)
  */
 
-#define DRIVER_VERSION "29-May-2008"
+#define UETH__VERSION  "29-May-2008"
 
 struct eth_dev {
        /* lock is held while accessing port_usb
@@ -170,7 +170,7 @@ static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
        struct eth_dev  *dev = netdev_priv(net);
 
        strlcpy(p->driver, "g_ether", sizeof p->driver);
-       strlcpy(p->version, DRIVER_VERSION, sizeof p->version);
+       strlcpy(p->version, UETH__VERSION, sizeof p->version);
        strlcpy(p->fw_version, dev->gadget->name, sizeof p->fw_version);
        strlcpy(p->bus_info, dev_name(&dev->gadget->dev), sizeof p->bus_info);
 }
index aa0bd4f126a1e5f7892e1ce645b187d88e4ea7f1..361d9659ac48726aa583d69accd2196edc3bd9df 100644 (file)
 #include "gadget_chips.h"
 
 
+/*-------------------------------------------------------------------------*/
+
+/*
+ * Kbuild is not very cooperative with respect to linking separately
+ * compiled library objects into one module.  So for now we won't use
+ * separate compilation ... ensuring init/exit sections work to shrink
+ * the runtime footprint, and giving us at least some parts of what
+ * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
+ */
+#include "composite.c"
+#include "usbstring.c"
+#include "config.c"
+#include "epautoconf.c"
+
+#include "f_sourcesink.c"
+#include "f_loopback.c"
+
 /*-------------------------------------------------------------------------*/
 
 #define DRIVER_VERSION         "Cinco de Mayo 2008"
index db645936eedd3b5f8f5aff71a9eee85a12223757..1f0c2cf26e5d54532ad23a384c1ede813b625b3b 100644 (file)
@@ -123,14 +123,10 @@ static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci)
 
 static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td)
 {
-       if (!list_empty(&td->list)) {
-               dev_warn(uhci_dev(uhci), "td %p still in list!\n", td);
-               WARN_ON(1);
-       }
-       if (!list_empty(&td->fl_list)) {
-               dev_warn(uhci_dev(uhci), "td %p still in fl_list!\n", td);
-               WARN_ON(1);
-       }
+       if (!list_empty(&td->list))
+               dev_WARN(uhci_dev(uhci), "td %p still in list!\n", td);
+       if (!list_empty(&td->fl_list))
+               dev_WARN(uhci_dev(uhci), "td %p still in fl_list!\n", td);
 
        dma_pool_free(uhci->td_pool, td, td->dma_handle);
 }
@@ -295,10 +291,8 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,
 static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
 {
        WARN_ON(qh->state != QH_STATE_IDLE && qh->udev);
-       if (!list_empty(&qh->queue)) {
-               dev_warn(uhci_dev(uhci), "qh %p list not empty!\n", qh);
-               WARN_ON(1);
-       }
+       if (!list_empty(&qh->queue))
+               dev_WARN(uhci_dev(uhci), "qh %p list not empty!\n", qh);
 
        list_del(&qh->node);
        if (qh->udev) {
@@ -746,11 +740,9 @@ static void uhci_free_urb_priv(struct uhci_hcd *uhci,
 {
        struct uhci_td *td, *tmp;
 
-       if (!list_empty(&urbp->node)) {
-               dev_warn(uhci_dev(uhci), "urb %p still on QH's list!\n",
+       if (!list_empty(&urbp->node))
+               dev_WARN(uhci_dev(uhci), "urb %p still on QH's list!\n",
                                urbp->urb);
-               WARN_ON(1);
-       }
 
        list_for_each_entry_safe(td, tmp, &urbp->td_list, list) {
                uhci_remove_td_from_urbp(td);
index 4cfa25b0f44e5620bc45b4447eee62737bf523f2..cc8e0a926f9991749be2cc48cce5a17a8bea9d79 100644 (file)
@@ -595,9 +595,8 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic
         } while(value);
         kit->dev_no = bit;
 
-       kit->dev = device_create_drvdata(phidget_class, &kit->udev->dev,
-                                       MKDEV(0, 0), kit,
-                                       "interfacekit%d", kit->dev_no);
+       kit->dev = device_create(phidget_class, &kit->udev->dev, MKDEV(0, 0),
+                                kit, "interfacekit%d", kit->dev_no);
         if (IS_ERR(kit->dev)) {
                 rc = PTR_ERR(kit->dev);
                 kit->dev = NULL;
index 9b4696f21b22849079b062336b7ef93aa1ed757e..38088b44349eb86695fc837fe54fc84ee1e2e482 100644 (file)
@@ -365,9 +365,8 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic
        } while(value);
        mc->dev_no = bit;
 
-       mc->dev = device_create_drvdata(phidget_class, &mc->udev->dev,
-                                       MKDEV(0, 0), mc,
-                                       "motorcontrol%d", mc->dev_no);
+       mc->dev = device_create(phidget_class, &mc->udev->dev, MKDEV(0, 0), mc,
+                               "motorcontrol%d", mc->dev_no);
        if (IS_ERR(mc->dev)) {
                rc = PTR_ERR(mc->dev);
                mc->dev = NULL;
index 1ca7ddb41d4dfe0014381391766bf8898947aa69..bef6fe16364b47c77c03ddc580744fa310a6daa5 100644 (file)
@@ -275,9 +275,8 @@ servo_probe(struct usb_interface *interface, const struct usb_device_id *id)
         } while (value);
        dev->dev_no = bit;
 
-       dev->dev = device_create_drvdata(phidget_class, &dev->udev->dev,
-                                        MKDEV(0, 0), dev,
-                                        "servo%d", dev->dev_no);
+       dev->dev = device_create(phidget_class, &dev->udev->dev, MKDEV(0, 0),
+                                dev, "servo%d", dev->dev_no);
        if (IS_ERR(dev->dev)) {
                rc = PTR_ERR(dev->dev);
                dev->dev = NULL;
index 6566fc0a322853a50b8f212d6b82df868da9b4d5..c9de3f027aab07a9907b331f25c7723ac012d8e3 100644 (file)
@@ -1162,9 +1162,9 @@ int mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus)
        if (minor >= MON_BIN_MAX_MINOR)
                return 0;
 
-       dev = device_create_drvdata(mon_bin_class, ubus? ubus->controller: NULL,
-                                   MKDEV(MAJOR(mon_bin_dev0), minor), NULL,
-                                   "usbmon%d", minor);
+       dev = device_create(mon_bin_class, ubus ? ubus->controller : NULL,
+                           MKDEV(MAJOR(mon_bin_dev0), minor), NULL,
+                           "usbmon%d", minor);
        if (IS_ERR(dev))
                return 0;
 
index 93a080e827ccc8cbf4370df966096170190701a4..64b3d30027b825395ee2320f70c2e33f7665a0cf 100644 (file)
@@ -3573,8 +3573,8 @@ static int __init fb_console_init(void)
 
        acquire_console_sem();
        fb_register_client(&fbcon_event_notifier);
-       fbcon_device = device_create_drvdata(fb_class, NULL, MKDEV(0, 0),
-                                            NULL, "fbcon");
+       fbcon_device = device_create(fb_class, NULL, MKDEV(0, 0), NULL,
+                                    "fbcon");
 
        if (IS_ERR(fbcon_device)) {
                printk(KERN_WARNING "Unable to create device "
index 6ef800bdf4822f4fcf09f4e0e9db002b0d6fb9ba..4830b1bf51e5da7e6fcdadcfe67ce231ea977cc1 100644 (file)
@@ -153,12 +153,9 @@ struct display_device *display_device_register(struct display_driver *driver,
                mutex_unlock(&allocated_dsp_lock);
 
                if (!ret) {
-                       new_dev->dev = device_create_drvdata(display_class,
-                                                            parent,
-                                                            MKDEV(0,0),
-                                                            new_dev,
-                                                            "display%d",
-                                                            new_dev->idx);
+                       new_dev->dev = device_create(display_class, parent,
+                                                    MKDEV(0, 0), new_dev,
+                                                    "display%d", new_dev->idx);
                        if (!IS_ERR(new_dev->dev)) {
                                new_dev->parent = parent;
                                new_dev->driver = driver;
index 3f18bb9abad0f79bdf736eeed0d07f740d1ea5d8..217c5118ae9e71818ea80014cb2b54cb8c63c707 100644 (file)
@@ -1430,9 +1430,8 @@ register_framebuffer(struct fb_info *fb_info)
                        break;
        fb_info->node = i;
 
-       fb_info->dev = device_create_drvdata(fb_class, fb_info->device,
-                                            MKDEV(FB_MAJOR, i), NULL,
-                                            "fb%d", i);
+       fb_info->dev = device_create(fb_class, fb_info->device,
+                                    MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
        if (IS_ERR(fb_info->dev)) {
                /* Not fatal */
                printk(KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n", i, PTR_ERR(fb_info->dev));
index 0d9b80ec689ccc0741fee358d92f26b34f1bc4c9..cfd29da714d1e9bf9b9f41338c09723ff09422de 100644 (file)
@@ -362,9 +362,8 @@ static int init_coda_psdev(void)
                goto out_chrdev;
        }               
        for (i = 0; i < MAX_CODADEVS; i++)
-               device_create_drvdata(coda_psdev_class, NULL,
-                                     MKDEV(CODA_PSDEV_MAJOR, i),
-                                     NULL, "cfs%d", i);
+               device_create(coda_psdev_class, NULL,
+                             MKDEV(CODA_PSDEV_MAJOR, i), NULL, "cfs%d", i);
        coda_sysctl_init();
        goto out;
 
index 006fc64227ddb16b051b85b0a959cfee7bd652a8..66f6e58a7e4bb1a52590f4eecbb4094647c61c4f 100644 (file)
@@ -61,6 +61,7 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)
        int size = dentry->d_inode->i_size;
        loff_t offs = *off;
        int count = min_t(size_t, bytes, PAGE_SIZE);
+       char *temp;
 
        if (size) {
                if (offs > size)
@@ -69,23 +70,33 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)
                        count = size - offs;
        }
 
+       temp = kmalloc(count, GFP_KERNEL);
+       if (!temp)
+               return -ENOMEM;
+
        mutex_lock(&bb->mutex);
 
        count = fill_read(dentry, bb->buffer, offs, count);
-       if (count < 0)
-               goto out_unlock;
+       if (count < 0) {
+               mutex_unlock(&bb->mutex);
+               goto out_free;
+       }
 
-       if (copy_to_user(userbuf, bb->buffer, count)) {
+       memcpy(temp, bb->buffer, count);
+
+       mutex_unlock(&bb->mutex);
+
+       if (copy_to_user(userbuf, temp, count)) {
                count = -EFAULT;
-               goto out_unlock;
+               goto out_free;
        }
 
        pr_debug("offs = %lld, *off = %lld, count = %d\n", offs, *off, count);
 
        *off = offs + count;
 
- out_unlock:
-       mutex_unlock(&bb->mutex);
+ out_free:
+       kfree(temp);
        return count;
 }
 
@@ -118,6 +129,7 @@ static ssize_t write(struct file *file, const char __user *userbuf,
        int size = dentry->d_inode->i_size;
        loff_t offs = *off;
        int count = min_t(size_t, bytes, PAGE_SIZE);
+       char *temp;
 
        if (size) {
                if (offs > size)
@@ -126,19 +138,27 @@ static ssize_t write(struct file *file, const char __user *userbuf,
                        count = size - offs;
        }
 
-       mutex_lock(&bb->mutex);
+       temp = kmalloc(count, GFP_KERNEL);
+       if (!temp)
+               return -ENOMEM;
 
-       if (copy_from_user(bb->buffer, userbuf, count)) {
+       if (copy_from_user(temp, userbuf, count)) {
                count = -EFAULT;
-               goto out_unlock;
+               goto out_free;
        }
 
+       mutex_lock(&bb->mutex);
+
+       memcpy(bb->buffer, temp, count);
+
        count = flush_write(dentry, bb->buffer, offs, count);
+       mutex_unlock(&bb->mutex);
+
        if (count > 0)
                *off = offs + count;
 
- out_unlock:
-       mutex_unlock(&bb->mutex);
+out_free:
+       kfree(temp);
        return count;
 }
 
index aedaeba82ae5503a41cbd6ee366601ecb67ae31b..3a05a596e3b4de91dcb522401441b8dc8d959aa9 100644 (file)
@@ -370,17 +370,17 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
        memset(acxt, 0, sizeof(*acxt));
        acxt->parent_sd = parent_sd;
 
-       /* Lookup parent inode.  inode initialization and I_NEW
-        * clearing are protected by sysfs_mutex.  By grabbing it and
-        * looking up with _nowait variant, inode state can be
-        * determined reliably.
+       /* Lookup parent inode.  inode initialization is protected by
+        * sysfs_mutex, so inode existence can be determined by
+        * looking up inode while holding sysfs_mutex.
         */
        mutex_lock(&sysfs_mutex);
 
-       inode = ilookup5_nowait(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test,
-                               parent_sd);
+       inode = ilookup5(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test,
+                        parent_sd);
+       if (inode) {
+               WARN_ON(inode->i_state & I_NEW);
 
-       if (inode && !(inode->i_state & I_NEW)) {
                /* parent inode available */
                acxt->parent_inode = inode;
 
@@ -393,8 +393,7 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
                        mutex_lock(&inode->i_mutex);
                        mutex_lock(&sysfs_mutex);
                }
-       } else
-               iput(inode);
+       }
 }
 
 /**
@@ -636,6 +635,7 @@ struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
 
        return sd;
 }
+EXPORT_SYMBOL_GPL(sysfs_get_dirent);
 
 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
                      const char *name, struct sysfs_dirent **p_sd)
@@ -829,16 +829,12 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
        if (!new_dentry)
                goto out_unlock;
 
-       /* rename kobject and sysfs_dirent */
+       /* rename sysfs_dirent */
        error = -ENOMEM;
        new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
        if (!new_name)
                goto out_unlock;
 
-       error = kobject_set_name(kobj, "%s", new_name);
-       if (error)
-               goto out_unlock;
-
        dup_name = sd->s_name;
        sd->s_name = new_name;
 
index c9e4e5091da14c24b185b67419f3207188150f96..1f4a3f877262f5f6fbf34085f688e50b42471c8e 100644 (file)
 #include <linux/poll.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
+#include <linux/limits.h>
 #include <asm/uaccess.h>
 
 #include "sysfs.h"
 
+/* used in crash dumps to help with debugging */
+static char last_sysfs_file[PATH_MAX];
+void sysfs_printk_last_file(void)
+{
+       printk(KERN_EMERG "last sysfs file: %s\n", last_sysfs_file);
+}
+
 /*
  * There's one sysfs_buffer for each open file and one
  * sysfs_open_dirent for each sysfs_dirent with one or more open
@@ -328,6 +336,11 @@ static int sysfs_open_file(struct inode *inode, struct file *file)
        struct sysfs_buffer *buffer;
        struct sysfs_ops *ops;
        int error = -EACCES;
+       char *p;
+
+       p = d_path(&file->f_path, last_sysfs_file, sizeof(last_sysfs_file));
+       if (p)
+               memmove(last_sysfs_file, p, strlen(p) + 1);
 
        /* need attr_sd for attr and ops, its parent for kobj */
        if (!sysfs_get_active_two(attr_sd))
@@ -440,7 +453,23 @@ static unsigned int sysfs_poll(struct file *filp, poll_table *wait)
        return POLLERR|POLLPRI;
 }
 
-void sysfs_notify(struct kobject *k, char *dir, char *attr)
+void sysfs_notify_dirent(struct sysfs_dirent *sd)
+{
+       struct sysfs_open_dirent *od;
+
+       spin_lock(&sysfs_open_dirent_lock);
+
+       od = sd->s_attr.open;
+       if (od) {
+               atomic_inc(&od->event);
+               wake_up_interruptible(&od->poll);
+       }
+
+       spin_unlock(&sysfs_open_dirent_lock);
+}
+EXPORT_SYMBOL_GPL(sysfs_notify_dirent);
+
+void sysfs_notify(struct kobject *k, const char *dir, const char *attr)
 {
        struct sysfs_dirent *sd = k->sd;
 
@@ -450,19 +479,8 @@ void sysfs_notify(struct kobject *k, char *dir, char *attr)
                sd = sysfs_find_dirent(sd, dir);
        if (sd && attr)
                sd = sysfs_find_dirent(sd, attr);
-       if (sd) {
-               struct sysfs_open_dirent *od;
-
-               spin_lock(&sysfs_open_dirent_lock);
-
-               od = sd->s_attr.open;
-               if (od) {
-                       atomic_inc(&od->event);
-                       wake_up_interruptible(&od->poll);
-               }
-
-               spin_unlock(&sysfs_open_dirent_lock);
-       }
+       if (sd)
+               sysfs_notify_dirent(sd);
 
        mutex_unlock(&sysfs_mutex);
 }
index 14f0023984d74d6a51dedc0791fdfab53f2d5cc4..ab343e371d64682f678646ed02615171e73b2d31 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/mount.h>
 #include <linux/pagemap.h>
 #include <linux/init.h>
+#include <linux/module.h>
 
 #include "sysfs.h"
 
@@ -115,3 +116,17 @@ out_err:
        sysfs_dir_cachep = NULL;
        goto out;
 }
+
+#undef sysfs_get
+struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
+{
+       return __sysfs_get(sd);
+}
+EXPORT_SYMBOL_GPL(sysfs_get);
+
+#undef sysfs_put
+void sysfs_put(struct sysfs_dirent *sd)
+{
+       __sysfs_put(sd);
+}
+EXPORT_SYMBOL_GPL(sysfs_put);
index a5db496f71c717ce63073440a3c9a23138b67d47..93c6d6b27c4ded5596c783ac1bdbe4e4b2590bbd 100644 (file)
@@ -124,7 +124,7 @@ int sysfs_create_subdir(struct kobject *kobj, const char *name,
                        struct sysfs_dirent **p_sd);
 void sysfs_remove_subdir(struct sysfs_dirent *sd);
 
-static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
+static inline struct sysfs_dirent *__sysfs_get(struct sysfs_dirent *sd)
 {
        if (sd) {
                WARN_ON(!atomic_read(&sd->s_count));
@@ -132,12 +132,14 @@ static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
        }
        return sd;
 }
+#define sysfs_get(sd) __sysfs_get(sd)
 
-static inline void sysfs_put(struct sysfs_dirent *sd)
+static inline void __sysfs_put(struct sysfs_dirent *sd)
 {
        if (sd && atomic_dec_and_test(&sd->s_count))
                release_sysfs_dirent(sd);
 }
+#define sysfs_put(sd) __sysfs_put(sd)
 
 /*
  * inode.c
index 7440a0dceddba276b59199d14e64a1ee2f232b36..74c5faf26c053a137768d5f4224d466945bc3253 100644 (file)
        CPU_DISCARD(init.data)                                          \
        CPU_DISCARD(init.rodata)                                        \
        MEM_DISCARD(init.data)                                          \
-       MEM_DISCARD(init.rodata)
+       MEM_DISCARD(init.rodata)                                        \
+       /* implement dynamic printk debug */                            \
+       VMLINUX_SYMBOL(__start___verbose_strings) = .;                  \
+       *(__verbose_strings)                                            \
+       VMLINUX_SYMBOL(__stop___verbose_strings) = .;                   \
+       . = ALIGN(8);                                                   \
+       VMLINUX_SYMBOL(__start___verbose) = .;                          \
+       *(__verbose)                                                    \
+       VMLINUX_SYMBOL(__stop___verbose) = .;
 
 #define INIT_TEXT                                                      \
        *(.init.text)                                                   \
index 246937c9cbc780db2cc30b542453d401bcd6c334..987f5912720a2d6ffd6d32a33a062e3b4ef27892 100644 (file)
@@ -90,6 +90,9 @@ int __must_check bus_for_each_drv(struct bus_type *bus,
                                  struct device_driver *start, void *data,
                                  int (*fn)(struct device_driver *, void *));
 
+void bus_sort_breadthfirst(struct bus_type *bus,
+                          int (*compare)(const struct device *a,
+                                         const struct device *b));
 /*
  * Bus notifiers: Get notified of addition/removal of devices
  * and binding/unbinding of drivers to devices.
@@ -502,7 +505,6 @@ extern struct device *device_create(struct class *cls, struct device *parent,
                                    dev_t devt, void *drvdata,
                                    const char *fmt, ...)
                                    __attribute__((format(printf, 5, 6)));
-#define device_create_drvdata  device_create
 extern void device_destroy(struct class *cls, dev_t devt);
 
 /*
@@ -551,7 +553,11 @@ extern const char *dev_driver_string(const struct device *dev);
 #define dev_info(dev, format, arg...)          \
        dev_printk(KERN_INFO , dev , format , ## arg)
 
-#ifdef DEBUG
+#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
+#define dev_dbg(dev, format, ...) do { \
+       dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \
+       } while (0)
+#elif defined(DEBUG)
 #define dev_dbg(dev, format, arg...)           \
        dev_printk(KERN_DEBUG , dev , format , ## arg)
 #else
@@ -567,6 +573,14 @@ extern const char *dev_driver_string(const struct device *dev);
        ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; })
 #endif
 
+/*
+ * dev_WARN() acts like dev_printk(), but with the key difference
+ * of using a WARN/WARN_ON to get the message out, including the
+ * file/line information and a backtrace.
+ */
+#define dev_WARN(dev, format, arg...) \
+       WARN(1, "Device: %s\n" format, dev_driver_string(dev), ## arg);
+
 /* Create alias, so I can be autoloaded. */
 #define MODULE_ALIAS_CHARDEV(major,minor) \
        MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
diff --git a/include/linux/dynamic_printk.h b/include/linux/dynamic_printk.h
new file mode 100644 (file)
index 0000000..2d528d0
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef _DYNAMIC_PRINTK_H
+#define _DYNAMIC_PRINTK_H
+
+#define DYNAMIC_DEBUG_HASH_BITS 6
+#define DEBUG_HASH_TABLE_SIZE (1 << DYNAMIC_DEBUG_HASH_BITS)
+
+#define TYPE_BOOLEAN 1
+
+#define DYNAMIC_ENABLED_ALL 0
+#define DYNAMIC_ENABLED_NONE 1
+#define DYNAMIC_ENABLED_SOME 2
+
+extern int dynamic_enabled;
+
+/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
+ * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
+ * use independent hash functions, to reduce the chance of false positives.
+ */
+extern long long dynamic_printk_enabled;
+extern long long dynamic_printk_enabled2;
+
+struct mod_debug {
+       char *modname;
+       char *logical_modname;
+       char *flag_names;
+       int type;
+       int hash;
+       int hash2;
+} __attribute__((aligned(8)));
+
+int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
+                                       char *flags, int hash, int hash2);
+
+#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
+extern int unregister_dynamic_debug_module(char *mod_name);
+extern int __dynamic_dbg_enabled_helper(char *modname, int type,
+                                       int value, int hash);
+
+#define __dynamic_dbg_enabled(module, type, value, level, hash)  ({         \
+       int __ret = 0;                                                       \
+       if (unlikely((dynamic_printk_enabled & (1LL << DEBUG_HASH)) &&       \
+                       (dynamic_printk_enabled2 & (1LL << DEBUG_HASH2))))   \
+                       __ret = __dynamic_dbg_enabled_helper(module, type,   \
+                                                               value, hash);\
+       __ret; })
+
+#define dynamic_pr_debug(fmt, ...) do {                                            \
+       static char mod_name[]                                              \
+       __attribute__((section("__verbose_strings")))                       \
+        = KBUILD_MODNAME;                                                  \
+       static struct mod_debug descriptor                                  \
+       __used                                                              \
+       __attribute__((section("__verbose"), aligned(8))) =                 \
+       { mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
+       if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,             \
+                                               0, 0, DEBUG_HASH))          \
+               printk(KERN_DEBUG KBUILD_MODNAME ":" fmt,                   \
+                               ##__VA_ARGS__);                             \
+       } while (0)
+
+#define dynamic_dev_dbg(dev, format, ...) do {                             \
+       static char mod_name[]                                              \
+       __attribute__((section("__verbose_strings")))                       \
+        = KBUILD_MODNAME;                                                  \
+       static struct mod_debug descriptor                                  \
+       __used                                                              \
+       __attribute__((section("__verbose"), aligned(8))) =                 \
+       { mod_name, mod_name, NULL, TYPE_BOOLEAN, DEBUG_HASH, DEBUG_HASH2 };\
+       if (__dynamic_dbg_enabled(KBUILD_MODNAME, TYPE_BOOLEAN,             \
+                                               0, 0, DEBUG_HASH))          \
+                       dev_printk(KERN_DEBUG, dev,                         \
+                                       KBUILD_MODNAME ": " format,         \
+                                       ##__VA_ARGS__);                     \
+       } while (0)
+
+#else
+
+static inline int unregister_dynamic_debug_module(const char *mod_name)
+{
+       return 0;
+}
+static inline int __dynamic_dbg_enabled_helper(char *modname, int type,
+                                               int value, int hash)
+{
+       return 0;
+}
+
+#define __dynamic_dbg_enabled(module, type, value, level, hash)  ({ 0; })
+#define dynamic_pr_debug(fmt, ...)  do { } while (0)
+#define dynamic_dev_dbg(dev, format, ...)  do { } while (0)
+#endif
+
+#endif
index e971c55f45ac1f71a528cf3ca2905169787bfdcd..1f3cd8ad052376cf8ce1df0f200dfd7d97591c7f 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/log2.h>
 #include <linux/typecheck.h>
 #include <linux/ratelimit.h>
+#include <linux/dynamic_printk.h>
 #include <asm/byteorder.h>
 #include <asm/bug.h>
 
@@ -304,8 +305,12 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
 #define pr_info(fmt, arg...) \
        printk(KERN_INFO fmt, ##arg)
 
-#ifdef DEBUG
 /* If you are writing a driver, please use dev_dbg instead */
+#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
+#define pr_debug(fmt, ...) do { \
+       dynamic_pr_debug(fmt, ##__VA_ARGS__); \
+       } while (0)
+#elif defined(DEBUG)
 #define pr_debug(fmt, arg...) \
        printk(KERN_DEBUG fmt, ##arg)
 #else
index 68e09557c9511ab31da394afd80a58decad3ee71..a41555cbe00ae071a02dab3c88b3c57bf6c38d4b 100644 (file)
@@ -345,7 +345,6 @@ struct module
        /* Reference counts */
        struct module_ref ref[NR_CPUS];
 #endif
-
 };
 #ifndef MODULE_ARCH_INIT
 #define MODULE_ARCH_INIT {}
index 95ac21ab3a092369f5f41537614eb9890161d70e..4b8cc6a324797682d08e487d314cb4ce647e2d7c 100644 (file)
@@ -37,6 +37,8 @@ extern int platform_add_devices(struct platform_device **, int);
 
 extern struct platform_device *platform_device_register_simple(const char *, int id,
                                        struct resource *, unsigned int);
+extern struct platform_device *platform_device_register_data(struct device *,
+               const char *, int, const void *, size_t);
 
 extern struct platform_device *platform_device_alloc(const char *name, int id);
 extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);
index 37fa24152bd810f7d9dd67b685e738179b5bfdf9..b330e289d71f280f7bb6ca3af431a733039ac420 100644 (file)
@@ -78,6 +78,8 @@ struct sysfs_ops {
        ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t);
 };
 
+struct sysfs_dirent;
+
 #ifdef CONFIG_SYSFS
 
 int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
@@ -117,9 +119,14 @@ int sysfs_add_file_to_group(struct kobject *kobj,
 void sysfs_remove_file_from_group(struct kobject *kobj,
                        const struct attribute *attr, const char *group);
 
-void sysfs_notify(struct kobject *kobj, char *dir, char *attr);
-
-extern int __must_check sysfs_init(void);
+void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
+void sysfs_notify_dirent(struct sysfs_dirent *sd);
+struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
+                                     const unsigned char *name);
+struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd);
+void sysfs_put(struct sysfs_dirent *sd);
+void sysfs_printk_last_file(void);
+int __must_check sysfs_init(void);
 
 #else /* CONFIG_SYSFS */
 
@@ -222,7 +229,24 @@ static inline void sysfs_remove_file_from_group(struct kobject *kobj,
 {
 }
 
-static inline void sysfs_notify(struct kobject *kobj, char *dir, char *attr)
+static inline void sysfs_notify(struct kobject *kobj, const char *dir,
+                               const char *attr)
+{
+}
+static inline void sysfs_notify_dirent(struct sysfs_dirent *sd)
+{
+}
+static inline
+struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
+                                     const unsigned char *name)
+{
+       return NULL;
+}
+static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd)
+{
+       return NULL;
+}
+static inline void sysfs_put(struct sysfs_dirent *sd)
 {
 }
 
@@ -231,6 +255,10 @@ static inline int __must_check sysfs_init(void)
        return 0;
 }
 
+static inline void sysfs_printk_last_file(void)
+{
+}
+
 #endif /* CONFIG_SYSFS */
 
 #endif /* _SYSFS_H_ */
index dd9ac6ad5cb9575926c2d3e6ce74b27f97ae40cf..b7205f67cfaf570aa4aee965cae7e953fec65a2f 100644 (file)
@@ -784,6 +784,7 @@ sys_delete_module(const char __user *name_user, unsigned int flags)
        mutex_lock(&module_mutex);
        /* Store the name of the last unloaded module for diagnostic purposes */
        strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
+       unregister_dynamic_debug_module(mod->name);
        free_module(mod);
 
  out:
@@ -1173,7 +1174,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
                while (i-- > 0)
                        sysfs_remove_bin_file(notes_attrs->dir,
                                              &notes_attrs->attrs[i]);
-               kobject_del(notes_attrs->dir);
+               kobject_put(notes_attrs->dir);
        }
        kfree(notes_attrs);
 }
@@ -1783,6 +1784,33 @@ static inline void add_kallsyms(struct module *mod,
 }
 #endif /* CONFIG_KALLSYMS */
 
+#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
+static void dynamic_printk_setup(Elf_Shdr *sechdrs, unsigned int verboseindex)
+{
+       struct mod_debug *debug_info;
+       unsigned long pos, end;
+       unsigned int num_verbose;
+
+       pos = sechdrs[verboseindex].sh_addr;
+       num_verbose = sechdrs[verboseindex].sh_size /
+                               sizeof(struct mod_debug);
+       end = pos + (num_verbose * sizeof(struct mod_debug));
+
+       for (; pos < end; pos += sizeof(struct mod_debug)) {
+               debug_info = (struct mod_debug *)pos;
+               register_dynamic_debug_module(debug_info->modname,
+                       debug_info->type, debug_info->logical_modname,
+                       debug_info->flag_names, debug_info->hash,
+                       debug_info->hash2);
+       }
+}
+#else
+static inline void dynamic_printk_setup(Elf_Shdr *sechdrs,
+                                       unsigned int verboseindex)
+{
+}
+#endif /* CONFIG_DYNAMIC_PRINTK_DEBUG */
+
 static void *module_alloc_update_bounds(unsigned long size)
 {
        void *ret = module_alloc(size);
@@ -1831,6 +1859,7 @@ static noinline struct module *load_module(void __user *umod,
 #endif
        unsigned int markersindex;
        unsigned int markersstringsindex;
+       unsigned int verboseindex;
        struct module *mod;
        long err = 0;
        void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */
@@ -2117,6 +2146,7 @@ static noinline struct module *load_module(void __user *umod,
        markersindex = find_sec(hdr, sechdrs, secstrings, "__markers");
        markersstringsindex = find_sec(hdr, sechdrs, secstrings,
                                        "__markers_strings");
+       verboseindex = find_sec(hdr, sechdrs, secstrings, "__verbose");
 
        /* Now do relocations. */
        for (i = 1; i < hdr->e_shnum; i++) {
@@ -2167,6 +2197,7 @@ static noinline struct module *load_module(void __user *umod,
                marker_update_probe_range(mod->markers,
                        mod->markers + mod->num_markers);
 #endif
+       dynamic_printk_setup(sechdrs, verboseindex);
        err = module_finalize(hdr, sechdrs, mod);
        if (err < 0)
                goto cleanup;
index aa81d2848448db8f007194cc086804dcffe2623e..31d784dd80d022cdb112fc56863eebe0cf6c5d7d 100644 (file)
@@ -807,6 +807,61 @@ menuconfig BUILD_DOCSRC
 
          Say N if you are unsure.
 
+config DYNAMIC_PRINTK_DEBUG
+       bool "Enable dynamic printk() call support"
+       default n
+       depends on PRINTK
+       select PRINTK_DEBUG
+       help
+
+         Compiles debug level messages into the kernel, which would not
+         otherwise be available at runtime. These messages can then be
+         enabled/disabled on a per module basis. This mechanism implicitly
+         enables all pr_debug() and dev_dbg() calls. The impact of this
+         compile option is a larger kernel text size of about 2%.
+
+         Usage:
+
+         Dynamic debugging is controlled by the debugfs file,
+         dynamic_printk/modules. This file contains a list of the modules that
+         can be enabled. The format of the file is the module name, followed
+         by a set of flags that can be enabled. The first flag is always the
+         'enabled' flag. For example:
+
+               <module_name> <enabled=0/1>
+                               .
+                               .
+                               .
+
+         <module_name> : Name of the module in which the debug call resides
+         <enabled=0/1> : whether the messages are enabled or not
+
+         From a live system:
+
+               snd_hda_intel enabled=0
+               fixup enabled=0
+               driver enabled=0
+
+         Enable a module:
+
+               $echo "set enabled=1 <module_name>" > dynamic_printk/modules
+
+         Disable a module:
+
+               $echo "set enabled=0 <module_name>" > dynamic_printk/modules
+
+         Enable all modules:
+
+               $echo "set enabled=1 all" > dynamic_printk/modules
+
+         Disable all modules:
+
+               $echo "set enabled=0 all" > dynamic_printk/modules
+
+         Finally, passing "dynamic_printk" at the command line enables
+         debugging for all modules. This mode can be turned off via the above
+         disable command.
+
 source "samples/Kconfig"
 
 source "lib/Kconfig.kgdb"
index 44001af76a7dfc4f44216fa25959291633df36e7..16feaab057b2d5fdda220ae350a09f765c7f24be 100644 (file)
@@ -81,6 +81,8 @@ obj-$(CONFIG_HAVE_LMB) += lmb.o
 
 obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o
 
+obj-$(CONFIG_DYNAMIC_PRINTK_DEBUG) += dynamic_printk.o
+
 hostprogs-y    := gen_crc32table
 clean-files    := crc32table.h
 
diff --git a/lib/dynamic_printk.c b/lib/dynamic_printk.c
new file mode 100644 (file)
index 0000000..d640f87
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * lib/dynamic_printk.c
+ *
+ * make pr_debug()/dev_dbg() calls runtime configurable based upon their
+ * their source module.
+ *
+ * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com>
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/uaccess.h>
+#include <linux/seq_file.h>
+#include <linux/debugfs.h>
+#include <linux/fs.h>
+
+extern struct mod_debug __start___verbose[];
+extern struct mod_debug __stop___verbose[];
+
+struct debug_name {
+       struct hlist_node hlist;
+       struct hlist_node hlist2;
+       int hash1;
+       int hash2;
+       char *name;
+       int enable;
+       int type;
+};
+
+static int nr_entries;
+static int num_enabled;
+int dynamic_enabled = DYNAMIC_ENABLED_NONE;
+static struct hlist_head module_table[DEBUG_HASH_TABLE_SIZE] =
+       { [0 ... DEBUG_HASH_TABLE_SIZE-1] = HLIST_HEAD_INIT };
+static struct hlist_head module_table2[DEBUG_HASH_TABLE_SIZE] =
+       { [0 ... DEBUG_HASH_TABLE_SIZE-1] = HLIST_HEAD_INIT };
+static DECLARE_MUTEX(debug_list_mutex);
+
+/* dynamic_printk_enabled, and dynamic_printk_enabled2 are bitmasks in which
+ * bit n is set to 1 if any modname hashes into the bucket n, 0 otherwise. They
+ * use independent hash functions, to reduce the chance of false positives.
+ */
+long long dynamic_printk_enabled;
+EXPORT_SYMBOL_GPL(dynamic_printk_enabled);
+long long dynamic_printk_enabled2;
+EXPORT_SYMBOL_GPL(dynamic_printk_enabled2);
+
+/* returns the debug module pointer. */
+static struct debug_name *find_debug_module(char *module_name)
+{
+       int i;
+       struct hlist_head *head;
+       struct hlist_node *node;
+       struct debug_name *element;
+
+       element = NULL;
+       for (i = 0; i < DEBUG_HASH_TABLE_SIZE; i++) {
+               head = &module_table[i];
+               hlist_for_each_entry_rcu(element, node, head, hlist)
+                       if (!strcmp(element->name, module_name))
+                               return element;
+       }
+       return NULL;
+}
+
+/* returns the debug module pointer. */
+static struct debug_name *find_debug_module_hash(char *module_name, int hash)
+{
+       struct hlist_head *head;
+       struct hlist_node *node;
+       struct debug_name *element;
+
+       element = NULL;
+       head = &module_table[hash];
+       hlist_for_each_entry_rcu(element, node, head, hlist)
+               if (!strcmp(element->name, module_name))
+                       return element;
+       return NULL;
+}
+
+/* caller must hold mutex*/
+static int __add_debug_module(char *mod_name, int hash, int hash2)
+{
+       struct debug_name *new;
+       char *module_name;
+       int ret = 0;
+
+       if (find_debug_module(mod_name)) {
+               ret = -EINVAL;
+               goto out;
+       }
+       module_name = kmalloc(strlen(mod_name) + 1, GFP_KERNEL);
+       if (!module_name) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       module_name = strcpy(module_name, mod_name);
+       module_name[strlen(mod_name)] = '\0';
+       new = kzalloc(sizeof(struct debug_name), GFP_KERNEL);
+       if (!new) {
+               kfree(module_name);
+               ret = -ENOMEM;
+               goto out;
+       }
+       INIT_HLIST_NODE(&new->hlist);
+       INIT_HLIST_NODE(&new->hlist2);
+       new->name = module_name;
+       new->hash1 = hash;
+       new->hash2 = hash2;
+       hlist_add_head_rcu(&new->hlist, &module_table[hash]);
+       hlist_add_head_rcu(&new->hlist2, &module_table2[hash2]);
+       nr_entries++;
+out:
+       return ret;
+}
+
+int unregister_dynamic_debug_module(char *mod_name)
+{
+       struct debug_name *element;
+       int ret = 0;
+
+       down(&debug_list_mutex);
+       element = find_debug_module(mod_name);
+       if (!element) {
+               ret = -EINVAL;
+               goto out;
+       }
+       hlist_del_rcu(&element->hlist);
+       hlist_del_rcu(&element->hlist2);
+       synchronize_rcu();
+       kfree(element->name);
+       if (element->enable)
+               num_enabled--;
+       kfree(element);
+       nr_entries--;
+out:
+       up(&debug_list_mutex);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(unregister_dynamic_debug_module);
+
+int register_dynamic_debug_module(char *mod_name, int type, char *share_name,
+                                       char *flags, int hash, int hash2)
+{
+       struct debug_name *elem;
+       int ret = 0;
+
+       down(&debug_list_mutex);
+       elem = find_debug_module(mod_name);
+       if (!elem) {
+               if (__add_debug_module(mod_name, hash, hash2))
+                       goto out;
+               elem = find_debug_module(mod_name);
+               if (dynamic_enabled == DYNAMIC_ENABLED_ALL &&
+                               !strcmp(mod_name, share_name)) {
+                       elem->enable = true;
+                       num_enabled++;
+               }
+       }
+       elem->type |= type;
+out:
+       up(&debug_list_mutex);
+       return ret;
+}
+EXPORT_SYMBOL_GPL(register_dynamic_debug_module);
+
+int __dynamic_dbg_enabled_helper(char *mod_name, int type, int value, int hash)
+{
+       struct debug_name *elem;
+       int ret = 0;
+
+       if (dynamic_enabled == DYNAMIC_ENABLED_ALL)
+               return 1;
+       rcu_read_lock();
+       elem = find_debug_module_hash(mod_name, hash);
+       if (elem && elem->enable)
+               ret = 1;
+       rcu_read_unlock();
+       return ret;
+}
+EXPORT_SYMBOL_GPL(__dynamic_dbg_enabled_helper);
+
+static void set_all(bool enable)
+{
+       struct debug_name *e;
+       struct hlist_node *node;
+       int i;
+       long long enable_mask;
+
+       for (i = 0; i < DEBUG_HASH_TABLE_SIZE; i++) {
+               if (module_table[i].first != NULL) {
+                       hlist_for_each_entry(e, node, &module_table[i], hlist) {
+                               e->enable = enable;
+                       }
+               }
+       }
+       if (enable)
+               enable_mask = ULLONG_MAX;
+       else
+               enable_mask = 0;
+       dynamic_printk_enabled = enable_mask;
+       dynamic_printk_enabled2 = enable_mask;
+}
+
+static int disabled_hash(int i, bool first_table)
+{
+       struct debug_name *e;
+       struct hlist_node *node;
+
+       if (first_table) {
+               hlist_for_each_entry(e, node, &module_table[i], hlist) {
+                       if (e->enable)
+                               return 0;
+               }
+       } else {
+               hlist_for_each_entry(e, node, &module_table2[i], hlist2) {
+                       if (e->enable)
+                               return 0;
+               }
+       }
+       return 1;
+}
+
+static ssize_t pr_debug_write(struct file *file, const char __user *buf,
+                               size_t length, loff_t *ppos)
+{
+       char *buffer, *s, *value_str, *setting_str;
+       int err, value;
+       struct debug_name *elem = NULL;
+       int all = 0;
+
+       if (length > PAGE_SIZE || length < 0)
+               return -EINVAL;
+
+       buffer = (char *)__get_free_page(GFP_KERNEL);
+       if (!buffer)
+               return -ENOMEM;
+
+       err = -EFAULT;
+       if (copy_from_user(buffer, buf, length))
+               goto out;
+
+       err = -EINVAL;
+       if (length < PAGE_SIZE)
+               buffer[length] = '\0';
+       else if (buffer[PAGE_SIZE-1])
+               goto out;
+
+       err = -EINVAL;
+       down(&debug_list_mutex);
+
+       if (strncmp("set", buffer, 3))
+               goto out_up;
+       s = buffer + 3;
+       setting_str = strsep(&s, "=");
+       if (s == NULL)
+               goto out_up;
+       setting_str = strstrip(setting_str);
+       value_str = strsep(&s, " ");
+       if (s == NULL)
+               goto out_up;
+       s = strstrip(s);
+       if (!strncmp(s, "all", 3))
+               all = 1;
+       else
+               elem = find_debug_module(s);
+       if (!strncmp(setting_str, "enable", 6)) {
+               value = !!simple_strtol(value_str, NULL, 10);
+               if (all) {
+                       if (value) {
+                               set_all(true);
+                               num_enabled = nr_entries;
+                               dynamic_enabled = DYNAMIC_ENABLED_ALL;
+                       } else {
+                               set_all(false);
+                               num_enabled = 0;
+                               dynamic_enabled = DYNAMIC_ENABLED_NONE;
+                       }
+                       err = 0;
+               } else {
+                       if (elem) {
+                               if (value && (elem->enable == 0)) {
+                                       dynamic_printk_enabled |=
+                                                       (1LL << elem->hash1);
+                                       dynamic_printk_enabled2 |=
+                                                       (1LL << elem->hash2);
+                                       elem->enable = 1;
+                                       num_enabled++;
+                                       dynamic_enabled = DYNAMIC_ENABLED_SOME;
+                                       err = 0;
+                                       printk(KERN_DEBUG
+                                              "debugging enabled for module %s",
+                                              elem->name);
+                               } else if (!value && (elem->enable == 1)) {
+                                       elem->enable = 0;
+                                       num_enabled--;
+                                       if (disabled_hash(elem->hash1, true))
+                                               dynamic_printk_enabled &=
+                                                       ~(1LL << elem->hash1);
+                                       if (disabled_hash(elem->hash2, false))
+                                               dynamic_printk_enabled2 &=
+                                                       ~(1LL << elem->hash2);
+                                       if (num_enabled)
+                                               dynamic_enabled =
+                                                       DYNAMIC_ENABLED_SOME;
+                                       else
+                                               dynamic_enabled =
+                                                       DYNAMIC_ENABLED_NONE;
+                                       err = 0;
+                                       printk(KERN_DEBUG
+                                              "debugging disabled for module "
+                                              "%s", elem->name);
+                               }
+                       }
+               }
+       }
+       if (!err)
+               err = length;
+out_up:
+       up(&debug_list_mutex);
+out:
+       free_page((unsigned long)buffer);
+       return err;
+}
+
+static void *pr_debug_seq_start(struct seq_file *f, loff_t *pos)
+{
+       return (*pos < DEBUG_HASH_TABLE_SIZE) ? pos : NULL;
+}
+
+static void *pr_debug_seq_next(struct seq_file *s, void *v, loff_t *pos)
+{
+       (*pos)++;
+       if (*pos >= DEBUG_HASH_TABLE_SIZE)
+               return NULL;
+       return pos;
+}
+
+static void pr_debug_seq_stop(struct seq_file *s, void *v)
+{
+       /* Nothing to do */
+}
+
+static int pr_debug_seq_show(struct seq_file *s, void *v)
+{
+       struct hlist_head *head;
+       struct hlist_node *node;
+       struct debug_name *elem;
+       unsigned int i = *(loff_t *) v;
+
+       rcu_read_lock();
+       head = &module_table[i];
+       hlist_for_each_entry_rcu(elem, node, head, hlist) {
+               seq_printf(s, "%s enabled=%d", elem->name, elem->enable);
+               seq_printf(s, "\n");
+       }
+       rcu_read_unlock();
+       return 0;
+}
+
+static struct seq_operations pr_debug_seq_ops = {
+       .start = pr_debug_seq_start,
+       .next  = pr_debug_seq_next,
+       .stop  = pr_debug_seq_stop,
+       .show  = pr_debug_seq_show
+};
+
+static int pr_debug_open(struct inode *inode, struct file *filp)
+{
+       return seq_open(filp, &pr_debug_seq_ops);
+}
+
+static const struct file_operations pr_debug_operations = {
+       .open           = pr_debug_open,
+       .read           = seq_read,
+       .write          = pr_debug_write,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
+static int __init dynamic_printk_init(void)
+{
+       struct dentry *dir, *file;
+       struct mod_debug *iter;
+       unsigned long value;
+
+       dir = debugfs_create_dir("dynamic_printk", NULL);
+       if (!dir)
+               return -ENOMEM;
+       file = debugfs_create_file("modules", 0644, dir, NULL,
+                                       &pr_debug_operations);
+       if (!file) {
+               debugfs_remove(dir);
+               return -ENOMEM;
+       }
+       for (value = (unsigned long)__start___verbose;
+               value < (unsigned long)__stop___verbose;
+               value += sizeof(struct mod_debug)) {
+                       iter = (struct mod_debug *)value;
+                       register_dynamic_debug_module(iter->modname,
+                               iter->type,
+                               iter->logical_modname,
+                               iter->flag_names, iter->hash, iter->hash2);
+       }
+       return 0;
+}
+module_init(dynamic_printk_init);
+/* may want to move this earlier so we can get traces as early as possible */
+
+static int __init dynamic_printk_setup(char *str)
+{
+       if (str)
+               return -ENOENT;
+       set_all(true);
+       return 0;
+}
+/* Use early_param(), so we can get debug output as early as possible */
+early_param("dynamic_printk", dynamic_printk_setup);
index fbf0ae28237672a6fafdbbf29e481d76c45ddd11..0487d1f64806c645927fdc22ea4a5848f3d9ea5f 100644 (file)
@@ -387,11 +387,17 @@ EXPORT_SYMBOL_GPL(kobject_init_and_add);
  * kobject_rename - change the name of an object
  * @kobj: object in question.
  * @new_name: object's new name
+ *
+ * It is the responsibility of the caller to provide mutual
+ * exclusion between two different calls of kobject_rename
+ * on the same kobject and to ensure that new_name is valid and
+ * won't conflict with other kobjects.
  */
 int kobject_rename(struct kobject *kobj, const char *new_name)
 {
        int error = 0;
        const char *devpath = NULL;
+       const char *dup_name = NULL, *name;
        char *devpath_string = NULL;
        char *envp[2];
 
@@ -401,19 +407,6 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
        if (!kobj->parent)
                return -EINVAL;
 
-       /* see if this name is already in use */
-       if (kobj->kset) {
-               struct kobject *temp_kobj;
-               temp_kobj = kset_find_obj(kobj->kset, new_name);
-               if (temp_kobj) {
-                       printk(KERN_WARNING "kobject '%s' cannot be renamed "
-                              "to '%s' as '%s' is already in existence.\n",
-                              kobject_name(kobj), new_name, new_name);
-                       kobject_put(temp_kobj);
-                       return -EINVAL;
-               }
-       }
-
        devpath = kobject_get_path(kobj, GFP_KERNEL);
        if (!devpath) {
                error = -ENOMEM;
@@ -428,15 +421,27 @@ int kobject_rename(struct kobject *kobj, const char *new_name)
        envp[0] = devpath_string;
        envp[1] = NULL;
 
+       name = dup_name = kstrdup(new_name, GFP_KERNEL);
+       if (!name) {
+               error = -ENOMEM;
+               goto out;
+       }
+
        error = sysfs_rename_dir(kobj, new_name);
+       if (error)
+               goto out;
+
+       /* Install the new kobject name */
+       dup_name = kobj->name;
+       kobj->name = name;
 
        /* This function is mostly/only used for network interface.
         * Some hotplug package track interfaces by their name and
         * therefore want to know when the name is changed by the user. */
-       if (!error)
-               kobject_uevent_env(kobj, KOBJ_MOVE, envp);
+       kobject_uevent_env(kobj, KOBJ_MOVE, envp);
 
 out:
+       kfree(dup_name);
        kfree(devpath_string);
        kfree(devpath);
        kobject_put(kobj);
index 373e51e91ce5bb07176ff87cf883309c616aa880..1bc3001d182773e33872081d4b40fc7bf6f4e95d 100644 (file)
@@ -65,7 +65,7 @@ void
                             struct nf_conntrack_expect *exp) __read_mostly;
 EXPORT_SYMBOL_GPL(nf_nat_pptp_hook_expectfn);
 
-#ifdef DEBUG
+#if defined(DEBUG) || defined(CONFIG_DYNAMIC_PRINTK_DEBUG)
 /* PptpControlMessageType names */
 const char *const pptp_msg_name[] = {
        "UNKNOWN_MESSAGE",
index ea48b82a37076123c09c04346f796bc8e68da5db..b4ca38a2115883294c49255769953519fb1c1ca4 100644 (file)
@@ -96,6 +96,14 @@ basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
 modname_flags  = $(if $(filter 1,$(words $(modname))),\
                  -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
 
+#hash values
+ifdef CONFIG_DYNAMIC_PRINTK_DEBUG
+debug_flags = -D"DEBUG_HASH=$(shell ./scripts/basic/hash djb2 $(@D)$(modname))"\
+              -D"DEBUG_HASH2=$(shell ./scripts/basic/hash r5 $(@D)$(modname))"
+else
+debug_flags =
+endif
+
 orig_c_flags   = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o)
 _c_flags       = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags))
 _a_flags       = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o)
@@ -121,7 +129,8 @@ endif
 
 c_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \
                 $(__c_flags) $(modkern_cflags) \
-                -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
+                -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \
+                 $(debug_flags)
 
 a_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \
                 $(__a_flags) $(modkern_aflags)
index 4c324a1f1e0efb8668b4d64e05b56e8e0f64f25b..09559951df1208e00f5a51efa1208145a87efe14 100644 (file)
@@ -9,7 +9,7 @@
 # fixdep:       Used to generate dependency information during build process
 # docproc:      Used in Documentation/DocBook
 
-hostprogs-y    := fixdep docproc
+hostprogs-y    := fixdep docproc hash
 always         := $(hostprogs-y)
 
 # fixdep is needed to compile other host programs
diff --git a/scripts/basic/hash.c b/scripts/basic/hash.c
new file mode 100644 (file)
index 0000000..3299ad7
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com>
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define DYNAMIC_DEBUG_HASH_BITS 6
+
+static const char *program;
+
+static void usage(void)
+{
+       printf("Usage: %s <djb2|r5> <modname>\n", program);
+       exit(1);
+}
+
+/* djb2 hashing algorithm by Dan Bernstein. From:
+ * http://www.cse.yorku.ca/~oz/hash.html
+ */
+
+unsigned int djb2_hash(char *str)
+{
+       unsigned long hash = 5381;
+       int c;
+
+       c = *str;
+       while (c) {
+               hash = ((hash << 5) + hash) + c;
+               c = *++str;
+       }
+       return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
+}
+
+unsigned int r5_hash(char *str)
+{
+       unsigned long hash = 0;
+       int c;
+
+       c = *str;
+       while (c) {
+               hash = (hash + (c << 4) + (c >> 4)) * 11;
+               c = *++str;
+       }
+       return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1));
+}
+
+int main(int argc, char *argv[])
+{
+       program = argv[0];
+
+       if (argc != 3)
+               usage();
+       if (!strcmp(argv[1], "djb2"))
+               printf("%d\n", djb2_hash(argv[2]));
+       else if (!strcmp(argv[1], "r5"))
+               printf("%d\n", r5_hash(argv[2]));
+       else
+               usage();
+       exit(0);
+}
+
index 8af467df9245823a2ea5c96981e161d42ed63734..ef2352c2e45116a824f4e8275e590a2c7394594b 100644 (file)
@@ -549,9 +549,9 @@ int snd_card_register(struct snd_card *card)
                return -EINVAL;
 #ifndef CONFIG_SYSFS_DEPRECATED
        if (!card->card_dev) {
-               card->card_dev = device_create_drvdata(sound_class, card->dev,
-                                                      MKDEV(0, 0), NULL,
-                                                      "card%i", card->number);
+               card->card_dev = device_create(sound_class, card->dev,
+                                              MKDEV(0, 0), NULL,
+                                              "card%i", card->number);
                if (IS_ERR(card->card_dev))
                        card->card_dev = NULL;
        }
index c0685e2f0afa1fe39cab14cf86cb733cbaa761e7..44a69bb8d4f018e953cf0de692a9fb681a4a74b0 100644 (file)
@@ -274,9 +274,8 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,
                return minor;
        }
        snd_minors[minor] = preg;
-       preg->dev = device_create_drvdata(sound_class, device,
-                                         MKDEV(major, minor),
-                                         private_data, "%s", name);
+       preg->dev = device_create(sound_class, device, MKDEV(major, minor),
+                                 private_data, "%s", name);
        if (IS_ERR(preg->dev)) {
                snd_minors[minor] = NULL;
                mutex_unlock(&sound_mutex);
index 7d89c081a0866bfe9b7ee22696ee286007cb0a2a..61aaedae6b7e084f8d7359d28fc88d9e4493e490 100644 (file)
@@ -560,19 +560,18 @@ static int __init oss_init(void)
        sound_dmap_flag = (dmabuf > 0 ? 1 : 0);
 
        for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
-               device_create_drvdata(sound_class, NULL,
-                                     MKDEV(SOUND_MAJOR, dev_list[i].minor),
-                                     NULL, "%s", dev_list[i].name);
+               device_create(sound_class, NULL,
+                             MKDEV(SOUND_MAJOR, dev_list[i].minor), NULL,
+                             "%s", dev_list[i].name);
 
                if (!dev_list[i].num)
                        continue;
 
                for (j = 1; j < *dev_list[i].num; j++)
-                       device_create_drvdata(sound_class, NULL,
-                                             MKDEV(SOUND_MAJOR,
-                                                   dev_list[i].minor + (j*0x10)),
-                                             NULL,
-                                             "%s%d", dev_list[i].name, j);
+                       device_create(sound_class, NULL,
+                                     MKDEV(SOUND_MAJOR,
+                                           dev_list[i].minor + (j*0x10)),
+                                     NULL, "%s%d", dev_list[i].name, j);
        }
 
        if (sound_nblocks >= 1024)
index 4ae07e236b36a81d87a51307a9272b50cef17528..faef87a9bc3fdbac4f5ed27040877de887db6783 100644 (file)
@@ -220,9 +220,8 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operati
        else
                sprintf(s->name, "sound/%s%d", name, r / SOUND_STEP);
 
-       device_create_drvdata(sound_class, dev,
-                             MKDEV(SOUND_MAJOR, s->unit_minor),
-                             NULL, s->name+6);
+       device_create(sound_class, dev, MKDEV(SOUND_MAJOR, s->unit_minor),
+                     NULL, s->name+6);
        return r;
 
  fail: