Commit dc21b545 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

iwlwifi: make mac80211 ops a device config

In the future, 4965 and modern AGN devices will
need to have different mac80211 callbacks since
they have different capabilities. Prepare for
that by making the mac80211 operations a device
config.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 07caf9d6
...@@ -243,6 +243,7 @@ static const struct iwl_ops iwl1000_ops = { ...@@ -243,6 +243,7 @@ static const struct iwl_ops iwl1000_ops = {
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl1000_base_params = { static struct iwl_base_params iwl1000_base_params = {
......
...@@ -2753,6 +2753,7 @@ static const struct iwl_ops iwl3945_ops = { ...@@ -2753,6 +2753,7 @@ static const struct iwl_ops iwl3945_ops = {
.hcmd = &iwl3945_hcmd, .hcmd = &iwl3945_hcmd,
.utils = &iwl3945_hcmd_utils, .utils = &iwl3945_hcmd_utils,
.led = &iwl3945_led_ops, .led = &iwl3945_led_ops,
.ieee80211_ops = &iwl3945_hw_ops,
}; };
static struct iwl_base_params iwl3945_base_params = { static struct iwl_base_params iwl3945_base_params = {
......
...@@ -282,6 +282,8 @@ extern int iwl3945_commit_rxon(struct iwl_priv *priv, ...@@ -282,6 +282,8 @@ extern int iwl3945_commit_rxon(struct iwl_priv *priv,
*/ */
extern u8 iwl3945_hw_find_station(struct iwl_priv *priv, const u8 *bssid); extern u8 iwl3945_hw_find_station(struct iwl_priv *priv, const u8 *bssid);
extern struct ieee80211_ops iwl3945_hw_ops;
/* /*
* Forward declare iwl-3945.c functions for iwl-base.c * Forward declare iwl-3945.c functions for iwl-base.c
*/ */
......
...@@ -2305,6 +2305,7 @@ static const struct iwl_ops iwl4965_ops = { ...@@ -2305,6 +2305,7 @@ static const struct iwl_ops iwl4965_ops = {
.hcmd = &iwl4965_hcmd, .hcmd = &iwl4965_hcmd,
.utils = &iwl4965_hcmd_utils, .utils = &iwl4965_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl4965_base_params = { static struct iwl_base_params iwl4965_base_params = {
......
...@@ -485,6 +485,7 @@ static const struct iwl_ops iwl5000_ops = { ...@@ -485,6 +485,7 @@ static const struct iwl_ops iwl5000_ops = {
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl5150_ops = { static const struct iwl_ops iwl5150_ops = {
...@@ -492,6 +493,7 @@ static const struct iwl_ops iwl5150_ops = { ...@@ -492,6 +493,7 @@ static const struct iwl_ops iwl5150_ops = {
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl5000_base_params = { static struct iwl_base_params iwl5000_base_params = {
......
...@@ -439,6 +439,7 @@ static const struct iwl_ops iwl6000_ops = { ...@@ -439,6 +439,7 @@ static const struct iwl_ops iwl6000_ops = {
.hcmd = &iwlagn_hcmd, .hcmd = &iwlagn_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6050_ops = { static const struct iwl_ops iwl6050_ops = {
...@@ -447,6 +448,7 @@ static const struct iwl_ops iwl6050_ops = { ...@@ -447,6 +448,7 @@ static const struct iwl_ops iwl6050_ops = {
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.nic = &iwl6050_nic_ops, .nic = &iwl6050_nic_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6050g2_ops = { static const struct iwl_ops iwl6050g2_ops = {
...@@ -455,6 +457,7 @@ static const struct iwl_ops iwl6050g2_ops = { ...@@ -455,6 +457,7 @@ static const struct iwl_ops iwl6050g2_ops = {
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.nic = &iwl6050g2_nic_ops, .nic = &iwl6050g2_nic_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static const struct iwl_ops iwl6000g2b_ops = { static const struct iwl_ops iwl6000g2b_ops = {
...@@ -462,6 +465,7 @@ static const struct iwl_ops iwl6000g2b_ops = { ...@@ -462,6 +465,7 @@ static const struct iwl_ops iwl6000g2b_ops = {
.hcmd = &iwlagn_bt_hcmd, .hcmd = &iwlagn_bt_hcmd,
.utils = &iwlagn_hcmd_utils, .utils = &iwlagn_hcmd_utils,
.led = &iwlagn_led_ops, .led = &iwlagn_led_ops,
.ieee80211_ops = &iwlagn_hw_ops,
}; };
static struct iwl_base_params iwl6000_base_params = { static struct iwl_base_params iwl6000_base_params = {
......
...@@ -4211,7 +4211,7 @@ static void iwl_uninit_drv(struct iwl_priv *priv) ...@@ -4211,7 +4211,7 @@ static void iwl_uninit_drv(struct iwl_priv *priv)
kfree(priv->scan_cmd); kfree(priv->scan_cmd);
} }
static struct ieee80211_ops iwl_hw_ops = { struct ieee80211_ops iwlagn_hw_ops = {
.tx = iwl_mac_tx, .tx = iwl_mac_tx,
.start = iwl_mac_start, .start = iwl_mac_start,
.stop = iwl_mac_stop, .stop = iwl_mac_stop,
...@@ -4300,10 +4300,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -4300,10 +4300,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
if (cfg->mod_params->disable_hw_scan) { if (cfg->mod_params->disable_hw_scan) {
dev_printk(KERN_DEBUG, &(pdev->dev), dev_printk(KERN_DEBUG, &(pdev->dev),
"sw scan support is deprecated\n"); "sw scan support is deprecated\n");
iwl_hw_ops.hw_scan = NULL; iwlagn_hw_ops.hw_scan = NULL;
} }
hw = iwl_alloc_all(cfg, &iwl_hw_ops); hw = iwl_alloc_all(cfg);
if (!hw) { if (!hw) {
err = -ENOMEM; err = -ENOMEM;
goto out; goto out;
......
...@@ -102,6 +102,8 @@ extern struct iwl_hcmd_ops iwlagn_hcmd; ...@@ -102,6 +102,8 @@ extern struct iwl_hcmd_ops iwlagn_hcmd;
extern struct iwl_hcmd_ops iwlagn_bt_hcmd; extern struct iwl_hcmd_ops iwlagn_bt_hcmd;
extern struct iwl_hcmd_utils_ops iwlagn_hcmd_utils; extern struct iwl_hcmd_utils_ops iwlagn_hcmd_utils;
extern struct ieee80211_ops iwlagn_hw_ops;
int iwl_reset_ict(struct iwl_priv *priv); int iwl_reset_ict(struct iwl_priv *priv);
void iwl_disable_ict(struct iwl_priv *priv); void iwl_disable_ict(struct iwl_priv *priv);
int iwl_alloc_isr_ict(struct iwl_priv *priv); int iwl_alloc_isr_ict(struct iwl_priv *priv);
......
...@@ -77,15 +77,15 @@ EXPORT_SYMBOL(iwl_bcast_addr); ...@@ -77,15 +77,15 @@ EXPORT_SYMBOL(iwl_bcast_addr);
/* This function both allocates and initializes hw and priv. */ /* This function both allocates and initializes hw and priv. */
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg, struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg)
struct ieee80211_ops *hw_ops)
{ {
struct iwl_priv *priv; struct iwl_priv *priv;
/* mac80211 allocates memory for this device instance, including /* mac80211 allocates memory for this device instance, including
* space for this driver's private structure */ * space for this driver's private structure */
struct ieee80211_hw *hw = struct ieee80211_hw *hw;
ieee80211_alloc_hw(sizeof(struct iwl_priv), hw_ops);
hw = ieee80211_alloc_hw(sizeof(struct iwl_priv),
cfg->ops->ieee80211_ops);
if (hw == NULL) { if (hw == NULL) {
pr_err("%s: Can not allocate network device\n", pr_err("%s: Can not allocate network device\n",
cfg->name); cfg->name);
......
...@@ -241,6 +241,7 @@ struct iwl_ops { ...@@ -241,6 +241,7 @@ struct iwl_ops {
const struct iwl_hcmd_utils_ops *utils; const struct iwl_hcmd_utils_ops *utils;
const struct iwl_led_ops *led; const struct iwl_led_ops *led;
const struct iwl_nic_ops *nic; const struct iwl_nic_ops *nic;
const struct ieee80211_ops *ieee80211_ops;
}; };
struct iwl_mod_params { struct iwl_mod_params {
...@@ -396,8 +397,7 @@ struct iwl_cfg { ...@@ -396,8 +397,7 @@ struct iwl_cfg {
* L i b * * L i b *
***************************/ ***************************/
struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg, struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg);
struct ieee80211_ops *hw_ops);
int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, int iwl_mac_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *params); const struct ieee80211_tx_queue_params *params);
int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw); int iwl_mac_tx_last_beacon(struct ieee80211_hw *hw);
......
...@@ -3824,7 +3824,7 @@ static struct attribute_group iwl3945_attribute_group = { ...@@ -3824,7 +3824,7 @@ static struct attribute_group iwl3945_attribute_group = {
.attrs = iwl3945_sysfs_entries, .attrs = iwl3945_sysfs_entries,
}; };
static struct ieee80211_ops iwl3945_hw_ops = { struct ieee80211_ops iwl3945_hw_ops = {
.tx = iwl3945_mac_tx, .tx = iwl3945_mac_tx,
.start = iwl3945_mac_start, .start = iwl3945_mac_start,
.stop = iwl3945_mac_stop, .stop = iwl3945_mac_stop,
...@@ -3966,7 +3966,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e ...@@ -3966,7 +3966,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
/* mac80211 allocates memory for this device instance, including /* mac80211 allocates memory for this device instance, including
* space for this driver's private structure */ * space for this driver's private structure */
hw = iwl_alloc_all(cfg, &iwl3945_hw_ops); hw = iwl_alloc_all(cfg);
if (hw == NULL) { if (hw == NULL) {
pr_err("Can not allocate network device\n"); pr_err("Can not allocate network device\n");
err = -ENOMEM; err = -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment