Deleted Added
full compact
e1000_82540.c (218588) e1000_82540.c (228386)
1/******************************************************************************
2
1/******************************************************************************
2
3 Copyright (c) 2001-2010, Intel Corporation
3 Copyright (c) 2001-2011, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11

--- 13 unchanged lines hidden (view full) ---

25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11

--- 13 unchanged lines hidden (view full) ---

25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: head/sys/dev/e1000/e1000_82540.c 218588 2011-02-12 00:07:40Z jfv $*/
33/*$FreeBSD: head/sys/dev/e1000/e1000_82540.c 228386 2011-12-10 06:55:02Z jfv $*/
34
35/*
36 * 82540EM Gigabit Ethernet Controller
37 * 82540EP Gigabit Ethernet Controller
38 * 82545EM Gigabit Ethernet Controller (Copper)
39 * 82545EM Gigabit Ethernet Controller (Fiber)
40 * 82545GM Gigabit Ethernet Controller
41 * 82546EB Gigabit Ethernet Controller (Copper)

--- 21 unchanged lines hidden (view full) ---

63 * e1000_init_phy_params_82540 - Init PHY func ptrs.
64 * @hw: pointer to the HW structure
65 **/
66static s32 e1000_init_phy_params_82540(struct e1000_hw *hw)
67{
68 struct e1000_phy_info *phy = &hw->phy;
69 s32 ret_val = E1000_SUCCESS;
70
34
35/*
36 * 82540EM Gigabit Ethernet Controller
37 * 82540EP Gigabit Ethernet Controller
38 * 82545EM Gigabit Ethernet Controller (Copper)
39 * 82545EM Gigabit Ethernet Controller (Fiber)
40 * 82545GM Gigabit Ethernet Controller
41 * 82546EB Gigabit Ethernet Controller (Copper)

--- 21 unchanged lines hidden (view full) ---

63 * e1000_init_phy_params_82540 - Init PHY func ptrs.
64 * @hw: pointer to the HW structure
65 **/
66static s32 e1000_init_phy_params_82540(struct e1000_hw *hw)
67{
68 struct e1000_phy_info *phy = &hw->phy;
69 s32 ret_val = E1000_SUCCESS;
70
71 phy->addr = 1;
72 phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
73 phy->reset_delay_us = 10000;
74 phy->type = e1000_phy_m88;
71 phy->addr = 1;
72 phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
73 phy->reset_delay_us = 10000;
74 phy->type = e1000_phy_m88;
75
76 /* Function Pointers */
75
76 /* Function Pointers */
77 phy->ops.check_polarity = e1000_check_polarity_m88;
78 phy->ops.commit = e1000_phy_sw_reset_generic;
79 phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
80 phy->ops.get_cable_length = e1000_get_cable_length_m88;
81 phy->ops.get_cfg_done = e1000_get_cfg_done_generic;
82 phy->ops.read_reg = e1000_read_phy_reg_m88;
83 phy->ops.reset = e1000_phy_hw_reset_generic;
84 phy->ops.write_reg = e1000_write_phy_reg_m88;
85 phy->ops.get_info = e1000_get_phy_info_m88;
86 phy->ops.power_up = e1000_power_up_phy_copper;
87 phy->ops.power_down = e1000_power_down_phy_copper_82540;
77 phy->ops.check_polarity = e1000_check_polarity_m88;
78 phy->ops.commit = e1000_phy_sw_reset_generic;
79 phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_m88;
80 phy->ops.get_cable_length = e1000_get_cable_length_m88;
81 phy->ops.get_cfg_done = e1000_get_cfg_done_generic;
82 phy->ops.read_reg = e1000_read_phy_reg_m88;
83 phy->ops.reset = e1000_phy_hw_reset_generic;
84 phy->ops.write_reg = e1000_write_phy_reg_m88;
85 phy->ops.get_info = e1000_get_phy_info_m88;
86 phy->ops.power_up = e1000_power_up_phy_copper;
87 phy->ops.power_down = e1000_power_down_phy_copper_82540;
88
89 ret_val = e1000_get_phy_id(hw);
90 if (ret_val)
91 goto out;
92
93 /* Verify phy id */
94 switch (hw->mac.type) {
95 case e1000_82540:

--- 20 unchanged lines hidden (view full) ---

116 **/
117static s32 e1000_init_nvm_params_82540(struct e1000_hw *hw)
118{
119 struct e1000_nvm_info *nvm = &hw->nvm;
120 u32 eecd = E1000_READ_REG(hw, E1000_EECD);
121
122 DEBUGFUNC("e1000_init_nvm_params_82540");
123
88
89 ret_val = e1000_get_phy_id(hw);
90 if (ret_val)
91 goto out;
92
93 /* Verify phy id */
94 switch (hw->mac.type) {
95 case e1000_82540:

--- 20 unchanged lines hidden (view full) ---

116 **/
117static s32 e1000_init_nvm_params_82540(struct e1000_hw *hw)
118{
119 struct e1000_nvm_info *nvm = &hw->nvm;
120 u32 eecd = E1000_READ_REG(hw, E1000_EECD);
121
122 DEBUGFUNC("e1000_init_nvm_params_82540");
123
124 nvm->type = e1000_nvm_eeprom_microwire;
125 nvm->delay_usec = 50;
126 nvm->opcode_bits = 3;
124 nvm->type = e1000_nvm_eeprom_microwire;
125 nvm->delay_usec = 50;
126 nvm->opcode_bits = 3;
127 switch (nvm->override) {
128 case e1000_nvm_override_microwire_large:
127 switch (nvm->override) {
128 case e1000_nvm_override_microwire_large:
129 nvm->address_bits = 8;
130 nvm->word_size = 256;
129 nvm->address_bits = 8;
130 nvm->word_size = 256;
131 break;
132 case e1000_nvm_override_microwire_small:
131 break;
132 case e1000_nvm_override_microwire_small:
133 nvm->address_bits = 6;
134 nvm->word_size = 64;
133 nvm->address_bits = 6;
134 nvm->word_size = 64;
135 break;
136 default:
135 break;
136 default:
137 nvm->address_bits = eecd & E1000_EECD_SIZE ? 8 : 6;
138 nvm->word_size = eecd & E1000_EECD_SIZE ? 256 : 64;
137 nvm->address_bits = eecd & E1000_EECD_SIZE ? 8 : 6;
138 nvm->word_size = eecd & E1000_EECD_SIZE ? 256 : 64;
139 break;
140 }
141
142 /* Function Pointers */
139 break;
140 }
141
142 /* Function Pointers */
143 nvm->ops.acquire = e1000_acquire_nvm_generic;
144 nvm->ops.read = e1000_read_nvm_microwire;
145 nvm->ops.release = e1000_release_nvm_generic;
146 nvm->ops.update = e1000_update_nvm_checksum_generic;
147 nvm->ops.valid_led_default = e1000_valid_led_default_generic;
148 nvm->ops.validate = e1000_validate_nvm_checksum_generic;
149 nvm->ops.write = e1000_write_nvm_microwire;
143 nvm->ops.acquire = e1000_acquire_nvm_generic;
144 nvm->ops.read = e1000_read_nvm_microwire;
145 nvm->ops.release = e1000_release_nvm_generic;
146 nvm->ops.update = e1000_update_nvm_checksum_generic;
147 nvm->ops.valid_led_default = e1000_valid_led_default_generic;
148 nvm->ops.validate = e1000_validate_nvm_checksum_generic;
149 nvm->ops.write = e1000_write_nvm_microwire;
150
151 return E1000_SUCCESS;
152}
153
154/**
155 * e1000_init_mac_params_82540 - Init MAC func ptrs.
156 * @hw: pointer to the HW structure
157 **/

--- 35 unchanged lines hidden (view full) ---

193 /* reset */
194 mac->ops.reset_hw = e1000_reset_hw_82540;
195 /* hw initialization */
196 mac->ops.init_hw = e1000_init_hw_82540;
197 /* link setup */
198 mac->ops.setup_link = e1000_setup_link_generic;
199 /* physical interface setup */
200 mac->ops.setup_physical_interface =
150
151 return E1000_SUCCESS;
152}
153
154/**
155 * e1000_init_mac_params_82540 - Init MAC func ptrs.
156 * @hw: pointer to the HW structure
157 **/

--- 35 unchanged lines hidden (view full) ---

193 /* reset */
194 mac->ops.reset_hw = e1000_reset_hw_82540;
195 /* hw initialization */
196 mac->ops.init_hw = e1000_init_hw_82540;
197 /* link setup */
198 mac->ops.setup_link = e1000_setup_link_generic;
199 /* physical interface setup */
200 mac->ops.setup_physical_interface =
201 (hw->phy.media_type == e1000_media_type_copper)
202 ? e1000_setup_copper_link_82540
203 : e1000_setup_fiber_serdes_link_82540;
201 (hw->phy.media_type == e1000_media_type_copper)
202 ? e1000_setup_copper_link_82540
203 : e1000_setup_fiber_serdes_link_82540;
204 /* check for link */
205 switch (hw->phy.media_type) {
206 case e1000_media_type_copper:
207 mac->ops.check_for_link = e1000_check_for_copper_link_generic;
208 break;
209 case e1000_media_type_fiber:
210 mac->ops.check_for_link = e1000_check_for_fiber_link_generic;
211 break;
212 case e1000_media_type_internal_serdes:
213 mac->ops.check_for_link = e1000_check_for_serdes_link_generic;
214 break;
215 default:
216 ret_val = -E1000_ERR_CONFIG;
217 goto out;
218 break;
219 }
220 /* link info */
221 mac->ops.get_link_up_info =
204 /* check for link */
205 switch (hw->phy.media_type) {
206 case e1000_media_type_copper:
207 mac->ops.check_for_link = e1000_check_for_copper_link_generic;
208 break;
209 case e1000_media_type_fiber:
210 mac->ops.check_for_link = e1000_check_for_fiber_link_generic;
211 break;
212 case e1000_media_type_internal_serdes:
213 mac->ops.check_for_link = e1000_check_for_serdes_link_generic;
214 break;
215 default:
216 ret_val = -E1000_ERR_CONFIG;
217 goto out;
218 break;
219 }
220 /* link info */
221 mac->ops.get_link_up_info =
222 (hw->phy.media_type == e1000_media_type_copper)
223 ? e1000_get_speed_and_duplex_copper_generic
224 : e1000_get_speed_and_duplex_fiber_serdes_generic;
222 (hw->phy.media_type == e1000_media_type_copper)
223 ? e1000_get_speed_and_duplex_copper_generic
224 : e1000_get_speed_and_duplex_fiber_serdes_generic;
225 /* multicast address update */
226 mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
227 /* writing VFTA */
228 mac->ops.write_vfta = e1000_write_vfta_generic;
229 /* clearing VFTA */
230 mac->ops.clear_vfta = e1000_clear_vfta_generic;
231 /* read mac address */
232 mac->ops.read_mac_addr = e1000_read_mac_addr_82540;

--- 136 unchanged lines hidden (view full) ---

369 if (mac->type < e1000_82545_rev_3)
370 e1000_pcix_mmrbc_workaround_generic(hw);
371
372 /* Setup link and flow control */
373 ret_val = mac->ops.setup_link(hw);
374
375 txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0));
376 txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) |
225 /* multicast address update */
226 mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
227 /* writing VFTA */
228 mac->ops.write_vfta = e1000_write_vfta_generic;
229 /* clearing VFTA */
230 mac->ops.clear_vfta = e1000_clear_vfta_generic;
231 /* read mac address */
232 mac->ops.read_mac_addr = e1000_read_mac_addr_82540;

--- 136 unchanged lines hidden (view full) ---

369 if (mac->type < e1000_82545_rev_3)
370 e1000_pcix_mmrbc_workaround_generic(hw);
371
372 /* Setup link and flow control */
373 ret_val = mac->ops.setup_link(hw);
374
375 txdctl = E1000_READ_REG(hw, E1000_TXDCTL(0));
376 txdctl = (txdctl & ~E1000_TXDCTL_WTHRESH) |
377 E1000_TXDCTL_FULL_TX_DESC_WB;
377 E1000_TXDCTL_FULL_TX_DESC_WB;
378 E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl);
379
380 /*
381 * Clear all of the statistics registers (clear on read). It is
382 * important that we do this after we have tried to establish link
383 * because the symbol error count will increment wildly if there
384 * is no link.
385 */

--- 36 unchanged lines hidden (view full) ---

422 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
423
424 ret_val = e1000_set_phy_mode_82540(hw);
425 if (ret_val)
426 goto out;
427
428 if (hw->mac.type == e1000_82545_rev_3 ||
429 hw->mac.type == e1000_82546_rev_3) {
378 E1000_WRITE_REG(hw, E1000_TXDCTL(0), txdctl);
379
380 /*
381 * Clear all of the statistics registers (clear on read). It is
382 * important that we do this after we have tried to establish link
383 * because the symbol error count will increment wildly if there
384 * is no link.
385 */

--- 36 unchanged lines hidden (view full) ---

422 E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
423
424 ret_val = e1000_set_phy_mode_82540(hw);
425 if (ret_val)
426 goto out;
427
428 if (hw->mac.type == e1000_82545_rev_3 ||
429 hw->mac.type == e1000_82546_rev_3) {
430 ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &data);
430 ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL,
431 &data);
431 if (ret_val)
432 goto out;
433 data |= 0x00000008;
432 if (ret_val)
433 goto out;
434 data |= 0x00000008;
434 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL, data);
435 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_SPEC_CTRL,
436 data);
435 if (ret_val)
436 goto out;
437 }
438
439 ret_val = e1000_copper_link_setup_m88(hw);
440 if (ret_val)
441 goto out;
442

--- 60 unchanged lines hidden (view full) ---

503
504 ret_val = hw->nvm.ops.read(hw, NVM_SERDES_AMPLITUDE, 1, &nvm_data);
505 if (ret_val)
506 goto out;
507
508 if (nvm_data != NVM_RESERVED_WORD) {
509 /* Adjust serdes output amplitude only. */
510 nvm_data &= NVM_SERDES_AMPLITUDE_MASK;
437 if (ret_val)
438 goto out;
439 }
440
441 ret_val = e1000_copper_link_setup_m88(hw);
442 if (ret_val)
443 goto out;
444

--- 60 unchanged lines hidden (view full) ---

505
506 ret_val = hw->nvm.ops.read(hw, NVM_SERDES_AMPLITUDE, 1, &nvm_data);
507 if (ret_val)
508 goto out;
509
510 if (nvm_data != NVM_RESERVED_WORD) {
511 /* Adjust serdes output amplitude only. */
512 nvm_data &= NVM_SERDES_AMPLITUDE_MASK;
511 ret_val = hw->phy.ops.write_reg(hw,
512 M88E1000_PHY_EXT_CTRL,
513 nvm_data);
513 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_EXT_CTRL,
514 nvm_data);
514 if (ret_val)
515 goto out;
516 }
517
518out:
519 return ret_val;
520}
521

--- 8 unchanged lines hidden (view full) ---

530 s32 ret_val = E1000_SUCCESS;
531 u16 default_page = 0;
532 u16 phy_data;
533
534 DEBUGFUNC("e1000_set_vco_speed_82540");
535
536 /* Set PHY register 30, page 5, bit 8 to 0 */
537
515 if (ret_val)
516 goto out;
517 }
518
519out:
520 return ret_val;
521}
522

--- 8 unchanged lines hidden (view full) ---

531 s32 ret_val = E1000_SUCCESS;
532 u16 default_page = 0;
533 u16 phy_data;
534
535 DEBUGFUNC("e1000_set_vco_speed_82540");
536
537 /* Set PHY register 30, page 5, bit 8 to 0 */
538
538 ret_val = hw->phy.ops.read_reg(hw,
539 M88E1000_PHY_PAGE_SELECT,
540 &default_page);
539 ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_PAGE_SELECT,
540 &default_page);
541 if (ret_val)
542 goto out;
543
544 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
545 if (ret_val)
546 goto out;
547
548 ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);

--- 16 unchanged lines hidden (view full) ---

565 goto out;
566
567 phy_data |= M88E1000_PHY_VCO_REG_BIT11;
568 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
569 if (ret_val)
570 goto out;
571
572 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
541 if (ret_val)
542 goto out;
543
544 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT, 0x0005);
545 if (ret_val)
546 goto out;
547
548 ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_GEN_CONTROL, &phy_data);

--- 16 unchanged lines hidden (view full) ---

565 goto out;
566
567 phy_data |= M88E1000_PHY_VCO_REG_BIT11;
568 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL, phy_data);
569 if (ret_val)
570 goto out;
571
572 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
573 default_page);
573 default_page);
574
575out:
576 return ret_val;
577}
578
579/**
580 * e1000_set_phy_mode_82540 - Set PHY to class A mode
581 * @hw: pointer to the HW structure
582 *
583 * Sets the PHY to class A mode and assumes the following operations will
584 * follow to enable the new class mode:
585 * 1. Do a PHY soft reset.
586 * 2. Restart auto-negotiation or force link.
587 **/
588static s32 e1000_set_phy_mode_82540(struct e1000_hw *hw)
589{
574
575out:
576 return ret_val;
577}
578
579/**
580 * e1000_set_phy_mode_82540 - Set PHY to class A mode
581 * @hw: pointer to the HW structure
582 *
583 * Sets the PHY to class A mode and assumes the following operations will
584 * follow to enable the new class mode:
585 * 1. Do a PHY soft reset.
586 * 2. Restart auto-negotiation or force link.
587 **/
588static s32 e1000_set_phy_mode_82540(struct e1000_hw *hw)
589{
590 struct e1000_phy_info *phy = &hw->phy;
591 s32 ret_val = E1000_SUCCESS;
592 u16 nvm_data;
593
594 DEBUGFUNC("e1000_set_phy_mode_82540");
595
596 if (hw->mac.type != e1000_82545_rev_3)
597 goto out;
598
599 ret_val = hw->nvm.ops.read(hw, NVM_PHY_CLASS_WORD, 1, &nvm_data);
600 if (ret_val) {
601 ret_val = -E1000_ERR_PHY;
602 goto out;
603 }
604
605 if ((nvm_data != NVM_RESERVED_WORD) && (nvm_data & NVM_PHY_CLASS_A)) {
606 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
590 s32 ret_val = E1000_SUCCESS;
591 u16 nvm_data;
592
593 DEBUGFUNC("e1000_set_phy_mode_82540");
594
595 if (hw->mac.type != e1000_82545_rev_3)
596 goto out;
597
598 ret_val = hw->nvm.ops.read(hw, NVM_PHY_CLASS_WORD, 1, &nvm_data);
599 if (ret_val) {
600 ret_val = -E1000_ERR_PHY;
601 goto out;
602 }
603
604 if ((nvm_data != NVM_RESERVED_WORD) && (nvm_data & NVM_PHY_CLASS_A)) {
605 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_PAGE_SELECT,
607 0x000B);
606 0x000B);
608 if (ret_val) {
609 ret_val = -E1000_ERR_PHY;
610 goto out;
611 }
607 if (ret_val) {
608 ret_val = -E1000_ERR_PHY;
609 goto out;
610 }
612 ret_val = hw->phy.ops.write_reg(hw,
613 M88E1000_PHY_GEN_CONTROL,
614 0x8104);
611 ret_val = hw->phy.ops.write_reg(hw, M88E1000_PHY_GEN_CONTROL,
612 0x8104);
615 if (ret_val) {
616 ret_val = -E1000_ERR_PHY;
617 goto out;
618 }
619
613 if (ret_val) {
614 ret_val = -E1000_ERR_PHY;
615 goto out;
616 }
617
620 phy->reset_disable = FALSE;
621 }
622
623out:
624 return ret_val;
625}
626
627/**
628 * e1000_power_down_phy_copper_82540 - Remove link in case of PHY power down

--- 93 unchanged lines hidden ---
618 }
619
620out:
621 return ret_val;
622}
623
624/**
625 * e1000_power_down_phy_copper_82540 - Remove link in case of PHY power down

--- 93 unchanged lines hidden ---