PCI-X/PCI-Express read control interfaces: use them in e1000
These driver changes incorporate the proposed PCI-X / PCI-Express read byte count interface. Reading and setting those valuse doesn't take place "manually", instead wrapping functions are called to allow quirks for some PCI bridges. Signed-off by: Peter Oruba <peter.oruba@amd.com> Based on work by Stephen Hemminger <shemminger@linux-foundation.org> Acked-by: Auke Kok <auke-jan.h.kok@intel.com> Cc: Jeff Garzik <jeff@garzik.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
committed by
David S. Miller
parent
7c32f470f4
commit
007755eb86
@@ -871,10 +871,6 @@ e1000_init_hw(struct e1000_hw *hw)
|
|||||||
uint32_t ctrl;
|
uint32_t ctrl;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
int32_t ret_val;
|
int32_t ret_val;
|
||||||
uint16_t pcix_cmd_word;
|
|
||||||
uint16_t pcix_stat_hi_word;
|
|
||||||
uint16_t cmd_mmrbc;
|
|
||||||
uint16_t stat_mmrbc;
|
|
||||||
uint32_t mta_size;
|
uint32_t mta_size;
|
||||||
uint32_t reg_data;
|
uint32_t reg_data;
|
||||||
uint32_t ctrl_ext;
|
uint32_t ctrl_ext;
|
||||||
@@ -964,24 +960,9 @@ e1000_init_hw(struct e1000_hw *hw)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
|
/* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
|
||||||
if (hw->bus_type == e1000_bus_type_pcix) {
|
if (hw->bus_type == e1000_bus_type_pcix && e1000_pcix_get_mmrbc(hw) > 2048)
|
||||||
e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd_word);
|
e1000_pcix_set_mmrbc(hw, 2048);
|
||||||
e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI,
|
break;
|
||||||
&pcix_stat_hi_word);
|
|
||||||
cmd_mmrbc = (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >>
|
|
||||||
PCIX_COMMAND_MMRBC_SHIFT;
|
|
||||||
stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >>
|
|
||||||
PCIX_STATUS_HI_MMRBC_SHIFT;
|
|
||||||
if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K)
|
|
||||||
stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K;
|
|
||||||
if (cmd_mmrbc > stat_mmrbc) {
|
|
||||||
pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK;
|
|
||||||
pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT;
|
|
||||||
e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER,
|
|
||||||
&pcix_cmd_word);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* More time needed for PHY to initialize */
|
/* More time needed for PHY to initialize */
|
||||||
|
@@ -424,6 +424,8 @@ void e1000_pci_clear_mwi(struct e1000_hw *hw);
|
|||||||
void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
||||||
void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
|
||||||
int32_t e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value);
|
int32_t e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value);
|
||||||
|
void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc);
|
||||||
|
int e1000_pcix_get_mmrbc(struct e1000_hw *hw);
|
||||||
/* Port I/O is only supported on 82544 and newer */
|
/* Port I/O is only supported on 82544 and newer */
|
||||||
void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
|
void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
|
||||||
int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
|
int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
|
||||||
|
@@ -4903,6 +4903,20 @@ e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
|
|||||||
pci_write_config_word(adapter->pdev, reg, *value);
|
pci_write_config_word(adapter->pdev, reg, *value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
e1000_pcix_get_mmrbc(struct e1000_hw *hw)
|
||||||
|
{
|
||||||
|
struct e1000_adapter *adapter = hw->back;
|
||||||
|
return pcix_get_mmrbc(adapter->pdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
|
||||||
|
{
|
||||||
|
struct e1000_adapter *adapter = hw->back;
|
||||||
|
pcix_set_mmrbc(adapter->pdev, mmrbc);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t
|
int32_t
|
||||||
e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
|
e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user