* dropped transactions.
                         */
                        pm_qos_update_request(
-                               adapter->netdev->pm_qos_req, 55);
+                               &adapter->netdev->pm_qos_req, 55);
                } else {
                        pm_qos_update_request(
-                               adapter->netdev->pm_qos_req,
+                               &adapter->netdev->pm_qos_req,
                                PM_QOS_DEFAULT_VALUE);
                }
        }
 
        /* DMA latency requirement to workaround early-receive/jumbo issue */
        if (adapter->flags & FLAG_HAS_ERT)
-               adapter->netdev->pm_qos_req =
-                       pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
-                                      PM_QOS_DEFAULT_VALUE);
+               pm_qos_add_request(&adapter->netdev->pm_qos_req,
+                                  PM_QOS_CPU_DMA_LATENCY,
+                                  PM_QOS_DEFAULT_VALUE);
 
        /* hardware has been reset, we need to reload some things */
        e1000_configure(adapter);
        e1000_clean_tx_ring(adapter);
        e1000_clean_rx_ring(adapter);
 
-       if (adapter->flags & FLAG_HAS_ERT) {
-               pm_qos_remove_request(
-                             adapter->netdev->pm_qos_req);
-               adapter->netdev->pm_qos_req = NULL;
-       }
+       if (adapter->flags & FLAG_HAS_ERT)
+               pm_qos_remove_request(&adapter->netdev->pm_qos_req);
 
        /*
         * TODO: for power management, we could drop the link and
 
 #define DRV_VERSION "1.0.0-k0"
 char igbvf_driver_name[] = "igbvf";
 const char igbvf_driver_version[] = DRV_VERSION;
-struct pm_qos_request_list *igbvf_driver_pm_qos_req;
+static struct pm_qos_request_list igbvf_driver_pm_qos_req;
 static const char igbvf_driver_string[] =
                                "Intel(R) Virtual Function Network Driver";
 static const char igbvf_copyright[] = "Copyright (c) 2009 Intel Corporation.";
        printk(KERN_INFO "%s\n", igbvf_copyright);
 
        ret = pci_register_driver(&igbvf_driver);
-       igbvf_driver_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
-                              PM_QOS_DEFAULT_VALUE);
+       pm_qos_add_request(&igbvf_driver_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+                          PM_QOS_DEFAULT_VALUE);
 
        return ret;
 }
 static void __exit igbvf_exit_module(void)
 {
        pci_unregister_driver(&igbvf_driver);
-       pm_qos_remove_request(igbvf_driver_pm_qos_req);
-       igbvf_driver_pm_qos_req = NULL;
+       pm_qos_remove_request(&igbvf_driver_pm_qos_req);
 }
 module_exit(igbvf_exit_module);
 
 
 #define DRV_DESCRIPTION        "Intel(R) PRO/Wireless 2100 Network Driver"
 #define DRV_COPYRIGHT  "Copyright(c) 2003-2006 Intel Corporation"
 
-struct pm_qos_request_list *ipw2100_pm_qos_req;
+struct pm_qos_request_list ipw2100_pm_qos_req;
 
 /* Debugging stuff */
 #ifdef CONFIG_IPW2100_DEBUG
        /* the ipw2100 hardware really doesn't want power management delays
         * longer than 175usec
         */
-       pm_qos_update_request(ipw2100_pm_qos_req, 175);
+       pm_qos_update_request(&ipw2100_pm_qos_req, 175);
 
        /* If the interrupt is enabled, turn it off... */
        spin_lock_irqsave(&priv->low_lock, flags);
        ipw2100_disable_interrupts(priv);
        spin_unlock_irqrestore(&priv->low_lock, flags);
 
-       pm_qos_update_request(ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
+       pm_qos_update_request(&ipw2100_pm_qos_req, PM_QOS_DEFAULT_VALUE);
 
        /* We have to signal any supplicant if we are disassociating */
        if (associated)
        if (ret)
                goto out;
 
-       ipw2100_pm_qos_req = pm_qos_add_request(PM_QOS_CPU_DMA_LATENCY,
-                       PM_QOS_DEFAULT_VALUE);
+       pm_qos_add_request(&ipw2100_pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
+                          PM_QOS_DEFAULT_VALUE);
 #ifdef CONFIG_IPW2100_DEBUG
        ipw2100_debug_level = debug;
        ret = driver_create_file(&ipw2100_pci_driver.driver,
                           &driver_attr_debug_level);
 #endif
        pci_unregister_driver(&ipw2100_pci_driver);
-       pm_qos_remove_request(ipw2100_pm_qos_req);
+       pm_qos_remove_request(&ipw2100_pm_qos_req);
 }
 
 module_init(ipw2100_init);
 
         */
        char                    name[IFNAMSIZ];
 
-       struct pm_qos_request_list *pm_qos_req;
+       struct pm_qos_request_list pm_qos_req;
 
        /* device name hash chain */
        struct hlist_node       name_hlist;
 
+#ifndef _LINUX_PM_QOS_PARAMS_H
+#define _LINUX_PM_QOS_PARAMS_H
 /* interface for the pm_qos_power infrastructure of the linux kernel.
  *
  * Mark Gross <mgross@linux.intel.com>
  */
-#include <linux/list.h>
+#include <linux/plist.h>
 #include <linux/notifier.h>
 #include <linux/miscdevice.h>
 
 #define PM_QOS_NUM_CLASSES 4
 #define PM_QOS_DEFAULT_VALUE -1
 
-struct pm_qos_request_list;
+struct pm_qos_request_list {
+       struct plist_node list;
+       int pm_qos_class;
+};
 
-struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value);
+void pm_qos_add_request(struct pm_qos_request_list *l, int pm_qos_class, s32 value);
 void pm_qos_update_request(struct pm_qos_request_list *pm_qos_req,
                s32 new_value);
 void pm_qos_remove_request(struct pm_qos_request_list *pm_qos_req);
 int pm_qos_request(int pm_qos_class);
 int pm_qos_add_notifier(int pm_qos_class, struct notifier_block *notifier);
 int pm_qos_remove_notifier(int pm_qos_class, struct notifier_block *notifier);
+int pm_qos_request_active(struct pm_qos_request_list *req);
 
+#endif
 
        int number;
        char name[32];                  /* substream name */
        int stream;                     /* stream (direction) */
-       struct pm_qos_request_list *latency_pm_qos_req; /* pm_qos request */
+       struct pm_qos_request_list latency_pm_qos_req; /* pm_qos request */
        size_t buffer_bytes_max;        /* limit ring buffer size */
        struct snd_dma_buffer dma_buffer;
        unsigned int dma_buf_id;
 
 /*#define DEBUG*/
 
 #include <linux/pm_qos_params.h>
-#include <linux/plist.h>
 #include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
  * or pm_qos_object list and pm_qos_objects need to happen with pm_qos_lock
  * held, taken with _irqsave.  One lock to rule them all
  */
-struct pm_qos_request_list {
-       struct plist_node list;
-       int pm_qos_class;
-};
-
 enum pm_qos_type {
        PM_QOS_MAX,             /* return the largest value */
        PM_QOS_MIN              /* return the smallest value */
 }
 EXPORT_SYMBOL_GPL(pm_qos_request);
 
+int pm_qos_request_active(struct pm_qos_request_list *req)
+{
+       return req->pm_qos_class != 0;
+}
+EXPORT_SYMBOL_GPL(pm_qos_request_active);
+
 /**
  * pm_qos_add_request - inserts new qos request into the list
  * @pm_qos_class: identifies which list of qos request to us
  * element as a handle for use in updating and removal.  Call needs to save
  * this handle for later use.
  */
-struct pm_qos_request_list *pm_qos_add_request(int pm_qos_class, s32 value)
+void pm_qos_add_request(struct pm_qos_request_list *dep,
+                       int pm_qos_class, s32 value)
 {
-       struct pm_qos_request_list *dep;
-
-       dep = kzalloc(sizeof(struct pm_qos_request_list), GFP_KERNEL);
-       if (dep) {
-               struct pm_qos_object *o =  pm_qos_array[pm_qos_class];
-               int new_value;
-
-               if (value == PM_QOS_DEFAULT_VALUE)
-                       new_value = o->default_value;
-               else
-                       new_value = value;
-               plist_node_init(&dep->list, new_value);
-               dep->pm_qos_class = pm_qos_class;
-               update_target(o, &dep->list, 0, PM_QOS_DEFAULT_VALUE);
-       }
+       struct pm_qos_object *o =  pm_qos_array[pm_qos_class];
+       int new_value;
 
-       return dep;
+       if (pm_qos_request_active(dep)) {
+               WARN(1, KERN_ERR "pm_qos_add_request() called for already added request\n");
+               return;
+       }
+       if (value == PM_QOS_DEFAULT_VALUE)
+               new_value = o->default_value;
+       else
+               new_value = value;
+       plist_node_init(&dep->list, new_value);
+       dep->pm_qos_class = pm_qos_class;
+       update_target(o, &dep->list, 0, PM_QOS_DEFAULT_VALUE);
 }
 EXPORT_SYMBOL_GPL(pm_qos_add_request);
 
        if (!pm_qos_req) /*guard against callers passing in null */
                return;
 
+       if (!pm_qos_request_active(pm_qos_req)) {
+               WARN(1, KERN_ERR "pm_qos_update_request() called for unknown object\n");
+               return;
+       }
+
        o = pm_qos_array[pm_qos_req->pm_qos_class];
 
        if (new_value == PM_QOS_DEFAULT_VALUE)
                return;
                /* silent return to keep pcm code cleaner */
 
+       if (!pm_qos_request_active(pm_qos_req)) {
+               WARN(1, KERN_ERR "pm_qos_remove_request() called for unknown object\n");
+               return;
+       }
+
        o = pm_qos_array[pm_qos_req->pm_qos_class];
        update_target(o, &pm_qos_req->list, 1, PM_QOS_DEFAULT_VALUE);
-       kfree(pm_qos_req);
+       memset(pm_qos_req, 0, sizeof(*pm_qos_req));
 }
 EXPORT_SYMBOL_GPL(pm_qos_remove_request);
 
 
        pm_qos_class = find_pm_qos_object_by_minor(iminor(inode));
        if (pm_qos_class >= 0) {
-               filp->private_data = (void *) pm_qos_add_request(pm_qos_class,
-                               PM_QOS_DEFAULT_VALUE);
+               struct pm_qos_request_list *req = kzalloc(GFP_KERNEL, sizeof(*req));
+               if (!req)
+                       return -ENOMEM;
+
+               pm_qos_add_request(req, pm_qos_class, PM_QOS_DEFAULT_VALUE);
+               filp->private_data = req;
 
                if (filp->private_data)
                        return 0;
 {
        struct pm_qos_request_list *req;
 
-       req = (struct pm_qos_request_list *)filp->private_data;
+       req = filp->private_data;
        pm_qos_remove_request(req);
+       kfree(req);
 
        return 0;
 }
 
        snd_pcm_timer_resolution_change(substream);
        runtime->status->state = SNDRV_PCM_STATE_SETUP;
 
-       if (substream->latency_pm_qos_req) {
-               pm_qos_remove_request(substream->latency_pm_qos_req);
-               substream->latency_pm_qos_req = NULL;
-       }
+       if (pm_qos_request_active(&substream->latency_pm_qos_req))
+               pm_qos_remove_request(&substream->latency_pm_qos_req);
        if ((usecs = period_to_usecs(runtime)) >= 0)
-               substream->latency_pm_qos_req = pm_qos_add_request(
-                                       PM_QOS_CPU_DMA_LATENCY, usecs);
+               pm_qos_add_request(&substream->latency_pm_qos_req,
+                                  PM_QOS_CPU_DMA_LATENCY, usecs);
        return 0;
  _error:
        /* hardware might be unuseable from this time,
        if (substream->ops->hw_free)
                result = substream->ops->hw_free(substream);
        runtime->status->state = SNDRV_PCM_STATE_OPEN;
-       pm_qos_remove_request(substream->latency_pm_qos_req);
-       substream->latency_pm_qos_req = NULL;
+       pm_qos_remove_request(&substream->latency_pm_qos_req);
        return result;
 }