]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixgbe/ixgbe_82598.c
add -n option to suppress clearing the build tree and add -DNO_CLEAN
[FreeBSD/FreeBSD.git] / sys / dev / ixgbe / ixgbe_82598.c
1 /******************************************************************************
2
3   Copyright (c) 2001-2008, 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$*/
34
35 #include "ixgbe_type.h"
36 #include "ixgbe_api.h"
37 #include "ixgbe_common.h"
38 #include "ixgbe_phy.h"
39
40 s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw);
41 s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
42                                       ixgbe_link_speed *speed,
43                                       bool *autoneg);
44 s32 ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw,
45                                              ixgbe_link_speed *speed,
46                                              bool *autoneg);
47 enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw);
48 s32 ixgbe_setup_fc_82598(struct ixgbe_hw *hw, s32 packetbuf_num);
49 s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw);
50 s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
51                                ixgbe_link_speed *speed,
52                                bool *link_up, bool link_up_wait_to_complete);
53 s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
54                                      ixgbe_link_speed speed,
55                                      bool autoneg,
56                                      bool autoneg_wait_to_complete);
57 s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw);
58 s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
59                                         ixgbe_link_speed speed,
60                                         bool autoneg,
61                                         bool autoneg_wait_to_complete);
62 #ifndef NO_82598_A0_SUPPORT
63 s32 ixgbe_reset_hw_rev_0_82598(struct ixgbe_hw *hw);
64 #endif
65 s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw);
66 s32 ixgbe_configure_fiber_serdes_fc_82598(struct ixgbe_hw *hw);
67 s32 ixgbe_setup_fiber_serdes_link_82598(struct ixgbe_hw *hw);
68 s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
69 s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
70 s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan,
71                                   u32 vind, bool vlan_on);
72 s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw);
73 s32 ixgbe_blink_led_stop_82598(struct ixgbe_hw *hw, u32 index);
74 s32 ixgbe_blink_led_start_82598(struct ixgbe_hw *hw, u32 index);
75
76 /**
77  *  ixgbe_init_ops_82598 - Inits func ptrs and MAC type
78  *  @hw: pointer to hardware structure
79  *
80  *  Initialize the function pointers and assign the MAC type for 82598.
81  *  Does not touch the hardware.
82  **/
83 s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
84 {
85         struct ixgbe_mac_info *mac = &hw->mac;
86         struct ixgbe_phy_info *phy = &hw->phy;
87         s32 ret_val;
88
89         ret_val = ixgbe_init_phy_ops_generic(hw);
90         ret_val = ixgbe_init_ops_generic(hw);
91
92         /* MAC */
93 #ifndef NO_82598_A0_SUPPORT
94         if (hw->revision_id == 0)
95                 mac->ops.reset_hw = &ixgbe_reset_hw_rev_0_82598;
96         else
97                 mac->ops.reset_hw = &ixgbe_reset_hw_82598;
98 #else
99         mac->ops.reset_hw = &ixgbe_reset_hw_82598;
100 #endif
101         mac->ops.get_media_type = &ixgbe_get_media_type_82598;
102
103         /* LEDs */
104         mac->ops.blink_led_start = &ixgbe_blink_led_start_82598;
105         mac->ops.blink_led_stop = &ixgbe_blink_led_stop_82598;
106
107         /* RAR, Multicast, VLAN */
108         mac->ops.set_vmdq = &ixgbe_set_vmdq_82598;
109         mac->ops.clear_vmdq = &ixgbe_clear_vmdq_82598;
110         mac->ops.set_vfta = &ixgbe_set_vfta_82598;
111         mac->ops.clear_vfta = &ixgbe_clear_vfta_82598;
112
113         /* Flow Control */
114         mac->ops.setup_fc = &ixgbe_setup_fc_82598;
115
116         /* Call PHY identify routine to get the phy type */
117         phy->ops.identify(hw);
118
119         /* PHY Init */
120         switch (hw->phy.type) {
121         case ixgbe_phy_tn:
122                 phy->ops.check_link = &ixgbe_check_phy_link_tnx;
123                 phy->ops.get_firmware_version =
124                              &ixgbe_get_phy_firmware_version_tnx;
125                 break;
126         default:
127                 break;
128         }
129
130         /* Link */
131         mac->ops.check_link = &ixgbe_check_mac_link_82598;
132         if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
133                 mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
134                 mac->ops.setup_link_speed =
135                                      &ixgbe_setup_copper_link_speed_82598;
136                 mac->ops.get_link_capabilities =
137                                      &ixgbe_get_copper_link_capabilities_82598;
138         } else {
139                 mac->ops.setup_link = &ixgbe_setup_mac_link_82598;
140                 mac->ops.setup_link_speed = &ixgbe_setup_mac_link_speed_82598;
141                 mac->ops.get_link_capabilities =
142                                        &ixgbe_get_link_capabilities_82598;
143         }
144
145         mac->mcft_size       = 128;
146         mac->vft_size        = 128;
147         mac->num_rar_entries = 16;
148         mac->max_tx_queues   = 32;
149         mac->max_rx_queues   = 64;
150
151         return IXGBE_SUCCESS;
152 }
153
154 /**
155  *  ixgbe_get_link_capabilities_82598 - Determines link capabilities
156  *  @hw: pointer to hardware structure
157  *  @speed: pointer to link speed
158  *  @autoneg: boolean auto-negotiation value
159  *
160  *  Determines the link capabilities by reading the AUTOC register.
161  **/
162 s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
163                                       ixgbe_link_speed *speed,
164                                       bool *autoneg)
165 {
166         s32 status = IXGBE_SUCCESS;
167         s32 autoc_reg;
168
169         autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
170
171         if (hw->mac.link_settings_loaded) {
172                 autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE;
173                 autoc_reg &= ~IXGBE_AUTOC_LMS_MASK;
174                 autoc_reg |= hw->mac.link_attach_type;
175                 autoc_reg |= hw->mac.link_mode_select;
176         }
177
178         switch (autoc_reg & IXGBE_AUTOC_LMS_MASK) {
179         case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
180                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
181                 *autoneg = FALSE;
182                 break;
183
184         case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
185                 *speed = IXGBE_LINK_SPEED_10GB_FULL;
186                 *autoneg = FALSE;
187                 break;
188
189         case IXGBE_AUTOC_LMS_1G_AN:
190                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
191                 *autoneg = TRUE;
192                 break;
193
194         case IXGBE_AUTOC_LMS_KX4_AN:
195         case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
196                 *speed = IXGBE_LINK_SPEED_UNKNOWN;
197                 if (autoc_reg & IXGBE_AUTOC_KX4_SUPP)
198                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
199                 if (autoc_reg & IXGBE_AUTOC_KX_SUPP)
200                         *speed |= IXGBE_LINK_SPEED_1GB_FULL;
201                 *autoneg = TRUE;
202                 break;
203
204         default:
205                 status = IXGBE_ERR_LINK_SETUP;
206                 break;
207         }
208
209         return status;
210 }
211
212 /**
213  *  ixgbe_get_copper_link_capabilities_82598 - Determines link capabilities
214  *  @hw: pointer to hardware structure
215  *  @speed: pointer to link speed
216  *  @autoneg: boolean auto-negotiation value
217  *
218  *  Determines the link capabilities by reading the AUTOC register.
219  **/
220 s32 ixgbe_get_copper_link_capabilities_82598(struct ixgbe_hw *hw,
221                                              ixgbe_link_speed *speed,
222                                              bool *autoneg)
223 {
224         s32 status = IXGBE_ERR_LINK_SETUP;
225         u16 speed_ability;
226
227         *speed = 0;
228         *autoneg = TRUE;
229
230         status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
231                                     IXGBE_MDIO_PMA_PMD_DEV_TYPE,
232                                     &speed_ability);
233
234         if (status == IXGBE_SUCCESS) {
235                 if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
236                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
237                 if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
238                         *speed |= IXGBE_LINK_SPEED_1GB_FULL;
239         }
240
241         return status;
242 }
243
244 /**
245  *  ixgbe_get_media_type_82598 - Determines media type
246  *  @hw: pointer to hardware structure
247  *
248  *  Returns the media type (fiber, copper, backplane)
249  **/
250 enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
251 {
252         enum ixgbe_media_type media_type;
253
254         /* Media type for I82598 is based on device ID */
255         switch (hw->device_id) {
256         case IXGBE_DEV_ID_82598AF_DUAL_PORT:
257         case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
258         case IXGBE_DEV_ID_82598EB_CX4:
259         case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
260         case IXGBE_DEV_ID_82598EB_XF_LR:
261                 media_type = ixgbe_media_type_fiber;
262                 break;
263         case IXGBE_DEV_ID_82598AT:
264                 media_type = ixgbe_media_type_copper;
265                 break;
266         case IXGBE_DEV_ID_82598AT_DUAL_PORT:
267                 media_type = ixgbe_media_type_copper;
268                 break;
269         default:
270                 media_type = ixgbe_media_type_unknown;
271                 break;
272         }
273
274         return media_type;
275 }
276
277 /**
278  *  ixgbe_setup_fc_82598 - Configure flow control settings
279  *  @hw: pointer to hardware structure
280  *  @packetbuf_num: packet buffer number (0-7)
281  *
282  *  Configures the flow control settings based on SW configuration.  This
283  *  function is used for 802.3x flow control configuration only.
284  **/
285 s32 ixgbe_setup_fc_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
286 {
287         u32 frctl_reg;
288         u32 rmcs_reg;
289
290         if (packetbuf_num < 0 || packetbuf_num > 7) {
291                 DEBUGOUT1("Invalid packet buffer number [%d], expected range is"
292                           " 0-7\n", packetbuf_num);
293                 ASSERT(0);
294         }
295
296         frctl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
297         frctl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE);
298
299         rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
300         rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X);
301
302         /*
303          * 10 gig parts do not have a word in the EEPROM to determine the
304          * default flow control setting, so we explicitly set it to full.
305          */
306         if (hw->fc.type == ixgbe_fc_default)
307                 hw->fc.type = ixgbe_fc_full;
308
309         /*
310          * We want to save off the original Flow Control configuration just in
311          * case we get disconnected and then reconnected into a different hub
312          * or switch with different Flow Control capabilities.
313          */
314         hw->fc.original_type = hw->fc.type;
315
316         /*
317          * The possible values of the "flow_control" parameter are:
318          * 0: Flow control is completely disabled
319          * 1: Rx flow control is enabled (we can receive pause frames but not
320          *    send pause frames).
321          * 2: Tx flow control is enabled (we can send pause frames but we do not
322          *    support receiving pause frames)
323          * 3: Both Rx and Tx flow control (symmetric) are enabled.
324          * other: Invalid.
325          */
326         switch (hw->fc.type) {
327         case ixgbe_fc_none:
328                 break;
329         case ixgbe_fc_rx_pause:
330                 /*
331                  * Rx Flow control is enabled,
332                  * and Tx Flow control is disabled.
333                  */
334                 frctl_reg |= IXGBE_FCTRL_RFCE;
335                 break;
336         case ixgbe_fc_tx_pause:
337                 /*
338                  * Tx Flow control is enabled, and Rx Flow control is disabled,
339                  * by a software over-ride.
340                  */
341                 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
342                 break;
343         case ixgbe_fc_full:
344                 /*
345                  * Flow control (both Rx and Tx) is enabled by a software
346                  * over-ride.
347                  */
348                 frctl_reg |= IXGBE_FCTRL_RFCE;
349                 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
350                 break;
351         default:
352                 /* We should never get here.  The value should be 0-3. */
353                 DEBUGOUT("Flow control param set incorrectly\n");
354                 ASSERT(0);
355                 break;
356         }
357
358         /* Enable 802.3x based flow control settings. */
359         IXGBE_WRITE_REG(hw, IXGBE_FCTRL, frctl_reg);
360         IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg);
361
362         /*
363          * Check for invalid software configuration, zeros are completely
364          * invalid for all parameters used past this point, and if we enable
365          * flow control with zero water marks, we blast flow control packets.
366          */
367         if (!hw->fc.low_water || !hw->fc.high_water || !hw->fc.pause_time) {
368                 DEBUGOUT("Flow control structure initialized incorrectly\n");
369                 return IXGBE_ERR_INVALID_LINK_SETTINGS;
370         }
371
372         /*
373          * We need to set up the Receive Threshold high and low water
374          * marks as well as (optionally) enabling the transmission of
375          * XON frames.
376          */
377         if (hw->fc.type & ixgbe_fc_tx_pause) {
378                 if (hw->fc.send_xon) {
379                         IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num),
380                                         (hw->fc.low_water | IXGBE_FCRTL_XONE));
381                 } else {
382                         IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num),
383                                         hw->fc.low_water);
384                 }
385                 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(packetbuf_num),
386                                 (hw->fc.high_water)|IXGBE_FCRTH_FCEN);
387         }
388
389         IXGBE_WRITE_REG(hw, IXGBE_FCTTV(0), hw->fc.pause_time);
390         IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1));
391
392         return IXGBE_SUCCESS;
393 }
394
395 /**
396  *  ixgbe_setup_mac_link_82598 - Configures MAC link settings
397  *  @hw: pointer to hardware structure
398  *
399  *  Configures link settings based on values in the ixgbe_hw struct.
400  *  Restarts the link.  Performs autonegotiation if needed.
401  **/
402 s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw)
403 {
404         ixgbe_link_speed speed;
405         bool link_up;
406         u32 autoc_reg;
407         u32 links_reg;
408         u32 i;
409         s32 status = IXGBE_SUCCESS;
410
411         autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
412
413         if (hw->mac.link_settings_loaded) {
414                 autoc_reg &= ~IXGBE_AUTOC_LMS_ATTACH_TYPE;
415                 autoc_reg &= ~IXGBE_AUTOC_LMS_MASK;
416                 autoc_reg |= hw->mac.link_attach_type;
417                 autoc_reg |= hw->mac.link_mode_select;
418
419                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
420                 IXGBE_WRITE_FLUSH(hw);
421                 msec_delay(50);
422         }
423
424         /* Restart link */
425         autoc_reg |= IXGBE_AUTOC_AN_RESTART;
426         IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
427
428         /* Only poll for autoneg to complete if specified to do so */
429         if (hw->phy.autoneg_wait_to_complete) {
430                 if (hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN ||
431                     hw->mac.link_mode_select == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
432                         links_reg = 0; /* Just in case Autoneg time = 0 */
433                         for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
434                                 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
435                                 if (links_reg & IXGBE_LINKS_KX_AN_COMP)
436                                         break;
437                                 msec_delay(100);
438                         }
439                         if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
440                                 status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
441                                 DEBUGOUT("Autonegotiation did not complete.\n");
442                         }
443                 }
444         }
445
446         /*
447          * We want to save off the original Flow Control configuration just in
448          * case we get disconnected and then reconnected into a different hub
449          * or switch with different Flow Control capabilities.
450          */
451         hw->fc.original_type = hw->fc.type;
452         /*
453          * Set up the SerDes link if in 1Gb mode, otherwise just set up
454          * 10Gb flow control.
455          */
456         hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
457         if (speed == IXGBE_LINK_SPEED_1GB_FULL)
458                 status = ixgbe_setup_fiber_serdes_link_82598(hw);
459         else
460                 ixgbe_setup_fc_82598(hw, 0);
461
462         /* Add delay to filter out noises during initial link setup */
463         msec_delay(50);
464
465         return status;
466 }
467
468 /**
469  *  ixgbe_check_mac_link_82598 - Get link/speed status
470  *  @hw: pointer to hardware structure
471  *  @speed: pointer to link speed
472  *  @link_up: TRUE is link is up, FALSE otherwise
473  *  @link_up_wait_to_complete: bool used to wait for link up or not
474  *
475  *  Reads the links register to determine if link is up and the current speed
476  **/
477 s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
478                                bool *link_up, bool link_up_wait_to_complete)
479 {
480         u32 links_reg;
481         u32 i;
482
483         links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
484         if (link_up_wait_to_complete) {
485                 for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
486                         if (links_reg & IXGBE_LINKS_UP) {
487                                 *link_up = TRUE;
488                                 break;
489                         } else {
490                                 *link_up = FALSE;
491                         }
492                         msec_delay(100);
493                         links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
494                 }
495         } else {
496                 if (links_reg & IXGBE_LINKS_UP)
497                         *link_up = TRUE;
498                 else
499                         *link_up = FALSE;
500         }
501
502         if (links_reg & IXGBE_LINKS_SPEED)
503                 *speed = IXGBE_LINK_SPEED_10GB_FULL;
504         else
505                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
506
507         return IXGBE_SUCCESS;
508 }
509
510 /**
511  *  ixgbe_configure_fiber_serdes_fc_82598 - Configure fiber flow control
512  *  @hw: pointer to hardware structure
513  *
514  *  Reads PCS registers and sets flow control settings, based on
515  *  link-partner's abilities.
516  **/
517 s32 ixgbe_configure_fiber_serdes_fc_82598(struct ixgbe_hw *hw)
518 {
519         s32 ret_val = IXGBE_SUCCESS;
520         u32 pcs_anadv_reg, pcs_lpab_reg, pcs_lstat_reg, i;
521         DEBUGFUNC("ixgbe_configure_fiber_serdes_fc_82598");
522
523         /* Check that autonegotiation has completed */
524         for (i = 0; i < FIBER_LINK_UP_LIMIT; i++) {
525                 msec_delay(10);
526                 pcs_lstat_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA);
527                 if (pcs_lstat_reg & IXGBE_PCS1GLSTA_LINK_OK) {
528                         if (pcs_lstat_reg & IXGBE_PCS1GLSTA_AN_COMPLETE) {
529                                 if (!(pcs_lstat_reg &
530                                     (IXGBE_PCS1GLSTA_AN_TIMED_OUT)))
531                                         hw->mac.autoneg_failed = 0;
532                                 else
533                                         hw->mac.autoneg_failed = 1;
534                                 break;
535                         } else {
536                                 hw->mac.autoneg_failed = 1;
537                                 break;
538                         }
539                 }
540         }
541
542         if (hw->mac.autoneg_failed) {
543                 /*
544                  * AutoNeg failed to achieve a link, so we will turn
545                  * flow control off.
546                  */
547                 hw->fc.type = ixgbe_fc_none;
548                 DEBUGOUT("Flow Control = NONE.\n");
549                 ret_val = ixgbe_setup_fc_82598(hw, 0);
550                 goto out;
551         }
552
553         /*
554          * Read the AN advertisement and LP ability registers and resolve
555          * local flow control settings accordingly
556          */
557         pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
558         pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
559         if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) &&
560                 (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE)) {
561                 /*
562                  * Now we need to check if the user selected Rx ONLY
563                  * of pause frames.  In this case, we had to advertise
564                  * FULL flow control because we could not advertise RX
565                  * ONLY. Hence, we must now check to see if we need to
566                  * turn OFF  the TRANSMISSION of PAUSE frames.
567                  */
568                 if (hw->fc.original_type == ixgbe_fc_full) {
569                         hw->fc.type = ixgbe_fc_full;
570                         DEBUGOUT("Flow Control = FULL.\n");
571                 } else {
572                         hw->fc.type = ixgbe_fc_rx_pause;
573                         DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
574                 }
575         } else if (!(pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) &&
576                    (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) &&
577                    (pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) &&
578                    (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) {
579                 hw->fc.type = ixgbe_fc_tx_pause;
580                 DEBUGOUT("Flow Control = TX PAUSE frames only.\n");
581         } else if ((pcs_anadv_reg & IXGBE_PCS1GANA_SYM_PAUSE) &&
582                    (pcs_anadv_reg & IXGBE_PCS1GANA_ASM_PAUSE) &&
583                    !(pcs_lpab_reg & IXGBE_PCS1GANA_SYM_PAUSE) &&
584                    (pcs_lpab_reg & IXGBE_PCS1GANA_ASM_PAUSE)) {
585                 hw->fc.type = ixgbe_fc_rx_pause;
586                 DEBUGOUT("Flow Control = RX PAUSE frames only.\n");
587         } else {
588                 hw->fc.type = ixgbe_fc_none;
589                 DEBUGOUT("Flow Control = NONE.\n");
590         }
591
592         ret_val = ixgbe_setup_fc_82598(hw, 0);
593         if (ret_val) {
594                 DEBUGOUT("Error forcing flow control settings\n");
595                 goto out;
596         }
597
598 out:
599         return ret_val;
600 }
601
602 /**
603  *  ixgbe_setup_fiber_serdes_link_82598 - Configure fiber serdes link
604  *  @hw: pointer to hardware structure
605  *
606  *  Sets up PCS registers and sets flow control settings, based on
607  *  link-partner's abilities.
608  **/
609 s32 ixgbe_setup_fiber_serdes_link_82598(struct ixgbe_hw *hw)
610 {
611         u32 reg;
612         s32 ret_val;
613
614         DEBUGFUNC("ixgbe_setup_fiber_serdes_link_82598");
615
616         /*
617          * 10 gig parts do not have a word in the EEPROM to determine the
618          * default flow control setting, so we explicitly set it to full.
619          */
620         if (hw->fc.type == ixgbe_fc_default)
621                 hw->fc.type = ixgbe_fc_full;
622
623         /*
624          * 82598 fiber/serdes devices require that flow control be resolved in
625          * software.
626          */
627         reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
628
629         /*
630          * The possible values of the "fc" parameter are:
631          * 0:  Flow control is completely disabled
632          * 1:  Rx flow control is enabled (we can receive pause frames,
633          *     but not send pause frames).
634          * 2:  Tx flow control is enabled (we can send pause frames but
635          *     we do not support receiving pause frames).
636          * 3:  Both Rx and Tx flow control (symmetric) are enabled.
637          */
638         switch (hw->fc.type) {
639         case ixgbe_fc_none:
640                 /*
641                  * Flow control completely disabled by a software
642                  * over-ride.
643                  */
644                 reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE);
645                 break;
646                 case ixgbe_fc_rx_pause:
647                 /*
648                  * Rx Flow control is enabled and Tx Flow control is
649                  * disabled by a software over-ride. Since there really
650                  * isn't a way to advertise that we are capable of RX
651                  * Pause ONLY, we will advertise that we support both
652                  * symmetric and asymmetric Rx PAUSE.  Later, we will
653                  * disable the adapter's ability to send PAUSE frames.
654                  */
655                 reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE);
656                 break;
657         case ixgbe_fc_tx_pause:
658                 /*
659                  * Tx Flow control is enabled, and Rx Flow control is
660                  * disabled, by a software over-ride.
661                  */
662                 reg |= (IXGBE_PCS1GANA_ASM_PAUSE);
663                 reg &= ~(IXGBE_PCS1GANA_SYM_PAUSE);
664                 break;
665         case ixgbe_fc_full:
666                 /*
667                  * Flow control (both Rx and Tx) is enabled by a
668                  * software over-ride.
669                  */
670                 reg |= (IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE);
671                 break;
672         default:
673                 DEBUGOUT("Flow control param set incorrectly\n");
674                 ret_val = -IXGBE_ERR_CONFIG;
675                 goto out;
676                 break;
677         }
678
679         IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg);
680         reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL);
681
682         /* Set PCS register for autoneg */
683         /* Enable and restart autoneg */
684         reg |= IXGBE_PCS1GLCTL_AN_ENABLE | IXGBE_PCS1GLCTL_AN_RESTART;
685
686         reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN; /* Disable AN timeout */
687         DEBUGOUT1("Configuring Autoneg; PCS_LCTL = 0x%08X\n", reg);
688         IXGBE_WRITE_REG(hw, IXGBE_PCS1GLCTL, reg);
689
690         /*
691          * Configure flow control. If we aren't auto-negotiating,
692          * just setup the flow control and do not worry about PCS autoneg.
693          */
694         ixgbe_configure_fiber_serdes_fc_82598(hw);
695
696 out:
697         return IXGBE_SUCCESS;
698 }
699
700 /**
701  *  ixgbe_setup_mac_link_speed_82598 - Set MAC link speed
702  *  @hw: pointer to hardware structure
703  *  @speed: new link speed
704  *  @autoneg: TRUE if auto-negotiation enabled
705  *  @autoneg_wait_to_complete: TRUE if waiting is needed to complete
706  *
707  *  Set the link speed in the AUTOC register and restarts link.
708  **/
709 s32 ixgbe_setup_mac_link_speed_82598(struct ixgbe_hw *hw,
710                                      ixgbe_link_speed speed, bool autoneg,
711                                      bool autoneg_wait_to_complete)
712 {
713         s32 status = IXGBE_SUCCESS;
714
715         /* If speed is 10G, then check for CX4 or XAUI. */
716         if ((speed == IXGBE_LINK_SPEED_10GB_FULL) &&
717             (!(hw->mac.link_attach_type & IXGBE_AUTOC_10G_KX4))) {
718                 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_10G_LINK_NO_AN;
719         } else if ((speed == IXGBE_LINK_SPEED_1GB_FULL) && (!autoneg)) {
720                 hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_LINK_NO_AN;
721         } else if (autoneg) {
722                 /* BX mode - Autonegotiate 1G */
723                 if (!(hw->mac.link_attach_type & IXGBE_AUTOC_1G_PMA_PMD))
724                         hw->mac.link_mode_select = IXGBE_AUTOC_LMS_1G_AN;
725                 else /* KX/KX4 mode */
726                         hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN_1G_AN;
727         } else {
728                 status = IXGBE_ERR_LINK_SETUP;
729         }
730
731         if (status == IXGBE_SUCCESS) {
732                 hw->phy.autoneg_wait_to_complete = autoneg_wait_to_complete;
733
734                 hw->mac.link_settings_loaded = TRUE;
735                 /*
736                  * Setup and restart the link based on the new values in
737                  * ixgbe_hw This will write the AUTOC register based on the new
738                  * stored values
739                  */
740                 ixgbe_setup_mac_link_82598(hw);
741         }
742
743         return status;
744 }
745
746
747 /**
748  *  ixgbe_setup_copper_link_82598 - Setup copper link settings
749  *  @hw: pointer to hardware structure
750  *
751  *  Configures link settings based on values in the ixgbe_hw struct.
752  *  Restarts the link.  Performs autonegotiation if needed.  Restart
753  *  phy and wait for autonegotiate to finish.  Then synchronize the
754  *  MAC and PHY.
755  **/
756 s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw)
757 {
758         s32 status;
759
760         /* Restart autonegotiation on PHY */
761         status = hw->phy.ops.setup_link(hw);
762
763         /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */
764         hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX);
765         hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN;
766
767         /* Set up MAC */
768         ixgbe_setup_mac_link_82598(hw);
769
770         return status;
771 }
772
773 /**
774  *  ixgbe_setup_copper_link_speed_82598 - Set the PHY autoneg advertised field
775  *  @hw: pointer to hardware structure
776  *  @speed: new link speed
777  *  @autoneg: TRUE if autonegotiation enabled
778  *  @autoneg_wait_to_complete: TRUE if waiting is needed to complete
779  *
780  *  Sets the link speed in the AUTOC register in the MAC and restarts link.
781  **/
782 s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
783                                         ixgbe_link_speed speed,
784                                         bool autoneg,
785                                         bool autoneg_wait_to_complete)
786 {
787         s32 status;
788
789         /* Setup the PHY according to input speed */
790         status = hw->phy.ops.setup_link_speed(hw, speed, autoneg,
791                                             autoneg_wait_to_complete);
792
793         /* Set MAC to KX/KX4 autoneg, which defaults to Parallel detection */
794         hw->mac.link_attach_type = (IXGBE_AUTOC_10G_KX4 | IXGBE_AUTOC_1G_KX);
795         hw->mac.link_mode_select = IXGBE_AUTOC_LMS_KX4_AN;
796
797         /* Set up MAC */
798         ixgbe_setup_mac_link_82598(hw);
799
800         return status;
801 }
802
803 #ifndef NO_82598_A0_SUPPORT
804 /**
805  *  ixgbe_reset_hw_rev_0_82598 - Performs hardware reset
806  *  @hw: pointer to hardware structure
807  *
808  *  Resets the hardware by resetting the transmit and receive units, masks and
809  *  clears all interrupts, performing a PHY reset, and performing a link (MAC)
810  *  reset.
811  **/
812 s32 ixgbe_reset_hw_rev_0_82598(struct ixgbe_hw *hw)
813 {
814         s32 status = IXGBE_SUCCESS;
815         u32 ctrl;
816         u32 gheccr;
817         u32 autoc;
818         u32 i;
819         u32 resets;
820
821         /* Call adapter stop to disable tx/rx and clear interrupts */
822         hw->mac.ops.stop_adapter(hw);
823
824         /* Reset PHY */
825         hw->phy.ops.reset(hw);
826
827         for (resets = 0; resets < 10; resets++) {
828                 /*
829                  * Prevent the PCI-E bus from from hanging by disabling PCI-E
830                  * master access and verify no pending requests before reset
831                  */
832                 if (ixgbe_disable_pcie_master(hw) != IXGBE_SUCCESS) {
833                         status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
834                         DEBUGOUT("PCI-E Master disable polling has failed.\n");
835                 }
836
837                 /*
838                  * Issue global reset to the MAC.  This needs to be a SW reset.
839                  * If link reset is used, it might reset the MAC when mng is
840                  * using it.
841                  */
842                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
843                 IXGBE_WRITE_REG(hw, IXGBE_CTRL, (ctrl | IXGBE_CTRL_RST));
844                 IXGBE_WRITE_FLUSH(hw);
845
846                 /*
847                  * Poll for reset bit to self-clear indicating reset is
848                  * complete
849                  */
850                 for (i = 0; i < 10; i++) {
851                         usec_delay(1);
852                         ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
853                         if (!(ctrl & IXGBE_CTRL_RST))
854                                 break;
855                 }
856                 if (ctrl & IXGBE_CTRL_RST) {
857                         status = IXGBE_ERR_RESET_FAILED;
858                         DEBUGOUT("Reset polling failed to complete.\n");
859                 }
860         }
861
862         msec_delay(50);
863
864         gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
865         gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6));
866         IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr);
867
868         /*
869          * AUTOC register which stores link settings gets cleared
870          * and reloaded from EEPROM after reset. We need to restore
871          * our stored value from init in case SW changed the attach
872          * type or speed.  If this is the first time and link settings
873          * have not been stored, store default settings from AUTOC.
874          */
875         autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
876         if (hw->mac.link_settings_loaded) {
877                 autoc &= ~(IXGBE_AUTOC_LMS_ATTACH_TYPE);
878                 autoc &= ~(IXGBE_AUTOC_LMS_MASK);
879                 autoc |= hw->mac.link_attach_type;
880                 autoc |= hw->mac.link_mode_select;
881                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
882         } else {
883                 hw->mac.link_attach_type =
884                                          (autoc & IXGBE_AUTOC_LMS_ATTACH_TYPE);
885                 hw->mac.link_mode_select = (autoc & IXGBE_AUTOC_LMS_MASK);
886                 hw->mac.link_settings_loaded = TRUE;
887         }
888
889         /* Store the permanent mac address */
890         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
891
892         return status;
893 }
894
895 #endif /* NO_A0_SUPPORT */
896 /**
897  *  ixgbe_reset_hw_82598 - Performs hardware reset
898  *  @hw: pointer to hardware structure
899  *
900  *  Resets the hardware by resetting the transmit and receive units, masks and
901  *  clears all interrupts, performing a PHY reset, and performing a link (MAC)
902  *  reset.
903  **/
904 s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
905 {
906         s32 status = IXGBE_SUCCESS;
907         u32 ctrl;
908         u32 gheccr;
909         u32 i;
910         u32 autoc;
911         u8  analog_val;
912
913         /* Call adapter stop to disable tx/rx and clear interrupts */
914         hw->mac.ops.stop_adapter(hw);
915
916         /*
917          * Power up the Atlas Tx lanes if they are currently powered down.
918          * Atlas Tx lanes are powered down for MAC loopback tests, but
919          * they are not automatically restored on reset.
920          */
921         hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val);
922         if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) {
923                 /* Enable Tx Atlas so packets can be transmitted again */
924                 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
925                                              &analog_val);
926                 analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN;
927                 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
928                                               analog_val);
929
930                 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
931                                              &analog_val);
932                 analog_val &= ~ IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
933                 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
934                                               analog_val);
935
936                 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
937                                              &analog_val);
938                 analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
939                 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
940                                               analog_val);
941
942                 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
943                                              &analog_val);
944                 analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
945                 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
946                                               analog_val);
947         }
948
949         /* Reset PHY */
950         if (hw->phy.reset_disable == FALSE)
951                 hw->phy.ops.reset(hw);
952
953         /*
954          * Prevent the PCI-E bus from from hanging by disabling PCI-E master
955          * access and verify no pending requests before reset
956          */
957         if (ixgbe_disable_pcie_master(hw) != IXGBE_SUCCESS) {
958                 status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
959                 DEBUGOUT("PCI-E Master disable polling has failed.\n");
960         }
961
962         /*
963          * Issue global reset to the MAC.  This needs to be a SW reset.
964          * If link reset is used, it might reset the MAC when mng is using it
965          */
966         ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
967         IXGBE_WRITE_REG(hw, IXGBE_CTRL, (ctrl | IXGBE_CTRL_RST));
968         IXGBE_WRITE_FLUSH(hw);
969
970         /* Poll for reset bit to self-clear indicating reset is complete */
971         for (i = 0; i < 10; i++) {
972                 usec_delay(1);
973                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
974                 if (!(ctrl & IXGBE_CTRL_RST))
975                         break;
976         }
977         if (ctrl & IXGBE_CTRL_RST) {
978                 status = IXGBE_ERR_RESET_FAILED;
979                 DEBUGOUT("Reset polling failed to complete.\n");
980         }
981
982         msec_delay(50);
983
984         gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
985         gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6));
986         IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr);
987
988         /*
989          * AUTOC register which stores link settings gets cleared
990          * and reloaded from EEPROM after reset. We need to restore
991          * our stored value from init in case SW changed the attach
992          * type or speed.  If this is the first time and link settings
993          * have not been stored, store default settings from AUTOC.
994          */
995         autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
996         if (hw->mac.link_settings_loaded) {
997                 autoc &= ~(IXGBE_AUTOC_LMS_ATTACH_TYPE);
998                 autoc &= ~(IXGBE_AUTOC_LMS_MASK);
999                 autoc |= hw->mac.link_attach_type;
1000                 autoc |= hw->mac.link_mode_select;
1001                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
1002         } else {
1003                 hw->mac.link_attach_type =
1004                                          (autoc & IXGBE_AUTOC_LMS_ATTACH_TYPE);
1005                 hw->mac.link_mode_select = (autoc & IXGBE_AUTOC_LMS_MASK);
1006                 hw->mac.link_settings_loaded = TRUE;
1007         }
1008
1009         /* Store the permanent mac address */
1010         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
1011
1012         return status;
1013 }
1014
1015 /**
1016  *  ixgbe_set_vmdq_82598 - Associate a VMDq set index with a rx address
1017  *  @hw: pointer to hardware struct
1018  *  @rar: receive address register index to associate with a VMDq index
1019  *  @vmdq: VMDq set index
1020  **/
1021 s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
1022 {
1023         u32 rar_high;
1024
1025         rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
1026         rar_high &= ~IXGBE_RAH_VIND_MASK;
1027         rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK);
1028         IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
1029         return IXGBE_SUCCESS;
1030 }
1031
1032 /**
1033  *  ixgbe_clear_vmdq_82598 - Disassociate a VMDq set index from an rx address
1034  *  @hw: pointer to hardware struct
1035  *  @rar: receive address register index to associate with a VMDq index
1036  *  @vmdq: VMDq clear index (not used in 82598, but elsewhere)
1037  **/
1038 s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
1039 {
1040         u32 rar_high;
1041         u32 rar_entries = hw->mac.num_rar_entries;
1042
1043     UNREFERENCED_PARAMETER(vmdq);
1044
1045         if (rar < rar_entries) {
1046                 rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
1047                 if (rar_high & IXGBE_RAH_VIND_MASK) {
1048                         rar_high &= ~IXGBE_RAH_VIND_MASK;
1049                         IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
1050                 }
1051         } else {
1052                 DEBUGOUT1("RAR index %d is out of range.\n", rar);
1053         }
1054
1055         return IXGBE_SUCCESS;
1056 }
1057
1058 /**
1059  *  ixgbe_set_vfta_82598 - Set VLAN filter table
1060  *  @hw: pointer to hardware structure
1061  *  @vlan: VLAN id to write to VLAN filter
1062  *  @vind: VMDq output index that maps queue to VLAN id in VFTA
1063  *  @vlan_on: boolean flag to turn on/off VLAN in VFTA
1064  *
1065  *  Turn on/off specified VLAN in the VLAN filter table.
1066  **/
1067 s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
1068                                                       bool vlan_on)
1069 {
1070         u32 regindex;
1071         u32 bitindex;
1072         u32 bits;
1073         u32 vftabyte;
1074
1075         if (vlan < 1 || vlan > 4095)
1076                 return IXGBE_ERR_PARAM;
1077
1078         /* Determine 32-bit word position in array */
1079         regindex = (vlan >> 5) & 0x7F;   /* upper seven bits */
1080
1081         /* Determine the location of the (VMD) queue index */
1082         vftabyte =  ((vlan >> 3) & 0x03); /* bits (4:3) indicating byte array */
1083         bitindex = (vlan & 0x7) << 2;    /* lower 3 bits indicate nibble */
1084
1085         /* Set the nibble for VMD queue index */
1086         bits = IXGBE_READ_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex));
1087         bits &= (~(0x0F << bitindex));
1088         bits |= (vind << bitindex);
1089         IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex), bits);
1090
1091         /* Determine the location of the bit for this VLAN id */
1092         bitindex = vlan & 0x1F;   /* lower five bits */
1093
1094         bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex));
1095         if (vlan_on)
1096                 /* Turn on this VLAN id */
1097                 bits |= (1 << bitindex);
1098         else
1099                 /* Turn off this VLAN id */
1100                 bits &= ~(1 << bitindex);
1101         IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits);
1102
1103         return IXGBE_SUCCESS;
1104 }
1105
1106 /**
1107  *  ixgbe_clear_vfta_82598 - Clear VLAN filter table
1108  *  @hw: pointer to hardware structure
1109  *
1110  *  Clears the VLAN filer table, and the VMDq index associated with the filter
1111  **/
1112 s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
1113 {
1114         u32 offset;
1115         u32 vlanbyte;
1116
1117         for (offset = 0; offset < hw->mac.vft_size; offset++)
1118                 IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0);
1119
1120         for (vlanbyte = 0; vlanbyte < 4; vlanbyte++)
1121                 for (offset = 0; offset < hw->mac.vft_size; offset++)
1122                         IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vlanbyte, offset),
1123                                                                           0);
1124
1125         return IXGBE_SUCCESS;
1126 }
1127
1128 /**
1129  *  ixgbe_blink_led_start_82598 - Blink LED based on index.
1130  *  @hw: pointer to hardware structure
1131  *  @index: led number to blink
1132  **/
1133 s32 ixgbe_blink_led_start_82598(struct ixgbe_hw *hw, u32 index)
1134 {
1135         ixgbe_link_speed speed = 0;
1136         bool link_up = 0;
1137         u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
1138         u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
1139
1140         /*
1141          * Link must be up to auto-blink the LEDs on the 82598EB MAC;
1142          * force it if link is down.
1143          */
1144         hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
1145
1146         if (!link_up) {
1147                 autoc_reg |= IXGBE_AUTOC_FLU;
1148                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
1149                 msec_delay(10);
1150         }
1151
1152         led_reg &= ~IXGBE_LED_MODE_MASK(index);
1153         led_reg |= IXGBE_LED_BLINK(index);
1154         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg);
1155         IXGBE_WRITE_FLUSH(hw);
1156
1157         return IXGBE_SUCCESS;
1158 }
1159
1160 /**
1161  *  ixgbe_blink_led_stop_82598 - Stop blinking LED based on index.
1162  *  @hw: pointer to hardware structure
1163  *  @index: led number to stop blinking
1164  **/
1165 s32 ixgbe_blink_led_stop_82598(struct ixgbe_hw *hw, u32 index)
1166 {
1167         u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
1168         u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
1169
1170         autoc_reg &= ~IXGBE_AUTOC_FLU;
1171         IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
1172
1173         led_reg &= ~IXGBE_LED_MODE_MASK(index);
1174         led_reg &= ~IXGBE_LED_BLINK(index);
1175         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg);
1176         IXGBE_WRITE_FLUSH(hw);
1177
1178         return IXGBE_SUCCESS;
1179 }