The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/e1000/e1000_80003es2lan.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /******************************************************************************
    2 
    3   Copyright (c) 2001-2010, 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   
   12    2. Redistributions in binary form must reproduce the above copyright 
   13       notice, this list of conditions and the following disclaimer in the 
   14       documentation and/or other materials provided with the distribution.
   15   
   16    3. Neither the name of the Intel Corporation nor the names of its 
   17       contributors may be used to endorse or promote products derived from 
   18       this software without specific prior written permission.
   19   
   20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
   22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
   23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
   24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
   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: releng/9.0/sys/dev/e1000/e1000_80003es2lan.c 218588 2011-02-12 00:07:40Z jfv $*/
   34 
   35 /*
   36  * 80003ES2LAN Gigabit Ethernet Controller (Copper)
   37  * 80003ES2LAN Gigabit Ethernet Controller (Serdes)
   38  */
   39 
   40 #include "e1000_api.h"
   41 
   42 static s32  e1000_init_phy_params_80003es2lan(struct e1000_hw *hw);
   43 static s32  e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw);
   44 static s32  e1000_init_mac_params_80003es2lan(struct e1000_hw *hw);
   45 static s32  e1000_acquire_phy_80003es2lan(struct e1000_hw *hw);
   46 static void e1000_release_phy_80003es2lan(struct e1000_hw *hw);
   47 static s32  e1000_acquire_nvm_80003es2lan(struct e1000_hw *hw);
   48 static void e1000_release_nvm_80003es2lan(struct e1000_hw *hw);
   49 static s32  e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
   50                                                    u32 offset,
   51                                                    u16 *data);
   52 static s32  e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
   53                                                     u32 offset,
   54                                                     u16 data);
   55 static s32  e1000_write_nvm_80003es2lan(struct e1000_hw *hw, u16 offset,
   56                                         u16 words, u16 *data);
   57 static s32  e1000_get_cfg_done_80003es2lan(struct e1000_hw *hw);
   58 static s32  e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw);
   59 static s32  e1000_get_cable_length_80003es2lan(struct e1000_hw *hw);
   60 static s32  e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed,
   61                                                u16 *duplex);
   62 static s32  e1000_reset_hw_80003es2lan(struct e1000_hw *hw);
   63 static s32  e1000_init_hw_80003es2lan(struct e1000_hw *hw);
   64 static s32  e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw);
   65 static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw);
   66 static s32  e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask);
   67 static s32  e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex);
   68 static s32  e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw);
   69 static s32  e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw);
   70 static s32  e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
   71                                             u16 *data);
   72 static s32  e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
   73                                              u16 data);
   74 static s32  e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw);
   75 static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw);
   76 static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask);
   77 static s32  e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw);
   78 static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw);
   79 
   80 /*
   81  * A table for the GG82563 cable length where the range is defined
   82  * with a lower bound at "index" and the upper bound at
   83  * "index + 5".
   84  */
   85 static const u16 e1000_gg82563_cable_length_table[] = {
   86         0, 60, 115, 150, 150, 60, 115, 150, 180, 180, 0xFF };
   87 #define GG82563_CABLE_LENGTH_TABLE_SIZE \
   88                 (sizeof(e1000_gg82563_cable_length_table) / \
   89                  sizeof(e1000_gg82563_cable_length_table[0]))
   90 
   91 /**
   92  *  e1000_init_phy_params_80003es2lan - Init ESB2 PHY func ptrs.
   93  *  @hw: pointer to the HW structure
   94  **/
   95 static s32 e1000_init_phy_params_80003es2lan(struct e1000_hw *hw)
   96 {
   97         struct e1000_phy_info *phy = &hw->phy;
   98         s32 ret_val = E1000_SUCCESS;
   99 
  100         DEBUGFUNC("e1000_init_phy_params_80003es2lan");
  101 
  102         if (hw->phy.media_type != e1000_media_type_copper) {
  103                 phy->type        = e1000_phy_none;
  104                 goto out;
  105         } else {
  106                 phy->ops.power_up = e1000_power_up_phy_copper;
  107                 phy->ops.power_down = e1000_power_down_phy_copper_80003es2lan;
  108         }
  109 
  110         phy->addr                = 1;
  111         phy->autoneg_mask        = AUTONEG_ADVERTISE_SPEED_DEFAULT;
  112         phy->reset_delay_us      = 100;
  113         phy->type                = e1000_phy_gg82563;
  114 
  115         phy->ops.acquire            = e1000_acquire_phy_80003es2lan;
  116         phy->ops.check_polarity     = e1000_check_polarity_m88;
  117         phy->ops.check_reset_block  = e1000_check_reset_block_generic;
  118         phy->ops.commit             = e1000_phy_sw_reset_generic;
  119         phy->ops.get_cfg_done       = e1000_get_cfg_done_80003es2lan;
  120         phy->ops.get_info           = e1000_get_phy_info_m88;
  121         phy->ops.release            = e1000_release_phy_80003es2lan;
  122         phy->ops.reset              = e1000_phy_hw_reset_generic;
  123         phy->ops.set_d3_lplu_state  = e1000_set_d3_lplu_state_generic;
  124 
  125         phy->ops.force_speed_duplex = e1000_phy_force_speed_duplex_80003es2lan;
  126         phy->ops.get_cable_length   = e1000_get_cable_length_80003es2lan;
  127         phy->ops.read_reg           = e1000_read_phy_reg_gg82563_80003es2lan;
  128         phy->ops.write_reg          = e1000_write_phy_reg_gg82563_80003es2lan;
  129 
  130         phy->ops.cfg_on_link_up    = e1000_cfg_on_link_up_80003es2lan;
  131 
  132         /* This can only be done after all function pointers are setup. */
  133         ret_val = e1000_get_phy_id(hw);
  134 
  135         /* Verify phy id */
  136         if (phy->id != GG82563_E_PHY_ID) {
  137                 ret_val = -E1000_ERR_PHY;
  138                 goto out;
  139         }
  140 
  141 out:
  142         return ret_val;
  143 }
  144 
  145 /**
  146  *  e1000_init_nvm_params_80003es2lan - Init ESB2 NVM func ptrs.
  147  *  @hw: pointer to the HW structure
  148  **/
  149 static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw)
  150 {
  151         struct e1000_nvm_info *nvm = &hw->nvm;
  152         u32 eecd = E1000_READ_REG(hw, E1000_EECD);
  153         u16 size;
  154 
  155         DEBUGFUNC("e1000_init_nvm_params_80003es2lan");
  156 
  157         nvm->opcode_bits        = 8;
  158         nvm->delay_usec         = 1;
  159         switch (nvm->override) {
  160         case e1000_nvm_override_spi_large:
  161                 nvm->page_size    = 32;
  162                 nvm->address_bits = 16;
  163                 break;
  164         case e1000_nvm_override_spi_small:
  165                 nvm->page_size    = 8;
  166                 nvm->address_bits = 8;
  167                 break;
  168         default:
  169                 nvm->page_size    = eecd & E1000_EECD_ADDR_BITS ? 32 : 8;
  170                 nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8;
  171                 break;
  172         }
  173 
  174         nvm->type = e1000_nvm_eeprom_spi;
  175 
  176         size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
  177                           E1000_EECD_SIZE_EX_SHIFT);
  178 
  179         /*
  180          * Added to a constant, "size" becomes the left-shift value
  181          * for setting word_size.
  182          */
  183         size += NVM_WORD_SIZE_BASE_SHIFT;
  184 
  185         /* EEPROM access above 16k is unsupported */
  186         if (size > 14)
  187                 size = 14;
  188         nvm->word_size  = 1 << size;
  189 
  190         /* Function Pointers */
  191         nvm->ops.acquire           = e1000_acquire_nvm_80003es2lan;
  192         nvm->ops.read              = e1000_read_nvm_eerd;
  193         nvm->ops.release           = e1000_release_nvm_80003es2lan;
  194         nvm->ops.update            = e1000_update_nvm_checksum_generic;
  195         nvm->ops.valid_led_default = e1000_valid_led_default_generic;
  196         nvm->ops.validate          = e1000_validate_nvm_checksum_generic;
  197         nvm->ops.write             = e1000_write_nvm_80003es2lan;
  198 
  199         return E1000_SUCCESS;
  200 }
  201 
  202 /**
  203  *  e1000_init_mac_params_80003es2lan - Init ESB2 MAC func ptrs.
  204  *  @hw: pointer to the HW structure
  205  **/
  206 static s32 e1000_init_mac_params_80003es2lan(struct e1000_hw *hw)
  207 {
  208         struct e1000_mac_info *mac = &hw->mac;
  209 
  210         DEBUGFUNC("e1000_init_mac_params_80003es2lan");
  211 
  212         /* Set media type and media-dependent function pointers */
  213         switch (hw->device_id) {
  214         case E1000_DEV_ID_80003ES2LAN_SERDES_DPT:
  215                 hw->phy.media_type = e1000_media_type_internal_serdes;
  216                 mac->ops.check_for_link = e1000_check_for_serdes_link_generic;
  217                 mac->ops.setup_physical_interface =
  218                         e1000_setup_fiber_serdes_link_generic;
  219                 break;
  220         default:
  221                 hw->phy.media_type = e1000_media_type_copper;
  222                 mac->ops.check_for_link = e1000_check_for_copper_link_generic;
  223                 mac->ops.setup_physical_interface =
  224                         e1000_setup_copper_link_80003es2lan;
  225                 break;
  226         }
  227 
  228         /* Set mta register count */
  229         mac->mta_reg_count = 128;
  230         /* Set rar entry count */
  231         mac->rar_entry_count = E1000_RAR_ENTRIES;
  232         /* Set if part includes ASF firmware */
  233         mac->asf_firmware_present = TRUE;
  234         /* FWSM register */
  235         mac->has_fwsm = TRUE;
  236         /* ARC supported; valid only if manageability features are enabled. */
  237         mac->arc_subsystem_valid =
  238                 (E1000_READ_REG(hw, E1000_FWSM) & E1000_FWSM_MODE_MASK)
  239                         ? TRUE : FALSE;
  240         /* Adaptive IFS not supported */
  241         mac->adaptive_ifs = FALSE;
  242 
  243         /* Function pointers */
  244 
  245         /* bus type/speed/width */
  246         mac->ops.get_bus_info = e1000_get_bus_info_pcie_generic;
  247         /* reset */
  248         mac->ops.reset_hw = e1000_reset_hw_80003es2lan;
  249         /* hw initialization */
  250         mac->ops.init_hw = e1000_init_hw_80003es2lan;
  251         /* link setup */
  252         mac->ops.setup_link = e1000_setup_link_generic;
  253         /* check management mode */
  254         mac->ops.check_mng_mode = e1000_check_mng_mode_generic;
  255         /* multicast address update */
  256         mac->ops.update_mc_addr_list = e1000_update_mc_addr_list_generic;
  257         /* writing VFTA */
  258         mac->ops.write_vfta = e1000_write_vfta_generic;
  259         /* clearing VFTA */
  260         mac->ops.clear_vfta = e1000_clear_vfta_generic;
  261         /* read mac address */
  262         mac->ops.read_mac_addr = e1000_read_mac_addr_80003es2lan;
  263         /* ID LED init */
  264         mac->ops.id_led_init = e1000_id_led_init_generic;
  265         /* blink LED */
  266         mac->ops.blink_led = e1000_blink_led_generic;
  267         /* setup LED */
  268         mac->ops.setup_led = e1000_setup_led_generic;
  269         /* cleanup LED */
  270         mac->ops.cleanup_led = e1000_cleanup_led_generic;
  271         /* turn on/off LED */
  272         mac->ops.led_on = e1000_led_on_generic;
  273         mac->ops.led_off = e1000_led_off_generic;
  274         /* clear hardware counters */
  275         mac->ops.clear_hw_cntrs = e1000_clear_hw_cntrs_80003es2lan;
  276         /* link info */
  277         mac->ops.get_link_up_info = e1000_get_link_up_info_80003es2lan;
  278 
  279         /* set lan id for port to determine which phy lock to use */
  280         hw->mac.ops.set_lan_id(hw);
  281 
  282         return E1000_SUCCESS;
  283 }
  284 
  285 /**
  286  *  e1000_init_function_pointers_80003es2lan - Init ESB2 func ptrs.
  287  *  @hw: pointer to the HW structure
  288  *
  289  *  Called to initialize all function pointers and parameters.
  290  **/
  291 void e1000_init_function_pointers_80003es2lan(struct e1000_hw *hw)
  292 {
  293         DEBUGFUNC("e1000_init_function_pointers_80003es2lan");
  294 
  295         hw->mac.ops.init_params = e1000_init_mac_params_80003es2lan;
  296         hw->nvm.ops.init_params = e1000_init_nvm_params_80003es2lan;
  297         hw->phy.ops.init_params = e1000_init_phy_params_80003es2lan;
  298 }
  299 
  300 /**
  301  *  e1000_acquire_phy_80003es2lan - Acquire rights to access PHY
  302  *  @hw: pointer to the HW structure
  303  *
  304  *  A wrapper to acquire access rights to the correct PHY.
  305  **/
  306 static s32 e1000_acquire_phy_80003es2lan(struct e1000_hw *hw)
  307 {
  308         u16 mask;
  309 
  310         DEBUGFUNC("e1000_acquire_phy_80003es2lan");
  311 
  312         mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM;
  313         return e1000_acquire_swfw_sync_80003es2lan(hw, mask);
  314 }
  315 
  316 /**
  317  *  e1000_release_phy_80003es2lan - Release rights to access PHY
  318  *  @hw: pointer to the HW structure
  319  *
  320  *  A wrapper to release access rights to the correct PHY.
  321  **/
  322 static void e1000_release_phy_80003es2lan(struct e1000_hw *hw)
  323 {
  324         u16 mask;
  325 
  326         DEBUGFUNC("e1000_release_phy_80003es2lan");
  327 
  328         mask = hw->bus.func ? E1000_SWFW_PHY1_SM : E1000_SWFW_PHY0_SM;
  329         e1000_release_swfw_sync_80003es2lan(hw, mask);
  330 }
  331 
  332 /**
  333  *  e1000_acquire_mac_csr_80003es2lan - Acquire rights to access Kumeran register
  334  *  @hw: pointer to the HW structure
  335  *
  336  *  Acquire the semaphore to access the Kumeran interface.
  337  *
  338  **/
  339 static s32 e1000_acquire_mac_csr_80003es2lan(struct e1000_hw *hw)
  340 {
  341         u16 mask;
  342 
  343         DEBUGFUNC("e1000_acquire_mac_csr_80003es2lan");
  344 
  345         mask = E1000_SWFW_CSR_SM;
  346 
  347         return e1000_acquire_swfw_sync_80003es2lan(hw, mask);
  348 }
  349 
  350 /**
  351  *  e1000_release_mac_csr_80003es2lan - Release rights to access Kumeran Register
  352  *  @hw: pointer to the HW structure
  353  *
  354  *  Release the semaphore used to access the Kumeran interface
  355  **/
  356 static void e1000_release_mac_csr_80003es2lan(struct e1000_hw *hw)
  357 {
  358         u16 mask;
  359 
  360         DEBUGFUNC("e1000_release_mac_csr_80003es2lan");
  361 
  362         mask = E1000_SWFW_CSR_SM;
  363 
  364         e1000_release_swfw_sync_80003es2lan(hw, mask);
  365 }
  366 
  367 /**
  368  *  e1000_acquire_nvm_80003es2lan - Acquire rights to access NVM
  369  *  @hw: pointer to the HW structure
  370  *
  371  *  Acquire the semaphore to access the EEPROM.
  372  **/
  373 static s32 e1000_acquire_nvm_80003es2lan(struct e1000_hw *hw)
  374 {
  375         s32 ret_val;
  376 
  377         DEBUGFUNC("e1000_acquire_nvm_80003es2lan");
  378 
  379         ret_val = e1000_acquire_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
  380         if (ret_val)
  381                 goto out;
  382 
  383         ret_val = e1000_acquire_nvm_generic(hw);
  384 
  385         if (ret_val)
  386                 e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
  387 
  388 out:
  389         return ret_val;
  390 }
  391 
  392 /**
  393  *  e1000_release_nvm_80003es2lan - Relinquish rights to access NVM
  394  *  @hw: pointer to the HW structure
  395  *
  396  *  Release the semaphore used to access the EEPROM.
  397  **/
  398 static void e1000_release_nvm_80003es2lan(struct e1000_hw *hw)
  399 {
  400         DEBUGFUNC("e1000_release_nvm_80003es2lan");
  401 
  402         e1000_release_nvm_generic(hw);
  403         e1000_release_swfw_sync_80003es2lan(hw, E1000_SWFW_EEP_SM);
  404 }
  405 
  406 /**
  407  *  e1000_acquire_swfw_sync_80003es2lan - Acquire SW/FW semaphore
  408  *  @hw: pointer to the HW structure
  409  *  @mask: specifies which semaphore to acquire
  410  *
  411  *  Acquire the SW/FW semaphore to access the PHY or NVM.  The mask
  412  *  will also specify which port we're acquiring the lock for.
  413  **/
  414 static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask)
  415 {
  416         u32 swfw_sync;
  417         u32 swmask = mask;
  418         u32 fwmask = mask << 16;
  419         s32 ret_val = E1000_SUCCESS;
  420         s32 i = 0, timeout = 50;
  421 
  422         DEBUGFUNC("e1000_acquire_swfw_sync_80003es2lan");
  423 
  424         while (i < timeout) {
  425                 if (e1000_get_hw_semaphore_generic(hw)) {
  426                         ret_val = -E1000_ERR_SWFW_SYNC;
  427                         goto out;
  428                 }
  429 
  430                 swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
  431                 if (!(swfw_sync & (fwmask | swmask)))
  432                         break;
  433 
  434                 /*
  435                  * Firmware currently using resource (fwmask)
  436                  * or other software thread using resource (swmask)
  437                  */
  438                 e1000_put_hw_semaphore_generic(hw);
  439                 msec_delay_irq(5);
  440                 i++;
  441         }
  442 
  443         if (i == timeout) {
  444                 DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
  445                 ret_val = -E1000_ERR_SWFW_SYNC;
  446                 goto out;
  447         }
  448 
  449         swfw_sync |= swmask;
  450         E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
  451 
  452         e1000_put_hw_semaphore_generic(hw);
  453 
  454 out:
  455         return ret_val;
  456 }
  457 
  458 /**
  459  *  e1000_release_swfw_sync_80003es2lan - Release SW/FW semaphore
  460  *  @hw: pointer to the HW structure
  461  *  @mask: specifies which semaphore to acquire
  462  *
  463  *  Release the SW/FW semaphore used to access the PHY or NVM.  The mask
  464  *  will also specify which port we're releasing the lock for.
  465  **/
  466 static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw, u16 mask)
  467 {
  468         u32 swfw_sync;
  469 
  470         DEBUGFUNC("e1000_release_swfw_sync_80003es2lan");
  471 
  472         while (e1000_get_hw_semaphore_generic(hw) != E1000_SUCCESS)
  473                 ; /* Empty */
  474 
  475         swfw_sync = E1000_READ_REG(hw, E1000_SW_FW_SYNC);
  476         swfw_sync &= ~mask;
  477         E1000_WRITE_REG(hw, E1000_SW_FW_SYNC, swfw_sync);
  478 
  479         e1000_put_hw_semaphore_generic(hw);
  480 }
  481 
  482 /**
  483  *  e1000_read_phy_reg_gg82563_80003es2lan - Read GG82563 PHY register
  484  *  @hw: pointer to the HW structure
  485  *  @offset: offset of the register to read
  486  *  @data: pointer to the data returned from the operation
  487  *
  488  *  Read the GG82563 PHY register.
  489  **/
  490 static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
  491                                                   u32 offset, u16 *data)
  492 {
  493         s32 ret_val;
  494         u32 page_select;
  495         u16 temp;
  496 
  497         DEBUGFUNC("e1000_read_phy_reg_gg82563_80003es2lan");
  498 
  499         ret_val = e1000_acquire_phy_80003es2lan(hw);
  500         if (ret_val)
  501                 goto out;
  502 
  503         /* Select Configuration Page */
  504         if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
  505                 page_select = GG82563_PHY_PAGE_SELECT;
  506         } else {
  507                 /*
  508                  * Use Alternative Page Select register to access
  509                  * registers 30 and 31
  510                  */
  511                 page_select = GG82563_PHY_PAGE_SELECT_ALT;
  512         }
  513 
  514         temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT);
  515         ret_val = e1000_write_phy_reg_mdic(hw, page_select, temp);
  516         if (ret_val) {
  517                 e1000_release_phy_80003es2lan(hw);
  518                 goto out;
  519         }
  520 
  521         if (hw->dev_spec._80003es2lan.mdic_wa_enable == TRUE) {
  522                 /*
  523                  * The "ready" bit in the MDIC register may be incorrectly set
  524                  * before the device has completed the "Page Select" MDI
  525                  * transaction.  So we wait 200us after each MDI command...
  526                  */
  527                 usec_delay(200);
  528 
  529                 /* ...and verify the command was successful. */
  530                 ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp);
  531 
  532                 if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
  533                         ret_val = -E1000_ERR_PHY;
  534                         e1000_release_phy_80003es2lan(hw);
  535                         goto out;
  536                 }
  537 
  538                 usec_delay(200);
  539 
  540                 ret_val = e1000_read_phy_reg_mdic(hw,
  541                                                   MAX_PHY_REG_ADDRESS & offset,
  542                                                   data);
  543 
  544                 usec_delay(200);
  545         } else {
  546                 ret_val = e1000_read_phy_reg_mdic(hw,
  547                                                   MAX_PHY_REG_ADDRESS & offset,
  548                                                   data);
  549         }
  550 
  551         e1000_release_phy_80003es2lan(hw);
  552 
  553 out:
  554         return ret_val;
  555 }
  556 
  557 /**
  558  *  e1000_write_phy_reg_gg82563_80003es2lan - Write GG82563 PHY register
  559  *  @hw: pointer to the HW structure
  560  *  @offset: offset of the register to read
  561  *  @data: value to write to the register
  562  *
  563  *  Write to the GG82563 PHY register.
  564  **/
  565 static s32 e1000_write_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
  566                                                    u32 offset, u16 data)
  567 {
  568         s32 ret_val;
  569         u32 page_select;
  570         u16 temp;
  571 
  572         DEBUGFUNC("e1000_write_phy_reg_gg82563_80003es2lan");
  573 
  574         ret_val = e1000_acquire_phy_80003es2lan(hw);
  575         if (ret_val)
  576                 goto out;
  577 
  578         /* Select Configuration Page */
  579         if ((offset & MAX_PHY_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
  580                 page_select = GG82563_PHY_PAGE_SELECT;
  581         } else {
  582                 /*
  583                  * Use Alternative Page Select register to access
  584                  * registers 30 and 31
  585                  */
  586                 page_select = GG82563_PHY_PAGE_SELECT_ALT;
  587         }
  588 
  589         temp = (u16)((u16)offset >> GG82563_PAGE_SHIFT);
  590         ret_val = e1000_write_phy_reg_mdic(hw, page_select, temp);
  591         if (ret_val) {
  592                 e1000_release_phy_80003es2lan(hw);
  593                 goto out;
  594         }
  595 
  596         if (hw->dev_spec._80003es2lan.mdic_wa_enable == TRUE) {
  597                 /*
  598                  * The "ready" bit in the MDIC register may be incorrectly set
  599                  * before the device has completed the "Page Select" MDI
  600                  * transaction.  So we wait 200us after each MDI command...
  601                  */
  602                 usec_delay(200);
  603 
  604                 /* ...and verify the command was successful. */
  605                 ret_val = e1000_read_phy_reg_mdic(hw, page_select, &temp);
  606 
  607                 if (((u16)offset >> GG82563_PAGE_SHIFT) != temp) {
  608                         ret_val = -E1000_ERR_PHY;
  609                         e1000_release_phy_80003es2lan(hw);
  610                         goto out;
  611                 }
  612 
  613                 usec_delay(200);
  614 
  615                 ret_val = e1000_write_phy_reg_mdic(hw,
  616                                                   MAX_PHY_REG_ADDRESS & offset,
  617                                                   data);
  618 
  619                 usec_delay(200);
  620         } else {
  621                 ret_val = e1000_write_phy_reg_mdic(hw,
  622                                                   MAX_PHY_REG_ADDRESS & offset,
  623                                                   data);
  624         }
  625 
  626         e1000_release_phy_80003es2lan(hw);
  627 
  628 out:
  629         return ret_val;
  630 }
  631 
  632 /**
  633  *  e1000_write_nvm_80003es2lan - Write to ESB2 NVM
  634  *  @hw: pointer to the HW structure
  635  *  @offset: offset of the register to read
  636  *  @words: number of words to write
  637  *  @data: buffer of data to write to the NVM
  638  *
  639  *  Write "words" of data to the ESB2 NVM.
  640  **/
  641 static s32 e1000_write_nvm_80003es2lan(struct e1000_hw *hw, u16 offset,
  642                             u16 words, u16 *data)
  643 {
  644         DEBUGFUNC("e1000_write_nvm_80003es2lan");
  645 
  646         return e1000_write_nvm_spi(hw, offset, words, data);
  647 }
  648 
  649 /**
  650  *  e1000_get_cfg_done_80003es2lan - Wait for configuration to complete
  651  *  @hw: pointer to the HW structure
  652  *
  653  *  Wait a specific amount of time for manageability processes to complete.
  654  *  This is a function pointer entry point called by the phy module.
  655  **/
  656 static s32 e1000_get_cfg_done_80003es2lan(struct e1000_hw *hw)
  657 {
  658         s32 timeout = PHY_CFG_TIMEOUT;
  659         s32 ret_val = E1000_SUCCESS;
  660         u32 mask = E1000_NVM_CFG_DONE_PORT_0;
  661 
  662         DEBUGFUNC("e1000_get_cfg_done_80003es2lan");
  663 
  664         if (hw->bus.func == 1)
  665                 mask = E1000_NVM_CFG_DONE_PORT_1;
  666 
  667         while (timeout) {
  668                 if (E1000_READ_REG(hw, E1000_EEMNGCTL) & mask)
  669                         break;
  670                 msec_delay(1);
  671                 timeout--;
  672         }
  673         if (!timeout) {
  674                 DEBUGOUT("MNG configuration cycle has not completed.\n");
  675                 ret_val = -E1000_ERR_RESET;
  676                 goto out;
  677         }
  678 
  679 out:
  680         return ret_val;
  681 }
  682 
  683 /**
  684  *  e1000_phy_force_speed_duplex_80003es2lan - Force PHY speed and duplex
  685  *  @hw: pointer to the HW structure
  686  *
  687  *  Force the speed and duplex settings onto the PHY.  This is a
  688  *  function pointer entry point called by the phy module.
  689  **/
  690 static s32 e1000_phy_force_speed_duplex_80003es2lan(struct e1000_hw *hw)
  691 {
  692         s32 ret_val = E1000_SUCCESS;
  693         u16 phy_data;
  694         bool link;
  695 
  696         DEBUGFUNC("e1000_phy_force_speed_duplex_80003es2lan");
  697 
  698         if (!(hw->phy.ops.read_reg))
  699                 goto out;
  700 
  701         /*
  702          * Clear Auto-Crossover to force MDI manually.  M88E1000 requires MDI
  703          * forced whenever speed and duplex are forced.
  704          */
  705         ret_val = hw->phy.ops.read_reg(hw, M88E1000_PHY_SPEC_CTRL, &phy_data);
  706         if (ret_val)
  707                 goto out;
  708 
  709         phy_data &= ~GG82563_PSCR_CROSSOVER_MODE_AUTO;
  710         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_SPEC_CTRL, phy_data);
  711         if (ret_val)
  712                 goto out;
  713 
  714         DEBUGOUT1("GG82563 PSCR: %X\n", phy_data);
  715 
  716         ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_data);
  717         if (ret_val)
  718                 goto out;
  719 
  720         e1000_phy_force_speed_duplex_setup(hw, &phy_data);
  721 
  722         /* Reset the phy to commit changes. */
  723         phy_data |= MII_CR_RESET;
  724 
  725         ret_val = hw->phy.ops.write_reg(hw, PHY_CONTROL, phy_data);
  726         if (ret_val)
  727                 goto out;
  728 
  729         usec_delay(1);
  730 
  731         if (hw->phy.autoneg_wait_to_complete) {
  732                 DEBUGOUT("Waiting for forced speed/duplex link "
  733                          "on GG82563 phy.\n");
  734 
  735                 ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
  736                                                      100000, &link);
  737                 if (ret_val)
  738                         goto out;
  739 
  740                 if (!link) {
  741                         /*
  742                          * We didn't get link.
  743                          * Reset the DSP and cross our fingers.
  744                          */
  745                         ret_val = e1000_phy_reset_dsp_generic(hw);
  746                         if (ret_val)
  747                                 goto out;
  748                 }
  749 
  750                 /* Try once more */
  751                 ret_val = e1000_phy_has_link_generic(hw, PHY_FORCE_LIMIT,
  752                                                      100000, &link);
  753                 if (ret_val)
  754                         goto out;
  755         }
  756 
  757         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, &phy_data);
  758         if (ret_val)
  759                 goto out;
  760 
  761         /*
  762          * Resetting the phy means we need to verify the TX_CLK corresponds
  763          * to the link speed.  10Mbps -> 2.5MHz, else 25MHz.
  764          */
  765         phy_data &= ~GG82563_MSCR_TX_CLK_MASK;
  766         if (hw->mac.forced_speed_duplex & E1000_ALL_10_SPEED)
  767                 phy_data |= GG82563_MSCR_TX_CLK_10MBPS_2_5;
  768         else
  769                 phy_data |= GG82563_MSCR_TX_CLK_100MBPS_25;
  770 
  771         /*
  772          * In addition, we must re-enable CRS on Tx for both half and full
  773          * duplex.
  774          */
  775         phy_data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
  776         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_MAC_SPEC_CTRL, phy_data);
  777 
  778 out:
  779         return ret_val;
  780 }
  781 
  782 /**
  783  *  e1000_get_cable_length_80003es2lan - Set approximate cable length
  784  *  @hw: pointer to the HW structure
  785  *
  786  *  Find the approximate cable length as measured by the GG82563 PHY.
  787  *  This is a function pointer entry point called by the phy module.
  788  **/
  789 static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw)
  790 {
  791         struct e1000_phy_info *phy = &hw->phy;
  792         s32 ret_val = E1000_SUCCESS;
  793         u16 phy_data, index;
  794 
  795         DEBUGFUNC("e1000_get_cable_length_80003es2lan");
  796 
  797         if (!(hw->phy.ops.read_reg))
  798                 goto out;
  799 
  800         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_DSP_DISTANCE, &phy_data);
  801         if (ret_val)
  802                 goto out;
  803 
  804         index = phy_data & GG82563_DSPD_CABLE_LENGTH;
  805 
  806         if (index >= GG82563_CABLE_LENGTH_TABLE_SIZE - 5) {
  807                 ret_val = -E1000_ERR_PHY;
  808                 goto out;
  809         }
  810 
  811         phy->min_cable_length = e1000_gg82563_cable_length_table[index];
  812         phy->max_cable_length = e1000_gg82563_cable_length_table[index + 5];
  813 
  814         phy->cable_length = (phy->min_cable_length + phy->max_cable_length) / 2;
  815 
  816 out:
  817         return ret_val;
  818 }
  819 
  820 /**
  821  *  e1000_get_link_up_info_80003es2lan - Report speed and duplex
  822  *  @hw: pointer to the HW structure
  823  *  @speed: pointer to speed buffer
  824  *  @duplex: pointer to duplex buffer
  825  *
  826  *  Retrieve the current speed and duplex configuration.
  827  **/
  828 static s32 e1000_get_link_up_info_80003es2lan(struct e1000_hw *hw, u16 *speed,
  829                                               u16 *duplex)
  830 {
  831         s32 ret_val;
  832 
  833         DEBUGFUNC("e1000_get_link_up_info_80003es2lan");
  834 
  835         if (hw->phy.media_type == e1000_media_type_copper) {
  836                 ret_val = e1000_get_speed_and_duplex_copper_generic(hw,
  837                                                                     speed,
  838                                                                     duplex);
  839                 hw->phy.ops.cfg_on_link_up(hw);
  840         } else {
  841                 ret_val = e1000_get_speed_and_duplex_fiber_serdes_generic(hw,
  842                                                                   speed,
  843                                                                   duplex);
  844         }
  845 
  846         return ret_val;
  847 }
  848 
  849 /**
  850  *  e1000_reset_hw_80003es2lan - Reset the ESB2 controller
  851  *  @hw: pointer to the HW structure
  852  *
  853  *  Perform a global reset to the ESB2 controller.
  854  **/
  855 static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
  856 {
  857         u32 ctrl;
  858         s32 ret_val;
  859 
  860         DEBUGFUNC("e1000_reset_hw_80003es2lan");
  861 
  862         /*
  863          * Prevent the PCI-E bus from sticking if there is no TLP connection
  864          * on the last TLP read/write transaction when MAC is reset.
  865          */
  866         ret_val = e1000_disable_pcie_master_generic(hw);
  867         if (ret_val)
  868                 DEBUGOUT("PCI-E Master disable polling has failed.\n");
  869 
  870         DEBUGOUT("Masking off all interrupts\n");
  871         E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
  872 
  873         E1000_WRITE_REG(hw, E1000_RCTL, 0);
  874         E1000_WRITE_REG(hw, E1000_TCTL, E1000_TCTL_PSP);
  875         E1000_WRITE_FLUSH(hw);
  876 
  877         msec_delay(10);
  878 
  879         ctrl = E1000_READ_REG(hw, E1000_CTRL);
  880 
  881         ret_val = e1000_acquire_phy_80003es2lan(hw);
  882         DEBUGOUT("Issuing a global reset to MAC\n");
  883         E1000_WRITE_REG(hw, E1000_CTRL, ctrl | E1000_CTRL_RST);
  884         e1000_release_phy_80003es2lan(hw);
  885 
  886         ret_val = e1000_get_auto_rd_done_generic(hw);
  887         if (ret_val)
  888                 /* We don't want to continue accessing MAC registers. */
  889                 goto out;
  890 
  891         /* Clear any pending interrupt events. */
  892         E1000_WRITE_REG(hw, E1000_IMC, 0xffffffff);
  893         E1000_READ_REG(hw, E1000_ICR);
  894 
  895         ret_val = e1000_check_alt_mac_addr_generic(hw);
  896 
  897 out:
  898         return ret_val;
  899 }
  900 
  901 /**
  902  *  e1000_init_hw_80003es2lan - Initialize the ESB2 controller
  903  *  @hw: pointer to the HW structure
  904  *
  905  *  Initialize the hw bits, LED, VFTA, MTA, link and hw counters.
  906  **/
  907 static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
  908 {
  909         struct e1000_mac_info *mac = &hw->mac;
  910         u32 reg_data;
  911         s32 ret_val;
  912         u16 kum_reg_data;
  913         u16 i;
  914 
  915         DEBUGFUNC("e1000_init_hw_80003es2lan");
  916 
  917         e1000_initialize_hw_bits_80003es2lan(hw);
  918 
  919         /* Initialize identification LED */
  920         ret_val = mac->ops.id_led_init(hw);
  921         if (ret_val)
  922                 DEBUGOUT("Error initializing identification LED\n");
  923                 /* This is not fatal and we should not stop init due to this */
  924 
  925         /* Disabling VLAN filtering */
  926         DEBUGOUT("Initializing the IEEE VLAN\n");
  927         mac->ops.clear_vfta(hw);
  928 
  929         /* Setup the receive address. */
  930         e1000_init_rx_addrs_generic(hw, mac->rar_entry_count);
  931 
  932         /* Zero out the Multicast HASH table */
  933         DEBUGOUT("Zeroing the MTA\n");
  934         for (i = 0; i < mac->mta_reg_count; i++)
  935                 E1000_WRITE_REG_ARRAY(hw, E1000_MTA, i, 0);
  936 
  937         /* Setup link and flow control */
  938         ret_val = mac->ops.setup_link(hw);
  939 
  940         /* Disable IBIST slave mode (far-end loopback) */
  941         e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
  942                                         &kum_reg_data);
  943         kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE;
  944         e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM,
  945                                          kum_reg_data);
  946 
  947         /* Set the transmit descriptor write-back policy */
  948         reg_data = E1000_READ_REG(hw, E1000_TXDCTL(0));
  949         reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) |
  950                    E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC;
  951         E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg_data);
  952 
  953         /* ...for both queues. */
  954         reg_data = E1000_READ_REG(hw, E1000_TXDCTL(1));
  955         reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) |
  956                    E1000_TXDCTL_FULL_TX_DESC_WB | E1000_TXDCTL_COUNT_DESC;
  957         E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg_data);
  958 
  959         /* Enable retransmit on late collisions */
  960         reg_data = E1000_READ_REG(hw, E1000_TCTL);
  961         reg_data |= E1000_TCTL_RTLC;
  962         E1000_WRITE_REG(hw, E1000_TCTL, reg_data);
  963 
  964         /* Configure Gigabit Carry Extend Padding */
  965         reg_data = E1000_READ_REG(hw, E1000_TCTL_EXT);
  966         reg_data &= ~E1000_TCTL_EXT_GCEX_MASK;
  967         reg_data |= DEFAULT_TCTL_EXT_GCEX_80003ES2LAN;
  968         E1000_WRITE_REG(hw, E1000_TCTL_EXT, reg_data);
  969 
  970         /* Configure Transmit Inter-Packet Gap */
  971         reg_data = E1000_READ_REG(hw, E1000_TIPG);
  972         reg_data &= ~E1000_TIPG_IPGT_MASK;
  973         reg_data |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN;
  974         E1000_WRITE_REG(hw, E1000_TIPG, reg_data);
  975 
  976         reg_data = E1000_READ_REG_ARRAY(hw, E1000_FFLT, 0x0001);
  977         reg_data &= ~0x00100000;
  978         E1000_WRITE_REG_ARRAY(hw, E1000_FFLT, 0x0001, reg_data);
  979 
  980         /* default to TRUE to enable the MDIC W/A */
  981         hw->dev_spec._80003es2lan.mdic_wa_enable = TRUE;
  982 
  983         ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
  984                                       E1000_KMRNCTRLSTA_OFFSET >>
  985                                       E1000_KMRNCTRLSTA_OFFSET_SHIFT,
  986                                       &i);
  987         if (!ret_val) {
  988                 if ((i & E1000_KMRNCTRLSTA_OPMODE_MASK) ==
  989                      E1000_KMRNCTRLSTA_OPMODE_INBAND_MDIO)
  990                         hw->dev_spec._80003es2lan.mdic_wa_enable = FALSE;
  991         }
  992 
  993         /*
  994          * Clear all of the statistics registers (clear on read).  It is
  995          * important that we do this after we have tried to establish link
  996          * because the symbol error count will increment wildly if there
  997          * is no link.
  998          */
  999         e1000_clear_hw_cntrs_80003es2lan(hw);
 1000 
 1001         return ret_val;
 1002 }
 1003 
 1004 /**
 1005  *  e1000_initialize_hw_bits_80003es2lan - Init hw bits of ESB2
 1006  *  @hw: pointer to the HW structure
 1007  *
 1008  *  Initializes required hardware-dependent bits needed for normal operation.
 1009  **/
 1010 static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw)
 1011 {
 1012         u32 reg;
 1013 
 1014         DEBUGFUNC("e1000_initialize_hw_bits_80003es2lan");
 1015 
 1016         /* Transmit Descriptor Control 0 */
 1017         reg = E1000_READ_REG(hw, E1000_TXDCTL(0));
 1018         reg |= (1 << 22);
 1019         E1000_WRITE_REG(hw, E1000_TXDCTL(0), reg);
 1020 
 1021         /* Transmit Descriptor Control 1 */
 1022         reg = E1000_READ_REG(hw, E1000_TXDCTL(1));
 1023         reg |= (1 << 22);
 1024         E1000_WRITE_REG(hw, E1000_TXDCTL(1), reg);
 1025 
 1026         /* Transmit Arbitration Control 0 */
 1027         reg = E1000_READ_REG(hw, E1000_TARC(0));
 1028         reg &= ~(0xF << 27); /* 30:27 */
 1029         if (hw->phy.media_type != e1000_media_type_copper)
 1030                 reg &= ~(1 << 20);
 1031         E1000_WRITE_REG(hw, E1000_TARC(0), reg);
 1032 
 1033         /* Transmit Arbitration Control 1 */
 1034         reg = E1000_READ_REG(hw, E1000_TARC(1));
 1035         if (E1000_READ_REG(hw, E1000_TCTL) & E1000_TCTL_MULR)
 1036                 reg &= ~(1 << 28);
 1037         else
 1038                 reg |= (1 << 28);
 1039         E1000_WRITE_REG(hw, E1000_TARC(1), reg);
 1040 
 1041         return;
 1042 }
 1043 
 1044 /**
 1045  *  e1000_copper_link_setup_gg82563_80003es2lan - Configure GG82563 Link
 1046  *  @hw: pointer to the HW structure
 1047  *
 1048  *  Setup some GG82563 PHY registers for obtaining link
 1049  **/
 1050 static s32 e1000_copper_link_setup_gg82563_80003es2lan(struct e1000_hw *hw)
 1051 {
 1052         struct e1000_phy_info *phy = &hw->phy;
 1053         s32 ret_val;
 1054         u32 ctrl_ext;
 1055         u16 data;
 1056 
 1057         DEBUGFUNC("e1000_copper_link_setup_gg82563_80003es2lan");
 1058 
 1059         if (phy->reset_disable)
 1060                 goto skip_reset;
 1061 
 1062         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
 1063                                      &data);
 1064         if (ret_val)
 1065                 goto out;
 1066 
 1067         data |= GG82563_MSCR_ASSERT_CRS_ON_TX;
 1068         /* Use 25MHz for both link down and 1000Base-T for Tx clock. */
 1069         data |= GG82563_MSCR_TX_CLK_1000MBPS_25;
 1070 
 1071         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_MAC_SPEC_CTRL,
 1072                                       data);
 1073         if (ret_val)
 1074                 goto out;
 1075 
 1076         /*
 1077          * Options:
 1078          *   MDI/MDI-X = 0 (default)
 1079          *   0 - Auto for all speeds
 1080          *   1 - MDI mode
 1081          *   2 - MDI-X mode
 1082          *   3 - Auto for 1000Base-T only (MDI-X for 10/100Base-T modes)
 1083          */
 1084         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_SPEC_CTRL, &data);
 1085         if (ret_val)
 1086                 goto out;
 1087 
 1088         data &= ~GG82563_PSCR_CROSSOVER_MODE_MASK;
 1089 
 1090         switch (phy->mdix) {
 1091         case 1:
 1092                 data |= GG82563_PSCR_CROSSOVER_MODE_MDI;
 1093                 break;
 1094         case 2:
 1095                 data |= GG82563_PSCR_CROSSOVER_MODE_MDIX;
 1096                 break;
 1097         case 0:
 1098         default:
 1099                 data |= GG82563_PSCR_CROSSOVER_MODE_AUTO;
 1100                 break;
 1101         }
 1102 
 1103         /*
 1104          * Options:
 1105          *   disable_polarity_correction = 0 (default)
 1106          *       Automatic Correction for Reversed Cable Polarity
 1107          *   0 - Disabled
 1108          *   1 - Enabled
 1109          */
 1110         data &= ~GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
 1111         if (phy->disable_polarity_correction)
 1112                 data |= GG82563_PSCR_POLARITY_REVERSAL_DISABLE;
 1113 
 1114         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_SPEC_CTRL, data);
 1115         if (ret_val)
 1116                 goto out;
 1117 
 1118         /* SW Reset the PHY so all changes take effect */
 1119         ret_val = hw->phy.ops.commit(hw);
 1120         if (ret_val) {
 1121                 DEBUGOUT("Error Resetting the PHY\n");
 1122                 goto out;
 1123         }
 1124 
 1125 skip_reset:
 1126         /* Bypass Rx and Tx FIFO's */
 1127         ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
 1128                                         E1000_KMRNCTRLSTA_OFFSET_FIFO_CTRL,
 1129                                         E1000_KMRNCTRLSTA_FIFO_CTRL_RX_BYPASS |
 1130                                         E1000_KMRNCTRLSTA_FIFO_CTRL_TX_BYPASS);
 1131         if (ret_val)
 1132                 goto out;
 1133 
 1134         ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
 1135                                       E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,
 1136                                       &data);
 1137         if (ret_val)
 1138                 goto out;
 1139         data |= E1000_KMRNCTRLSTA_OPMODE_E_IDLE;
 1140         ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
 1141                                        E1000_KMRNCTRLSTA_OFFSET_MAC2PHY_OPMODE,
 1142                                        data);
 1143         if (ret_val)
 1144                 goto out;
 1145 
 1146         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_SPEC_CTRL_2, &data);
 1147         if (ret_val)
 1148                 goto out;
 1149 
 1150         data &= ~GG82563_PSCR2_REVERSE_AUTO_NEG;
 1151         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_SPEC_CTRL_2, data);
 1152         if (ret_val)
 1153                 goto out;
 1154 
 1155         ctrl_ext = E1000_READ_REG(hw, E1000_CTRL_EXT);
 1156         ctrl_ext &= ~(E1000_CTRL_EXT_LINK_MODE_MASK);
 1157         E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrl_ext);
 1158 
 1159         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_PWR_MGMT_CTRL, &data);
 1160         if (ret_val)
 1161                 goto out;
 1162 
 1163         /*
 1164          * Do not init these registers when the HW is in IAMT mode, since the
 1165          * firmware will have already initialized them.  We only initialize
 1166          * them if the HW is not in IAMT mode.
 1167          */
 1168         if (!(hw->mac.ops.check_mng_mode(hw))) {
 1169                 /* Enable Electrical Idle on the PHY */
 1170                 data |= GG82563_PMCR_ENABLE_ELECTRICAL_IDLE;
 1171                 ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_PWR_MGMT_CTRL,
 1172                                                 data);
 1173                 if (ret_val)
 1174                         goto out;
 1175 
 1176                 ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1177                                                &data);
 1178                 if (ret_val)
 1179                         goto out;
 1180 
 1181                 data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
 1182                 ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1183                                                 data);
 1184                 if (ret_val)
 1185                         goto out;
 1186         }
 1187 
 1188         /*
 1189          * Workaround: Disable padding in Kumeran interface in the MAC
 1190          * and in the PHY to avoid CRC errors.
 1191          */
 1192         ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_INBAND_CTRL, &data);
 1193         if (ret_val)
 1194                 goto out;
 1195 
 1196         data |= GG82563_ICR_DIS_PADDING;
 1197         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_INBAND_CTRL, data);
 1198         if (ret_val)
 1199                 goto out;
 1200 
 1201 out:
 1202         return ret_val;
 1203 }
 1204 
 1205 /**
 1206  *  e1000_setup_copper_link_80003es2lan - Setup Copper Link for ESB2
 1207  *  @hw: pointer to the HW structure
 1208  *
 1209  *  Essentially a wrapper for setting up all things "copper" related.
 1210  *  This is a function pointer entry point called by the mac module.
 1211  **/
 1212 static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw)
 1213 {
 1214         u32 ctrl;
 1215         s32 ret_val;
 1216         u16 reg_data;
 1217 
 1218         DEBUGFUNC("e1000_setup_copper_link_80003es2lan");
 1219 
 1220         ctrl = E1000_READ_REG(hw, E1000_CTRL);
 1221         ctrl |= E1000_CTRL_SLU;
 1222         ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
 1223         E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
 1224 
 1225         /*
 1226          * Set the mac to wait the maximum time between each
 1227          * iteration and increase the max iterations when
 1228          * polling the phy; this fixes erroneous timeouts at 10Mbps.
 1229          */
 1230         ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 4),
 1231                                                    0xFFFF);
 1232         if (ret_val)
 1233                 goto out;
 1234         ret_val = e1000_read_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9),
 1235                                                   &reg_data);
 1236         if (ret_val)
 1237                 goto out;
 1238         reg_data |= 0x3F;
 1239         ret_val = e1000_write_kmrn_reg_80003es2lan(hw, GG82563_REG(0x34, 9),
 1240                                                    reg_data);
 1241         if (ret_val)
 1242                 goto out;
 1243         ret_val = e1000_read_kmrn_reg_80003es2lan(hw,
 1244                                       E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,
 1245                                       &reg_data);
 1246         if (ret_val)
 1247                 goto out;
 1248         reg_data |= E1000_KMRNCTRLSTA_INB_CTRL_DIS_PADDING;
 1249         ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
 1250                                        E1000_KMRNCTRLSTA_OFFSET_INB_CTRL,
 1251                                        reg_data);
 1252         if (ret_val)
 1253                 goto out;
 1254 
 1255         ret_val = e1000_copper_link_setup_gg82563_80003es2lan(hw);
 1256         if (ret_val)
 1257                 goto out;
 1258 
 1259         ret_val = e1000_setup_copper_link_generic(hw);
 1260 
 1261 out:
 1262         return ret_val;
 1263 }
 1264 
 1265 /**
 1266  *  e1000_cfg_on_link_up_80003es2lan - es2 link configuration after link-up
 1267  *  @hw: pointer to the HW structure
 1268  *  @duplex: current duplex setting
 1269  *
 1270  *  Configure the KMRN interface by applying last minute quirks for
 1271  *  10/100 operation.
 1272  **/
 1273 static s32 e1000_cfg_on_link_up_80003es2lan(struct e1000_hw *hw)
 1274 {
 1275         s32 ret_val = E1000_SUCCESS;
 1276         u16 speed;
 1277         u16 duplex;
 1278 
 1279         DEBUGFUNC("e1000_configure_on_link_up");
 1280 
 1281         if (hw->phy.media_type == e1000_media_type_copper) {
 1282                 ret_val = e1000_get_speed_and_duplex_copper_generic(hw,
 1283                                                                     &speed,
 1284                                                                     &duplex);
 1285                 if (ret_val)
 1286                         goto out;
 1287 
 1288                 if (speed == SPEED_1000)
 1289                         ret_val = e1000_cfg_kmrn_1000_80003es2lan(hw);
 1290                 else
 1291                         ret_val = e1000_cfg_kmrn_10_100_80003es2lan(hw, duplex);
 1292         }
 1293 
 1294 out:
 1295         return ret_val;
 1296 }
 1297 
 1298 /**
 1299  *  e1000_cfg_kmrn_10_100_80003es2lan - Apply "quirks" for 10/100 operation
 1300  *  @hw: pointer to the HW structure
 1301  *  @duplex: current duplex setting
 1302  *
 1303  *  Configure the KMRN interface by applying last minute quirks for
 1304  *  10/100 operation.
 1305  **/
 1306 static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex)
 1307 {
 1308         s32 ret_val = E1000_SUCCESS;
 1309         u32 tipg;
 1310         u32 i = 0;
 1311         u16 reg_data, reg_data2;
 1312 
 1313         DEBUGFUNC("e1000_configure_kmrn_for_10_100");
 1314 
 1315         reg_data = E1000_KMRNCTRLSTA_HD_CTRL_10_100_DEFAULT;
 1316         ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
 1317                                        E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,
 1318                                        reg_data);
 1319         if (ret_val)
 1320                 goto out;
 1321 
 1322         /* Configure Transmit Inter-Packet Gap */
 1323         tipg = E1000_READ_REG(hw, E1000_TIPG);
 1324         tipg &= ~E1000_TIPG_IPGT_MASK;
 1325         tipg |= DEFAULT_TIPG_IPGT_10_100_80003ES2LAN;
 1326         E1000_WRITE_REG(hw, E1000_TIPG, tipg);
 1327 
 1328         do {
 1329                 ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1330                                                &reg_data);
 1331                 if (ret_val)
 1332                         goto out;
 1333 
 1334                 ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1335                                                &reg_data2);
 1336                 if (ret_val)
 1337                         goto out;
 1338                 i++;
 1339         } while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));
 1340 
 1341         if (duplex == HALF_DUPLEX)
 1342                 reg_data |= GG82563_KMCR_PASS_FALSE_CARRIER;
 1343         else
 1344                 reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
 1345 
 1346         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
 1347 
 1348 out:
 1349         return ret_val;
 1350 }
 1351 
 1352 /**
 1353  *  e1000_cfg_kmrn_1000_80003es2lan - Apply "quirks" for gigabit operation
 1354  *  @hw: pointer to the HW structure
 1355  *
 1356  *  Configure the KMRN interface by applying last minute quirks for
 1357  *  gigabit operation.
 1358  **/
 1359 static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw)
 1360 {
 1361         s32 ret_val = E1000_SUCCESS;
 1362         u16 reg_data, reg_data2;
 1363         u32 tipg;
 1364         u32 i = 0;
 1365 
 1366         DEBUGFUNC("e1000_configure_kmrn_for_1000");
 1367 
 1368         reg_data = E1000_KMRNCTRLSTA_HD_CTRL_1000_DEFAULT;
 1369         ret_val = e1000_write_kmrn_reg_80003es2lan(hw,
 1370                                        E1000_KMRNCTRLSTA_OFFSET_HD_CTRL,
 1371                                        reg_data);
 1372         if (ret_val)
 1373                 goto out;
 1374 
 1375         /* Configure Transmit Inter-Packet Gap */
 1376         tipg = E1000_READ_REG(hw, E1000_TIPG);
 1377         tipg &= ~E1000_TIPG_IPGT_MASK;
 1378         tipg |= DEFAULT_TIPG_IPGT_1000_80003ES2LAN;
 1379         E1000_WRITE_REG(hw, E1000_TIPG, tipg);
 1380 
 1381         do {
 1382                 ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1383                                                &reg_data);
 1384                 if (ret_val)
 1385                         goto out;
 1386 
 1387                 ret_val = hw->phy.ops.read_reg(hw, GG82563_PHY_KMRN_MODE_CTRL,
 1388                                                &reg_data2);
 1389                 if (ret_val)
 1390                         goto out;
 1391                 i++;
 1392         } while ((reg_data != reg_data2) && (i < GG82563_MAX_KMRN_RETRY));
 1393 
 1394         reg_data &= ~GG82563_KMCR_PASS_FALSE_CARRIER;
 1395         ret_val = hw->phy.ops.write_reg(hw, GG82563_PHY_KMRN_MODE_CTRL, reg_data);
 1396 
 1397 out:
 1398         return ret_val;
 1399 }
 1400 
 1401 /**
 1402  *  e1000_read_kmrn_reg_80003es2lan - Read kumeran register
 1403  *  @hw: pointer to the HW structure
 1404  *  @offset: register offset to be read
 1405  *  @data: pointer to the read data
 1406  *
 1407  *  Acquire semaphore, then read the PHY register at offset
 1408  *  using the kumeran interface.  The information retrieved is stored in data.
 1409  *  Release the semaphore before exiting.
 1410  **/
 1411 static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
 1412                                            u16 *data)
 1413 {
 1414         u32 kmrnctrlsta;
 1415         s32 ret_val = E1000_SUCCESS;
 1416 
 1417         DEBUGFUNC("e1000_read_kmrn_reg_80003es2lan");
 1418 
 1419         ret_val = e1000_acquire_mac_csr_80003es2lan(hw);
 1420         if (ret_val)
 1421                 goto out;
 1422 
 1423         kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
 1424                        E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN;
 1425         E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta);
 1426 
 1427         usec_delay(2);
 1428 
 1429         kmrnctrlsta = E1000_READ_REG(hw, E1000_KMRNCTRLSTA);
 1430         *data = (u16)kmrnctrlsta;
 1431 
 1432         e1000_release_mac_csr_80003es2lan(hw);
 1433 
 1434 out:
 1435         return ret_val;
 1436 }
 1437 
 1438 /**
 1439  *  e1000_write_kmrn_reg_80003es2lan - Write kumeran register
 1440  *  @hw: pointer to the HW structure
 1441  *  @offset: register offset to write to
 1442  *  @data: data to write at register offset
 1443  *
 1444  *  Acquire semaphore, then write the data to PHY register
 1445  *  at the offset using the kumeran interface.  Release semaphore
 1446  *  before exiting.
 1447  **/
 1448 static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset,
 1449                                             u16 data)
 1450 {
 1451         u32 kmrnctrlsta;
 1452         s32 ret_val = E1000_SUCCESS;
 1453 
 1454         DEBUGFUNC("e1000_write_kmrn_reg_80003es2lan");
 1455 
 1456         ret_val = e1000_acquire_mac_csr_80003es2lan(hw);
 1457         if (ret_val)
 1458                 goto out;
 1459 
 1460         kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) &
 1461                        E1000_KMRNCTRLSTA_OFFSET) | data;
 1462         E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA, kmrnctrlsta);
 1463 
 1464         usec_delay(2);
 1465 
 1466         e1000_release_mac_csr_80003es2lan(hw);
 1467 
 1468 out:
 1469         return ret_val;
 1470 }
 1471 
 1472 /**
 1473  *  e1000_read_mac_addr_80003es2lan - Read device MAC address
 1474  *  @hw: pointer to the HW structure
 1475  **/
 1476 static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw)
 1477 {
 1478         s32 ret_val = E1000_SUCCESS;
 1479 
 1480         DEBUGFUNC("e1000_read_mac_addr_80003es2lan");
 1481 
 1482         /*
 1483          * If there's an alternate MAC address place it in RAR0
 1484          * so that it will override the Si installed default perm
 1485          * address.
 1486          */
 1487         ret_val = e1000_check_alt_mac_addr_generic(hw);
 1488         if (ret_val)
 1489                 goto out;
 1490 
 1491         ret_val = e1000_read_mac_addr_generic(hw);
 1492 
 1493 out:
 1494         return ret_val;
 1495 }
 1496 
 1497 /**
 1498  * e1000_power_down_phy_copper_80003es2lan - Remove link during PHY power down
 1499  * @hw: pointer to the HW structure
 1500  *
 1501  * In the case of a PHY power down to save power, or to turn off link during a
 1502  * driver unload, or wake on lan is not enabled, remove the link.
 1503  **/
 1504 static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw)
 1505 {
 1506         /* If the management interface is not enabled, then power down */
 1507         if (!(hw->mac.ops.check_mng_mode(hw) ||
 1508               hw->phy.ops.check_reset_block(hw)))
 1509                 e1000_power_down_phy_copper(hw);
 1510 
 1511         return;
 1512 }
 1513 
 1514 /**
 1515  *  e1000_clear_hw_cntrs_80003es2lan - Clear device specific hardware counters
 1516  *  @hw: pointer to the HW structure
 1517  *
 1518  *  Clears the hardware counters by reading the counter registers.
 1519  **/
 1520 static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw)
 1521 {
 1522         DEBUGFUNC("e1000_clear_hw_cntrs_80003es2lan");
 1523 
 1524         e1000_clear_hw_cntrs_base_generic(hw);
 1525 
 1526         E1000_READ_REG(hw, E1000_PRC64);
 1527         E1000_READ_REG(hw, E1000_PRC127);
 1528         E1000_READ_REG(hw, E1000_PRC255);
 1529         E1000_READ_REG(hw, E1000_PRC511);
 1530         E1000_READ_REG(hw, E1000_PRC1023);
 1531         E1000_READ_REG(hw, E1000_PRC1522);
 1532         E1000_READ_REG(hw, E1000_PTC64);
 1533         E1000_READ_REG(hw, E1000_PTC127);
 1534         E1000_READ_REG(hw, E1000_PTC255);
 1535         E1000_READ_REG(hw, E1000_PTC511);
 1536         E1000_READ_REG(hw, E1000_PTC1023);
 1537         E1000_READ_REG(hw, E1000_PTC1522);
 1538 
 1539         E1000_READ_REG(hw, E1000_ALGNERRC);
 1540         E1000_READ_REG(hw, E1000_RXERRC);
 1541         E1000_READ_REG(hw, E1000_TNCRS);
 1542         E1000_READ_REG(hw, E1000_CEXTERR);
 1543         E1000_READ_REG(hw, E1000_TSCTC);
 1544         E1000_READ_REG(hw, E1000_TSCTFC);
 1545 
 1546         E1000_READ_REG(hw, E1000_MGTPRC);
 1547         E1000_READ_REG(hw, E1000_MGTPDC);
 1548         E1000_READ_REG(hw, E1000_MGTPTC);
 1549 
 1550         E1000_READ_REG(hw, E1000_IAC);
 1551         E1000_READ_REG(hw, E1000_ICRXOC);
 1552 
 1553         E1000_READ_REG(hw, E1000_ICRXPTC);
 1554         E1000_READ_REG(hw, E1000_ICRXATC);
 1555         E1000_READ_REG(hw, E1000_ICTXPTC);
 1556         E1000_READ_REG(hw, E1000_ICTXATC);
 1557         E1000_READ_REG(hw, E1000_ICTXQEC);
 1558         E1000_READ_REG(hw, E1000_ICTXQMTC);
 1559         E1000_READ_REG(hw, E1000_ICRXDMTC);
 1560 }

Cache object: eb7efbb8986c943a833ca3c836bbf595


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.