1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#include <linux/pci.h>
30#include <linux/delay.h>
31#include <linux/sched.h>
32
33#include "ixgbe.h"
34#include "ixgbe_phy.h"
35
36#define IXGBE_82598_MAX_TX_QUEUES 32
37#define IXGBE_82598_MAX_RX_QUEUES 64
38#define IXGBE_82598_RAR_ENTRIES 16
39#define IXGBE_82598_MC_TBL_SIZE 128
40#define IXGBE_82598_VFT_TBL_SIZE 128
41#define IXGBE_82598_RX_PB_SIZE 512
42
43static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
44 ixgbe_link_speed speed,
45 bool autoneg_wait_to_complete);
46static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
47 u8 *eeprom_data);
48
49
50
51
52
53
54
55
56
57
58
59static void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
60{
61 u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
62 u16 pcie_devctl2;
63
64 if (ixgbe_removed(hw->hw_addr))
65 return;
66
67
68 if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
69 goto out;
70
71
72
73
74
75 if (!(gcr & IXGBE_GCR_CAP_VER2)) {
76 gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
77 goto out;
78 }
79
80
81
82
83
84
85 pcie_devctl2 = ixgbe_read_pci_cfg_word(hw, IXGBE_PCI_DEVICE_CONTROL2);
86 pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
87 ixgbe_write_pci_cfg_word(hw, IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
88out:
89
90 gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
91 IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
92}
93
94static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
95{
96 struct ixgbe_mac_info *mac = &hw->mac;
97
98
99 ixgbe_identify_phy_generic(hw);
100
101 mac->mcft_size = IXGBE_82598_MC_TBL_SIZE;
102 mac->vft_size = IXGBE_82598_VFT_TBL_SIZE;
103 mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES;
104 mac->rx_pb_size = IXGBE_82598_RX_PB_SIZE;
105 mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
106 mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
107 mac->max_msix_vectors = ixgbe_get_pcie_msix_count_generic(hw);
108
109 return 0;
110}
111
112
113
114
115
116
117
118
119
120
121static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
122{
123 struct ixgbe_mac_info *mac = &hw->mac;
124 struct ixgbe_phy_info *phy = &hw->phy;
125 s32 ret_val;
126 u16 list_offset, data_offset;
127
128
129 phy->ops.identify(hw);
130
131
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.get_link_capabilities =
135 &ixgbe_get_copper_link_capabilities_generic;
136 }
137
138 switch (hw->phy.type) {
139 case ixgbe_phy_tn:
140 phy->ops.setup_link = &ixgbe_setup_phy_link_tnx;
141 phy->ops.check_link = &ixgbe_check_phy_link_tnx;
142 break;
143 case ixgbe_phy_nl:
144 phy->ops.reset = &ixgbe_reset_phy_nl;
145
146
147 ret_val = phy->ops.identify_sfp(hw);
148 if (ret_val)
149 return ret_val;
150 if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
151 return IXGBE_ERR_SFP_NOT_SUPPORTED;
152
153
154 ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
155 &list_offset,
156 &data_offset);
157 if (ret_val)
158 return IXGBE_ERR_SFP_NOT_SUPPORTED;
159 break;
160 default:
161 break;
162 }
163
164 return 0;
165}
166
167
168
169
170
171
172
173
174
175
176static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
177{
178#ifndef CONFIG_SPARC
179 u32 regval;
180 u32 i;
181#endif
182 s32 ret_val;
183
184 ret_val = ixgbe_start_hw_generic(hw);
185
186#ifndef CONFIG_SPARC
187
188 for (i = 0; ((i < hw->mac.max_tx_queues) &&
189 (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
190 regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
191 regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
192 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
193 }
194
195 for (i = 0; ((i < hw->mac.max_rx_queues) &&
196 (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
197 regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
198 regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN |
199 IXGBE_DCA_RXCTRL_HEAD_WRO_EN);
200 IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
201 }
202#endif
203 if (ret_val)
204 return ret_val;
205
206
207 ixgbe_set_pcie_completion_timeout(hw);
208
209 return 0;
210}
211
212
213
214
215
216
217
218
219
220static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
221 ixgbe_link_speed *speed,
222 bool *autoneg)
223{
224 u32 autoc = 0;
225
226
227
228
229
230
231 if (hw->mac.orig_link_settings_stored)
232 autoc = hw->mac.orig_autoc;
233 else
234 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
235
236 switch (autoc & IXGBE_AUTOC_LMS_MASK) {
237 case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
238 *speed = IXGBE_LINK_SPEED_1GB_FULL;
239 *autoneg = false;
240 break;
241
242 case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
243 *speed = IXGBE_LINK_SPEED_10GB_FULL;
244 *autoneg = false;
245 break;
246
247 case IXGBE_AUTOC_LMS_1G_AN:
248 *speed = IXGBE_LINK_SPEED_1GB_FULL;
249 *autoneg = true;
250 break;
251
252 case IXGBE_AUTOC_LMS_KX4_AN:
253 case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
254 *speed = IXGBE_LINK_SPEED_UNKNOWN;
255 if (autoc & IXGBE_AUTOC_KX4_SUPP)
256 *speed |= IXGBE_LINK_SPEED_10GB_FULL;
257 if (autoc & IXGBE_AUTOC_KX_SUPP)
258 *speed |= IXGBE_LINK_SPEED_1GB_FULL;
259 *autoneg = true;
260 break;
261
262 default:
263 return IXGBE_ERR_LINK_SETUP;
264 }
265
266 return 0;
267}
268
269
270
271
272
273
274
275static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
276{
277
278 switch (hw->phy.type) {
279 case ixgbe_phy_cu_unknown:
280 case ixgbe_phy_tn:
281 return ixgbe_media_type_copper;
282
283 default:
284 break;
285 }
286
287
288 switch (hw->device_id) {
289 case IXGBE_DEV_ID_82598:
290 case IXGBE_DEV_ID_82598_BX:
291
292 return ixgbe_media_type_backplane;
293
294 case IXGBE_DEV_ID_82598AF_DUAL_PORT:
295 case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
296 case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
297 case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
298 case IXGBE_DEV_ID_82598EB_XF_LR:
299 case IXGBE_DEV_ID_82598EB_SFP_LOM:
300 return ixgbe_media_type_fiber;
301
302 case IXGBE_DEV_ID_82598EB_CX4:
303 case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
304 return ixgbe_media_type_cx4;
305
306 case IXGBE_DEV_ID_82598AT:
307 case IXGBE_DEV_ID_82598AT2:
308 return ixgbe_media_type_copper;
309
310 default:
311 return ixgbe_media_type_unknown;
312 }
313}
314
315
316
317
318
319
320
321static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
322{
323 u32 fctrl_reg;
324 u32 rmcs_reg;
325 u32 reg;
326 u32 fcrtl, fcrth;
327 u32 link_speed = 0;
328 int i;
329 bool link_up;
330
331
332 if (!hw->fc.pause_time)
333 return IXGBE_ERR_INVALID_LINK_SETTINGS;
334
335
336 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
337 if ((hw->fc.current_mode & ixgbe_fc_tx_pause) &&
338 hw->fc.high_water[i]) {
339 if (!hw->fc.low_water[i] ||
340 hw->fc.low_water[i] >= hw->fc.high_water[i]) {
341 hw_dbg(hw, "Invalid water mark configuration\n");
342 return IXGBE_ERR_INVALID_LINK_SETTINGS;
343 }
344 }
345 }
346
347
348
349
350
351
352 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
353 if (link_up && link_speed == IXGBE_LINK_SPEED_1GB_FULL) {
354 switch (hw->fc.requested_mode) {
355 case ixgbe_fc_full:
356 hw->fc.requested_mode = ixgbe_fc_tx_pause;
357 break;
358 case ixgbe_fc_rx_pause:
359 hw->fc.requested_mode = ixgbe_fc_none;
360 break;
361 default:
362
363 break;
364 }
365 }
366
367
368 hw->mac.ops.fc_autoneg(hw);
369
370
371 fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
372 fctrl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE);
373
374 rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
375 rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X);
376
377
378
379
380
381
382
383
384
385
386
387 switch (hw->fc.current_mode) {
388 case ixgbe_fc_none:
389
390
391
392
393 break;
394 case ixgbe_fc_rx_pause:
395
396
397
398
399
400
401
402
403 fctrl_reg |= IXGBE_FCTRL_RFCE;
404 break;
405 case ixgbe_fc_tx_pause:
406
407
408
409
410 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
411 break;
412 case ixgbe_fc_full:
413
414 fctrl_reg |= IXGBE_FCTRL_RFCE;
415 rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
416 break;
417 default:
418 hw_dbg(hw, "Flow control param set incorrectly\n");
419 return IXGBE_ERR_CONFIG;
420 }
421
422
423 fctrl_reg |= IXGBE_FCTRL_DPF;
424 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl_reg);
425 IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg);
426
427
428 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
429 if ((hw->fc.current_mode & ixgbe_fc_tx_pause) &&
430 hw->fc.high_water[i]) {
431 fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
432 fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
433 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
434 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), fcrth);
435 } else {
436 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
437 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
438 }
439
440 }
441
442
443 reg = hw->fc.pause_time * 0x00010001;
444 for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
445 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
446
447
448 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
449
450 return 0;
451}
452
453
454
455
456
457
458
459
460static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
461 bool autoneg_wait_to_complete)
462{
463 u32 autoc_reg;
464 u32 links_reg;
465 u32 i;
466 s32 status = 0;
467
468
469 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
470 autoc_reg |= IXGBE_AUTOC_AN_RESTART;
471 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
472
473
474 if (autoneg_wait_to_complete) {
475 if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
476 IXGBE_AUTOC_LMS_KX4_AN ||
477 (autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
478 IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
479 links_reg = 0;
480 for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
481 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
482 if (links_reg & IXGBE_LINKS_KX_AN_COMP)
483 break;
484 msleep(100);
485 }
486 if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
487 status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
488 hw_dbg(hw, "Autonegotiation did not complete.\n");
489 }
490 }
491 }
492
493
494 msleep(50);
495
496 return status;
497}
498
499
500
501
502
503
504
505
506static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
507{
508 u32 timeout;
509 u16 an_reg;
510
511 if (hw->device_id != IXGBE_DEV_ID_82598AT2)
512 return 0;
513
514 for (timeout = 0;
515 timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) {
516 hw->phy.ops.read_reg(hw, MDIO_STAT1, MDIO_MMD_AN, &an_reg);
517
518 if ((an_reg & MDIO_AN_STAT1_COMPLETE) &&
519 (an_reg & MDIO_STAT1_LSTATUS))
520 break;
521
522 msleep(100);
523 }
524
525 if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
526 hw_dbg(hw, "Link was indicated but link is down\n");
527 return IXGBE_ERR_LINK_SETUP;
528 }
529
530 return 0;
531}
532
533
534
535
536
537
538
539
540
541
542static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
543 ixgbe_link_speed *speed, bool *link_up,
544 bool link_up_wait_to_complete)
545{
546 u32 links_reg;
547 u32 i;
548 u16 link_reg, adapt_comp_reg;
549
550
551
552
553
554
555
556 if (hw->phy.type == ixgbe_phy_nl) {
557 hw->phy.ops.read_reg(hw, 0xC79F, MDIO_MMD_PMAPMD, &link_reg);
558 hw->phy.ops.read_reg(hw, 0xC79F, MDIO_MMD_PMAPMD, &link_reg);
559 hw->phy.ops.read_reg(hw, 0xC00C, MDIO_MMD_PMAPMD,
560 &adapt_comp_reg);
561 if (link_up_wait_to_complete) {
562 for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
563 if ((link_reg & 1) &&
564 ((adapt_comp_reg & 1) == 0)) {
565 *link_up = true;
566 break;
567 } else {
568 *link_up = false;
569 }
570 msleep(100);
571 hw->phy.ops.read_reg(hw, 0xC79F,
572 MDIO_MMD_PMAPMD,
573 &link_reg);
574 hw->phy.ops.read_reg(hw, 0xC00C,
575 MDIO_MMD_PMAPMD,
576 &adapt_comp_reg);
577 }
578 } else {
579 if ((link_reg & 1) && ((adapt_comp_reg & 1) == 0))
580 *link_up = true;
581 else
582 *link_up = false;
583 }
584
585 if (!*link_up)
586 return 0;
587 }
588
589 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
590 if (link_up_wait_to_complete) {
591 for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
592 if (links_reg & IXGBE_LINKS_UP) {
593 *link_up = true;
594 break;
595 } else {
596 *link_up = false;
597 }
598 msleep(100);
599 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
600 }
601 } else {
602 if (links_reg & IXGBE_LINKS_UP)
603 *link_up = true;
604 else
605 *link_up = false;
606 }
607
608 if (links_reg & IXGBE_LINKS_SPEED)
609 *speed = IXGBE_LINK_SPEED_10GB_FULL;
610 else
611 *speed = IXGBE_LINK_SPEED_1GB_FULL;
612
613 if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && *link_up &&
614 (ixgbe_validate_link_ready(hw) != 0))
615 *link_up = false;
616
617 return 0;
618}
619
620
621
622
623
624
625
626
627
628static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
629 ixgbe_link_speed speed,
630 bool autoneg_wait_to_complete)
631{
632 bool autoneg = false;
633 ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN;
634 u32 curr_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
635 u32 autoc = curr_autoc;
636 u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK;
637
638
639 ixgbe_get_link_capabilities_82598(hw, &link_capabilities, &autoneg);
640 speed &= link_capabilities;
641
642 if (speed == IXGBE_LINK_SPEED_UNKNOWN)
643 return IXGBE_ERR_LINK_SETUP;
644
645
646 else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
647 link_mode == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
648 autoc &= ~IXGBE_AUTOC_KX4_KX_SUPP_MASK;
649 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
650 autoc |= IXGBE_AUTOC_KX4_SUPP;
651 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
652 autoc |= IXGBE_AUTOC_KX_SUPP;
653 if (autoc != curr_autoc)
654 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
655 }
656
657
658
659
660
661 return ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
662}
663
664
665
666
667
668
669
670
671
672
673static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
674 ixgbe_link_speed speed,
675 bool autoneg_wait_to_complete)
676{
677 s32 status;
678
679
680 status = hw->phy.ops.setup_link_speed(hw, speed,
681 autoneg_wait_to_complete);
682
683 ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
684
685 return status;
686}
687
688
689
690
691
692
693
694
695
696static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
697{
698 s32 status;
699 s32 phy_status = 0;
700 u32 ctrl;
701 u32 gheccr;
702 u32 i;
703 u32 autoc;
704 u8 analog_val;
705
706
707 status = hw->mac.ops.stop_adapter(hw);
708 if (status)
709 return status;
710
711
712
713
714
715
716 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val);
717 if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) {
718
719 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
720 &analog_val);
721 analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN;
722 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
723 analog_val);
724
725 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
726 &analog_val);
727 analog_val &= ~IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
728 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
729 analog_val);
730
731 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
732 &analog_val);
733 analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
734 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
735 analog_val);
736
737 hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
738 &analog_val);
739 analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
740 hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
741 analog_val);
742 }
743
744
745 if (hw->phy.reset_disable == false) {
746
747
748
749 phy_status = hw->phy.ops.init(hw);
750 if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
751 return phy_status;
752 if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
753 goto mac_reset_top;
754
755 hw->phy.ops.reset(hw);
756 }
757
758mac_reset_top:
759
760
761
762
763 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL) | IXGBE_CTRL_RST;
764 IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
765 IXGBE_WRITE_FLUSH(hw);
766 usleep_range(1000, 1200);
767
768
769 for (i = 0; i < 10; i++) {
770 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
771 if (!(ctrl & IXGBE_CTRL_RST))
772 break;
773 udelay(1);
774 }
775 if (ctrl & IXGBE_CTRL_RST) {
776 status = IXGBE_ERR_RESET_FAILED;
777 hw_dbg(hw, "Reset polling failed to complete.\n");
778 }
779
780 msleep(50);
781
782
783
784
785
786
787 if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
788 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
789 goto mac_reset_top;
790 }
791
792 gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
793 gheccr &= ~(BIT(21) | BIT(18) | BIT(9) | BIT(6));
794 IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr);
795
796
797
798
799
800
801 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
802 if (hw->mac.orig_link_settings_stored == false) {
803 hw->mac.orig_autoc = autoc;
804 hw->mac.orig_link_settings_stored = true;
805 } else if (autoc != hw->mac.orig_autoc) {
806 IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc);
807 }
808
809
810 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
811
812
813
814
815
816 hw->mac.ops.init_rx_addrs(hw);
817
818 if (phy_status)
819 status = phy_status;
820
821 return status;
822}
823
824
825
826
827
828
829
830static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
831{
832 u32 rar_high;
833 u32 rar_entries = hw->mac.num_rar_entries;
834
835
836 if (rar >= rar_entries) {
837 hw_dbg(hw, "RAR index %d is out of range.\n", rar);
838 return IXGBE_ERR_INVALID_ARGUMENT;
839 }
840
841 rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
842 rar_high &= ~IXGBE_RAH_VIND_MASK;
843 rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK);
844 IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
845 return 0;
846}
847
848
849
850
851
852
853
854static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
855{
856 u32 rar_high;
857 u32 rar_entries = hw->mac.num_rar_entries;
858
859
860
861 if (rar >= rar_entries) {
862 hw_dbg(hw, "RAR index %d is out of range.\n", rar);
863 return IXGBE_ERR_INVALID_ARGUMENT;
864 }
865
866 rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
867 if (rar_high & IXGBE_RAH_VIND_MASK) {
868 rar_high &= ~IXGBE_RAH_VIND_MASK;
869 IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
870 }
871
872 return 0;
873}
874
875
876
877
878
879
880
881
882
883
884
885static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
886 bool vlan_on, bool vlvf_bypass)
887{
888 u32 regindex;
889 u32 bitindex;
890 u32 bits;
891 u32 vftabyte;
892
893 if (vlan > 4095)
894 return IXGBE_ERR_PARAM;
895
896
897 regindex = (vlan >> 5) & 0x7F;
898
899
900 vftabyte = ((vlan >> 3) & 0x03);
901 bitindex = (vlan & 0x7) << 2;
902
903
904 bits = IXGBE_READ_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex));
905 bits &= (~(0x0F << bitindex));
906 bits |= (vind << bitindex);
907 IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex), bits);
908
909
910 bitindex = vlan & 0x1F;
911
912 bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex));
913 if (vlan_on)
914
915 bits |= BIT(bitindex);
916 else
917
918 bits &= ~BIT(bitindex);
919 IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits);
920
921 return 0;
922}
923
924
925
926
927
928
929
930static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
931{
932 u32 offset;
933 u32 vlanbyte;
934
935 for (offset = 0; offset < hw->mac.vft_size; offset++)
936 IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0);
937
938 for (vlanbyte = 0; vlanbyte < 4; vlanbyte++)
939 for (offset = 0; offset < hw->mac.vft_size; offset++)
940 IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vlanbyte, offset),
941 0);
942
943 return 0;
944}
945
946
947
948
949
950
951
952
953
954static s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val)
955{
956 u32 atlas_ctl;
957
958 IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL,
959 IXGBE_ATLASCTL_WRITE_CMD | (reg << 8));
960 IXGBE_WRITE_FLUSH(hw);
961 udelay(10);
962 atlas_ctl = IXGBE_READ_REG(hw, IXGBE_ATLASCTL);
963 *val = (u8)atlas_ctl;
964
965 return 0;
966}
967
968
969
970
971
972
973
974
975
976static s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
977{
978 u32 atlas_ctl;
979
980 atlas_ctl = (reg << 8) | val;
981 IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl);
982 IXGBE_WRITE_FLUSH(hw);
983 udelay(10);
984
985 return 0;
986}
987
988
989
990
991
992
993
994
995
996
997static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
998 u8 byte_offset, u8 *eeprom_data)
999{
1000 s32 status = 0;
1001 u16 sfp_addr = 0;
1002 u16 sfp_data = 0;
1003 u16 sfp_stat = 0;
1004 u16 gssr;
1005 u32 i;
1006
1007 if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
1008 gssr = IXGBE_GSSR_PHY1_SM;
1009 else
1010 gssr = IXGBE_GSSR_PHY0_SM;
1011
1012 if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != 0)
1013 return IXGBE_ERR_SWFW_SYNC;
1014
1015 if (hw->phy.type == ixgbe_phy_nl) {
1016
1017
1018
1019
1020
1021 sfp_addr = (dev_addr << 8) + byte_offset;
1022 sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK);
1023 hw->phy.ops.write_reg_mdi(hw,
1024 IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR,
1025 MDIO_MMD_PMAPMD,
1026 sfp_addr);
1027
1028
1029 for (i = 0; i < 100; i++) {
1030 hw->phy.ops.read_reg_mdi(hw,
1031 IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT,
1032 MDIO_MMD_PMAPMD,
1033 &sfp_stat);
1034 sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK;
1035 if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS)
1036 break;
1037 usleep_range(10000, 20000);
1038 }
1039
1040 if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) {
1041 hw_dbg(hw, "EEPROM read did not pass.\n");
1042 status = IXGBE_ERR_SFP_NOT_PRESENT;
1043 goto out;
1044 }
1045
1046
1047 hw->phy.ops.read_reg_mdi(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA,
1048 MDIO_MMD_PMAPMD, &sfp_data);
1049
1050 *eeprom_data = (u8)(sfp_data >> 8);
1051 } else {
1052 status = IXGBE_ERR_PHY;
1053 }
1054
1055out:
1056 hw->mac.ops.release_swfw_sync(hw, gssr);
1057 return status;
1058}
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
1069 u8 *eeprom_data)
1070{
1071 return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR,
1072 byte_offset, eeprom_data);
1073}
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset,
1084 u8 *sff8472_data)
1085{
1086 return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR2,
1087 byte_offset, sff8472_data);
1088}
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098static void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw)
1099{
1100 struct ixgbe_bus_info *bus = &hw->bus;
1101 u16 pci_gen = 0;
1102 u16 pci_ctrl2 = 0;
1103
1104 ixgbe_set_lan_id_multi_port_pcie(hw);
1105
1106
1107 hw->eeprom.ops.read(hw, IXGBE_PCIE_GENERAL_PTR, &pci_gen);
1108 if ((pci_gen != 0) && (pci_gen != 0xFFFF)) {
1109
1110 hw->eeprom.ops.read(hw, pci_gen + IXGBE_PCIE_CTRL2, &pci_ctrl2);
1111
1112
1113 if ((pci_ctrl2 & IXGBE_PCIE_CTRL2_LAN_DISABLE) &&
1114 !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DISABLE_SELECT) &&
1115 !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DUMMY_ENABLE)) {
1116
1117 bus->func = 0;
1118 }
1119 }
1120}
1121
1122
1123
1124
1125
1126
1127
1128
1129static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb,
1130 u32 headroom, int strategy)
1131{
1132 u32 rxpktsize = IXGBE_RXPBSIZE_64KB;
1133 u8 i = 0;
1134
1135 if (!num_pb)
1136 return;
1137
1138
1139 switch (strategy) {
1140 case PBA_STRATEGY_WEIGHTED:
1141
1142 rxpktsize = IXGBE_RXPBSIZE_80KB;
1143 for (; i < 4; i++)
1144 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
1145
1146 rxpktsize = IXGBE_RXPBSIZE_48KB;
1147
1148 case PBA_STRATEGY_EQUAL:
1149 default:
1150
1151 for (; i < IXGBE_MAX_PACKET_BUFFERS; i++)
1152 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
1153 break;
1154 }
1155
1156
1157 for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++)
1158 IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB);
1159}
1160
1161static const struct ixgbe_mac_operations mac_ops_82598 = {
1162 .init_hw = &ixgbe_init_hw_generic,
1163 .reset_hw = &ixgbe_reset_hw_82598,
1164 .start_hw = &ixgbe_start_hw_82598,
1165 .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic,
1166 .get_media_type = &ixgbe_get_media_type_82598,
1167 .enable_rx_dma = &ixgbe_enable_rx_dma_generic,
1168 .get_mac_addr = &ixgbe_get_mac_addr_generic,
1169 .stop_adapter = &ixgbe_stop_adapter_generic,
1170 .get_bus_info = &ixgbe_get_bus_info_generic,
1171 .set_lan_id = &ixgbe_set_lan_id_multi_port_pcie_82598,
1172 .read_analog_reg8 = &ixgbe_read_analog_reg8_82598,
1173 .write_analog_reg8 = &ixgbe_write_analog_reg8_82598,
1174 .setup_link = &ixgbe_setup_mac_link_82598,
1175 .set_rxpba = &ixgbe_set_rxpba_82598,
1176 .check_link = &ixgbe_check_mac_link_82598,
1177 .get_link_capabilities = &ixgbe_get_link_capabilities_82598,
1178 .led_on = &ixgbe_led_on_generic,
1179 .led_off = &ixgbe_led_off_generic,
1180 .init_led_link_act = ixgbe_init_led_link_act_generic,
1181 .blink_led_start = &ixgbe_blink_led_start_generic,
1182 .blink_led_stop = &ixgbe_blink_led_stop_generic,
1183 .set_rar = &ixgbe_set_rar_generic,
1184 .clear_rar = &ixgbe_clear_rar_generic,
1185 .set_vmdq = &ixgbe_set_vmdq_82598,
1186 .clear_vmdq = &ixgbe_clear_vmdq_82598,
1187 .init_rx_addrs = &ixgbe_init_rx_addrs_generic,
1188 .update_mc_addr_list = &ixgbe_update_mc_addr_list_generic,
1189 .enable_mc = &ixgbe_enable_mc_generic,
1190 .disable_mc = &ixgbe_disable_mc_generic,
1191 .clear_vfta = &ixgbe_clear_vfta_82598,
1192 .set_vfta = &ixgbe_set_vfta_82598,
1193 .fc_enable = &ixgbe_fc_enable_82598,
1194 .setup_fc = ixgbe_setup_fc_generic,
1195 .fc_autoneg = ixgbe_fc_autoneg,
1196 .set_fw_drv_ver = NULL,
1197 .acquire_swfw_sync = &ixgbe_acquire_swfw_sync,
1198 .release_swfw_sync = &ixgbe_release_swfw_sync,
1199 .init_swfw_sync = NULL,
1200 .get_thermal_sensor_data = NULL,
1201 .init_thermal_sensor_thresh = NULL,
1202 .prot_autoc_read = &prot_autoc_read_generic,
1203 .prot_autoc_write = &prot_autoc_write_generic,
1204 .enable_rx = &ixgbe_enable_rx_generic,
1205 .disable_rx = &ixgbe_disable_rx_generic,
1206};
1207
1208static const struct ixgbe_eeprom_operations eeprom_ops_82598 = {
1209 .init_params = &ixgbe_init_eeprom_params_generic,
1210 .read = &ixgbe_read_eerd_generic,
1211 .write = &ixgbe_write_eeprom_generic,
1212 .write_buffer = &ixgbe_write_eeprom_buffer_bit_bang_generic,
1213 .read_buffer = &ixgbe_read_eerd_buffer_generic,
1214 .calc_checksum = &ixgbe_calc_eeprom_checksum_generic,
1215 .validate_checksum = &ixgbe_validate_eeprom_checksum_generic,
1216 .update_checksum = &ixgbe_update_eeprom_checksum_generic,
1217};
1218
1219static const struct ixgbe_phy_operations phy_ops_82598 = {
1220 .identify = &ixgbe_identify_phy_generic,
1221 .identify_sfp = &ixgbe_identify_module_generic,
1222 .init = &ixgbe_init_phy_ops_82598,
1223 .reset = &ixgbe_reset_phy_generic,
1224 .read_reg = &ixgbe_read_phy_reg_generic,
1225 .write_reg = &ixgbe_write_phy_reg_generic,
1226 .read_reg_mdi = &ixgbe_read_phy_reg_mdi,
1227 .write_reg_mdi = &ixgbe_write_phy_reg_mdi,
1228 .setup_link = &ixgbe_setup_phy_link_generic,
1229 .setup_link_speed = &ixgbe_setup_phy_link_speed_generic,
1230 .read_i2c_sff8472 = &ixgbe_read_i2c_sff8472_82598,
1231 .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598,
1232 .check_overtemp = &ixgbe_tn_check_overtemp,
1233};
1234
1235const struct ixgbe_info ixgbe_82598_info = {
1236 .mac = ixgbe_mac_82598EB,
1237 .get_invariants = &ixgbe_get_invariants_82598,
1238 .mac_ops = &mac_ops_82598,
1239 .eeprom_ops = &eeprom_ops_82598,
1240 .phy_ops = &phy_ops_82598,
1241 .mvals = ixgbe_mvals_8259X,
1242};
1243