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/igc/igc_mac.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  * Copyright 2021 Intel Corp
    3  * Copyright 2021 Rubicon Communications, LLC (Netgate)
    4  * SPDX-License-Identifier: BSD-3-Clause
    5  */
    6 
    7 #include <sys/cdefs.h>
    8 __FBSDID("$FreeBSD$");
    9 
   10 #include "igc_api.h"
   11 
   12 static void igc_config_collision_dist_generic(struct igc_hw *hw);
   13 
   14 /**
   15  *  igc_init_mac_ops_generic - Initialize MAC function pointers
   16  *  @hw: pointer to the HW structure
   17  *
   18  *  Setups up the function pointers to no-op functions
   19  **/
   20 void igc_init_mac_ops_generic(struct igc_hw *hw)
   21 {
   22         struct igc_mac_info *mac = &hw->mac;
   23         DEBUGFUNC("igc_init_mac_ops_generic");
   24 
   25         /* General Setup */
   26         mac->ops.init_params = igc_null_ops_generic;
   27         mac->ops.config_collision_dist = igc_config_collision_dist_generic;
   28         mac->ops.rar_set = igc_rar_set_generic;
   29 }
   30 
   31 /**
   32  *  igc_null_ops_generic - No-op function, returns 0
   33  *  @hw: pointer to the HW structure
   34  **/
   35 s32 igc_null_ops_generic(struct igc_hw IGC_UNUSEDARG *hw)
   36 {
   37         DEBUGFUNC("igc_null_ops_generic");
   38         return IGC_SUCCESS;
   39 }
   40 
   41 /**
   42  *  igc_null_mac_generic - No-op function, return void
   43  *  @hw: pointer to the HW structure
   44  **/
   45 void igc_null_mac_generic(struct igc_hw IGC_UNUSEDARG *hw)
   46 {
   47         DEBUGFUNC("igc_null_mac_generic");
   48         return;
   49 }
   50 
   51 /**
   52  *  igc_null_link_info - No-op function, return 0
   53  *  @hw: pointer to the HW structure
   54  *  @s: dummy variable
   55  *  @d: dummy variable
   56  **/
   57 s32 igc_null_link_info(struct igc_hw IGC_UNUSEDARG *hw,
   58                          u16 IGC_UNUSEDARG *s, u16 IGC_UNUSEDARG *d)
   59 {
   60         DEBUGFUNC("igc_null_link_info");
   61         return IGC_SUCCESS;
   62 }
   63 
   64 /**
   65  *  igc_null_mng_mode - No-op function, return false
   66  *  @hw: pointer to the HW structure
   67  **/
   68 bool igc_null_mng_mode(struct igc_hw IGC_UNUSEDARG *hw)
   69 {
   70         DEBUGFUNC("igc_null_mng_mode");
   71         return false;
   72 }
   73 
   74 /**
   75  *  igc_null_update_mc - No-op function, return void
   76  *  @hw: pointer to the HW structure
   77  *  @h: dummy variable
   78  *  @a: dummy variable
   79  **/
   80 void igc_null_update_mc(struct igc_hw IGC_UNUSEDARG *hw,
   81                           u8 IGC_UNUSEDARG *h, u32 IGC_UNUSEDARG a)
   82 {
   83         DEBUGFUNC("igc_null_update_mc");
   84         return;
   85 }
   86 
   87 /**
   88  *  igc_null_write_vfta - No-op function, return void
   89  *  @hw: pointer to the HW structure
   90  *  @a: dummy variable
   91  *  @b: dummy variable
   92  **/
   93 void igc_null_write_vfta(struct igc_hw IGC_UNUSEDARG *hw,
   94                            u32 IGC_UNUSEDARG a, u32 IGC_UNUSEDARG b)
   95 {
   96         DEBUGFUNC("igc_null_write_vfta");
   97         return;
   98 }
   99 
  100 /**
  101  *  igc_null_rar_set - No-op function, return 0
  102  *  @hw: pointer to the HW structure
  103  *  @h: dummy variable
  104  *  @a: dummy variable
  105  **/
  106 int igc_null_rar_set(struct igc_hw IGC_UNUSEDARG *hw,
  107                         u8 IGC_UNUSEDARG *h, u32 IGC_UNUSEDARG a)
  108 {
  109         DEBUGFUNC("igc_null_rar_set");
  110         return IGC_SUCCESS;
  111 }
  112 
  113 /**
  114  *  igc_set_lan_id_single_port - Set LAN id for a single port device
  115  *  @hw: pointer to the HW structure
  116  *
  117  *  Sets the LAN function id to zero for a single port device.
  118  **/
  119 void igc_set_lan_id_single_port(struct igc_hw *hw)
  120 {
  121         struct igc_bus_info *bus = &hw->bus;
  122 
  123         bus->func = 0;
  124 }
  125 
  126 /**
  127  *  igc_clear_vfta_generic - Clear VLAN filter table
  128  *  @hw: pointer to the HW structure
  129  *
  130  *  Clears the register array which contains the VLAN filter table by
  131  *  setting all the values to 0.
  132  **/
  133 void igc_clear_vfta_generic(struct igc_hw *hw)
  134 {
  135         u32 offset;
  136 
  137         DEBUGFUNC("igc_clear_vfta_generic");
  138 
  139         for (offset = 0; offset < IGC_VLAN_FILTER_TBL_SIZE; offset++) {
  140                 IGC_WRITE_REG_ARRAY(hw, IGC_VFTA, offset, 0);
  141                 IGC_WRITE_FLUSH(hw);
  142         }
  143 }
  144 
  145 /**
  146  *  igc_write_vfta_generic - Write value to VLAN filter table
  147  *  @hw: pointer to the HW structure
  148  *  @offset: register offset in VLAN filter table
  149  *  @value: register value written to VLAN filter table
  150  *
  151  *  Writes value at the given offset in the register array which stores
  152  *  the VLAN filter table.
  153  **/
  154 void igc_write_vfta_generic(struct igc_hw *hw, u32 offset, u32 value)
  155 {
  156         DEBUGFUNC("igc_write_vfta_generic");
  157 
  158         IGC_WRITE_REG_ARRAY(hw, IGC_VFTA, offset, value);
  159         IGC_WRITE_FLUSH(hw);
  160 }
  161 
  162 /**
  163  *  igc_init_rx_addrs_generic - Initialize receive address's
  164  *  @hw: pointer to the HW structure
  165  *  @rar_count: receive address registers
  166  *
  167  *  Setup the receive address registers by setting the base receive address
  168  *  register to the devices MAC address and clearing all the other receive
  169  *  address registers to 0.
  170  **/
  171 void igc_init_rx_addrs_generic(struct igc_hw *hw, u16 rar_count)
  172 {
  173         u32 i;
  174         u8 mac_addr[ETH_ADDR_LEN] = {0};
  175 
  176         DEBUGFUNC("igc_init_rx_addrs_generic");
  177 
  178         /* Setup the receive address */
  179         DEBUGOUT("Programming MAC Address into RAR[0]\n");
  180 
  181         hw->mac.ops.rar_set(hw, hw->mac.addr, 0);
  182 
  183         /* Zero out the other (rar_entry_count - 1) receive addresses */
  184         DEBUGOUT1("Clearing RAR[1-%u]\n", rar_count-1);
  185         for (i = 1; i < rar_count; i++)
  186                 hw->mac.ops.rar_set(hw, mac_addr, i);
  187 }
  188 
  189 /**
  190  *  igc_check_alt_mac_addr_generic - Check for alternate MAC addr
  191  *  @hw: pointer to the HW structure
  192  *
  193  *  Checks the nvm for an alternate MAC address.  An alternate MAC address
  194  *  can be setup by pre-boot software and must be treated like a permanent
  195  *  address and must override the actual permanent MAC address. If an
  196  *  alternate MAC address is found it is programmed into RAR0, replacing
  197  *  the permanent address that was installed into RAR0 by the Si on reset.
  198  *  This function will return SUCCESS unless it encounters an error while
  199  *  reading the EEPROM.
  200  **/
  201 s32 igc_check_alt_mac_addr_generic(struct igc_hw *hw)
  202 {
  203         u32 i;
  204         s32 ret_val;
  205         u16 offset, nvm_alt_mac_addr_offset, nvm_data;
  206         u8 alt_mac_addr[ETH_ADDR_LEN];
  207 
  208         DEBUGFUNC("igc_check_alt_mac_addr_generic");
  209 
  210         ret_val = hw->nvm.ops.read(hw, NVM_COMPAT, 1, &nvm_data);
  211         if (ret_val)
  212                 return ret_val;
  213 
  214 
  215         ret_val = hw->nvm.ops.read(hw, NVM_ALT_MAC_ADDR_PTR, 1,
  216                                    &nvm_alt_mac_addr_offset);
  217         if (ret_val) {
  218                 DEBUGOUT("NVM Read Error\n");
  219                 return ret_val;
  220         }
  221 
  222         if ((nvm_alt_mac_addr_offset == 0xFFFF) ||
  223             (nvm_alt_mac_addr_offset == 0x0000))
  224                 /* There is no Alternate MAC Address */
  225                 return IGC_SUCCESS;
  226 
  227         if (hw->bus.func == IGC_FUNC_1)
  228                 nvm_alt_mac_addr_offset += IGC_ALT_MAC_ADDRESS_OFFSET_LAN1;
  229         for (i = 0; i < ETH_ADDR_LEN; i += 2) {
  230                 offset = nvm_alt_mac_addr_offset + (i >> 1);
  231                 ret_val = hw->nvm.ops.read(hw, offset, 1, &nvm_data);
  232                 if (ret_val) {
  233                         DEBUGOUT("NVM Read Error\n");
  234                         return ret_val;
  235                 }
  236 
  237                 alt_mac_addr[i] = (u8)(nvm_data & 0xFF);
  238                 alt_mac_addr[i + 1] = (u8)(nvm_data >> 8);
  239         }
  240 
  241         /* if multicast bit is set, the alternate address will not be used */
  242         if (alt_mac_addr[0] & 0x01) {
  243                 DEBUGOUT("Ignoring Alternate Mac Address with MC bit set\n");
  244                 return IGC_SUCCESS;
  245         }
  246 
  247         /* We have a valid alternate MAC address, and we want to treat it the
  248          * same as the normal permanent MAC address stored by the HW into the
  249          * RAR. Do this by mapping this address into RAR0.
  250          */
  251         hw->mac.ops.rar_set(hw, alt_mac_addr, 0);
  252 
  253         return IGC_SUCCESS;
  254 }
  255 
  256 /**
  257  *  igc_rar_set_generic - Set receive address register
  258  *  @hw: pointer to the HW structure
  259  *  @addr: pointer to the receive address
  260  *  @index: receive address array register
  261  *
  262  *  Sets the receive address array register at index to the address passed
  263  *  in by addr.
  264  **/
  265 int igc_rar_set_generic(struct igc_hw *hw, u8 *addr, u32 index)
  266 {
  267         u32 rar_low, rar_high;
  268 
  269         DEBUGFUNC("igc_rar_set_generic");
  270 
  271         /* HW expects these in little endian so we reverse the byte order
  272          * from network order (big endian) to little endian
  273          */
  274         rar_low = ((u32) addr[0] | ((u32) addr[1] << 8) |
  275                    ((u32) addr[2] << 16) | ((u32) addr[3] << 24));
  276 
  277         rar_high = ((u32) addr[4] | ((u32) addr[5] << 8));
  278 
  279         /* If MAC address zero, no need to set the AV bit */
  280         if (rar_low || rar_high)
  281                 rar_high |= IGC_RAH_AV;
  282 
  283         /* Some bridges will combine consecutive 32-bit writes into
  284          * a single burst write, which will malfunction on some parts.
  285          * The flushes avoid this.
  286          */
  287         IGC_WRITE_REG(hw, IGC_RAL(index), rar_low);
  288         IGC_WRITE_FLUSH(hw);
  289         IGC_WRITE_REG(hw, IGC_RAH(index), rar_high);
  290         IGC_WRITE_FLUSH(hw);
  291 
  292         return IGC_SUCCESS;
  293 }
  294 
  295 /**
  296  *  igc_hash_mc_addr_generic - Generate a multicast hash value
  297  *  @hw: pointer to the HW structure
  298  *  @mc_addr: pointer to a multicast address
  299  *
  300  *  Generates a multicast address hash value which is used to determine
  301  *  the multicast filter table array address and new table value.
  302  **/
  303 u32 igc_hash_mc_addr_generic(struct igc_hw *hw, u8 *mc_addr)
  304 {
  305         u32 hash_value, hash_mask;
  306         u8 bit_shift = 0;
  307 
  308         DEBUGFUNC("igc_hash_mc_addr_generic");
  309 
  310         /* Register count multiplied by bits per register */
  311         hash_mask = (hw->mac.mta_reg_count * 32) - 1;
  312 
  313         /* For a mc_filter_type of 0, bit_shift is the number of left-shifts
  314          * where 0xFF would still fall within the hash mask.
  315          */
  316         while (hash_mask >> bit_shift != 0xFF)
  317                 bit_shift++;
  318 
  319         /* The portion of the address that is used for the hash table
  320          * is determined by the mc_filter_type setting.
  321          * The algorithm is such that there is a total of 8 bits of shifting.
  322          * The bit_shift for a mc_filter_type of 0 represents the number of
  323          * left-shifts where the MSB of mc_addr[5] would still fall within
  324          * the hash_mask.  Case 0 does this exactly.  Since there are a total
  325          * of 8 bits of shifting, then mc_addr[4] will shift right the
  326          * remaining number of bits. Thus 8 - bit_shift.  The rest of the
  327          * cases are a variation of this algorithm...essentially raising the
  328          * number of bits to shift mc_addr[5] left, while still keeping the
  329          * 8-bit shifting total.
  330          *
  331          * For example, given the following Destination MAC Address and an
  332          * mta register count of 128 (thus a 4096-bit vector and 0xFFF mask),
  333          * we can see that the bit_shift for case 0 is 4.  These are the hash
  334          * values resulting from each mc_filter_type...
  335          * [0] [1] [2] [3] [4] [5]
  336          * 01  AA  00  12  34  56
  337          * LSB           MSB
  338          *
  339          * case 0: hash_value = ((0x34 >> 4) | (0x56 << 4)) & 0xFFF = 0x563
  340          * case 1: hash_value = ((0x34 >> 3) | (0x56 << 5)) & 0xFFF = 0xAC6
  341          * case 2: hash_value = ((0x34 >> 2) | (0x56 << 6)) & 0xFFF = 0x163
  342          * case 3: hash_value = ((0x34 >> 0) | (0x56 << 8)) & 0xFFF = 0x634
  343          */
  344         switch (hw->mac.mc_filter_type) {
  345         default:
  346         case 0:
  347                 break;
  348         case 1:
  349                 bit_shift += 1;
  350                 break;
  351         case 2:
  352                 bit_shift += 2;
  353                 break;
  354         case 3:
  355                 bit_shift += 4;
  356                 break;
  357         }
  358 
  359         hash_value = hash_mask & (((mc_addr[4] >> (8 - bit_shift)) |
  360                                   (((u16) mc_addr[5]) << bit_shift)));
  361 
  362         return hash_value;
  363 }
  364 
  365 /**
  366  *  igc_update_mc_addr_list_generic - Update Multicast addresses
  367  *  @hw: pointer to the HW structure
  368  *  @mc_addr_list: array of multicast addresses to program
  369  *  @mc_addr_count: number of multicast addresses to program
  370  *
  371  *  Updates entire Multicast Table Array.
  372  *  The caller must have a packed mc_addr_list of multicast addresses.
  373  **/
  374 void igc_update_mc_addr_list_generic(struct igc_hw *hw,
  375                                        u8 *mc_addr_list, u32 mc_addr_count)
  376 {
  377         u32 hash_value, hash_bit, hash_reg;
  378         int i;
  379 
  380         DEBUGFUNC("igc_update_mc_addr_list_generic");
  381 
  382         /* clear mta_shadow */
  383         memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
  384 
  385         /* update mta_shadow from mc_addr_list */
  386         for (i = 0; (u32) i < mc_addr_count; i++) {
  387                 hash_value = igc_hash_mc_addr_generic(hw, mc_addr_list);
  388 
  389                 hash_reg = (hash_value >> 5) & (hw->mac.mta_reg_count - 1);
  390                 hash_bit = hash_value & 0x1F;
  391 
  392                 hw->mac.mta_shadow[hash_reg] |= (1 << hash_bit);
  393                 mc_addr_list += (ETH_ADDR_LEN);
  394         }
  395 
  396         /* replace the entire MTA table */
  397         for (i = hw->mac.mta_reg_count - 1; i >= 0; i--)
  398                 IGC_WRITE_REG_ARRAY(hw, IGC_MTA, i, hw->mac.mta_shadow[i]);
  399         IGC_WRITE_FLUSH(hw);
  400 }
  401 
  402 /**
  403  *  igc_clear_hw_cntrs_base_generic - Clear base hardware counters
  404  *  @hw: pointer to the HW structure
  405  *
  406  *  Clears the base hardware counters by reading the counter registers.
  407  **/
  408 void igc_clear_hw_cntrs_base_generic(struct igc_hw *hw)
  409 {
  410         DEBUGFUNC("igc_clear_hw_cntrs_base_generic");
  411 
  412         IGC_READ_REG(hw, IGC_CRCERRS);
  413         IGC_READ_REG(hw, IGC_MPC);
  414         IGC_READ_REG(hw, IGC_SCC);
  415         IGC_READ_REG(hw, IGC_ECOL);
  416         IGC_READ_REG(hw, IGC_MCC);
  417         IGC_READ_REG(hw, IGC_LATECOL);
  418         IGC_READ_REG(hw, IGC_COLC);
  419         IGC_READ_REG(hw, IGC_RERC);
  420         IGC_READ_REG(hw, IGC_DC);
  421         IGC_READ_REG(hw, IGC_RLEC);
  422         IGC_READ_REG(hw, IGC_XONRXC);
  423         IGC_READ_REG(hw, IGC_XONTXC);
  424         IGC_READ_REG(hw, IGC_XOFFRXC);
  425         IGC_READ_REG(hw, IGC_XOFFTXC);
  426         IGC_READ_REG(hw, IGC_FCRUC);
  427         IGC_READ_REG(hw, IGC_GPRC);
  428         IGC_READ_REG(hw, IGC_BPRC);
  429         IGC_READ_REG(hw, IGC_MPRC);
  430         IGC_READ_REG(hw, IGC_GPTC);
  431         IGC_READ_REG(hw, IGC_GORCL);
  432         IGC_READ_REG(hw, IGC_GORCH);
  433         IGC_READ_REG(hw, IGC_GOTCL);
  434         IGC_READ_REG(hw, IGC_GOTCH);
  435         IGC_READ_REG(hw, IGC_RNBC);
  436         IGC_READ_REG(hw, IGC_RUC);
  437         IGC_READ_REG(hw, IGC_RFC);
  438         IGC_READ_REG(hw, IGC_ROC);
  439         IGC_READ_REG(hw, IGC_RJC);
  440         IGC_READ_REG(hw, IGC_TORL);
  441         IGC_READ_REG(hw, IGC_TORH);
  442         IGC_READ_REG(hw, IGC_TOTL);
  443         IGC_READ_REG(hw, IGC_TOTH);
  444         IGC_READ_REG(hw, IGC_TPR);
  445         IGC_READ_REG(hw, IGC_TPT);
  446         IGC_READ_REG(hw, IGC_MPTC);
  447         IGC_READ_REG(hw, IGC_BPTC);
  448         IGC_READ_REG(hw, IGC_TLPIC);
  449         IGC_READ_REG(hw, IGC_RLPIC);
  450         IGC_READ_REG(hw, IGC_RXDMTC);
  451 }
  452 
  453 /**
  454  *  igc_check_for_copper_link_generic - Check for link (Copper)
  455  *  @hw: pointer to the HW structure
  456  *
  457  *  Checks to see of the link status of the hardware has changed.  If a
  458  *  change in link status has been detected, then we read the PHY registers
  459  *  to get the current speed/duplex if link exists.
  460  **/
  461 s32 igc_check_for_copper_link_generic(struct igc_hw *hw)
  462 {
  463         struct igc_mac_info *mac = &hw->mac;
  464         s32 ret_val;
  465         bool link = false;
  466 
  467         DEBUGFUNC("igc_check_for_copper_link");
  468 
  469         /* We only want to go out to the PHY registers to see if Auto-Neg
  470          * has completed and/or if our link status has changed.  The
  471          * get_link_status flag is set upon receiving a Link Status
  472          * Change or Rx Sequence Error interrupt.
  473          */
  474         if (!mac->get_link_status)
  475                 return IGC_SUCCESS;
  476 
  477         /* First we want to see if the MII Status Register reports
  478          * link.  If so, then we want to get the current speed/duplex
  479          * of the PHY.
  480          */
  481         ret_val = igc_phy_has_link_generic(hw, 1, 0, &link);
  482         if (ret_val)
  483                 return ret_val;
  484 
  485         if (!link)
  486                 return IGC_SUCCESS; /* No link detected */
  487 
  488         mac->get_link_status = false;
  489 
  490         /* Check if there was DownShift, must be checked
  491          * immediately after link-up
  492          */
  493         igc_check_downshift_generic(hw);
  494 
  495         /* If we are forcing speed/duplex, then we simply return since
  496          * we have already determined whether we have link or not.
  497          */
  498         if (!mac->autoneg)
  499                 return -IGC_ERR_CONFIG;
  500 
  501         /* Auto-Neg is enabled.  Auto Speed Detection takes care
  502          * of MAC speed/duplex configuration.  So we only need to
  503          * configure Collision Distance in the MAC.
  504          */
  505         mac->ops.config_collision_dist(hw);
  506 
  507         /* Configure Flow Control now that Auto-Neg has completed.
  508          * First, we need to restore the desired flow control
  509          * settings because we may have had to re-autoneg with a
  510          * different link partner.
  511          */
  512         ret_val = igc_config_fc_after_link_up_generic(hw);
  513         if (ret_val)
  514                 DEBUGOUT("Error configuring flow control\n");
  515 
  516         return ret_val;
  517 }
  518 
  519 /**
  520  *  igc_setup_link_generic - Setup flow control and link settings
  521  *  @hw: pointer to the HW structure
  522  *
  523  *  Determines which flow control settings to use, then configures flow
  524  *  control.  Calls the appropriate media-specific link configuration
  525  *  function.  Assuming the adapter has a valid link partner, a valid link
  526  *  should be established.  Assumes the hardware has previously been reset
  527  *  and the transmitter and receiver are not enabled.
  528  **/
  529 s32 igc_setup_link_generic(struct igc_hw *hw)
  530 {
  531         s32 ret_val;
  532 
  533         DEBUGFUNC("igc_setup_link_generic");
  534 
  535         /* In the case of the phy reset being blocked, we already have a link.
  536          * We do not need to set it up again.
  537          */
  538         if (hw->phy.ops.check_reset_block && hw->phy.ops.check_reset_block(hw))
  539                 return IGC_SUCCESS;
  540 
  541         /* If requested flow control is set to default, set flow control
  542          * for both 'rx' and 'tx' pause frames.
  543          */
  544         if (hw->fc.requested_mode == igc_fc_default) {
  545                 hw->fc.requested_mode = igc_fc_full;
  546         }
  547 
  548         /* Save off the requested flow control mode for use later.  Depending
  549          * on the link partner's capabilities, we may or may not use this mode.
  550          */
  551         hw->fc.current_mode = hw->fc.requested_mode;
  552 
  553         DEBUGOUT1("After fix-ups FlowControl is now = %x\n",
  554                 hw->fc.current_mode);
  555 
  556         /* Call the necessary media_type subroutine to configure the link. */
  557         ret_val = hw->mac.ops.setup_physical_interface(hw);
  558         if (ret_val)
  559                 return ret_val;
  560 
  561         /* Initialize the flow control address, type, and PAUSE timer
  562          * registers to their default values.  This is done even if flow
  563          * control is disabled, because it does not hurt anything to
  564          * initialize these registers.
  565          */
  566         DEBUGOUT("Initializing the Flow Control address, type and timer regs\n");
  567         IGC_WRITE_REG(hw, IGC_FCT, FLOW_CONTROL_TYPE);
  568         IGC_WRITE_REG(hw, IGC_FCAH, FLOW_CONTROL_ADDRESS_HIGH);
  569         IGC_WRITE_REG(hw, IGC_FCAL, FLOW_CONTROL_ADDRESS_LOW);
  570 
  571         IGC_WRITE_REG(hw, IGC_FCTTV, hw->fc.pause_time);
  572 
  573         return igc_set_fc_watermarks_generic(hw);
  574 }
  575 
  576 /**
  577  *  igc_config_collision_dist_generic - Configure collision distance
  578  *  @hw: pointer to the HW structure
  579  *
  580  *  Configures the collision distance to the default value and is used
  581  *  during link setup.
  582  **/
  583 static void igc_config_collision_dist_generic(struct igc_hw *hw)
  584 {
  585         u32 tctl;
  586 
  587         DEBUGFUNC("igc_config_collision_dist_generic");
  588 
  589         tctl = IGC_READ_REG(hw, IGC_TCTL);
  590 
  591         tctl &= ~IGC_TCTL_COLD;
  592         tctl |= IGC_COLLISION_DISTANCE << IGC_COLD_SHIFT;
  593 
  594         IGC_WRITE_REG(hw, IGC_TCTL, tctl);
  595         IGC_WRITE_FLUSH(hw);
  596 }
  597 
  598 /**
  599  *  igc_set_fc_watermarks_generic - Set flow control high/low watermarks
  600  *  @hw: pointer to the HW structure
  601  *
  602  *  Sets the flow control high/low threshold (watermark) registers.  If
  603  *  flow control XON frame transmission is enabled, then set XON frame
  604  *  transmission as well.
  605  **/
  606 s32 igc_set_fc_watermarks_generic(struct igc_hw *hw)
  607 {
  608         u32 fcrtl = 0, fcrth = 0;
  609 
  610         DEBUGFUNC("igc_set_fc_watermarks_generic");
  611 
  612         /* Set the flow control receive threshold registers.  Normally,
  613          * these registers will be set to a default threshold that may be
  614          * adjusted later by the driver's runtime code.  However, if the
  615          * ability to transmit pause frames is not enabled, then these
  616          * registers will be set to 0.
  617          */
  618         if (hw->fc.current_mode & igc_fc_tx_pause) {
  619                 /* We need to set up the Receive Threshold high and low water
  620                  * marks as well as (optionally) enabling the transmission of
  621                  * XON frames.
  622                  */
  623                 fcrtl = hw->fc.low_water;
  624                 if (hw->fc.send_xon)
  625                         fcrtl |= IGC_FCRTL_XONE;
  626 
  627                 fcrth = hw->fc.high_water;
  628         }
  629         IGC_WRITE_REG(hw, IGC_FCRTL, fcrtl);
  630         IGC_WRITE_REG(hw, IGC_FCRTH, fcrth);
  631 
  632         return IGC_SUCCESS;
  633 }
  634 
  635 /**
  636  *  igc_force_mac_fc_generic - Force the MAC's flow control settings
  637  *  @hw: pointer to the HW structure
  638  *
  639  *  Force the MAC's flow control settings.  Sets the TFCE and RFCE bits in the
  640  *  device control register to reflect the adapter settings.  TFCE and RFCE
  641  *  need to be explicitly set by software when a copper PHY is used because
  642  *  autonegotiation is managed by the PHY rather than the MAC.  Software must
  643  *  also configure these bits when link is forced on a fiber connection.
  644  **/
  645 s32 igc_force_mac_fc_generic(struct igc_hw *hw)
  646 {
  647         u32 ctrl;
  648 
  649         DEBUGFUNC("igc_force_mac_fc_generic");
  650 
  651         ctrl = IGC_READ_REG(hw, IGC_CTRL);
  652 
  653         /* Because we didn't get link via the internal auto-negotiation
  654          * mechanism (we either forced link or we got link via PHY
  655          * auto-neg), we have to manually enable/disable transmit an
  656          * receive flow control.
  657          *
  658          * The "Case" statement below enables/disable flow control
  659          * according to the "hw->fc.current_mode" parameter.
  660          *
  661          * The possible values of the "fc" parameter are:
  662          *      0:  Flow control is completely disabled
  663          *      1:  Rx flow control is enabled (we can receive pause
  664          *          frames but not send pause frames).
  665          *      2:  Tx flow control is enabled (we can send pause frames
  666          *          frames but we do not receive pause frames).
  667          *      3:  Both Rx and Tx flow control (symmetric) is enabled.
  668          *  other:  No other values should be possible at this point.
  669          */
  670         DEBUGOUT1("hw->fc.current_mode = %u\n", hw->fc.current_mode);
  671 
  672         switch (hw->fc.current_mode) {
  673         case igc_fc_none:
  674                 ctrl &= (~(IGC_CTRL_TFCE | IGC_CTRL_RFCE));
  675                 break;
  676         case igc_fc_rx_pause:
  677                 ctrl &= (~IGC_CTRL_TFCE);
  678                 ctrl |= IGC_CTRL_RFCE;
  679                 break;
  680         case igc_fc_tx_pause:
  681                 ctrl &= (~IGC_CTRL_RFCE);
  682                 ctrl |= IGC_CTRL_TFCE;
  683                 break;
  684         case igc_fc_full:
  685                 ctrl |= (IGC_CTRL_TFCE | IGC_CTRL_RFCE);
  686                 break;
  687         default:
  688                 DEBUGOUT("Flow control param set incorrectly\n");
  689                 return -IGC_ERR_CONFIG;
  690         }
  691 
  692         IGC_WRITE_REG(hw, IGC_CTRL, ctrl);
  693 
  694         return IGC_SUCCESS;
  695 }
  696 
  697 /**
  698  *  igc_config_fc_after_link_up_generic - Configures flow control after link
  699  *  @hw: pointer to the HW structure
  700  *
  701  *  Checks the status of auto-negotiation after link up to ensure that the
  702  *  speed and duplex were not forced.  If the link needed to be forced, then
  703  *  flow control needs to be forced also.  If auto-negotiation is enabled
  704  *  and did not fail, then we configure flow control based on our link
  705  *  partner.
  706  **/
  707 s32 igc_config_fc_after_link_up_generic(struct igc_hw *hw)
  708 {
  709         struct igc_mac_info *mac = &hw->mac;
  710         s32 ret_val = IGC_SUCCESS;
  711         u16 mii_status_reg, mii_nway_adv_reg, mii_nway_lp_ability_reg;
  712         u16 speed, duplex;
  713 
  714         DEBUGFUNC("igc_config_fc_after_link_up_generic");
  715 
  716         if (ret_val) {
  717                 DEBUGOUT("Error forcing flow control settings\n");
  718                 return ret_val;
  719         }
  720 
  721         /* Check for the case where we have copper media and auto-neg is
  722          * enabled.  In this case, we need to check and see if Auto-Neg
  723          * has completed, and if so, how the PHY and link partner has
  724          * flow control configured.
  725          */
  726         if (mac->autoneg) {
  727                 /* Read the MII Status Register and check to see if AutoNeg
  728                  * has completed.  We read this twice because this reg has
  729                  * some "sticky" (latched) bits.
  730                  */
  731                 ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
  732                 if (ret_val)
  733                         return ret_val;
  734                 ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &mii_status_reg);
  735                 if (ret_val)
  736                         return ret_val;
  737 
  738                 if (!(mii_status_reg & MII_SR_AUTONEG_COMPLETE)) {
  739                         DEBUGOUT("Copper PHY and Auto Neg has not completed.\n");
  740                         return ret_val;
  741                 }
  742 
  743                 /* The AutoNeg process has completed, so we now need to
  744                  * read both the Auto Negotiation Advertisement
  745                  * Register (Address 4) and the Auto_Negotiation Base
  746                  * Page Ability Register (Address 5) to determine how
  747                  * flow control was negotiated.
  748                  */
  749                 ret_val = hw->phy.ops.read_reg(hw, PHY_AUTONEG_ADV,
  750                                                &mii_nway_adv_reg);
  751                 if (ret_val)
  752                         return ret_val;
  753                 ret_val = hw->phy.ops.read_reg(hw, PHY_LP_ABILITY,
  754                                                &mii_nway_lp_ability_reg);
  755                 if (ret_val)
  756                         return ret_val;
  757 
  758                 /* Two bits in the Auto Negotiation Advertisement Register
  759                  * (Address 4) and two bits in the Auto Negotiation Base
  760                  * Page Ability Register (Address 5) determine flow control
  761                  * for both the PHY and the link partner.  The following
  762                  * table, taken out of the IEEE 802.3ab/D6.0 dated March 25,
  763                  * 1999, describes these PAUSE resolution bits and how flow
  764                  * control is determined based upon these settings.
  765                  * NOTE:  DC = Don't Care
  766                  *
  767                  *   LOCAL DEVICE  |   LINK PARTNER
  768                  * PAUSE | ASM_DIR | PAUSE | ASM_DIR | NIC Resolution
  769                  *-------|---------|-------|---------|--------------------
  770                  *   0   |    0    |  DC   |   DC    | igc_fc_none
  771                  *   0   |    1    |   0   |   DC    | igc_fc_none
  772                  *   0   |    1    |   1   |    0    | igc_fc_none
  773                  *   0   |    1    |   1   |    1    | igc_fc_tx_pause
  774                  *   1   |    0    |   0   |   DC    | igc_fc_none
  775                  *   1   |   DC    |   1   |   DC    | igc_fc_full
  776                  *   1   |    1    |   0   |    0    | igc_fc_none
  777                  *   1   |    1    |   0   |    1    | igc_fc_rx_pause
  778                  *
  779                  * Are both PAUSE bits set to 1?  If so, this implies
  780                  * Symmetric Flow Control is enabled at both ends.  The
  781                  * ASM_DIR bits are irrelevant per the spec.
  782                  *
  783                  * For Symmetric Flow Control:
  784                  *
  785                  *   LOCAL DEVICE  |   LINK PARTNER
  786                  * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
  787                  *-------|---------|-------|---------|--------------------
  788                  *   1   |   DC    |   1   |   DC    | IGC_fc_full
  789                  *
  790                  */
  791                 if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
  792                     (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE)) {
  793                         /* Now we need to check if the user selected Rx ONLY
  794                          * of pause frames.  In this case, we had to advertise
  795                          * FULL flow control because we could not advertise Rx
  796                          * ONLY. Hence, we must now check to see if we need to
  797                          * turn OFF the TRANSMISSION of PAUSE frames.
  798                          */
  799                         if (hw->fc.requested_mode == igc_fc_full) {
  800                                 hw->fc.current_mode = igc_fc_full;
  801                                 DEBUGOUT("Flow Control = FULL.\n");
  802                         } else {
  803                                 hw->fc.current_mode = igc_fc_rx_pause;
  804                                 DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
  805                         }
  806                 }
  807                 /* For receiving PAUSE frames ONLY.
  808                  *
  809                  *   LOCAL DEVICE  |   LINK PARTNER
  810                  * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
  811                  *-------|---------|-------|---------|--------------------
  812                  *   0   |    1    |   1   |    1    | igc_fc_tx_pause
  813                  */
  814                 else if (!(mii_nway_adv_reg & NWAY_AR_PAUSE) &&
  815                           (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
  816                           (mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
  817                           (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
  818                         hw->fc.current_mode = igc_fc_tx_pause;
  819                         DEBUGOUT("Flow Control = Tx PAUSE frames only.\n");
  820                 }
  821                 /* For transmitting PAUSE frames ONLY.
  822                  *
  823                  *   LOCAL DEVICE  |   LINK PARTNER
  824                  * PAUSE | ASM_DIR | PAUSE | ASM_DIR | Result
  825                  *-------|---------|-------|---------|--------------------
  826                  *   1   |    1    |   0   |    1    | igc_fc_rx_pause
  827                  */
  828                 else if ((mii_nway_adv_reg & NWAY_AR_PAUSE) &&
  829                          (mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
  830                          !(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
  831                          (mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
  832                         hw->fc.current_mode = igc_fc_rx_pause;
  833                         DEBUGOUT("Flow Control = Rx PAUSE frames only.\n");
  834                 } else {
  835                         /* Per the IEEE spec, at this point flow control
  836                          * should be disabled.
  837                          */
  838                         hw->fc.current_mode = igc_fc_none;
  839                         DEBUGOUT("Flow Control = NONE.\n");
  840                 }
  841 
  842                 /* Now we need to do one last check...  If we auto-
  843                  * negotiated to HALF DUPLEX, flow control should not be
  844                  * enabled per IEEE 802.3 spec.
  845                  */
  846                 ret_val = mac->ops.get_link_up_info(hw, &speed, &duplex);
  847                 if (ret_val) {
  848                         DEBUGOUT("Error getting link speed and duplex\n");
  849                         return ret_val;
  850                 }
  851 
  852                 if (duplex == HALF_DUPLEX)
  853                         hw->fc.current_mode = igc_fc_none;
  854 
  855                 /* Now we call a subroutine to actually force the MAC
  856                  * controller to use the correct flow control settings.
  857                  */
  858                 ret_val = igc_force_mac_fc_generic(hw);
  859                 if (ret_val) {
  860                         DEBUGOUT("Error forcing flow control settings\n");
  861                         return ret_val;
  862                 }
  863         }
  864 
  865         return IGC_SUCCESS;
  866 }
  867 
  868 /**
  869  *  igc_get_speed_and_duplex_copper_generic - Retrieve current speed/duplex
  870  *  @hw: pointer to the HW structure
  871  *  @speed: stores the current speed
  872  *  @duplex: stores the current duplex
  873  *
  874  *  Read the status register for the current speed/duplex and store the current
  875  *  speed and duplex for copper connections.
  876  **/
  877 s32 igc_get_speed_and_duplex_copper_generic(struct igc_hw *hw, u16 *speed,
  878                                               u16 *duplex)
  879 {
  880         u32 status;
  881 
  882         DEBUGFUNC("igc_get_speed_and_duplex_copper_generic");
  883 
  884         status = IGC_READ_REG(hw, IGC_STATUS);
  885         if (status & IGC_STATUS_SPEED_1000) {
  886                 /* For I225, STATUS will indicate 1G speed in both 1 Gbps
  887                  * and 2.5 Gbps link modes. An additional bit is used
  888                  * to differentiate between 1 Gbps and 2.5 Gbps.
  889                  */
  890                 if ((hw->mac.type == igc_i225) &&
  891                     (status & IGC_STATUS_SPEED_2500)) {
  892                         *speed = SPEED_2500;
  893                         DEBUGOUT("2500 Mbs, ");
  894                 } else {
  895                         *speed = SPEED_1000;
  896                         DEBUGOUT("1000 Mbs, ");
  897                 }
  898         } else if (status & IGC_STATUS_SPEED_100) {
  899                 *speed = SPEED_100;
  900                 DEBUGOUT("100 Mbs, ");
  901         } else {
  902                 *speed = SPEED_10;
  903                 DEBUGOUT("10 Mbs, ");
  904         }
  905 
  906         if (status & IGC_STATUS_FD) {
  907                 *duplex = FULL_DUPLEX;
  908                 DEBUGOUT("Full Duplex\n");
  909         } else {
  910                 *duplex = HALF_DUPLEX;
  911                 DEBUGOUT("Half Duplex\n");
  912         }
  913 
  914         return IGC_SUCCESS;
  915 }
  916 
  917 /**
  918  *  igc_get_hw_semaphore_generic - Acquire hardware semaphore
  919  *  @hw: pointer to the HW structure
  920  *
  921  *  Acquire the HW semaphore to access the PHY or NVM
  922  **/
  923 s32 igc_get_hw_semaphore_generic(struct igc_hw *hw)
  924 {
  925         u32 swsm;
  926         s32 timeout = hw->nvm.word_size + 1;
  927         s32 i = 0;
  928 
  929         DEBUGFUNC("igc_get_hw_semaphore_generic");
  930 
  931         /* Get the SW semaphore */
  932         while (i < timeout) {
  933                 swsm = IGC_READ_REG(hw, IGC_SWSM);
  934                 if (!(swsm & IGC_SWSM_SMBI))
  935                         break;
  936 
  937                 usec_delay(50);
  938                 i++;
  939         }
  940 
  941         if (i == timeout) {
  942                 DEBUGOUT("Driver can't access device - SMBI bit is set.\n");
  943                 return -IGC_ERR_NVM;
  944         }
  945 
  946         /* Get the FW semaphore. */
  947         for (i = 0; i < timeout; i++) {
  948                 swsm = IGC_READ_REG(hw, IGC_SWSM);
  949                 IGC_WRITE_REG(hw, IGC_SWSM, swsm | IGC_SWSM_SWESMBI);
  950 
  951                 /* Semaphore acquired if bit latched */
  952                 if (IGC_READ_REG(hw, IGC_SWSM) & IGC_SWSM_SWESMBI)
  953                         break;
  954 
  955                 usec_delay(50);
  956         }
  957 
  958         if (i == timeout) {
  959                 /* Release semaphores */
  960                 igc_put_hw_semaphore_generic(hw);
  961                 DEBUGOUT("Driver can't access the NVM\n");
  962                 return -IGC_ERR_NVM;
  963         }
  964 
  965         return IGC_SUCCESS;
  966 }
  967 
  968 /**
  969  *  igc_put_hw_semaphore_generic - Release hardware semaphore
  970  *  @hw: pointer to the HW structure
  971  *
  972  *  Release hardware semaphore used to access the PHY or NVM
  973  **/
  974 void igc_put_hw_semaphore_generic(struct igc_hw *hw)
  975 {
  976         u32 swsm;
  977 
  978         DEBUGFUNC("igc_put_hw_semaphore_generic");
  979 
  980         swsm = IGC_READ_REG(hw, IGC_SWSM);
  981 
  982         swsm &= ~(IGC_SWSM_SMBI | IGC_SWSM_SWESMBI);
  983 
  984         IGC_WRITE_REG(hw, IGC_SWSM, swsm);
  985 }
  986 
  987 /**
  988  *  igc_get_auto_rd_done_generic - Check for auto read completion
  989  *  @hw: pointer to the HW structure
  990  *
  991  *  Check EEPROM for Auto Read done bit.
  992  **/
  993 s32 igc_get_auto_rd_done_generic(struct igc_hw *hw)
  994 {
  995         s32 i = 0;
  996 
  997         DEBUGFUNC("igc_get_auto_rd_done_generic");
  998 
  999         while (i < AUTO_READ_DONE_TIMEOUT) {
 1000                 if (IGC_READ_REG(hw, IGC_EECD) & IGC_EECD_AUTO_RD)
 1001                         break;
 1002                 msec_delay(1);
 1003                 i++;
 1004         }
 1005 
 1006         if (i == AUTO_READ_DONE_TIMEOUT) {
 1007                 DEBUGOUT("Auto read by HW from NVM has not completed.\n");
 1008                 return -IGC_ERR_RESET;
 1009         }
 1010 
 1011         return IGC_SUCCESS;
 1012 }
 1013 
 1014 /**
 1015  *  igc_disable_pcie_master_generic - Disables PCI-express master access
 1016  *  @hw: pointer to the HW structure
 1017  *
 1018  *  Returns IGC_SUCCESS if successful, else returns -10
 1019  *  (-IGC_ERR_MASTER_REQUESTS_PENDING) if master disable bit has not caused
 1020  *  the master requests to be disabled.
 1021  *
 1022  *  Disables PCI-Express master access and verifies there are no pending
 1023  *  requests.
 1024  **/
 1025 s32 igc_disable_pcie_master_generic(struct igc_hw *hw)
 1026 {
 1027         u32 ctrl;
 1028         s32 timeout = MASTER_DISABLE_TIMEOUT;
 1029 
 1030         DEBUGFUNC("igc_disable_pcie_master_generic");
 1031 
 1032         ctrl = IGC_READ_REG(hw, IGC_CTRL);
 1033         ctrl |= IGC_CTRL_GIO_MASTER_DISABLE;
 1034         IGC_WRITE_REG(hw, IGC_CTRL, ctrl);
 1035 
 1036         while (timeout) {
 1037                 if (!(IGC_READ_REG(hw, IGC_STATUS) &
 1038                       IGC_STATUS_GIO_MASTER_ENABLE))
 1039                         break;
 1040                 usec_delay(100);
 1041                 timeout--;
 1042         }
 1043 
 1044         if (!timeout) {
 1045                 DEBUGOUT("Master requests are pending.\n");
 1046                 return -IGC_ERR_MASTER_REQUESTS_PENDING;
 1047         }
 1048 
 1049         return IGC_SUCCESS;
 1050 }

Cache object: 6bb0fa73a5f6cf8b31711980b5457453


[ 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.