wlcore/wl12xx: create per-chip-family private storage

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>
This commit is contained in:
Arik Nemtsov 2011-12-07 21:09:03 +02:00 committed by Luciano Coelho
parent 441101f678
commit 96e0c6837b
3 changed files with 21 additions and 3 deletions

View file

@ -655,12 +655,16 @@ static struct wlcore_ops wl12xx_ops = {
.get_mac = wl12xx_get_mac, .get_mac = wl12xx_get_mac,
}; };
struct wl12xx_priv {
};
static int __devinit wl12xx_probe(struct platform_device *pdev) static int __devinit wl12xx_probe(struct platform_device *pdev)
{ {
struct wl1271 *wl; struct wl1271 *wl;
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
struct wl12xx_priv *priv;
hw = wlcore_alloc_hw(); hw = wlcore_alloc_hw(sizeof(*priv));
if (IS_ERR(hw)) { if (IS_ERR(hw)) {
wl1271_error("can't allocate hw"); wl1271_error("can't allocate hw");
return PTR_ERR(hw); return PTR_ERR(hw);

View file

@ -5197,7 +5197,7 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
#define WL1271_DEFAULT_CHANNEL 0 #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 ieee80211_hw *hw;
struct wl1271 *wl; struct wl1271 *wl;
@ -5216,6 +5216,13 @@ struct ieee80211_hw *wlcore_alloc_hw(void)
wl = hw->priv; wl = hw->priv;
memset(wl, 0, sizeof(*wl)); 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); INIT_LIST_HEAD(&wl->wlvif_list);
wl->hw = hw; wl->hw = hw;
@ -5316,6 +5323,9 @@ struct ieee80211_hw *wlcore_alloc_hw(void)
err_hw: err_hw:
wl1271_debugfs_exit(wl); wl1271_debugfs_exit(wl);
kfree(wl->priv);
err_priv_alloc:
ieee80211_free_hw(hw); ieee80211_free_hw(hw);
err_hw_alloc: err_hw_alloc:
@ -5354,6 +5364,7 @@ int wlcore_free_hw(struct wl1271 *wl)
kfree(wl->tx_res_if); kfree(wl->tx_res_if);
destroy_workqueue(wl->freezable_wq); destroy_workqueue(wl->freezable_wq);
kfree(wl->priv);
ieee80211_free_hw(wl->hw); ieee80211_free_hw(wl->hw);
return 0; return 0;

View file

@ -300,11 +300,14 @@ struct wl1271 {
const char *plt_fw_name; const char *plt_fw_name;
const char *sr_fw_name; const char *sr_fw_name;
const char *mr_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 __devinit wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);
int __devexit wlcore_remove(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); int wlcore_free_hw(struct wl1271 *wl);
/* Firmware image load chunk size */ /* Firmware image load chunk size */