diff options
author | Andi Kleen <ak@linux.intel.com> | 2014-05-20 04:22:45 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2014-05-27 05:10:44 -0400 |
commit | c6f3148c5bcad2eb9ff1c700d6c79815173aed35 (patch) | |
tree | 2ec3c4a276ebfeeec40df99c7c4251bdfb06b91c /drivers/net/ethernet/intel/e1000e | |
parent | 50844bb7f445165afda1af315bd16c93bf528185 (diff) |
e1000e: Out of line __ew32_prepare/__ew32
Out of lining these two common inlines saves about 30k text size,
due to their errata workarounds.
14131431 2008136 1507328 17646895 10d452f vmlinux-before-e1000e
14101415 2004040 1507328 17612783 10cbfef vmlinux-e1000e
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 31 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 30 |
2 files changed, 32 insertions, 29 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 63bde99a4ab4..7785240a0da1 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -575,35 +575,8 @@ static inline u32 __er32(struct e1000_hw *hw, unsigned long reg) | |||
575 | 575 | ||
576 | #define er32(reg) __er32(hw, E1000_##reg) | 576 | #define er32(reg) __er32(hw, E1000_##reg) |
577 | 577 | ||
578 | /** | 578 | s32 __ew32_prepare(struct e1000_hw *hw); |
579 | * __ew32_prepare - prepare to write to MAC CSR register on certain parts | 579 | void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val); |
580 | * @hw: pointer to the HW structure | ||
581 | * | ||
582 | * When updating the MAC CSR registers, the Manageability Engine (ME) could | ||
583 | * be accessing the registers at the same time. Normally, this is handled in | ||
584 | * h/w by an arbiter but on some parts there is a bug that acknowledges Host | ||
585 | * accesses later than it should which could result in the register to have | ||
586 | * an incorrect value. Workaround this by checking the FWSM register which | ||
587 | * has bit 24 set while ME is accessing MAC CSR registers, wait if it is set | ||
588 | * and try again a number of times. | ||
589 | **/ | ||
590 | static inline s32 __ew32_prepare(struct e1000_hw *hw) | ||
591 | { | ||
592 | s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT; | ||
593 | |||
594 | while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i) | ||
595 | udelay(50); | ||
596 | |||
597 | return i; | ||
598 | } | ||
599 | |||
600 | static inline void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) | ||
601 | { | ||
602 | if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) | ||
603 | __ew32_prepare(hw); | ||
604 | |||
605 | writel(val, hw->hw_addr + reg); | ||
606 | } | ||
607 | 580 | ||
608 | #define ew32(reg, val) __ew32(hw, E1000_##reg, (val)) | 581 | #define ew32(reg, val) __ew32(hw, E1000_##reg, (val)) |
609 | 582 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index e00144a4ed55..201cc93f3625 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -124,6 +124,36 @@ static const struct e1000_reg_info e1000_reg_info_tbl[] = { | |||
124 | }; | 124 | }; |
125 | 125 | ||
126 | /** | 126 | /** |
127 | * __ew32_prepare - prepare to write to MAC CSR register on certain parts | ||
128 | * @hw: pointer to the HW structure | ||
129 | * | ||
130 | * When updating the MAC CSR registers, the Manageability Engine (ME) could | ||
131 | * be accessing the registers at the same time. Normally, this is handled in | ||
132 | * h/w by an arbiter but on some parts there is a bug that acknowledges Host | ||
133 | * accesses later than it should which could result in the register to have | ||
134 | * an incorrect value. Workaround this by checking the FWSM register which | ||
135 | * has bit 24 set while ME is accessing MAC CSR registers, wait if it is set | ||
136 | * and try again a number of times. | ||
137 | **/ | ||
138 | s32 __ew32_prepare(struct e1000_hw *hw) | ||
139 | { | ||
140 | s32 i = E1000_ICH_FWSM_PCIM2PCI_COUNT; | ||
141 | |||
142 | while ((er32(FWSM) & E1000_ICH_FWSM_PCIM2PCI) && --i) | ||
143 | udelay(50); | ||
144 | |||
145 | return i; | ||
146 | } | ||
147 | |||
148 | void __ew32(struct e1000_hw *hw, unsigned long reg, u32 val) | ||
149 | { | ||
150 | if (hw->adapter->flags2 & FLAG2_PCIM2PCI_ARBITER_WA) | ||
151 | __ew32_prepare(hw); | ||
152 | |||
153 | writel(val, hw->hw_addr + reg); | ||
154 | } | ||
155 | |||
156 | /** | ||
127 | * e1000_regdump - register printout routine | 157 | * e1000_regdump - register printout routine |
128 | * @hw: pointer to the HW structure | 158 | * @hw: pointer to the HW structure |
129 | * @reginfo: pointer to the register info table | 159 | * @reginfo: pointer to the register info table |