aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorPeter Oruba <peter.oruba@amd.com>2007-09-29 01:42:06 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:53:50 -0400
commit007755eb86c3953bb8615bd016246fc99056580c (patch)
treee981b57164e776ef9dcad02f6c519ff7d8e70372 /drivers
parent7c32f470f4f6a0fdc6944cefcd22f288e59a0ae2 (diff)
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/e1000/e1000_hw.c25
-rw-r--r--drivers/net/e1000/e1000_hw.h2
-rw-r--r--drivers/net/e1000/e1000_main.c14
3 files changed, 19 insertions, 22 deletions
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c
index 8604adbe351c..8fa0fe4009d5 100644
--- a/drivers/net/e1000/e1000_hw.c
+++ b/drivers/net/e1000/e1000_hw.c
@@ -871,10 +871,6 @@ e1000_init_hw(struct e1000_hw *hw)
871 uint32_t ctrl; 871 uint32_t ctrl;
872 uint32_t i; 872 uint32_t i;
873 int32_t ret_val; 873 int32_t ret_val;
874 uint16_t pcix_cmd_word;
875 uint16_t pcix_stat_hi_word;
876 uint16_t cmd_mmrbc;
877 uint16_t stat_mmrbc;
878 uint32_t mta_size; 874 uint32_t mta_size;
879 uint32_t reg_data; 875 uint32_t reg_data;
880 uint32_t ctrl_ext; 876 uint32_t ctrl_ext;
@@ -964,24 +960,9 @@ e1000_init_hw(struct e1000_hw *hw)
964 break; 960 break;
965 default: 961 default:
966 /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */ 962 /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
967 if (hw->bus_type == e1000_bus_type_pcix) { 963 if (hw->bus_type == e1000_bus_type_pcix && e1000_pcix_get_mmrbc(hw) > 2048)
968 e1000_read_pci_cfg(hw, PCIX_COMMAND_REGISTER, &pcix_cmd_word); 964 e1000_pcix_set_mmrbc(hw, 2048);
969 e1000_read_pci_cfg(hw, PCIX_STATUS_REGISTER_HI, 965 break;
970 &pcix_stat_hi_word);
971 cmd_mmrbc = (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >>
972 PCIX_COMMAND_MMRBC_SHIFT;
973 stat_mmrbc = (pcix_stat_hi_word & PCIX_STATUS_HI_MMRBC_MASK) >>
974 PCIX_STATUS_HI_MMRBC_SHIFT;
975 if (stat_mmrbc == PCIX_STATUS_HI_MMRBC_4K)
976 stat_mmrbc = PCIX_STATUS_HI_MMRBC_2K;
977 if (cmd_mmrbc > stat_mmrbc) {
978 pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK;
979 pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT;
980 e1000_write_pci_cfg(hw, PCIX_COMMAND_REGISTER,
981 &pcix_cmd_word);
982 }
983 }
984 break;
985 } 966 }
986 967
987 /* More time needed for PHY to initialize */ 968 /* More time needed for PHY to initialize */
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h
index 07f0ea73676e..a2a86c54a75c 100644
--- a/drivers/net/e1000/e1000_hw.h
+++ b/drivers/net/e1000/e1000_hw.h
@@ -424,6 +424,8 @@ void e1000_pci_clear_mwi(struct e1000_hw *hw);
424void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); 424void e1000_read_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
425void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value); 425void e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t * value);
426int32_t e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value); 426int32_t e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value);
427void e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc);
428int e1000_pcix_get_mmrbc(struct e1000_hw *hw);
427/* Port I/O is only supported on 82544 and newer */ 429/* Port I/O is only supported on 82544 and newer */
428void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value); 430void e1000_io_write(struct e1000_hw *hw, unsigned long port, uint32_t value);
429int32_t e1000_disable_pciex_master(struct e1000_hw *hw); 431int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
index ad444c9a5d04..10505de00bcc 100644
--- a/drivers/net/e1000/e1000_main.c
+++ b/drivers/net/e1000/e1000_main.c
@@ -4903,6 +4903,20 @@ e1000_write_pci_cfg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
4903 pci_write_config_word(adapter->pdev, reg, *value); 4903 pci_write_config_word(adapter->pdev, reg, *value);
4904} 4904}
4905 4905
4906int
4907e1000_pcix_get_mmrbc(struct e1000_hw *hw)
4908{
4909 struct e1000_adapter *adapter = hw->back;
4910 return pcix_get_mmrbc(adapter->pdev);
4911}
4912
4913void
4914e1000_pcix_set_mmrbc(struct e1000_hw *hw, int mmrbc)
4915{
4916 struct e1000_adapter *adapter = hw->back;
4917 pcix_set_mmrbc(adapter->pdev, mmrbc);
4918}
4919
4906int32_t 4920int32_t
4907e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value) 4921e1000_read_pcie_cap_reg(struct e1000_hw *hw, uint32_t reg, uint16_t *value)
4908{ 4922{