1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include "h/skdrv1st.h"
25#include "h/skdrv2nd.h"
26
27
28
29
30
31#if (defined(DEBUG) || ((!defined(LINT)) && (!defined(SK_SLIM))))
32static const char SysKonnectFileId[] =
33 "@(#) $Id: skgeinit.c,v 1.97 2003/10/02 16:45:31 rschmidt Exp $ (C) Marvell.";
34#endif
35
36struct s_QOffTab {
37 int RxQOff;
38 int XsQOff;
39 int XaQOff;
40};
41static struct s_QOffTab QOffTab[] = {
42 {Q_R1, Q_XS1, Q_XA1}, {Q_R2, Q_XS2, Q_XA2}
43};
44
45struct s_Config {
46 char ScanString[8];
47 SK_U32 Value;
48};
49
50static struct s_Config OemConfig = {
51 {'O','E','M','_','C','o','n','f'},
52#ifdef SK_OEM_CONFIG
53 OEM_CONFIG_VALUE,
54#else
55 0,
56#endif
57};
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72void SkGePollRxD(
73SK_AC *pAC,
74SK_IOC IoC,
75int Port,
76SK_BOOL PollRxD)
77{
78 SK_GEPORT *pPrt;
79
80 pPrt = &pAC->GIni.GP[Port];
81
82 SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), (PollRxD) ?
83 CSR_ENA_POL : CSR_DIS_POL);
84}
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100void SkGePollTxD(
101SK_AC *pAC,
102SK_IOC IoC,
103int Port,
104SK_BOOL PollTxD)
105{
106 SK_GEPORT *pPrt;
107 SK_U32 DWord;
108
109 pPrt = &pAC->GIni.GP[Port];
110
111 DWord = (SK_U32)(PollTxD ? CSR_ENA_POL : CSR_DIS_POL);
112
113 if (pPrt->PXSQSize != 0) {
114 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), DWord);
115 }
116
117 if (pPrt->PXAQSize != 0) {
118 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), DWord);
119 }
120}
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136void SkGeYellowLED(
137SK_AC *pAC,
138SK_IOC IoC,
139int State)
140{
141 if (State == 0) {
142
143 SK_OUT8(IoC, B0_LED, LED_STAT_OFF);
144 }
145 else {
146
147 SK_OUT8(IoC, B0_LED, LED_STAT_ON);
148 }
149}
150
151
152#if (!defined(SK_SLIM) || defined(GENESIS))
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170void SkGeXmitLED(
171SK_AC *pAC,
172SK_IOC IoC,
173int Led,
174int Mode)
175{
176 SK_U32 LedIni;
177
178 switch (Mode) {
179 case SK_LED_ENA:
180 LedIni = SK_XMIT_DUR * (SK_U32)pAC->GIni.GIHstClkFact / 100;
181 SK_OUT32(IoC, Led + XMIT_LED_INI, LedIni);
182 SK_OUT8(IoC, Led + XMIT_LED_CTRL, LED_START);
183 break;
184 case SK_LED_TST:
185 SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_ON);
186 SK_OUT32(IoC, Led + XMIT_LED_CNT, 100);
187 SK_OUT8(IoC, Led + XMIT_LED_CTRL, LED_START);
188 break;
189 case SK_LED_DIS:
190 default:
191
192
193
194
195 SK_OUT32(IoC, Led + XMIT_LED_CNT, 0);
196 SK_OUT8(IoC, Led + XMIT_LED_TST, LED_T_OFF);
197 break;
198 }
199
200
201
202
203
204
205
206
207}
208#endif
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228static int DoCalcAddr(
229SK_AC *pAC,
230SK_GEPORT SK_FAR *pPrt,
231int QuSize,
232SK_U32 SK_FAR *StartVal,
233SK_U32 SK_FAR *QuStartAddr,
234SK_U32 SK_FAR *QuEndAddr)
235{
236 SK_U32 EndVal;
237 SK_U32 NextStart;
238 int Rtv;
239
240 Rtv = 0;
241 if (QuSize == 0) {
242 EndVal = *StartVal;
243 NextStart = EndVal;
244 }
245 else {
246 EndVal = *StartVal + ((SK_U32)QuSize * 1024) - 1;
247 NextStart = EndVal + 1;
248 }
249
250 if (pPrt->PState >= SK_PRT_INIT) {
251 if (*StartVal != *QuStartAddr || EndVal != *QuEndAddr) {
252 Rtv = 1;
253 }
254 }
255 else {
256 *QuStartAddr = *StartVal;
257 *QuEndAddr = EndVal;
258 }
259
260 *StartVal = NextStart;
261 return(Rtv);
262}
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283int SkGeInitAssignRamToQueues(
284SK_AC *pAC,
285int ActivePort,
286SK_BOOL DualNet)
287{
288 int i;
289 int UsedKilobytes;
290 int ActivePortKilobytes;
291 SK_GEPORT *pGePort;
292
293 UsedKilobytes = 0;
294
295 if (ActivePort >= pAC->GIni.GIMacsFound) {
296 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
297 ("SkGeInitAssignRamToQueues: ActivePort (%d) invalid\n",
298 ActivePort));
299 return(1);
300 }
301 if (((pAC->GIni.GIMacsFound * (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE)) +
302 ((RAM_QUOTA_SYNC == 0) ? 0 : SK_MIN_TXQ_SIZE)) > pAC->GIni.GIRamSize) {
303 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
304 ("SkGeInitAssignRamToQueues: Not enough memory (%d)\n",
305 pAC->GIni.GIRamSize));
306 return(2);
307 }
308
309 if (DualNet) {
310
311 ActivePortKilobytes = pAC->GIni.GIRamSize / pAC->GIni.GIMacsFound;
312 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
313
314 pGePort = &pAC->GIni.GP[i];
315
316
317 ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE);
318
319
320 pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB((
321 ActivePortKilobytes * (unsigned long) RAM_QUOTA_RX) / 100))
322 + SK_MIN_RXQ_SIZE;
323
324 ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE);
325
326
327 pGePort->PXSQSize = 0;
328
329
330 pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes +
331 SK_MIN_TXQ_SIZE);
332 }
333 }
334 else {
335
336
337
338 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
339
340 if (i != ActivePort) {
341 pGePort = &pAC->GIni.GP[i];
342
343 pGePort->PRxQSize = SK_MIN_RXQ_SIZE;
344 pGePort->PXAQSize = SK_MIN_TXQ_SIZE;
345 pGePort->PXSQSize = 0;
346
347
348 UsedKilobytes += pGePort->PRxQSize + pGePort->PXAQSize;
349 }
350 }
351
352 ActivePortKilobytes = pAC->GIni.GIRamSize - UsedKilobytes;
353
354
355
356 ActivePortKilobytes -= (SK_MIN_RXQ_SIZE + SK_MIN_TXQ_SIZE);
357 pGePort = &pAC->GIni.GP[ActivePort];
358
359
360 pGePort->PRxQSize = (int) (ROUND_QUEUE_SIZE_KB((ActivePortKilobytes *
361 (unsigned long) RAM_QUOTA_RX) / 100)) + SK_MIN_RXQ_SIZE;
362
363 ActivePortKilobytes -= (pGePort->PRxQSize - SK_MIN_RXQ_SIZE);
364
365
366 pGePort->PXSQSize = 0;
367
368
369 pGePort->PXAQSize = (int) ROUND_QUEUE_SIZE_KB(ActivePortKilobytes) +
370 SK_MIN_TXQ_SIZE;
371 }
372#ifdef VCPU
373 VCPUprintf(0, "PRxQSize=%u, PXSQSize=%u, PXAQSize=%u\n",
374 pGePort->PRxQSize, pGePort->PXSQSize, pGePort->PXAQSize);
375#endif
376
377 return(0);
378}
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405static int SkGeCheckQSize(
406SK_AC *pAC,
407int Port)
408{
409 SK_GEPORT *pPrt;
410 int i;
411 int Rtv;
412 int Rtv2;
413 SK_U32 StartAddr;
414#ifndef SK_SLIM
415 int UsedMem;
416#endif
417
418 Rtv = 0;
419
420#ifndef SK_SLIM
421
422 UsedMem = 0;
423 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
424 pPrt = &pAC->GIni.GP[i];
425
426 if ((pPrt->PRxQSize & QZ_UNITS) != 0 ||
427 (pPrt->PXSQSize & QZ_UNITS) != 0 ||
428 (pPrt->PXAQSize & QZ_UNITS) != 0) {
429
430 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
431 return(1);
432 }
433
434 if (i == Port && pPrt->PRxQSize < SK_MIN_RXQ_SIZE) {
435 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E011, SKERR_HWI_E011MSG);
436 return(1);
437 }
438
439
440
441
442
443 if ((i == Port && pPrt->PXSQSize == 0 && pPrt->PXAQSize == 0) ||
444 (pAC->GIni.GIPortUsage == SK_JUMBO_LINK &&
445 ((pPrt->PXSQSize > 0 && pPrt->PXSQSize < SK_MIN_TXQ_SIZE) ||
446 (pPrt->PXAQSize > 0 && pPrt->PXAQSize < SK_MIN_TXQ_SIZE)))) {
447 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E023, SKERR_HWI_E023MSG);
448 return(1);
449 }
450
451 UsedMem += pPrt->PRxQSize + pPrt->PXSQSize + pPrt->PXAQSize;
452 }
453
454 if (UsedMem > pAC->GIni.GIRamSize) {
455 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E012, SKERR_HWI_E012MSG);
456 return(1);
457 }
458#endif
459
460
461 StartAddr = pAC->GIni.GIRamOffs;
462 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
463 pPrt = &pAC->GIni.GP[i];
464
465
466 Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PRxQSize, &StartAddr,
467 &pPrt->PRxQRamStart, &pPrt->PRxQRamEnd);
468 Rtv |= Rtv2;
469
470
471 Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PXSQSize, &StartAddr,
472 &pPrt->PXsQRamStart, &pPrt->PXsQRamEnd);
473 Rtv |= Rtv2;
474
475
476 Rtv2 = DoCalcAddr(pAC, pPrt, pPrt->PXAQSize, &StartAddr,
477 &pPrt->PXaQRamStart, &pPrt->PXaQRamEnd);
478 Rtv |= Rtv2;
479
480 if (Rtv) {
481 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E013, SKERR_HWI_E013MSG);
482 return(1);
483 }
484 }
485
486 return(0);
487}
488
489
490#ifdef GENESIS
491
492
493
494
495
496
497
498
499
500
501
502
503static void SkGeInitMacArb(
504SK_AC *pAC,
505SK_IOC IoC)
506{
507
508 SK_OUT16(IoC, B3_MA_TO_CTRL, MA_RST_CLR);
509
510
511 SK_OUT8(IoC, B3_MA_TOINI_RX1, SK_MAC_TO_53);
512 SK_OUT8(IoC, B3_MA_TOINI_RX2, SK_MAC_TO_53);
513 SK_OUT8(IoC, B3_MA_TOINI_TX1, SK_MAC_TO_53);
514 SK_OUT8(IoC, B3_MA_TOINI_TX2, SK_MAC_TO_53);
515
516 SK_OUT8(IoC, B3_MA_RCINI_RX1, 0);
517 SK_OUT8(IoC, B3_MA_RCINI_RX2, 0);
518 SK_OUT8(IoC, B3_MA_RCINI_TX1, 0);
519 SK_OUT8(IoC, B3_MA_RCINI_TX2, 0);
520
521
522
523
524
525
526
527
528}
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543static void SkGeInitPktArb(
544SK_AC *pAC,
545SK_IOC IoC)
546{
547
548 SK_OUT16(IoC, B3_PA_CTRL, PA_RST_CLR);
549
550
551 SK_OUT16(IoC, B3_PA_TOINI_RX1, SK_PKT_TO_MAX);
552 SK_OUT16(IoC, B3_PA_TOINI_RX2, SK_PKT_TO_MAX);
553 SK_OUT16(IoC, B3_PA_TOINI_TX1, SK_PKT_TO_MAX);
554 SK_OUT16(IoC, B3_PA_TOINI_TX2, SK_PKT_TO_MAX);
555
556
557
558
559
560
561 if (pAC->GIni.GIPortUsage != SK_JUMBO_LINK) {
562 if (pAC->GIni.GIMacsFound == 1) {
563 SK_OUT16(IoC, B3_PA_CTRL, PA_ENA_TO_TX1);
564 }
565 else {
566 SK_OUT16(IoC, B3_PA_CTRL, PA_ENA_TO_TX1 | PA_ENA_TO_TX2);
567 }
568 }
569}
570#endif
571
572
573
574
575
576
577
578
579
580
581
582
583static void SkGeInitMacFifo(
584SK_AC *pAC,
585SK_IOC IoC,
586int Port)
587{
588 SK_U16 Word;
589#ifdef VCPU
590 SK_U32 DWord;
591#endif
592
593
594
595
596
597
598
599
600#ifdef GENESIS
601 if (pAC->GIni.GIGenesis) {
602
603 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_CLR);
604 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_RX_CTRL_DEF);
605 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_ENA_OP_MD);
606
607
608 SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_CLR);
609 SK_OUT16(IoC, MR_ADDR(Port, TX_MFF_CTRL1), MFF_TX_CTRL_DEF);
610 SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_ENA_OP_MD);
611
612
613 if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK) {
614 SK_OUT16(IoC, MR_ADDR(Port, RX_MFF_CTRL1), MFF_ENA_FLUSH);
615 }
616 }
617#endif
618
619#ifdef YUKON
620 if (pAC->GIni.GIYukon) {
621
622 SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_MSK), (SK_U16)RX_FF_FL_DEF_MSK);
623
624 Word = (SK_U16)GMF_RX_CTRL_DEF;
625
626
627 if (pAC->GIni.GIYukonLite && pAC->GIni.GIChipId == CHIP_ID_YUKON) {
628
629 Word &= ~GMF_RX_F_FL_ON;
630 }
631
632
633 SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR);
634 SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), Word);
635
636
637 SK_OUT16(IoC, MR_ADDR(Port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF);
638
639
640 SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_CLR);
641 SK_OUT16(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U16)GMF_TX_CTRL_DEF);
642
643#ifdef VCPU
644 SK_IN32(IoC, MR_ADDR(Port, RX_GMF_AF_THR), &DWord);
645 SK_IN32(IoC, MR_ADDR(Port, TX_GMF_AE_THR), &DWord);
646#endif
647
648
649
650 }
651#endif
652
653}
654
655#ifdef SK_LNK_SYNC_CNT
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675void SkGeLoadLnkSyncCnt(
676SK_AC *pAC,
677SK_IOC IoC,
678int Port,
679SK_U32 CntVal)
680{
681 SK_U32 OrgIMsk;
682 SK_U32 NewIMsk;
683 SK_U32 ISrc;
684 SK_BOOL IrqPend;
685
686
687 SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_STOP);
688
689
690
691
692
693
694
695
696
697 IrqPend = SK_FALSE;
698 SK_IN32(IoC, B0_ISRC, &ISrc);
699 SK_IN32(IoC, B0_IMSK, &OrgIMsk);
700 if (Port == MAC_1) {
701 NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M1;
702 if ((ISrc & IS_LNK_SYNC_M1) != 0) {
703 IrqPend = SK_TRUE;
704 }
705 }
706 else {
707 NewIMsk = OrgIMsk & ~IS_LNK_SYNC_M2;
708 if ((ISrc & IS_LNK_SYNC_M2) != 0) {
709 IrqPend = SK_TRUE;
710 }
711 }
712 if (!IrqPend) {
713 SK_OUT32(IoC, B0_IMSK, NewIMsk);
714 }
715
716
717 SK_OUT32(IoC, MR_ADDR(Port, LNK_SYNC_INI), CntVal);
718
719
720 SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_START);
721
722 if (!IrqPend) {
723
724 SK_OUT8(IoC, MR_ADDR(Port, LNK_SYNC_CTRL), LED_CLR_IRQ);
725 SK_OUT32(IoC, B0_IMSK, OrgIMsk);
726 }
727}
728#endif
729
730#if defined(SK_DIAG) || defined(SK_CFG_SYNC)
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759int SkGeCfgSync(
760SK_AC *pAC,
761SK_IOC IoC,
762int Port,
763SK_U32 IntTime,
764SK_U32 LimCount,
765int SyncMode)
766{
767 int Rtv;
768
769 Rtv = 0;
770
771
772 if (LimCount > IntTime ||
773 (LimCount == 0 && IntTime != 0) ||
774 (LimCount != 0 && IntTime == 0)) {
775
776 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
777 return(1);
778 }
779
780 if (pAC->GIni.GP[Port].PXSQSize == 0) {
781 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E009, SKERR_HWI_E009MSG);
782 return(2);
783 }
784
785
786 IntTime = (IntTime / 2) * pAC->GIni.GIHstClkFact / 100;
787 LimCount = LimCount / 8;
788
789 if (IntTime > TXA_MAX_VAL || LimCount > TXA_MAX_VAL) {
790 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E010, SKERR_HWI_E010MSG);
791 return(1);
792 }
793
794
795
796
797
798
799
800
801
802
803
804 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
805 TXA_ENA_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
806
807 SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), IntTime);
808 SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), LimCount);
809
810 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
811 (SK_U8)(SyncMode & (TXA_ENA_ALLOC | TXA_DIS_ALLOC)));
812
813 if (IntTime != 0 || LimCount != 0) {
814 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_DIS_FSYNC | TXA_START_RC);
815 }
816
817 return(0);
818}
819#endif
820
821
822
823
824
825
826
827
828
829
830
831
832
833static void DoInitRamQueue(
834SK_AC *pAC,
835SK_IOC IoC,
836int QuIoOffs,
837SK_U32 QuStartAddr,
838SK_U32 QuEndAddr,
839int QuType)
840{
841 SK_U32 RxUpThresVal;
842 SK_U32 RxLoThresVal;
843
844 if (QuStartAddr != QuEndAddr) {
845
846 RxUpThresVal = (QuEndAddr + 1 - QuStartAddr - SK_RB_ULPP) / 8;
847 RxLoThresVal = (QuEndAddr + 1 - QuStartAddr - SK_RB_LLPP_B)/8;
848
849
850 QuStartAddr = QuStartAddr / 8;
851 QuEndAddr = QuEndAddr / 8;
852
853
854 SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_RST_CLR);
855
856
857 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_START), QuStartAddr);
858 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_END), QuEndAddr);
859 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_WP), QuStartAddr);
860 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RP), QuStartAddr);
861
862 switch (QuType) {
863 case SK_RX_SRAM_Q:
864
865 RxLoThresVal += (SK_RB_LLPP_B - SK_RB_LLPP_S) / 8;
866
867
868 case SK_RX_BRAM_Q:
869
870
871 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_UTPP), RxUpThresVal);
872 SK_OUT32(IoC, RB_ADDR(QuIoOffs, RB_RX_LTPP), RxLoThresVal);
873
874
875 break;
876 case SK_TX_RAM_Q:
877
878
879
880
881
882
883
884 if (pAC->GIni.GIPortUsage == SK_JUMBO_LINK ||
885 pAC->GIni.GIYukon) {
886
887 SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_STFWD);
888 }
889 break;
890 }
891
892
893 SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_ENA_OP_MD);
894 }
895 else {
896
897 SK_OUT8(IoC, RB_ADDR(QuIoOffs, RB_CTRL), RB_RST_SET);
898 }
899}
900
901
902
903
904
905
906
907
908
909
910
911
912static void SkGeInitRamBufs(
913SK_AC *pAC,
914SK_IOC IoC,
915int Port)
916{
917 SK_GEPORT *pPrt;
918 int RxQType;
919
920 pPrt = &pAC->GIni.GP[Port];
921
922 if (pPrt->PRxQSize == SK_MIN_RXQ_SIZE) {
923 RxQType = SK_RX_SRAM_Q;
924 }
925 else {
926 RxQType = SK_RX_BRAM_Q;
927 }
928
929 DoInitRamQueue(pAC, IoC, pPrt->PRxQOff, pPrt->PRxQRamStart,
930 pPrt->PRxQRamEnd, RxQType);
931
932 DoInitRamQueue(pAC, IoC, pPrt->PXsQOff, pPrt->PXsQRamStart,
933 pPrt->PXsQRamEnd, SK_TX_RAM_Q);
934
935 DoInitRamQueue(pAC, IoC, pPrt->PXaQOff, pPrt->PXaQRamStart,
936 pPrt->PXaQRamEnd, SK_TX_RAM_Q);
937
938}
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954void SkGeInitRamIface(
955SK_AC *pAC,
956SK_IOC IoC)
957{
958
959 SK_OUT16(IoC, B3_RI_CTRL, RI_RST_CLR);
960
961
962 SK_OUT8(IoC, B3_RI_WTO_R1, SK_RI_TO_53);
963 SK_OUT8(IoC, B3_RI_WTO_XA1, SK_RI_TO_53);
964 SK_OUT8(IoC, B3_RI_WTO_XS1, SK_RI_TO_53);
965 SK_OUT8(IoC, B3_RI_RTO_R1, SK_RI_TO_53);
966 SK_OUT8(IoC, B3_RI_RTO_XA1, SK_RI_TO_53);
967 SK_OUT8(IoC, B3_RI_RTO_XS1, SK_RI_TO_53);
968 SK_OUT8(IoC, B3_RI_WTO_R2, SK_RI_TO_53);
969 SK_OUT8(IoC, B3_RI_WTO_XA2, SK_RI_TO_53);
970 SK_OUT8(IoC, B3_RI_WTO_XS2, SK_RI_TO_53);
971 SK_OUT8(IoC, B3_RI_RTO_R2, SK_RI_TO_53);
972 SK_OUT8(IoC, B3_RI_RTO_XA2, SK_RI_TO_53);
973 SK_OUT8(IoC, B3_RI_RTO_XS2, SK_RI_TO_53);
974
975}
976
977
978
979
980
981
982
983
984
985
986
987
988static void SkGeInitBmu(
989SK_AC *pAC,
990SK_IOC IoC,
991int Port)
992{
993 SK_GEPORT *pPrt;
994 SK_U32 RxWm;
995 SK_U32 TxWm;
996
997 pPrt = &pAC->GIni.GP[Port];
998
999 RxWm = SK_BMU_RX_WM;
1000 TxWm = SK_BMU_TX_WM;
1001
1002 if (!pAC->GIni.GIPciSlot64 && !pAC->GIni.GIPciClock66) {
1003
1004 RxWm /= 2;
1005 TxWm /= 2;
1006 }
1007
1008
1009 SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_CLR_RESET);
1010 SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_F), RxWm);
1011
1012
1013
1014
1015
1016 if (pPrt->PXSQSize != 0) {
1017 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_CLR_RESET);
1018 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_F), TxWm);
1019 }
1020
1021 if (pPrt->PXAQSize != 0) {
1022 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_CLR_RESET);
1023 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_F), TxWm);
1024 }
1025
1026
1027
1028
1029}
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045static SK_U32 TestStopBit(
1046SK_AC *pAC,
1047SK_IOC IoC,
1048int QuIoOffs)
1049{
1050 SK_U32 QuCsr;
1051
1052 SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
1053
1054 if ((QuCsr & (CSR_STOP | CSR_SV_IDLE)) == 0) {
1055
1056 SK_OUT32(IoC, Q_ADDR(QuIoOffs, Q_CSR), CSR_STOP);
1057
1058 SK_IN32(IoC, Q_ADDR(QuIoOffs, Q_CSR), &QuCsr);
1059 }
1060
1061 return(QuCsr);
1062}
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143void SkGeStopPort(
1144SK_AC *pAC,
1145SK_IOC IoC,
1146int Port,
1147int Dir,
1148int RstMode)
1149{
1150#ifndef SK_DIAG
1151 SK_EVPARA Para;
1152#endif
1153 SK_GEPORT *pPrt;
1154 SK_U32 DWord;
1155 SK_U32 XsCsr;
1156 SK_U32 XaCsr;
1157 SK_U64 ToutStart;
1158 int i;
1159 int ToutCnt;
1160
1161 pPrt = &pAC->GIni.GP[Port];
1162
1163 if ((Dir & SK_STOP_TX) != 0) {
1164
1165 SkMacRxTxDisable(pAC, IoC, Port);
1166
1167
1168
1169
1170
1171
1172 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_STOP);
1173 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_STOP);
1174
1175 ToutStart = SkOsGetTime(pAC);
1176 ToutCnt = 0;
1177 do {
1178
1179
1180
1181
1182 SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
1183 PA_CLR_TO_TX1 : PA_CLR_TO_TX2));
1184
1185
1186
1187
1188
1189 SkMacFlushTxFifo(pAC, IoC, Port);
1190
1191 XsCsr = TestStopBit(pAC, IoC, pPrt->PXsQOff);
1192 XaCsr = TestStopBit(pAC, IoC, pPrt->PXaQOff);
1193
1194 if (SkOsGetTime(pAC) - ToutStart > (SK_TICKS_PER_SEC / 18)) {
1195
1196
1197
1198
1199 ToutCnt++;
1200 if (ToutCnt > 1) {
1201
1202
1203
1204
1205
1206 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E018,
1207 SKERR_HWI_E018MSG);
1208#ifndef SK_DIAG
1209 Para.Para64 = Port;
1210 SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);
1211#endif
1212 return;
1213 }
1214
1215
1216
1217
1218 ToutStart = SkOsGetTime(pAC);
1219
1220 if ((XsCsr & CSR_STOP) != 0) {
1221 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_START);
1222 }
1223 if ((XaCsr & CSR_STOP) != 0) {
1224 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_START);
1225 }
1226 }
1227
1228
1229
1230
1231
1232 } while ((XsCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE ||
1233 (XaCsr & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE);
1234
1235
1236 if (RstMode == SK_SOFT_RST) {
1237 SkMacSoftRst(pAC, IoC, Port);
1238 }
1239 else {
1240 SkMacHardRst(pAC, IoC, Port);
1241 }
1242
1243
1244 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL),
1245 TXA_DIS_FSYNC | TXA_DIS_ALLOC | TXA_STOP_RC);
1246
1247
1248 SK_OUT32(IoC, MR_ADDR(Port, TXA_ITI_INI), 0L);
1249 SK_OUT32(IoC, MR_ADDR(Port, TXA_LIM_INI), 0L);
1250
1251
1252
1253
1254 SK_OUT32(IoC, Q_ADDR(pPrt->PXaQOff, Q_CSR), CSR_SET_RESET);
1255
1256 SK_OUT32(IoC, Q_ADDR(pPrt->PXsQOff, Q_CSR), CSR_SET_RESET);
1257
1258 SK_OUT8(IoC, RB_ADDR(pPrt->PXaQOff, RB_CTRL), RB_RST_SET);
1259
1260 SK_OUT8(IoC, RB_ADDR(pPrt->PXsQOff, RB_CTRL), RB_RST_SET);
1261
1262
1263#ifdef GENESIS
1264 if (pAC->GIni.GIGenesis) {
1265
1266 SK_OUT8(IoC, MR_ADDR(Port, TX_MFF_CTRL2), MFF_RST_SET);
1267
1268
1269
1270 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_DIS);
1271 }
1272#endif
1273
1274#ifdef YUKON
1275 if (pAC->GIni.GIYukon) {
1276
1277 SK_OUT8(IoC, MR_ADDR(Port, TX_GMF_CTRL_T), (SK_U8)GMF_RST_SET);
1278 }
1279#endif
1280 }
1281
1282 if ((Dir & SK_STOP_RX) != 0) {
1283
1284
1285
1286
1287
1288
1289
1290 SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_STOP);
1291
1292 i = 100;
1293 do {
1294
1295
1296
1297
1298 SK_OUT16(IoC, B3_PA_CTRL, (SK_U16)((Port == MAC_1) ?
1299 PA_CLR_TO_RX1 : PA_CLR_TO_RX2));
1300
1301 DWord = TestStopBit(pAC, IoC, pPrt->PRxQOff);
1302
1303
1304 if (--i == 0) {
1305 SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_HWI_E024,
1306 SKERR_HWI_E024MSG);
1307 break;
1308 }
1309
1310
1311
1312
1313
1314 } while ((DWord & (CSR_STOP | CSR_SV_IDLE)) != CSR_SV_IDLE);
1315
1316
1317
1318
1319
1320
1321 SK_OUT32(IoC, Q_ADDR(pPrt->PRxQOff, Q_CSR), CSR_SET_RESET);
1322
1323 SK_OUT8(IoC, RB_ADDR(pPrt->PRxQOff, RB_CTRL), RB_RST_SET);
1324
1325
1326#ifdef GENESIS
1327 if (pAC->GIni.GIGenesis) {
1328
1329 SK_OUT8(IoC, MR_ADDR(Port, RX_MFF_CTRL2), MFF_RST_SET);
1330
1331
1332 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_DIS);
1333 }
1334#endif
1335
1336#ifdef YUKON
1337 if (pAC->GIni.GIYukon) {
1338
1339 SK_OUT8(IoC, MR_ADDR(Port, RX_GMF_CTRL_T), (SK_U8)GMF_RST_SET);
1340 }
1341#endif
1342 }
1343}
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356static void SkGeInit0(
1357SK_AC *pAC,
1358SK_IOC IoC)
1359{
1360 int i;
1361 SK_GEPORT *pPrt;
1362
1363 for (i = 0; i < SK_MAX_MACS; i++) {
1364 pPrt = &pAC->GIni.GP[i];
1365
1366 pPrt->PState = SK_PRT_RESET;
1367 pPrt->PRxQOff = QOffTab[i].RxQOff;
1368 pPrt->PXsQOff = QOffTab[i].XsQOff;
1369 pPrt->PXaQOff = QOffTab[i].XaQOff;
1370 pPrt->PCheckPar = SK_FALSE;
1371 pPrt->PIsave = 0;
1372 pPrt->PPrevShorts = 0;
1373 pPrt->PLinkResCt = 0;
1374 pPrt->PAutoNegTOCt = 0;
1375 pPrt->PPrevRx = 0;
1376 pPrt->PPrevFcs = 0;
1377 pPrt->PRxLim = SK_DEF_RX_WA_LIM;
1378 pPrt->PLinkMode = (SK_U8)SK_LMODE_AUTOFULL;
1379 pPrt->PLinkSpeedCap = (SK_U8)SK_LSPEED_CAP_1000MBPS;
1380 pPrt->PLinkSpeed = (SK_U8)SK_LSPEED_1000MBPS;
1381 pPrt->PLinkSpeedUsed = (SK_U8)SK_LSPEED_STAT_UNKNOWN;
1382 pPrt->PLinkModeConf = (SK_U8)SK_LMODE_AUTOSENSE;
1383 pPrt->PFlowCtrlMode = (SK_U8)SK_FLOW_MODE_SYM_OR_REM;
1384 pPrt->PLinkCap = (SK_U8)(SK_LMODE_CAP_HALF | SK_LMODE_CAP_FULL |
1385 SK_LMODE_CAP_AUTOHALF | SK_LMODE_CAP_AUTOFULL);
1386 pPrt->PLinkModeStatus = (SK_U8)SK_LMODE_STAT_UNKNOWN;
1387 pPrt->PFlowCtrlCap = (SK_U8)SK_FLOW_MODE_SYM_OR_REM;
1388 pPrt->PFlowCtrlStatus = (SK_U8)SK_FLOW_STAT_NONE;
1389 pPrt->PMSCap = 0;
1390 pPrt->PMSMode = (SK_U8)SK_MS_MODE_AUTO;
1391 pPrt->PMSStatus = (SK_U8)SK_MS_STAT_UNSET;
1392 pPrt->PLipaAutoNeg = (SK_U8)SK_LIPA_UNKNOWN;
1393 pPrt->PAutoNegFail = SK_FALSE;
1394 pPrt->PHWLinkUp = SK_FALSE;
1395 pPrt->PLinkBroken = SK_TRUE;
1396 pPrt->PPhyPowerState = PHY_PM_OPERATIONAL_MODE;
1397 pPrt->PMacColThres = TX_COL_DEF;
1398 pPrt->PMacJamLen = TX_JAM_LEN_DEF;
1399 pPrt->PMacJamIpgVal = TX_JAM_IPG_DEF;
1400 pPrt->PMacJamIpgData = TX_IPG_JAM_DEF;
1401 pPrt->PMacIpgData = IPG_DATA_DEF;
1402 pPrt->PMacLimit4 = SK_FALSE;
1403 }
1404
1405 pAC->GIni.GIPortUsage = SK_RED_LINK;
1406 pAC->GIni.GILedBlinkCtrl = (SK_U16)OemConfig.Value;
1407 pAC->GIni.GIValIrqMask = IS_ALL_MSK;
1408
1409}
1410
1411#ifdef SK_PCI_RESET
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427static int SkGePciReset(
1428SK_AC *pAC,
1429SK_IOC IoC)
1430{
1431 int i;
1432 SK_U16 PmCtlSts;
1433 SK_U32 Bp1;
1434 SK_U32 Bp2;
1435 SK_U16 PciCmd;
1436 SK_U8 Cls;
1437 SK_U8 Lat;
1438 SK_U8 ConfigSpace[PCI_CFG_SIZE];
1439
1440
1441
1442
1443
1444
1445 for (i = 0; i < PCI_CFG_SIZE; i++) {
1446 SkPciReadCfgDWord(pAC, i*4, &ConfigSpace[i]);
1447 }
1448
1449
1450 SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D3);
1451 SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
1452
1453 if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D3) {
1454 return(1);
1455 }
1456
1457
1458 SkPciWriteCfgWord(pAC, PCI_PM_CTL_STS, PCI_PM_STATE_D0);
1459
1460
1461 SkPciReadCfgWord(pAC, PCI_PM_CTL_STS, &PmCtlSts);
1462
1463 if ((PmCtlSts & PCI_PM_STATE_MSK) != PCI_PM_STATE_D0) {
1464 return(1);
1465 }
1466
1467
1468 SkPciReadCfgWord(pAC, PCI_COMMAND, &PciCmd);
1469 SkPciReadCfgByte(pAC, PCI_CACHE_LSZ, &Cls);
1470 SkPciReadCfgDWord(pAC, PCI_BASE_1ST, &Bp1);
1471 SkPciReadCfgDWord(pAC, PCI_BASE_2ND, &Bp2);
1472 SkPciReadCfgByte(pAC, PCI_LAT_TIM, &Lat);
1473
1474 if (PciCmd != 0 || Cls != (SK_U8)0 || Lat != (SK_U8)0 ||
1475 (Bp1 & 0xfffffff0L) != 0 || Bp2 != 1) {
1476 return(1);
1477 }
1478
1479
1480 for (i = 0; i < PCI_CFG_SIZE; i++) {
1481 SkPciWriteCfgDWord(pAC, i*4, ConfigSpace[i]);
1482 }
1483
1484 return(0);
1485}
1486
1487#endif
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510static int SkGeInit1(
1511SK_AC *pAC,
1512SK_IOC IoC)
1513{
1514 SK_U8 Byte;
1515 SK_U16 Word;
1516 SK_U16 CtrlStat;
1517 SK_U32 DWord;
1518 int RetVal;
1519 int i;
1520
1521 RetVal = 0;
1522
1523
1524 SK_IN16(IoC, B0_CTST, &CtrlStat);
1525
1526#ifdef SK_PCI_RESET
1527 (void)SkGePciReset(pAC, IoC);
1528#endif
1529
1530
1531 SK_OUT8(IoC, B0_CTST, CS_RST_SET);
1532
1533
1534 SK_OUT8(IoC, B0_CTST, CS_RST_CLR);
1535
1536
1537
1538
1539
1540
1541 SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
1542
1543 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
1544 SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
1545 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
1546
1547
1548 SK_OUT8(IoC, B0_CTST, CS_MRST_CLR);
1549
1550#ifdef CLK_RUN
1551 CtrlStat |= CS_CLK_RUN_ENA;
1552#endif
1553
1554
1555 SK_OUT16(IoC, B0_CTST, (SK_U16)(CtrlStat &
1556 (CS_CLK_RUN_HOT | CS_CLK_RUN_RST | CS_CLK_RUN_ENA)));
1557
1558
1559 SK_IN8(IoC, B2_CHIP_ID, &Byte);
1560 pAC->GIni.GIChipId = Byte;
1561
1562
1563 SK_IN8(IoC, B2_MAC_CFG, &Byte);
1564 pAC->GIni.GIMacsFound = (Byte & CFG_SNG_MAC) ? 1 : 2;
1565
1566
1567 pAC->GIni.GIChipRev = (SK_U8)((Byte & CFG_CHIP_R_MSK) >> 4);
1568
1569
1570 SK_IN16(IoC, B0_CTST, &CtrlStat);
1571
1572
1573 SK_IN8(IoC, B2_E_0, &Byte);
1574
1575 pAC->GIni.GIGenesis = SK_FALSE;
1576 pAC->GIni.GIYukon = SK_FALSE;
1577 pAC->GIni.GIYukonLite = SK_FALSE;
1578
1579#ifdef GENESIS
1580 if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {
1581
1582 pAC->GIni.GIGenesis = SK_TRUE;
1583
1584 if (Byte == (SK_U8)3) {
1585
1586 pAC->GIni.GIRamSize = 1024;
1587 pAC->GIni.GIRamOffs = (SK_U32)512 * 1024;
1588 }
1589 else {
1590 pAC->GIni.GIRamSize = (int)Byte * 512;
1591 pAC->GIni.GIRamOffs = 0;
1592 }
1593
1594 pAC->GIni.GIHstClkFact = SK_FACT_53;
1595
1596
1597 pAC->GIni.GIPollTimerVal =
1598 SK_DPOLL_DEF * (SK_U32)pAC->GIni.GIHstClkFact / 100;
1599 }
1600#endif
1601
1602#ifdef YUKON
1603 if (pAC->GIni.GIChipId != CHIP_ID_GENESIS) {
1604
1605 pAC->GIni.GIYukon = SK_TRUE;
1606
1607 pAC->GIni.GIRamSize = (Byte == (SK_U8)0) ? 128 : (int)Byte * 4;
1608
1609 pAC->GIni.GIRamOffs = 0;
1610
1611
1612 pAC->GIni.GIWolOffs = (pAC->GIni.GIChipId == CHIP_ID_YUKON &&
1613 pAC->GIni.GIChipRev == 0) ? WOL_REG_OFFS : 0;
1614
1615
1616 SK_IN16(IoC, PCI_C(PCI_PM_CAP_REG), &Word);
1617
1618
1619 if (((CtrlStat & CS_VAUX_AVAIL) != 0) &&
1620
1621 ((Word & PCI_PME_D3C_SUP) != 0)) {
1622
1623 pAC->GIni.GIVauxAvail = SK_TRUE;
1624 }
1625
1626 if (pAC->GIni.GIChipId == CHIP_ID_YUKON_LITE) {
1627
1628 pAC->GIni.GIYukonLite = SK_TRUE;
1629 }
1630 else {
1631
1632 SK_IN32(IoC, B2_FAR, &DWord);
1633
1634
1635 SK_OUT8(IoC, B2_FAR + 3, 0xff);
1636 SK_IN8(IoC, B2_FAR + 3, &Byte);
1637
1638 if (Byte != 0) {
1639
1640 pAC->GIni.GIYukonLite = SK_TRUE;
1641
1642
1643 SK_OUT32(IoC, B2_FAR, DWord);
1644 }
1645 }
1646
1647
1648 SK_OUT8(IoC, B0_POWER_CTRL, (SK_U8)(PC_VAUX_ENA | PC_VCC_ENA |
1649 PC_VAUX_OFF | PC_VCC_ON));
1650
1651
1652 SK_IN32(IoC, B0_ISRC, &DWord);
1653
1654 if ((DWord & IS_HW_ERR) != 0) {
1655
1656 SK_IN32(IoC, B0_HWE_ISRC, &DWord);
1657
1658 if ((DWord & IS_IRQ_SENSOR) != 0) {
1659
1660 pAC->GIni.GIValIrqMask &= ~IS_HW_ERR;
1661 }
1662 }
1663
1664 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
1665
1666 SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_SET);
1667
1668
1669 SK_OUT16(IoC, MR_ADDR(i, GMAC_LINK_CTRL), GMLC_RST_CLR);
1670 }
1671
1672 pAC->GIni.GIHstClkFact = SK_FACT_78;
1673
1674 pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX;
1675 }
1676#endif
1677
1678
1679 pAC->GIni.GIPciSlot64 = (SK_BOOL)((CtrlStat & CS_BUS_SLOT_SZ) != 0);
1680
1681
1682 pAC->GIni.GIPciClock66 = (SK_BOOL)((CtrlStat & CS_BUS_CLOCK) != 0);
1683
1684
1685 SK_IN8(IoC, PCI_C(PCI_REV_ID), &Byte);
1686 pAC->GIni.GIPciHwRev = Byte;
1687
1688
1689 SK_IN8(IoC, B2_PMD_TYP, &Byte);
1690 pAC->GIni.GICopperType = (SK_U8)(Byte == 'T');
1691
1692
1693 SK_IN8(IoC, B2_E_1, &Byte);
1694
1695 Byte &= 0x0f;
1696 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
1697
1698#ifdef GENESIS
1699 if (pAC->GIni.GIGenesis) {
1700 switch (Byte) {
1701 case SK_PHY_XMAC:
1702 pAC->GIni.GP[i].PhyAddr = PHY_ADDR_XMAC;
1703 break;
1704 case SK_PHY_BCOM:
1705 pAC->GIni.GP[i].PhyAddr = PHY_ADDR_BCOM;
1706 pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
1707 SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE);
1708 break;
1709#ifdef OTHER_PHY
1710 case SK_PHY_LONE:
1711 pAC->GIni.GP[i].PhyAddr = PHY_ADDR_LONE;
1712 break;
1713 case SK_PHY_NAT:
1714 pAC->GIni.GP[i].PhyAddr = PHY_ADDR_NAT;
1715 break;
1716#endif
1717 default:
1718
1719 RetVal = 5;
1720 break;
1721 }
1722 }
1723#endif
1724
1725#ifdef YUKON
1726 if (pAC->GIni.GIYukon) {
1727
1728 if (Byte < (SK_U8)SK_PHY_MARV_COPPER) {
1729
1730 Byte = (SK_U8)SK_PHY_MARV_COPPER;
1731
1732 pAC->GIni.GICopperType = SK_TRUE;
1733 }
1734
1735 pAC->GIni.GP[i].PhyAddr = PHY_ADDR_MARV;
1736
1737 if (pAC->GIni.GICopperType) {
1738
1739 pAC->GIni.GP[i].PLinkSpeedCap = (SK_U8)(SK_LSPEED_CAP_AUTO |
1740 SK_LSPEED_CAP_10MBPS | SK_LSPEED_CAP_100MBPS |
1741 SK_LSPEED_CAP_1000MBPS);
1742
1743 pAC->GIni.GP[i].PLinkSpeed = (SK_U8)SK_LSPEED_AUTO;
1744
1745 pAC->GIni.GP[i].PMSCap = (SK_U8)(SK_MS_CAP_AUTO |
1746 SK_MS_CAP_MASTER | SK_MS_CAP_SLAVE);
1747 }
1748 else {
1749 Byte = (SK_U8)SK_PHY_MARV_FIBER;
1750 }
1751 }
1752#endif
1753
1754 pAC->GIni.GP[i].PhyType = (int)Byte;
1755
1756 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
1757 ("PHY type: %d PHY addr: %04x\n", Byte,
1758 pAC->GIni.GP[i].PhyAddr));
1759 }
1760
1761
1762#ifdef GENESIS
1763 if (pAC->GIni.GIGenesis) {
1764
1765 pAC->GIni.GIMacType = SK_MAC_XMAC;
1766
1767 pAC->GIni.GIFunc.pFnMacUpdateStats = SkXmUpdateStats;
1768 pAC->GIni.GIFunc.pFnMacStatistic = SkXmMacStatistic;
1769 pAC->GIni.GIFunc.pFnMacResetCounter = SkXmResetCounter;
1770 pAC->GIni.GIFunc.pFnMacOverflow = SkXmOverflowStatus;
1771 }
1772#endif
1773
1774#ifdef YUKON
1775 if (pAC->GIni.GIYukon) {
1776
1777 pAC->GIni.GIMacType = SK_MAC_GMAC;
1778
1779 pAC->GIni.GIFunc.pFnMacUpdateStats = SkGmUpdateStats;
1780 pAC->GIni.GIFunc.pFnMacStatistic = SkGmMacStatistic;
1781 pAC->GIni.GIFunc.pFnMacResetCounter = SkGmResetCounter;
1782 pAC->GIni.GIFunc.pFnMacOverflow = SkGmOverflowStatus;
1783
1784#ifdef SPECIAL_HANDLING
1785 if (pAC->GIni.GIChipId == CHIP_ID_YUKON) {
1786
1787 SK_IN8(IoC, B2_E_3, &Byte);
1788 if (Byte & B2_E3_RES_MASK) {
1789 RetVal = 6;
1790 }
1791 }
1792#endif
1793 }
1794#endif
1795
1796 return(RetVal);
1797}
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815static void SkGeInit2(
1816SK_AC *pAC,
1817SK_IOC IoC)
1818{
1819#ifdef GENESIS
1820 SK_U32 DWord;
1821#endif
1822 int i;
1823
1824
1825 if (pAC->GIni.GIPollTimerVal != 0) {
1826 if (pAC->GIni.GIPollTimerVal > SK_DPOLL_MAX) {
1827 pAC->GIni.GIPollTimerVal = SK_DPOLL_MAX;
1828
1829 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E017, SKERR_HWI_E017MSG);
1830 }
1831 SK_OUT32(IoC, B28_DPT_INI, pAC->GIni.GIPollTimerVal);
1832 SK_OUT8(IoC, B28_DPT_CTRL, DPT_START);
1833 }
1834
1835#ifdef GENESIS
1836 if (pAC->GIni.GIGenesis) {
1837
1838 DWord = SK_BLK_DUR * (SK_U32)pAC->GIni.GIHstClkFact / 100;
1839
1840 SK_OUT32(IoC, B2_BSC_INI, DWord);
1841 SK_OUT8(IoC, B2_BSC_CTRL, BSC_START);
1842
1843
1844
1845
1846
1847 SkGeInitMacArb(pAC, IoC);
1848
1849 SkGeInitPktArb(pAC, IoC);
1850 }
1851#endif
1852
1853#ifdef YUKON
1854 if (pAC->GIni.GIYukon) {
1855
1856 SK_OUT8(IoC, GMAC_TI_ST_CTRL, (SK_U8)GMT_ST_START);
1857 }
1858#endif
1859
1860
1861 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
1862 SK_OUT8(IoC, MR_ADDR(i, TXA_CTRL), TXA_ENA_ARB);
1863 }
1864
1865
1866 SkGeInitRamIface(pAC, IoC);
1867
1868}
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904int SkGeInit(
1905SK_AC *pAC,
1906SK_IOC IoC,
1907int Level)
1908{
1909 int RetVal;
1910 SK_U32 DWord;
1911
1912 RetVal = 0;
1913 SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_INIT,
1914 ("SkGeInit(Level %d)\n", Level));
1915
1916 switch (Level) {
1917 case SK_INIT_DATA:
1918
1919 SkGeInit0(pAC, IoC);
1920 pAC->GIni.GILevel = SK_INIT_DATA;
1921 break;
1922
1923 case SK_INIT_IO:
1924
1925 RetVal = SkGeInit1(pAC, IoC);
1926 if (RetVal != 0) {
1927 break;
1928 }
1929
1930
1931 SK_OUT32(IoC, B2_IRQM_INI, SK_TEST_VAL);
1932 SK_IN32(IoC, B2_IRQM_INI, &DWord);
1933 SK_OUT32(IoC, B2_IRQM_INI, 0L);
1934
1935 if (DWord != SK_TEST_VAL) {
1936 RetVal = 2;
1937 break;
1938 }
1939
1940
1941 if (pAC->GIni.GIMacsFound > SK_MAX_MACS) {
1942 RetVal = 1;
1943 break;
1944 }
1945
1946
1947 pAC->GIni.GILevel = SK_INIT_IO;
1948 break;
1949
1950 case SK_INIT_RUN:
1951
1952 if (pAC->GIni.GILevel != SK_INIT_IO) {
1953#ifndef SK_DIAG
1954 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E002, SKERR_HWI_E002MSG);
1955#endif
1956 RetVal = 4;
1957 break;
1958 }
1959 SkGeInit2(pAC, IoC);
1960
1961
1962 pAC->GIni.GILevel = SK_INIT_RUN;
1963 break;
1964
1965 default:
1966 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E003, SKERR_HWI_E003MSG);
1967 RetVal = 3;
1968 break;
1969 }
1970
1971 return(RetVal);
1972}
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986void SkGeDeInit(
1987SK_AC *pAC,
1988SK_IOC IoC)
1989{
1990 int i;
1991 SK_U16 Word;
1992
1993#ifdef SK_PHY_LP_MODE
1994 SK_U8 Byte;
1995 SK_U16 PmCtlSts;
1996#endif
1997
1998#if (!defined(SK_SLIM) && !defined(VCPU))
1999
2000 SkI2cWaitIrq(pAC, IoC);
2001#endif
2002
2003
2004 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
2005 if (pAC->GIni.GP[i].PState != SK_PRT_STOP &&
2006 pAC->GIni.GP[i].PState != SK_PRT_RESET) {
2007
2008 SkGeStopPort(pAC, IoC, i, SK_STOP_ALL, SK_HARD_RST);
2009 }
2010 }
2011
2012#ifdef SK_PHY_LP_MODE
2013
2014
2015
2016
2017 if (pAC->GIni.GIYukonLite &&
2018 pAC->GIni.GIChipRev == CHIP_REV_YU_LITE_A3) {
2019
2020
2021 for (i = 0; i < pAC->GIni.GIMacsFound; i++) {
2022
2023 SkGmEnterLowPowerMode(pAC, IoC, i, PHY_PM_DEEP_SLEEP);
2024 }
2025
2026 if (pAC->GIni.GIVauxAvail) {
2027
2028 Byte = PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF;
2029
2030 SK_OUT8(IoC, B0_POWER_CTRL, Byte);
2031 }
2032
2033
2034 SK_IN16(IoC, PCI_C(PCI_PM_CTL_STS), &PmCtlSts);
2035
2036 PmCtlSts |= PCI_PM_STATE_D3;
2037
2038 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
2039
2040 SK_OUT16(IoC, PCI_C(PCI_PM_CTL_STS), PmCtlSts);
2041 }
2042#endif
2043
2044
2045
2046
2047
2048
2049 SK_IN16(IoC, PCI_C(PCI_STATUS), &Word);
2050
2051 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_ON);
2052 SK_OUT16(IoC, PCI_C(PCI_STATUS), (SK_U16)(Word | PCI_ERRBITS));
2053 SK_OUT8(IoC, B2_TST_CTRL1, TST_CFG_WRITE_OFF);
2054
2055
2056 SK_OUT8(IoC, B0_CTST, CS_RST_SET);
2057
2058 pAC->GIni.GILevel = SK_INIT_DATA;
2059}
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090int SkGeInitPort(
2091SK_AC *pAC,
2092SK_IOC IoC,
2093int Port)
2094{
2095 SK_GEPORT *pPrt;
2096
2097 pPrt = &pAC->GIni.GP[Port];
2098
2099 if (SkGeCheckQSize(pAC, Port) != 0) {
2100 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E004, SKERR_HWI_E004MSG);
2101 return(1);
2102 }
2103
2104 if (pPrt->PState == SK_PRT_INIT || pPrt->PState == SK_PRT_RUN) {
2105 SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_HWI_E005, SKERR_HWI_E005MSG);
2106 return(2);
2107 }
2108
2109
2110
2111#ifdef GENESIS
2112 if (pAC->GIni.GIGenesis) {
2113
2114
2115
2116
2117
2118 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, TX_LED_INI), SK_LED_ENA);
2119 SkGeXmitLED(pAC, IoC, MR_ADDR(Port, RX_LED_INI), SK_LED_ENA);
2120
2121
2122 SkXmInitMac(pAC, IoC, Port);
2123 }
2124#endif
2125
2126#ifdef YUKON
2127 if (pAC->GIni.GIYukon) {
2128
2129 SkGmInitMac(pAC, IoC, Port);
2130 }
2131#endif
2132
2133
2134
2135 SkGeInitMacFifo(pAC, IoC, Port);
2136
2137 SkGeInitRamBufs(pAC, IoC, Port);
2138
2139 if (pPrt->PXSQSize != 0) {
2140
2141 SK_OUT8(IoC, MR_ADDR(Port, TXA_CTRL), TXA_ENA_FSYNC);
2142 }
2143
2144 SkGeInitBmu(pAC, IoC, Port);
2145
2146
2147 pPrt->PState = SK_PRT_INIT;
2148
2149 return(0);
2150}
2151