diff options
author | Reinette Chatre <reinette.chatre@intel.com> | 2008-12-02 15:14:06 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-12-05 09:35:56 -0500 |
commit | a0987a8d68c86562f267efa97be01314c490c496 (patch) | |
tree | bd2fe7c65c61fbbb9a94c5264b0690fddbcbe6d2 /drivers/net/wireless/iwlwifi/iwl-5000.c | |
parent | c02b3acd29766c6f79c2411cb5b85e1ee72c4c8f (diff) |
iwlwifi: rely on API version read from firmware
This adds the infrastructure to support older firmware APIs.
The API version number is stored as part of the filename, we first try to
load the most recent firmware and progressively try lower versions.
The API version is also read from the firmware self and stored as part
of the iwl_priv structure. Only firmware that is supported by driver will
be loaded. The version number read from firmware is compared
to supported versions in the driver not the API version used as part of
filename.
An example using this new infrastrucure:
if (IWL_UCODE_API(priv->ucode_ver) >= 2) {
Driver interacts with Firmware API version >= 2.
} else {
Driver interacts with Firmware API version 1.
}
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-5000.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index f7a8df8dcaa7..438e4bd0a9a8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -44,11 +44,21 @@ | |||
44 | #include "iwl-helpers.h" | 44 | #include "iwl-helpers.h" |
45 | #include "iwl-5000-hw.h" | 45 | #include "iwl-5000-hw.h" |
46 | 46 | ||
47 | #define IWL5000_UCODE_API "-1" | 47 | /* Highest firmware API version supported */ |
48 | #define IWL5150_UCODE_API "-1" | 48 | #define IWL5000_UCODE_API_MAX 1 |
49 | #define IWL5150_UCODE_API_MAX 1 | ||
49 | 50 | ||
50 | #define IWL5000_MODULE_FIRMWARE "iwlwifi-5000" IWL5000_UCODE_API ".ucode" | 51 | /* Lowest firmware API version supported */ |
51 | #define IWL5150_MODULE_FIRMWARE "iwlwifi-5150" IWL5150_UCODE_API ".ucode" | 52 | #define IWL5000_UCODE_API_MIN 1 |
53 | #define IWL5150_UCODE_API_MIN 1 | ||
54 | |||
55 | #define IWL5000_FW_PRE "iwlwifi-5000-" | ||
56 | #define _IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE #api ".ucode" | ||
57 | #define IWL5000_MODULE_FIRMWARE(api) _IWL5000_MODULE_FIRMWARE(api) | ||
58 | |||
59 | #define IWL5150_FW_PRE "iwlwifi-5150-" | ||
60 | #define _IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE #api ".ucode" | ||
61 | #define IWL5150_MODULE_FIRMWARE(api) _IWL5150_MODULE_FIRMWARE(api) | ||
52 | 62 | ||
53 | static const u16 iwl5000_default_queue_to_tx_fifo[] = { | 63 | static const u16 iwl5000_default_queue_to_tx_fifo[] = { |
54 | IWL_TX_FIFO_AC3, | 64 | IWL_TX_FIFO_AC3, |
@@ -1532,7 +1542,9 @@ static struct iwl_mod_params iwl50_mod_params = { | |||
1532 | 1542 | ||
1533 | struct iwl_cfg iwl5300_agn_cfg = { | 1543 | struct iwl_cfg iwl5300_agn_cfg = { |
1534 | .name = "5300AGN", | 1544 | .name = "5300AGN", |
1535 | .fw_name = IWL5000_MODULE_FIRMWARE, | 1545 | .fw_name_pre = IWL5000_FW_PRE, |
1546 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
1547 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
1536 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, | 1548 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
1537 | .ops = &iwl5000_ops, | 1549 | .ops = &iwl5000_ops, |
1538 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1550 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1543,7 +1555,9 @@ struct iwl_cfg iwl5300_agn_cfg = { | |||
1543 | 1555 | ||
1544 | struct iwl_cfg iwl5100_bg_cfg = { | 1556 | struct iwl_cfg iwl5100_bg_cfg = { |
1545 | .name = "5100BG", | 1557 | .name = "5100BG", |
1546 | .fw_name = IWL5000_MODULE_FIRMWARE, | 1558 | .fw_name_pre = IWL5000_FW_PRE, |
1559 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
1560 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
1547 | .sku = IWL_SKU_G, | 1561 | .sku = IWL_SKU_G, |
1548 | .ops = &iwl5000_ops, | 1562 | .ops = &iwl5000_ops, |
1549 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1563 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1554,7 +1568,9 @@ struct iwl_cfg iwl5100_bg_cfg = { | |||
1554 | 1568 | ||
1555 | struct iwl_cfg iwl5100_abg_cfg = { | 1569 | struct iwl_cfg iwl5100_abg_cfg = { |
1556 | .name = "5100ABG", | 1570 | .name = "5100ABG", |
1557 | .fw_name = IWL5000_MODULE_FIRMWARE, | 1571 | .fw_name_pre = IWL5000_FW_PRE, |
1572 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
1573 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
1558 | .sku = IWL_SKU_A|IWL_SKU_G, | 1574 | .sku = IWL_SKU_A|IWL_SKU_G, |
1559 | .ops = &iwl5000_ops, | 1575 | .ops = &iwl5000_ops, |
1560 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1576 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1565,7 +1581,9 @@ struct iwl_cfg iwl5100_abg_cfg = { | |||
1565 | 1581 | ||
1566 | struct iwl_cfg iwl5100_agn_cfg = { | 1582 | struct iwl_cfg iwl5100_agn_cfg = { |
1567 | .name = "5100AGN", | 1583 | .name = "5100AGN", |
1568 | .fw_name = IWL5000_MODULE_FIRMWARE, | 1584 | .fw_name_pre = IWL5000_FW_PRE, |
1585 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
1586 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
1569 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, | 1587 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
1570 | .ops = &iwl5000_ops, | 1588 | .ops = &iwl5000_ops, |
1571 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1589 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1576,7 +1594,9 @@ struct iwl_cfg iwl5100_agn_cfg = { | |||
1576 | 1594 | ||
1577 | struct iwl_cfg iwl5350_agn_cfg = { | 1595 | struct iwl_cfg iwl5350_agn_cfg = { |
1578 | .name = "5350AGN", | 1596 | .name = "5350AGN", |
1579 | .fw_name = IWL5000_MODULE_FIRMWARE, | 1597 | .fw_name_pre = IWL5000_FW_PRE, |
1598 | .ucode_api_max = IWL5000_UCODE_API_MAX, | ||
1599 | .ucode_api_min = IWL5000_UCODE_API_MIN, | ||
1580 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, | 1600 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
1581 | .ops = &iwl5000_ops, | 1601 | .ops = &iwl5000_ops, |
1582 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1602 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1587,7 +1607,9 @@ struct iwl_cfg iwl5350_agn_cfg = { | |||
1587 | 1607 | ||
1588 | struct iwl_cfg iwl5150_agn_cfg = { | 1608 | struct iwl_cfg iwl5150_agn_cfg = { |
1589 | .name = "5150AGN", | 1609 | .name = "5150AGN", |
1590 | .fw_name = IWL5150_MODULE_FIRMWARE, | 1610 | .fw_name_pre = IWL5150_FW_PRE, |
1611 | .ucode_api_max = IWL5150_UCODE_API_MAX, | ||
1612 | .ucode_api_min = IWL5150_UCODE_API_MIN, | ||
1591 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, | 1613 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
1592 | .ops = &iwl5000_ops, | 1614 | .ops = &iwl5000_ops, |
1593 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, | 1615 | .eeprom_size = IWL_5000_EEPROM_IMG_SIZE, |
@@ -1596,8 +1618,8 @@ struct iwl_cfg iwl5150_agn_cfg = { | |||
1596 | .mod_params = &iwl50_mod_params, | 1618 | .mod_params = &iwl50_mod_params, |
1597 | }; | 1619 | }; |
1598 | 1620 | ||
1599 | MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE); | 1621 | MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); |
1600 | MODULE_FIRMWARE(IWL5150_MODULE_FIRMWARE); | 1622 | MODULE_FIRMWARE(IWL5150_MODULE_FIRMWARE(IWL5150_UCODE_API_MAX)); |
1601 | 1623 | ||
1602 | module_param_named(disable50, iwl50_mod_params.disable, int, 0444); | 1624 | module_param_named(disable50, iwl50_mod_params.disable, int, 0444); |
1603 | MODULE_PARM_DESC(disable50, | 1625 | MODULE_PARM_DESC(disable50, |