rt2x00: Introduce concept of driver data in struct rt2x00_dev.
authorGertjan van Wingerde <gwingerde@gmail.com>
Mon, 6 Feb 2012 22:45:06 +0000 (23:45 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 8 Feb 2012 20:26:27 +0000 (15:26 -0500)
We are getting more and more fields in struct rt2x00_dev that are
specific to one or two of the low-level drivers. Instead of putting
these fields inside the main structure and thus clobbering all low-level
drivers with these fields, introduce the concept of driver data inside
struct rt2x00_dev, whose size is indicated by the low-level driver and
which can be populated by the low-level driver.

Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00.h
drivers/net/wireless/rt2x00/rt2x00dev.c

index b03b22c47b187753269ed1a69cf1189af4e71dd6..b4260bfb6cb49d0aae9d0778eba2b677957a9062 100644 (file)
@@ -647,6 +647,7 @@ struct rt2x00lib_ops {
  */
 struct rt2x00_ops {
        const char *name;
+       const unsigned int drv_data_size;
        const unsigned int max_sta_intf;
        const unsigned int max_ap_intf;
        const unsigned int eeprom_size;
@@ -741,6 +742,11 @@ struct rt2x00_dev {
         */
        const struct rt2x00_ops *ops;
 
+       /*
+        * Driver data.
+        */
+       void *drv_data;
+
        /*
         * IEEE80211 control structure.
         */
index c3e1aa7c1a8057b7eb19270f8aacb3f718b86577..bae5b01299ea1e1065078d984bc4b94e5086a1ad 100644 (file)
@@ -1121,6 +1121,18 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
 {
        int retval = -ENOMEM;
 
+       /*
+        * Allocate the driver data memory, if necessary.
+        */
+       if (rt2x00dev->ops->drv_data_size > 0) {
+               rt2x00dev->drv_data = kzalloc(rt2x00dev->ops->drv_data_size,
+                                             GFP_KERNEL);
+               if (!rt2x00dev->drv_data) {
+                       retval = -ENOMEM;
+                       goto exit;
+               }
+       }
+
        spin_lock_init(&rt2x00dev->irqmask_lock);
        mutex_init(&rt2x00dev->csr_mutex);
 
@@ -1261,6 +1273,12 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
         * Free queue structures.
         */
        rt2x00queue_free(rt2x00dev);
+
+       /*
+        * Free the driver data.
+        */
+       if (rt2x00dev->drv_data)
+               kfree(rt2x00dev->drv_data);
 }
 EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);