iwlwifi: cleanup PCI register handling
This patch cleans up pci registers handling. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
926f0b2ef2
commit
e7b635814b
@ -98,16 +98,17 @@
|
|||||||
#define IWL_RSSI_OFFSET 44
|
#define IWL_RSSI_OFFSET 44
|
||||||
|
|
||||||
|
|
||||||
#include "iwl-commands.h"
|
|
||||||
|
|
||||||
/* PCI registers */
|
/* PCI registers */
|
||||||
#define PCI_LINK_CTRL 0x0F0 /* 1 byte */
|
#define PCI_CFG_RETRY_TIMEOUT 0x041
|
||||||
#define PCI_POWER_SOURCE 0x0C8
|
#define PCI_CFG_POWER_SOURCE 0x0C8
|
||||||
#define PCI_REG_WUM8 0x0E8
|
#define PCI_REG_WUM8 0x0E8
|
||||||
|
#define PCI_CFG_LINK_CTRL 0x0F0
|
||||||
|
|
||||||
/* PCI register values */
|
/* PCI register values */
|
||||||
#define PCI_LINK_VAL_L0S_EN 0x01
|
#define PCI_CFG_LINK_CTRL_VAL_L0S_EN 0x01
|
||||||
#define PCI_LINK_VAL_L1_EN 0x02
|
#define PCI_CFG_LINK_CTRL_VAL_L1_EN 0x02
|
||||||
|
#define PCI_CFG_CMD_REG_INT_DIS_MSK 0x04
|
||||||
#define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000)
|
#define PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT (0x80000000)
|
||||||
|
|
||||||
#define TFD_QUEUE_SIZE_MAX (256)
|
#define TFD_QUEUE_SIZE_MAX (256)
|
||||||
|
@ -399,7 +399,7 @@ static void iwl4965_nic_config(struct iwl_priv *priv)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 val;
|
u32 val;
|
||||||
u16 radio_cfg;
|
u16 radio_cfg;
|
||||||
u8 val_link;
|
u16 link;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
|
||||||
@ -410,10 +410,10 @@ static void iwl4965_nic_config(struct iwl_priv *priv)
|
|||||||
val & ~(1 << 11));
|
val & ~(1 << 11));
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_read_config_byte(priv->pci_dev, PCI_LINK_CTRL, &val_link);
|
pci_read_config_word(priv->pci_dev, PCI_CFG_LINK_CTRL, &link);
|
||||||
|
|
||||||
/* L1 is enabled by BIOS */
|
/* L1 is enabled by BIOS */
|
||||||
if ((val_link & PCI_LINK_VAL_L1_EN) == PCI_LINK_VAL_L1_EN)
|
if ((link & PCI_CFG_LINK_CTRL_VAL_L1_EN) == PCI_CFG_LINK_CTRL_VAL_L1_EN)
|
||||||
/* diable L0S disabled L1A enabled */
|
/* diable L0S disabled L1A enabled */
|
||||||
iwl_set_bit(priv, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
|
iwl_set_bit(priv, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
|
||||||
else
|
else
|
||||||
|
@ -208,14 +208,14 @@ static void iwl5000_nic_config(struct iwl_priv *priv)
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u16 radio_cfg;
|
u16 radio_cfg;
|
||||||
u8 val_link;
|
u16 link;
|
||||||
|
|
||||||
spin_lock_irqsave(&priv->lock, flags);
|
spin_lock_irqsave(&priv->lock, flags);
|
||||||
|
|
||||||
pci_read_config_byte(priv->pci_dev, PCI_LINK_CTRL, &val_link);
|
pci_read_config_word(priv->pci_dev, PCI_CFG_LINK_CTRL, &link);
|
||||||
|
|
||||||
/* L1 is enabled by BIOS */
|
/* L1 is enabled by BIOS */
|
||||||
if ((val_link & PCI_LINK_VAL_L1_EN) == PCI_LINK_VAL_L1_EN)
|
if ((link & PCI_CFG_LINK_CTRL_VAL_L1_EN) == PCI_CFG_LINK_CTRL_VAL_L1_EN)
|
||||||
/* diable L0S disabled L1A enabled */
|
/* diable L0S disabled L1A enabled */
|
||||||
iwl_set_bit(priv, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
|
iwl_set_bit(priv, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
|
||||||
else
|
else
|
||||||
|
@ -1273,7 +1273,7 @@ int iwl4965_set_pwr_src(struct iwl_priv *priv, enum iwl_pwr_src src)
|
|||||||
|
|
||||||
if (src == IWL_PWR_SRC_VAUX) {
|
if (src == IWL_PWR_SRC_VAUX) {
|
||||||
u32 val;
|
u32 val;
|
||||||
ret = pci_read_config_dword(priv->pci_dev, PCI_POWER_SOURCE,
|
ret = pci_read_config_dword(priv->pci_dev, PCI_CFG_POWER_SOURCE,
|
||||||
&val);
|
&val);
|
||||||
|
|
||||||
if (val & PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT)
|
if (val & PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT)
|
||||||
@ -4229,9 +4229,6 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|||||||
|
|
||||||
pci_set_drvdata(pdev, priv);
|
pci_set_drvdata(pdev, priv);
|
||||||
|
|
||||||
/* We disable the RETRY_TIMEOUT register (0x41) to keep
|
|
||||||
* PCI Tx retries from interfering with C3 CPU state */
|
|
||||||
pci_write_config_byte(pdev, 0x41, 0x00);
|
|
||||||
|
|
||||||
/***********************
|
/***********************
|
||||||
* 3. Read REV register
|
* 3. Read REV register
|
||||||
@ -4251,6 +4248,10 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
|
|||||||
": Detected Intel Wireless WiFi Link %s REV=0x%X\n",
|
": Detected Intel Wireless WiFi Link %s REV=0x%X\n",
|
||||||
priv->cfg->name, priv->hw_rev);
|
priv->cfg->name, priv->hw_rev);
|
||||||
|
|
||||||
|
/* We disable the RETRY_TIMEOUT register (0x41) to keep
|
||||||
|
* PCI Tx retries from interfering with C3 CPU state */
|
||||||
|
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
||||||
|
|
||||||
/* amp init */
|
/* amp init */
|
||||||
err = priv->cfg->ops->lib->apm_ops.init(priv);
|
err = priv->cfg->ops->lib->apm_ops.init(priv);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
|
@ -2026,8 +2026,8 @@ struct iwl4965_spectrum_notification {
|
|||||||
* bit 2 - '0' PM have to walk up every DTIM
|
* bit 2 - '0' PM have to walk up every DTIM
|
||||||
* '1' PM could sleep over DTIM till listen Interval.
|
* '1' PM could sleep over DTIM till listen Interval.
|
||||||
* PCI power managed
|
* PCI power managed
|
||||||
* bit 3 - '0' (PCI_LINK_CTRL & 0x1)
|
* bit 3 - '0' (PCI_CFG_LINK_CTRL & 0x1)
|
||||||
* '1' !(PCI_LINK_CTRL & 0x1)
|
* '1' !(PCI_CFG_LINK_CTRL & 0x1)
|
||||||
* Force sleep Modes
|
* Force sleep Modes
|
||||||
* bit 31/30- '00' use both mac/xtal sleeps
|
* bit 31/30- '00' use both mac/xtal sleeps
|
||||||
* '01' force Mac sleep
|
* '01' force Mac sleep
|
||||||
|
@ -152,9 +152,10 @@ static u16 iwl_get_auto_power_mode(struct iwl_priv *priv)
|
|||||||
/* initialize to default */
|
/* initialize to default */
|
||||||
static int iwl_power_init_handle(struct iwl_priv *priv)
|
static int iwl_power_init_handle(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
int ret = 0, i;
|
|
||||||
struct iwl_power_mgr *pow_data;
|
struct iwl_power_mgr *pow_data;
|
||||||
int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_MAX;
|
int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_MAX;
|
||||||
|
struct iwl_powertable_cmd *cmd;
|
||||||
|
int i;
|
||||||
u16 pci_pm;
|
u16 pci_pm;
|
||||||
|
|
||||||
IWL_DEBUG_POWER("Initialize power \n");
|
IWL_DEBUG_POWER("Initialize power \n");
|
||||||
@ -167,25 +168,19 @@ static int iwl_power_init_handle(struct iwl_priv *priv)
|
|||||||
memcpy(&pow_data->pwr_range_1[0], &range_1[0], size);
|
memcpy(&pow_data->pwr_range_1[0], &range_1[0], size);
|
||||||
memcpy(&pow_data->pwr_range_2[0], &range_2[0], size);
|
memcpy(&pow_data->pwr_range_2[0], &range_2[0], size);
|
||||||
|
|
||||||
ret = pci_read_config_word(priv->pci_dev,
|
pci_read_config_word(priv->pci_dev, PCI_CFG_LINK_CTRL, &pci_pm);
|
||||||
PCI_LINK_CTRL, &pci_pm);
|
|
||||||
if (ret != 0)
|
|
||||||
return 0;
|
|
||||||
else {
|
|
||||||
struct iwl_powertable_cmd *cmd;
|
|
||||||
|
|
||||||
IWL_DEBUG_POWER("adjust power command flags\n");
|
IWL_DEBUG_POWER("adjust power command flags\n");
|
||||||
|
|
||||||
for (i = 0; i < IWL_POWER_MAX; i++) {
|
for (i = 0; i < IWL_POWER_MAX; i++) {
|
||||||
cmd = &pow_data->pwr_range_0[i].cmd;
|
cmd = &pow_data->pwr_range_0[i].cmd;
|
||||||
|
|
||||||
if (pci_pm & 0x1)
|
if (pci_pm & PCI_CFG_LINK_CTRL_VAL_L0S_EN)
|
||||||
cmd->flags &= ~IWL_POWER_PCI_PM_MSK;
|
cmd->flags &= ~IWL_POWER_PCI_PM_MSK;
|
||||||
else
|
else
|
||||||
cmd->flags |= IWL_POWER_PCI_PM_MSK;
|
cmd->flags |= IWL_POWER_PCI_PM_MSK;
|
||||||
}
|
}
|
||||||
}
|
return 0;
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust power command according to dtim period and power level*/
|
/* adjust power command according to dtim period and power level*/
|
||||||
|
Loading…
Reference in New Issue
Block a user