wlcore/wl12xx: create per-chip-family private storage
authorArik Nemtsov <arik@wizery.com>
Wed, 7 Dec 2011 19:09:03 +0000 (21:09 +0200)
committerLuciano Coelho <coelho@ti.com>
Thu, 12 Apr 2012 05:43:58 +0000 (08:43 +0300)
This storage is allocated in wlcore_alloc_hw and freed in free_hw. The
size of the storage is determined by the low-level driver.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wlcore/main.c
drivers/net/wireless/ti/wlcore/wlcore.h

index d24e49a..e05a1cf 100644 (file)
@@ -655,12 +655,16 @@ static struct wlcore_ops wl12xx_ops = {
        .get_mac        = wl12xx_get_mac,
 };
 
+struct wl12xx_priv {
+};
+
 static int __devinit wl12xx_probe(struct platform_device *pdev)
 {
        struct wl1271 *wl;
        struct ieee80211_hw *hw;
+       struct wl12xx_priv *priv;
 
-       hw = wlcore_alloc_hw();
+       hw = wlcore_alloc_hw(sizeof(*priv));
        if (IS_ERR(hw)) {
                wl1271_error("can't allocate hw");
                return PTR_ERR(hw);
index 5a20292..2e29baf 100644 (file)
@@ -5197,7 +5197,7 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
 
 #define WL1271_DEFAULT_CHANNEL 0
 
-struct ieee80211_hw *wlcore_alloc_hw(void)
+struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size)
 {
        struct ieee80211_hw *hw;
        struct wl1271 *wl;
@@ -5216,6 +5216,13 @@ struct ieee80211_hw *wlcore_alloc_hw(void)
        wl = hw->priv;
        memset(wl, 0, sizeof(*wl));
 
+       wl->priv = kzalloc(priv_size, GFP_KERNEL);
+       if (!wl->priv) {
+               wl1271_error("could not alloc wl priv");
+               ret = -ENOMEM;
+               goto err_priv_alloc;
+       }
+
        INIT_LIST_HEAD(&wl->wlvif_list);
 
        wl->hw = hw;
@@ -5316,6 +5323,9 @@ err_wq:
 
 err_hw:
        wl1271_debugfs_exit(wl);
+       kfree(wl->priv);
+
+err_priv_alloc:
        ieee80211_free_hw(hw);
 
 err_hw_alloc:
@@ -5354,6 +5364,7 @@ int wlcore_free_hw(struct wl1271 *wl)
        kfree(wl->tx_res_if);
        destroy_workqueue(wl->freezable_wq);
 
+       kfree(wl->priv);
        ieee80211_free_hw(wl->hw);
 
        return 0;
index 66c33b8..01ac091 100644 (file)
@@ -300,11 +300,14 @@ struct wl1271 {
        const char *plt_fw_name;
        const char *sr_fw_name;
        const char *mr_fw_name;
+
+       /* per-chip-family private structure */
+       void *priv;
 };
 
 int __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
 int __devexit wlcore_remove(struct platform_device *pdev);
-struct ieee80211_hw *wlcore_alloc_hw(void);
+struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size);
 int wlcore_free_hw(struct wl1271 *wl);
 
 /* Firmware image load chunk size */