diff options
author | Gertjan van Wingerde <gwingerde@gmail.com> | 2012-02-06 17:45:06 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-02-08 15:26:27 -0500 |
commit | 1ebbc48520a0853cd4d812d8342f9886b2b07b92 (patch) | |
tree | b6ab8a4688581394a3bb08ab92d79215a21719df /drivers/net/wireless | |
parent | 234f6e5c05277c0198797553434e2ed5acac18cc (diff) |
rt2x00: Introduce concept of driver data in struct rt2x00_dev.
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>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 18 |
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index b03b22c47b18..b4260bfb6cb4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -647,6 +647,7 @@ struct rt2x00lib_ops { | |||
647 | */ | 647 | */ |
648 | struct rt2x00_ops { | 648 | struct rt2x00_ops { |
649 | const char *name; | 649 | const char *name; |
650 | const unsigned int drv_data_size; | ||
650 | const unsigned int max_sta_intf; | 651 | const unsigned int max_sta_intf; |
651 | const unsigned int max_ap_intf; | 652 | const unsigned int max_ap_intf; |
652 | const unsigned int eeprom_size; | 653 | const unsigned int eeprom_size; |
@@ -742,6 +743,11 @@ struct rt2x00_dev { | |||
742 | const struct rt2x00_ops *ops; | 743 | const struct rt2x00_ops *ops; |
743 | 744 | ||
744 | /* | 745 | /* |
746 | * Driver data. | ||
747 | */ | ||
748 | void *drv_data; | ||
749 | |||
750 | /* | ||
745 | * IEEE80211 control structure. | 751 | * IEEE80211 control structure. |
746 | */ | 752 | */ |
747 | struct ieee80211_hw *hw; | 753 | struct ieee80211_hw *hw; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c3e1aa7c1a80..bae5b01299ea 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1121,6 +1121,18 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
1121 | { | 1121 | { |
1122 | int retval = -ENOMEM; | 1122 | int retval = -ENOMEM; |
1123 | 1123 | ||
1124 | /* | ||
1125 | * Allocate the driver data memory, if necessary. | ||
1126 | */ | ||
1127 | if (rt2x00dev->ops->drv_data_size > 0) { | ||
1128 | rt2x00dev->drv_data = kzalloc(rt2x00dev->ops->drv_data_size, | ||
1129 | GFP_KERNEL); | ||
1130 | if (!rt2x00dev->drv_data) { | ||
1131 | retval = -ENOMEM; | ||
1132 | goto exit; | ||
1133 | } | ||
1134 | } | ||
1135 | |||
1124 | spin_lock_init(&rt2x00dev->irqmask_lock); | 1136 | spin_lock_init(&rt2x00dev->irqmask_lock); |
1125 | mutex_init(&rt2x00dev->csr_mutex); | 1137 | mutex_init(&rt2x00dev->csr_mutex); |
1126 | 1138 | ||
@@ -1261,6 +1273,12 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev) | |||
1261 | * Free queue structures. | 1273 | * Free queue structures. |
1262 | */ | 1274 | */ |
1263 | rt2x00queue_free(rt2x00dev); | 1275 | rt2x00queue_free(rt2x00dev); |
1276 | |||
1277 | /* | ||
1278 | * Free the driver data. | ||
1279 | */ | ||
1280 | if (rt2x00dev->drv_data) | ||
1281 | kfree(rt2x00dev->drv_data); | ||
1264 | } | 1282 | } |
1265 | EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev); | 1283 | EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev); |
1266 | 1284 | ||