aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2012-02-06 17:45:06 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-02-08 15:26:27 -0500
commit1ebbc48520a0853cd4d812d8342f9886b2b07b92 (patch)
treeb6ab8a4688581394a3bb08ab92d79215a21719df /drivers
parent234f6e5c05277c0198797553434e2ed5acac18cc (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')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h6
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c18
2 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index b03b22c47b1..b4260bfb6cb 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -647,6 +647,7 @@ struct rt2x00lib_ops {
647 */ 647 */
648struct rt2x00_ops { 648struct 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 c3e1aa7c1a8..bae5b01299e 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}
1265EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev); 1283EXPORT_SYMBOL_GPL(rt2x00lib_remove_dev);
1266 1284