Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci/ixgbe Add forgotten ixgbe_x550.c and ixgbe_x550.h.



details:   https://anonhg.NetBSD.org/src/rev/4d4e9dd9c327
branches:  trunk
changeset: 349229:4d4e9dd9c327
user:      msaitoh <msaitoh%NetBSD.org@localhost>
date:      Thu Dec 01 07:44:58 2016 +0000

description:
Add forgotten ixgbe_x550.c and ixgbe_x550.h.

diffstat:

 sys/dev/pci/ixgbe/ixgbe_x550.c |  3191 ++++++++++++++++++++++++++++++++++++++++
 sys/dev/pci/ixgbe/ixgbe_x550.h |   109 +
 2 files changed, 3300 insertions(+), 0 deletions(-)

diffs (truncated from 3308 to 300 lines):

diff -r 5c1300e0313a -r 4d4e9dd9c327 sys/dev/pci/ixgbe/ixgbe_x550.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/pci/ixgbe/ixgbe_x550.c    Thu Dec 01 07:44:58 2016 +0000
@@ -0,0 +1,3191 @@
+/******************************************************************************
+
+  Copyright (c) 2001-2015, Intel Corporation 
+  All rights reserved.
+  
+  Redistribution and use in source and binary forms, with or without 
+  modification, are permitted provided that the following conditions are met:
+  
+   1. Redistributions of source code must retain the above copyright notice, 
+      this list of conditions and the following disclaimer.
+  
+   2. Redistributions in binary form must reproduce the above copyright 
+      notice, this list of conditions and the following disclaimer in the 
+      documentation and/or other materials provided with the distribution.
+  
+   3. Neither the name of the Intel Corporation nor the names of its 
+      contributors may be used to endorse or promote products derived from 
+      this software without specific prior written permission.
+  
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
+  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
+  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
+  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
+  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+  POSSIBILITY OF SUCH DAMAGE.
+
+******************************************************************************/
+/*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x550.c 282289 2015-04-30 22:53:27Z erj $*/
+
+#include "ixgbe_x550.h"
+#include "ixgbe_x540.h"
+#include "ixgbe_type.h"
+#include "ixgbe_api.h"
+#include "ixgbe_common.h"
+#include "ixgbe_phy.h"
+
+static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
+
+/**
+ *  ixgbe_init_ops_X550 - Inits func ptrs and MAC type
+ *  @hw: pointer to hardware structure
+ *
+ *  Initialize the function pointers and assign the MAC type for X550.
+ *  Does not touch the hardware.
+ **/
+s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
+{
+       struct ixgbe_mac_info *mac = &hw->mac;
+       struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
+       s32 ret_val;
+
+       DEBUGFUNC("ixgbe_init_ops_X550");
+
+       ret_val = ixgbe_init_ops_X540(hw);
+       mac->ops.dmac_config = ixgbe_dmac_config_X550;
+       mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
+       mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
+       mac->ops.setup_eee = ixgbe_setup_eee_X550;
+       mac->ops.set_source_address_pruning =
+                       ixgbe_set_source_address_pruning_X550;
+       mac->ops.set_ethertype_anti_spoofing =
+                       ixgbe_set_ethertype_anti_spoofing_X550;
+
+       mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
+       eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
+       eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
+       eeprom->ops.read = ixgbe_read_ee_hostif_X550;
+       eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
+       eeprom->ops.write = ixgbe_write_ee_hostif_X550;
+       eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
+       eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
+       eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
+
+       mac->ops.disable_mdd = ixgbe_disable_mdd_X550;
+       mac->ops.enable_mdd = ixgbe_enable_mdd_X550;
+       mac->ops.mdd_event = ixgbe_mdd_event_X550;
+       mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
+       mac->ops.disable_rx = ixgbe_disable_rx_x550;
+       if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
+               hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
+               hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
+       }
+       return ret_val;
+}
+
+/**
+ * ixgbe_read_cs4227 - Read CS4227 register
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: pointer to receive value read
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value)
+{
+       return ixgbe_read_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
+}
+
+/**
+ * ixgbe_write_cs4227 - Write CS4227 register
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: value to write to register
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value)
+{
+       return ixgbe_write_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
+}
+
+/**
+ * ixgbe_get_cs4227_status - Return CS4227 status
+ * @hw: pointer to hardware structure
+ *
+ * Returns error if CS4227 not successfully initialized
+ **/
+static s32 ixgbe_get_cs4227_status(struct ixgbe_hw *hw)
+{
+       s32 status;
+       u16 value = 0;
+       u16 reg_slice, reg_val;
+       u8 retry;
+
+       for (retry = 0; retry < IXGBE_CS4227_RETRIES; ++retry) {
+               status = ixgbe_read_cs4227(hw, IXGBE_CS4227_GLOBAL_ID_LSB,
+                                          &value);
+               if (status != IXGBE_SUCCESS)
+                       return status;
+               if (value == IXGBE_CS4227_GLOBAL_ID_VALUE)
+                       break;
+               msec_delay(IXGBE_CS4227_CHECK_DELAY);
+       }
+       if (value != IXGBE_CS4227_GLOBAL_ID_VALUE)
+               return IXGBE_ERR_PHY;
+
+       status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
+       if (status != IXGBE_SUCCESS)
+               return status;
+
+       /* If this is the first time after power-on, check the ucode.
+        * Otherwise, this will disrupt link on all ports. Because we
+        * can only do this the first time, we must check all ports,
+        * not just our own.
+        */
+       if (value != IXGBE_CS4227_SCRATCH_VALUE) {
+               reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB;
+               reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+               status = ixgbe_write_cs4227(hw, reg_slice,
+                                           reg_val);
+               if (status != IXGBE_SUCCESS)
+                       return status;
+
+               reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB;
+               reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
+               status = ixgbe_write_cs4227(hw, reg_slice,
+                                           reg_val);
+               if (status != IXGBE_SUCCESS)
+                       return status;
+
+               reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + (1 << 12);
+               reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+               status = ixgbe_write_cs4227(hw, reg_slice,
+                                           reg_val);
+               if (status != IXGBE_SUCCESS)
+                       return status;
+
+               reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB + (1 << 12);
+               reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
+               status = ixgbe_write_cs4227(hw, reg_slice,
+                                           reg_val);
+               if (status != IXGBE_SUCCESS)
+                       return status;
+
+               msec_delay(10);
+       }
+
+       /* Verify that the ucode is operational on all ports. */
+       reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB;
+       reg_val = 0xFFFF;
+       status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       if (reg_val != 0)
+               return IXGBE_ERR_PHY;
+
+       reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB;
+       reg_val = 0xFFFF;
+       status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       if (reg_val != 0)
+               return IXGBE_ERR_PHY;
+
+       reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + (1 << 12);
+       reg_val = 0xFFFF;
+       status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       if (reg_val != 0)
+               return IXGBE_ERR_PHY;
+
+       reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB + (1 << 12);
+       reg_val = 0xFFFF;
+       status = ixgbe_read_cs4227(hw, reg_slice, &reg_val);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       if (reg_val != 0)
+               return IXGBE_ERR_PHY;
+
+       /* Set scratch for next time. */
+       status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
+                                   IXGBE_CS4227_SCRATCH_VALUE);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       if (value != IXGBE_CS4227_SCRATCH_VALUE)
+               return IXGBE_ERR_PHY;
+
+       return IXGBE_SUCCESS;
+}
+
+/**
+ * ixgbe_read_pe - Read register from port expander
+ * @hw: pointer to hardware structure
+ * @reg: register number to read
+ * @value: pointer to receive read value
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value)
+{
+       s32 status;
+
+       status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
+       if (status != IXGBE_SUCCESS)
+               ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+                             "port expander access failed with %d\n", status);
+       return status;
+}
+
+/**
+ * ixgbe_write_pe - Write register to port expander
+ * @hw: pointer to hardware structure
+ * @reg: register number to write
+ * @value: value to write
+ *
+ * Returns status code
+ **/
+static s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value)
+{
+       s32 status;
+
+       status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
+       if (status != IXGBE_SUCCESS)
+               ERROR_REPORT2(IXGBE_ERROR_CAUTION,
+                             "port expander access failed with %d\n", status);
+       return status;
+}
+
+/**
+ * ixgbe_reset_cs4227 - Reset CS4227 using port expander
+ * @hw: pointer to hardware structure
+ *
+ * Returns error code
+ **/
+static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
+{
+       s32 status;
+       u8 reg;
+
+       status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       reg |= IXGBE_PE_BIT1;
+       status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
+       if (status != IXGBE_SUCCESS)
+               return status;
+
+       status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, &reg);
+       if (status != IXGBE_SUCCESS)
+               return status;
+       reg &= ~IXGBE_PE_BIT1;
+       status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg);
+       if (status != IXGBE_SUCCESS)
+               return status;
+
+       status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
+       if (status != IXGBE_SUCCESS)



Home | Main Index | Thread Index | Old Index