blob: 09dcef16202426e56632fd31cc02f29029852872 [file] [log] [blame]
developer69bcd592024-03-25 14:26:39 +08001/* FILE NAME: air_port.c
2 * PURPOSE:
3 * Define the port function in AIR SDK.
4 *
5 * NOTES:
6 * None
7 */
8
9/* INCLUDE FILE DECLARATIONS
10 */
11#include "air.h"
12#include "air_port.h"
13
14/* NAMING CONSTANT DECLARATIONS
15 */
16
17/* MACRO FUNCTION DECLARATIONS
18 */
19#define AIR_SET_REG_BIT(cond, reg, bit) \
20 do{ \
21 if(TRUE == (cond)) \
22 { \
23 (reg) |= (bit); \
24 } \
25 else \
26 { \
27 (reg) &= ~(bit); \
28 } \
29 }while(0)
30
31/* DATA TYPE DECLARATIONS
32 */
33
34/* GLOBAL VARIABLE DECLARATIONS
35 */
36
37/* LOCAL SUBPROGRAM DECLARATIONS
38 */
39
40/* STATIC VARIABLE DECLARATIONS
41 */
42
43/* LOCAL SUBPROGRAM BODIES
44 */
45
46/* FUNCTION NAME: air_port_setAnMode
47 * PURPOSE:
48 * Set the auto-negotiation mode for a specific port.(Auto or Forced)
49 *
50 * INPUT:
51 * unit -- Device ID
52 * port -- Index of port number
53 * state -- FALSE:Disable
54 * TRUE: Enable
55 * OUTPUT:
56 * None
57 *
58 * RETURN:
59 * AIR_E_OK
60 * AIR_E_BAD_PARAMETER
61 *
62 * NOTES:
63 * None
64 */
65AIR_ERROR_NO_T
66air_port_setAnMode(
67 const UI32_T unit,
68 const UI32_T port,
69 const BOOL_T state)
70{
71 UI32_T u32CtrlReg = 0;
72 UI32_T u32Pmcr = 0;
73 UI32_T i = 0;
74 UI32_T mii_port = 0;
75 AIR_ERROR_NO_T ret = AIR_E_OK;
76
77 /* Mistake proofing for port checking */
78 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
79 AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
80
81 /* Read data from phy register */
82 aml_readPhyReg(unit, port, 0x0, &u32CtrlReg);
83
84 if(TRUE == state)
85 {
86 /* Enable AN mode of PHY port */
87 u32CtrlReg |= BIT(12);
88 }
89 else
90 {
91 /* Disable AN mode of PHY port */
92 u32CtrlReg &= ~BIT(12);
93 }
94
95 /* Restart AN */
96 u32CtrlReg |= BIT(9);
97
98 /* Write data to register */
99 aml_writePhyReg(unit, port, 0x00, u32CtrlReg);
100
101 return ret;
102}
103
104/* FUNCTION NAME: air_port_getAnMode
105 * PURPOSE:
106 * Get the auto-negotiation mode for a specific port.
107 *
108 * INPUT:
109 * unit -- Device ID
110 * port -- Index of port number
111 *
112 * OUTPUT:
113 * state -- FALSE:Disable
114 * TRUE: Enable
115 * RETURN:
116 * AIR_E_OK
117 * AIR_E_BAD_PARAMETER
118 *
119 * NOTES:
120 * None
121 */
122AIR_ERROR_NO_T
123air_port_getAnMode(
124 const UI32_T unit,
125 const UI32_T port,
126 BOOL_T *ptr_state)
127{
128 UI32_T u32dat = 0;
129 UI32_T i = 0, mii_port = 0;
130 AIR_ERROR_NO_T ret = AIR_E_OK;
131
132 /* Mistake proofing */
133 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
134 AIR_CHECK_PTR(ptr_state);
135
136 /* Read data from register */
137 aml_readPhyReg(unit, port, 0x0, &u32dat);
138 (*ptr_state) = BITS_OFF_R(u32dat, 12, 1);
139
140 return ret;
141}
142
143/* FUNCTION NAME: air_port_setLocalAdvAbility
144 * PURPOSE:
145 * Set the auto-negotiation advertisement for a
146 * specific port.
147 *
148 * INPUT:
149 * unit -- Device ID
150 * port -- Index of port number
151 * adv -- AN advertisement setting
152 *
153 * OUTPUT:
154 * None
155 *
156 * RETURN:
157 * AIR_E_OK
158 * AIR_E_BAD_PARAMETER
159 *
160 * NOTES:
161 * None
162 */
163AIR_ERROR_NO_T
164air_port_setLocalAdvAbility(
165 const UI32_T unit,
166 const UI32_T port,
167 const AIR_AN_ADV_T adv)
168{
169 UI32_T u32dat = 0;
170
171 /* Mistake proofing for port checking */
172 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
173
174 /* Read AN Advertisement from register */
175 aml_readPhyReg(unit, port, PHY_AN_ADV, &u32dat);
176
177 /* Modify AN Advertisement */
178 AIR_SET_REG_BIT(adv.advCap10HDX, u32dat, AN_ADV_CAP_10_HDX);
179 AIR_SET_REG_BIT(adv.advCap10FDX, u32dat, AN_ADV_CAP_10_FDX);
180 AIR_SET_REG_BIT(adv.advCap100HDX, u32dat, AN_ADV_CAP_100_HDX);
181 AIR_SET_REG_BIT(adv.advCap100FDX, u32dat, AN_ADV_CAP_100_FDX);
182 AIR_SET_REG_BIT(adv.advPause, u32dat, AN_ADV_CAP_PAUSE);
183
184 /* Write AN Advertisement to register */
185 aml_writePhyReg(unit, port, PHY_AN_ADV, u32dat);
186
187 /* Write 1000BASE-T duplex capbility to register */
188 aml_readPhyReg(unit, port, PHY_CR1G, &u32dat);
189 AIR_SET_REG_BIT(adv.advCap1000FDX, u32dat, CR1G_ADV_CAP1000_FDX);
190 aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
191
192 return AIR_E_OK;
193}
194
195/* FUNCTION NAME: air_port_getLocalAdvAbility
196 * PURPOSE:
197 * Get the auto-negotiation advertisement for a
198 * specific port.
199 *
200 * INPUT:
201 * unit -- Device ID
202 * port -- Index of port number
203 *
204 * OUTPUT:
205 * ptr_adv -- AN advertisement setting
206 *
207 * RETURN:
208 * AIR_E_OK
209 * AIR_E_BAD_PARAMETER
210 *
211 * NOTES:
212 * None
213 */
214AIR_ERROR_NO_T
215air_port_getLocalAdvAbility(
216 const UI32_T unit,
217 const UI32_T port,
218 AIR_AN_ADV_T *ptr_adv)
219{
220 UI32_T u32dat = 0;
221
222 /* Mistake proofing for port checking */
223 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
224 /* Mistake proofing checking */
225 AIR_CHECK_PTR(ptr_adv);
226
227 /* Read AN Advertisement from register */
228 aml_readPhyReg(unit, port, PHY_AN_ADV, &u32dat);
229 ptr_adv ->advCap10HDX = (u32dat & AN_ADV_CAP_10_HDX)?TRUE:FALSE;
230 ptr_adv ->advCap10FDX = (u32dat & AN_ADV_CAP_10_FDX)?TRUE:FALSE;
231 ptr_adv ->advCap100HDX = (u32dat & AN_ADV_CAP_100_HDX)?TRUE:FALSE;
232 ptr_adv ->advCap100FDX = (u32dat & AN_ADV_CAP_100_FDX)?TRUE:FALSE;
233 ptr_adv ->advPause = (u32dat & AN_ADV_CAP_PAUSE)?TRUE:FALSE;
234
235 /* Read 1000BASE-T duplex capalibity from register */
236 aml_readPhyReg(unit, port, PHY_CR1G, &u32dat);
237 ptr_adv ->advCap1000FDX = (u32dat & CR1G_ADV_CAP1000_FDX)?TRUE:FALSE;
238
239 return AIR_E_OK;
240}
241
242/* FUNCTION NAME: air_port_getRemoteAdvAbility
243 * PURPOSE:
244 * Get the auto-negotiation remote advertisement for a
245 * specific port.
246 *
247 * INPUT:
248 * unit -- Device ID
249 * port -- Index of port number
250 *
251 * OUTPUT:
252 * ptr_lp_adv -- AN advertisement of link partner
253 *
254 * RETURN:
255 * AIR_E_OK
256 * AIR_E_BAD_PARAMETER
257 *
258 * NOTES:
259 * None
260 */
261AIR_ERROR_NO_T
262air_port_getRemoteAdvAbility(
263 const UI32_T unit,
264 const UI32_T port,
265 AIR_AN_ADV_T *ptr_lp_adv)
266{
267 UI32_T u32dat = 0;
268
269 /* Mistake proofing for port checking */
270 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
271 AIR_CHECK_PTR(ptr_lp_adv);
272
273 /* Read AN LP Advertisement from register */
274 aml_readPhyReg(unit, port, PHY_AN_LP_ADV, &u32dat);
275 ptr_lp_adv ->advCap10HDX = (u32dat & AN_LP_CAP_10_HDX)?TRUE:FALSE;
276 ptr_lp_adv ->advCap10FDX = (u32dat & AN_LP_CAP_10_FDX)?TRUE:FALSE;
277 ptr_lp_adv ->advCap100HDX = (u32dat & AN_LP_CAP_100_HDX)?TRUE:FALSE;
278 ptr_lp_adv ->advCap100FDX = (u32dat & AN_LP_CAP_100_FDX)?TRUE:FALSE;
279 ptr_lp_adv ->advPause = (u32dat & AN_LP_CAP_PAUSE)?TRUE:FALSE;
280
281 /* Read LP 1000BASE-T duplex capalibity from register */
282 aml_readPhyReg(unit, port, PHY_SR1G, &u32dat);
283 ptr_lp_adv ->advCap1000FDX = (u32dat & SR1G_CAP1000_FDX)?TRUE:FALSE;
284
285 return AIR_E_OK;
286}
287
288/* FUNCTION NAME: air_port_setSpeed
289 * PURPOSE:
290 * Set the speed for a specific port.
291 * This setting is used on force mode only.
292 *
293 * INPUT:
294 * unit -- Device ID
295 * port -- Index of port number
296 * speed -- AIR_PORT_SPEED_10M: 10Mbps
297 * AIR_PORT_SPEED_100M: 100Mbps
298 * AIR_PORT_SPEED_1000M:1Gbps
299 * OUTPUT:
300 * None
301 *
302 * RETURN:
303 * AIR_E_OK
304 * AIR_E_BAD_PARAMETER
305 * AIR_E_OTHERS
306 *
307 * NOTES:
308 * None
309 */
310AIR_ERROR_NO_T
311air_port_setSpeed(
312 const UI32_T unit,
313 const UI32_T port,
314 const UI32_T speed)
315{
316 UI32_T u32dat = 0;
317 UI32_T mii_port = 0;
318 BOOL_T an = 0;
319
320 /* Mistake proofing for port checking */
321 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
322
323 /* Mistake proofing for speed checking */
324 AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
325
326 /* Read data from register */
327 aml_readPhyReg(unit, port, 0x0, &u32dat);
328
329 u32dat &= ~(BIT(13) | BIT(6));
330 switch(speed)
331 {
332 case AIR_PORT_SPEED_10M:
333 /* (bit6, bit13) = 2b'00 means 10M */
334 break;
335 case AIR_PORT_SPEED_100M:
336 /* (bit6, bit13) = 2b'01 means 100M */
337 u32dat |= BIT(13);
338 break;
339 case AIR_PORT_SPEED_1000M:
340 /* (bit6, bit13) = 2b'10 means 1000M */
341 u32dat |= BIT(6);
342 break;
343 default:
344 /* (bit6, bit13) = 2b'11 means reverse,
345 * other value is invalid */
346 AIR_PRINT("argument 3: speed(%u) is invalid.\n", speed);
347 return AIR_E_BAD_PARAMETER;
348 }
349
350 /* Write data to register */
351 aml_writePhyReg(unit, port, 0x00, u32dat);
352
353 return AIR_E_OK;
354}
355
356/* FUNCTION NAME: air_port_getSpeed
357 * PURPOSE:
358 * Get the speed for a specific port.
359 *
360 * INPUT:
361 * unit -- Device ID
362 * port -- Index of port number
363 *
364 * OUTPUT:
365 * ptr_speed -- AIR_PORT_SPEED_10M: 10Mbps
366 * AIR_PORT_SPEED_100M: 100Mbps
367 * AIR_PORT_SPEED_1000M:1Gbps
368 * AIR_PORT_SPEED_2500M:2.5Gbps
369 * RETURN:
370 * AIR_E_OK
371 * AIR_E_BAD_PARAMETER
372 *
373 * NOTES:
374 * None
375 */
376AIR_ERROR_NO_T
377air_port_getSpeed(
378 const UI32_T unit,
379 const UI32_T port,
380 UI32_T *ptr_speed)
381{
382 UI32_T u32dat = 0;
383 UI32_T mii_port = 0, sp = 0;
384 UI32_T ret = AIR_E_OK;
385
386 /* Mistake proofing for port checking */
387 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
388
389 /* Mistake proofing for speed checking */
390 AIR_CHECK_PTR(ptr_speed);
391
392 /* Read data from register */
393 aml_readPhyReg(unit, port, 0x0, &u32dat);
394 (*ptr_speed) = (BITS_OFF_R(u32dat, 6, 1) << 1) | BITS_OFF_R(u32dat, 13, 1);
395
396 return ret;
397}
398
399/* FUNCTION NAME: air_port_setDuplex
400 * PURPOSE:
401 * Get the duplex for a specific port.
402 * This setting is used on force mode only.
403 *
404 * INPUT:
405 * unit -- Device ID
406 * port -- Index of port number
407 * duplex -- AIR_PORT_DUPLEX_HALF
408 * AIR_PORT_DUPLEX_FULL
409 * OUTPUT:
410 * None
411 *
412 * RETURN:
413 * AIR_E_OK
414 * AIR_E_BAD_PARAMETER
415 *
416 * NOTES:
417 * None
418 */
419AIR_ERROR_NO_T
420air_port_setDuplex(
421 const UI32_T unit,
422 const UI32_T port,
423 const BOOL_T duplex)
424{
425 UI32_T ret = AIR_E_OK;
426 UI32_T u32dat = 0;
427 UI32_T mii_port = 0, speed = 0;
428
429 /* Mistake proofing for port checking */
430 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
431
432 /* Mistake proofing for duplex checking */
433 AIR_PARAM_CHK(((AIR_PORT_DUPLEX_HALF != duplex) && (AIR_PORT_DUPLEX_FULL != duplex)), AIR_E_BAD_PARAMETER);
434
435 /* Read data from register */
436 aml_readPhyReg(unit, port, 0x0, &u32dat);
437 speed = (BITS_OFF_R(u32dat, 6, 1) << 1) | BITS_OFF_R(u32dat, 13, 1);
438 if(AIR_PORT_SPEED_100M >= speed)
439 {
440 if(TRUE == duplex)
441 {
442 u32dat |= BIT(8);
443 }
444 else
445 {
446 u32dat &= ~BIT(8);
447 }
448 }
449 else
450 {
451 /* 1G support full duplex only */
452 u32dat |= BIT(8);
453 }
454
455 /* Write data to register */
456 aml_writePhyReg(unit, port, 0x0, u32dat);
457
458 return ret;
459}
460
461/* FUNCTION NAME: air_port_getDuplex
462 * PURPOSE:
463 * Get the duplex for a specific port.
464 *
465 * INPUT:
466 * unit -- Device ID
467 * port -- Index of port number
468 *
469 * OUTPUT:
470 * ptr_duplex -- AIR_PORT_DUPLEX_HALF
471 * AIR_PORT_DUPLEX_FULL
472 * RETURN:
473 * AIR_E_OK
474 * AIR_E_BAD_PARAMETER
475 *
476 * NOTES:
477 * None
478 */
479AIR_ERROR_NO_T
480air_port_getDuplex(
481 const UI32_T unit,
482 const UI32_T port,
483 BOOL_T *ptr_duplex)
484{
485 UI32_T u32dat = 0;
486 UI32_T mii_port = 0, duplex = 0;
487
488 /* Mistake proofing for port checking */
489 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
490 /* Mistake proofing for duplex checking */
491 AIR_CHECK_PTR(ptr_duplex);
492
493 /* Read data from register */
494 aml_readPhyReg(unit, port, 0x0, &u32dat);
495 (*ptr_duplex) = BITS_OFF_R(u32dat, 8, 1);
496
497 return AIR_E_OK;
498}
499
500/* FUNCTION NAME: air_port_getLink
501 * PURPOSE:
502 * Get the physical link status for a specific port.
503 *
504 * INPUT:
505 * unit -- Device ID
506 * port -- Index of port number
507 *
508 * OUTPUT:
509 * ptr_ps -- AIR_PORT_STATUS_T
510 *
511 * RETURN:
512 * AIR_E_OK
513 * AIR_E_BAD_PARAMETER
514 *
515 * NOTES:
516 * None
517 */
518AIR_ERROR_NO_T
519air_port_getLink(
520 const UI32_T unit,
521 const UI32_T port,
522 AIR_PORT_STATUS_T *ptr_ps)
523{
524 UI32_T ret = AIR_E_OK;
525 UI32_T u32dat = 0;
526 UI32_T mii_port = 0;
527 BOOL_T an = 0;
528
529 /* Mistake proofing for port checking */
530 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
531 /* Mistake proofing for duplex checking */
532 AIR_CHECK_PTR(ptr_ps);
533
534 /* Read data from register */
535 aml_readReg(unit, PMSR(port), &u32dat);
536 ptr_ps->link = BITS_OFF_R(u32dat, 24, 1);
537 ptr_ps->duplex = BITS_OFF_R(u32dat, 25, 1);
538 ptr_ps->speed = BITS_OFF_R(u32dat, 28, 3);
539
540 return ret;
541}
542
543/* FUNCTION NAME: air_port_setBckPres
544 * PURPOSE:
545 * Set the back pressure configuration for a specific port.
546 *
547 * INPUT:
548 * unit -- Device ID
549 * port -- Index of port number
550 * bckPres -- FALSE:Disable
551 * TRUE: Enable
552 * OUTPUT:
553 * None
554 *
555 * RETURN:
556 * AIR_E_OK
557 * AIR_E_BAD_PARAMETER
558 *
559 * NOTES:
560 * None
561 */
562AIR_ERROR_NO_T
563air_port_setBckPres(
564 const UI32_T unit,
565 const UI32_T port,
566 const BOOL_T bckPres)
567{
568 UI32_T u32dat = 0;
569
570 /* Mistake proofing for port checking */
571 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
572 /* Mistake proofing for speed checking */
573 AIR_PARAM_CHK(((TRUE != bckPres) && (FALSE != bckPres)), AIR_E_BAD_PARAMETER);
574
575 /* Read data from register */
576 aml_readReg(unit, PMCR(port), &u32dat);
577 if(TRUE == bckPres)
578 {
579 u32dat |= BIT(11);
580 }
581 else
582 {
583 u32dat &= ~BIT(11);
584 }
585
586 /* Write data to register */
587 aml_writeReg(unit, PMCR(port), u32dat);
588
589 return AIR_E_OK;
590}
591
592/* FUNCTION NAME: air_port_getBckPres
593 * PURPOSE:
594 * Get the back pressure configuration for a specific port.
595 *
596 * INPUT:
597 * unit -- Device ID
598 * port -- Index of port number
599 *
600 * OUTPUT:
601 * ptr_bckPres -- FALSE:Disable
602 * TRUE: Enable
603 * RETURN:
604 * AIR_E_OK
605 * AIR_E_BAD_PARAMETER
606 *
607 * NOTES:
608 * None
609 */
610AIR_ERROR_NO_T
611air_port_getBckPres(
612 const UI32_T unit,
613 const UI32_T port,
614 BOOL_T *ptr_bckPres)
615{
616 UI32_T u32dat = 0;
617
618 /* Mistake proofing for port checking */
619 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
620
621 /* Mistake proofing for speed checking */
622 AIR_CHECK_PTR(ptr_bckPres);
623
624 /* Read data from register */
625 aml_readReg(unit, PMCR(port), &u32dat);
626 (*ptr_bckPres) = BITS_OFF_R(u32dat, 11, 1);
627
628 return AIR_E_OK;
629}
630
631/* FUNCTION NAME: air_port_setFlowCtrl
632 * PURPOSE:
633 * Set the flow control configuration for specific port.
634 *
635 * INPUT:
636 * unit -- Select device ID
637 * port -- Select port number (0 - 6)
638 * dir -- Directions of AIR_PORT_TX or AIR_PORT_RX
639 * fc_en -- TRUE: Enable select port flow control
640 * FALSE:Disable select port flow control
641 * OUTPUT:
642 * None
643 *
644 * RETURN:
645 * AIR_E_OK
646 * AIR_E_BAD_PARAMETER
647 *
648 * NOTES:
649 * None
650 */
651AIR_ERROR_NO_T
652air_port_setFlowCtrl(
653 const UI32_T unit,
654 const UI32_T port,
655 const BOOL_T dir,
656 const BOOL_T fc_en)
657{
658 UI32_T u32dat = 0;
659
660 /* Check port range */
661 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
662
663 /* Check directions */
664 if(dir != AIR_PORT_TX && dir != AIR_PORT_RX)
665 return AIR_E_BAD_PARAMETER;;
666
667 /* Check fc_en */
668 AIR_PARAM_CHK(((TRUE != fc_en) && (FALSE != fc_en)), AIR_E_BAD_PARAMETER);
669
670 aml_readReg(unit, PMCR(port), &u32dat);
671 if(TRUE == fc_en)
672 {
673 /* Enable port flow control */
674 if(dir == AIR_PORT_TX)
675 {
676 u32dat |= FORCE_TX_FC;
677 }
678 else
679 {
680 u32dat |= FORCE_RX_FC;
681 }
682 }
683 else
684 {
685 /* Disable port flow control */
686 if(dir == AIR_PORT_TX)
687 {
688 u32dat &= ~(FORCE_TX_FC);
689 }
690 else
691 {
692 u32dat &= ~(FORCE_RX_FC);
693 }
694 }
695 aml_writeReg(unit, PMCR(port), u32dat);
696
697 return AIR_E_OK;
698}
699
700/* FUNCTION NAME: air_port_getFlowCtrl
701 * PURPOSE:
702 * Get the flow control configuration for specific port.
703 *
704 * INPUT:
705 * unit -- Select device ID
706 * port -- Select port number (0..6)
707 * dir -- AIR_PORT_TX
708 * AIR_PORT_RX
709 * OUTPUT:
710 * ptr_fc_en -- FALSE: Port flow control disable
711 * TRUE: Port flow control enable
712 * RETURN:
713 * AIR_E_OK
714 * AIR_E_BAD_PARAMETER
715 *
716 * NOTES:
717 * None
718 */
719AIR_ERROR_NO_T
720air_port_getFlowCtrl(
721 const UI32_T unit,
722 const UI32_T port,
723 const BOOL_T dir,
724 BOOL_T *ptr_fc_en)
725{
726 UI32_T u32dat = 0;
727
728 /* Check port range */
729 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
730 AIR_CHECK_PTR(ptr_fc_en);
731
732 /* Check directions */
733 if(dir != AIR_PORT_TX && dir != AIR_PORT_RX)
734 return AIR_E_BAD_PARAMETER;
735
736 /* Read port flow control status*/
737 aml_readReg(unit, PMCR(port), &u32dat);
738 if(dir == AIR_PORT_TX)
739 {
740 if((u32dat & FORCE_TX_FC) == FORCE_TX_FC)
741 *ptr_fc_en = TRUE;
742 else
743 *ptr_fc_en = FALSE;
744 }
745 else
746 {
747 if((u32dat & FORCE_RX_FC) == FORCE_RX_FC)
748 *ptr_fc_en = TRUE;
749 else
750 *ptr_fc_en = FALSE;
751 }
752
753 return AIR_E_OK;
754}
755
756/* FUNCTION NAME: air_port_setJumbo
757 * PURPOSE:
758 * Set accepting jumbo frmes with specificied size.
759 *
760 * INPUT:
761 * unit -- Select device ID
762 * pkt_len -- Select max packet length
763 * RX_PKT_LEN_1518
764 * RX_PKT_LEN_1536
765 * RX_PKT_LEN_1552
766 * RX_PKT_LEN_MAX_JUMBO
767 * frame_len -- Select max lenght of jumbo frames
768 * Range : 2 - 16
769 * Units : K Bytes
770 * OUTPUT:
771 * None
772 *
773 * RETURN:
774 * AIR_E_OK
775 * AIR_E_BAD_PARAMETER
776 *
777 * NOTES:
778 * None
779 */
780AIR_ERROR_NO_T
781air_port_setJumbo(
782 const UI32_T unit,
783 const UI32_T pkt_len,
784 const UI32_T frame_len)
785{
786 UI32_T u32dat = 0;
787
788 /* Check packet length */
789 AIR_PARAM_CHK((pkt_len > 3), AIR_E_BAD_PARAMETER);
790
791 /* Check frame length */
792 AIR_PARAM_CHK((frame_len < 2), AIR_E_BAD_PARAMETER);
793 AIR_PARAM_CHK((frame_len > 16), AIR_E_BAD_PARAMETER);
794
795 /* Read and clear jumbo frame info */
796 aml_readReg(unit, GMACCR, &u32dat);
797 u32dat &= ~0x00F3;
798
799 /* Set max packet length */
800 u32dat |= pkt_len;
801
802 /* Set jumbo frames max length */
803 u32dat |= (frame_len << 4);
804
805 aml_writeReg(unit, GMACCR, u32dat);
806
807 return AIR_E_OK;
808}
809
810/* FUNCTION NAME: air_port_getJumbo
811 * PURPOSE:
812 * Get accepting jumbo frmes with specificied size.
813 *
814 * INPUT:
815 * unit -- Select device ID
816 *
817 * OUTPUT:
818 * ptr_pkt_len -- Select max packet length
819 * RX_PKT_LEN_1518
820 * RX_PKT_LEN_1536
821 * RX_PKT_LEN_1552
822 * RX_PKT_LEN_MAX_JUMBO
823 * ptr_frame_len -- Select max lenght of jumbo frames
824 * Range : 2 - 16
825 * Units : K Bytes
826 * RETURN:
827 * AIR_E_OK
828 * AIR_E_BAD_PARAMETER
829 *
830 * NOTES:
831 * None
832 */
833AIR_ERROR_NO_T
834air_port_getJumbo(
835 const UI32_T unit,
836 UI32_T *ptr_pkt_len,
837 UI32_T *ptr_frame_len)
838{
839 UI32_T u32dat = 0;
840
841 AIR_CHECK_PTR(ptr_pkt_len);
842 AIR_CHECK_PTR(ptr_frame_len);
843
844 /* Read and clear jumbo frame info */
845 aml_readReg(unit, GMACCR, &u32dat);
846
847 /* Set max packet length */
848 *ptr_pkt_len = (0x03 & u32dat);
849
850 /* Set jumbo frames max length */
851 *ptr_frame_len = (0x0F & (u32dat >> 4));
852
853 return AIR_E_OK;
854}
855
856/* FUNCTION NAME: air_port_setPsMode
857 * PURPOSE:
858 * Set the power saving mode for a specific port.
859 *
860 * INPUT:
861 * unit -- Device ID
862 * port -- Index of port number
863 * mode -- Bit-map:
864 * AIR_PORT_PS_LINKSTATUS
865 * AIR_PORT_PS_EEE
866 * FALSE: Disable / TRUE: Enable
867 * OUTPUT:
868 * None
869 *
870 * RETURN:
871 * AIR_E_OK
872 * AIR_E_BAD_PARAMETER
873 *
874 * NOTES:
875 * None
876 */
877AIR_ERROR_NO_T
878air_port_setPsMode(
879 const UI32_T unit,
880 const UI32_T port,
881 const UI32_T mode)
882{
883 UI32_T u32dat = 0;
884 UI32_T u32cl45_1e_3c = 0;
885 UI32_T u32cl45_1e_3d = 0;
886 UI32_T u32cl45_1e_3e = 0;
887
888 /* Mistake proofing for port checking */
889 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
890 AIR_PARAM_CHK((mode & (~AIR_PORT_PS_MASK)), AIR_E_BAD_PARAMETER);
891
892 /* Read data from register */
893 aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, &u32cl45_1e_3c);
894 aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, &u32cl45_1e_3d);
895 aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, &u32cl45_1e_3e);
896
897 if(mode & AIR_PORT_PS_LINKSTATUS)
898 {
899 /* Set Link Status
900 * Disable bypass function to enable */
901 u32cl45_1e_3c &= ~BITS(12, 15);
902 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, u32cl45_1e_3c);
903 u32cl45_1e_3d &= ~BITS(12, 15);
904 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, u32cl45_1e_3d);
905 u32cl45_1e_3e &= ~BITS(11, 15);
906 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, u32cl45_1e_3e);
907 }
908 else
909 {
910 /* Set Link Status
911 * Enable bypass function to disable */
912 u32cl45_1e_3c |= BITS(12, 15);
913 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, u32cl45_1e_3c);
914 u32cl45_1e_3d |= BITS(12, 15);
915 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, u32cl45_1e_3d);
916 u32cl45_1e_3e |= BITS(11, 15);
917 aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, u32cl45_1e_3e);
918 }
919
920 if(mode & AIR_PORT_PS_EEE)
921 {
922 /* Enable EEE */
923 u32dat = (EEE_ADV_1000BT | EEE_ADV_100BT );
924 aml_writePhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, u32dat);
925 }
926 else
927 {
928 /* Disable EEE */
929 aml_writePhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, 0);
930 }
931 return AIR_E_OK;
932
933}
934
935/* FUNCTION NAME: air_port_getPsMode
936 * PURPOSE:
937 * Get the power saving mode for a specific port.
938 *
939 * INPUT:
940 * unit -- Device ID
941 * port -- Index of port number
942 * OUTPUT:
943 * ptr_mode -- Bit-map:
944 * AIR_PORT_PS_LINKSTATUS
945 * AIR_PORT_PS_EEE
946 * FALSE: Disable / TRUE: Enable
947 * RETURN:
948 * AIR_E_OK
949 * AIR_E_BAD_PARAMETER
950 *
951 * NOTES:
952 * None
953 */
954AIR_ERROR_NO_T
955air_port_getPsMode(
956 const UI32_T unit,
957 const UI32_T port,
958 UI32_T *ptr_mode)
959{
960 UI32_T u32cl45_1e_3e = 0;
961 UI32_T u32cl45_07_3c = 0;
962
963 /* Mistake proofing for port checking */
964 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
965
966 /* Mistake proofing for mode checking */
967 AIR_CHECK_PTR(ptr_mode);
968
969 (*ptr_mode) = 0;
970
971 /* Check link-status power saving */
972 aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, &u32cl45_1e_3e);
973 if(!BITS_OFF_R(u32cl45_1e_3e, 11, 5))
974 {
975 /* Read Bypass the power-down TXVLD to check link-status
976 * power saving function state */
977 (*ptr_mode) |= AIR_PORT_PS_LINKSTATUS;
978 }
979
980 /* Check EEE */
981 aml_readPhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, &u32cl45_07_3c);
982 if( (u32cl45_07_3c & EEE_ADV_1000BT) && (u32cl45_07_3c & EEE_ADV_100BT) )
983 {
984 /* Read PMCR to check EEE ability */
985 (*ptr_mode) |= AIR_PORT_PS_EEE;
986 }
987
988 return AIR_E_OK;
989}
990
991/* FUNCTION NAME: air_port_setSmtSpdDwn
992 * PURPOSE:
993 * Set Smart speed down feature for a specific port.
994 *
995 * INPUT:
996 * unit -- Device ID
997 * port -- Index of port number
998 * state -- FALSE:Disable
999 * TRUE: Enable
1000 * time -- AIR_PORT_SSD_2T
1001 * AIR_PORT_SSD_3T
1002 * AIR_PORT_SSD_4T
1003 * AIR_PORT_SSD_5T
1004 * OUTPUT:
1005 * None
1006 *
1007 * RETURN:
1008 * AIR_E_OK
1009 * AIR_E_BAD_PARAMETER
1010 *
1011 * NOTES:
1012 * None
1013 */
1014AIR_ERROR_NO_T
1015air_port_setSmtSpdDwn(
1016 const UI32_T unit,
1017 const UI32_T port,
1018 const BOOL_T state,
1019 const UI32_T time)
1020{
1021 UI32_T u32ext14 = 0;
1022 UI32_T page = 0;
1023
1024 /* Mistake proofing for port checking */
1025 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
1026
1027 /* Mistake proofing for state checking */
1028 AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
1029
1030 /* Mistake proofing for time checking */
1031 AIR_PARAM_CHK((time >= AIR_PORT_SSD_LAST), AIR_E_BAD_PARAMETER);
1032
1033 /* Backup page */
1034 aml_readPhyReg(unit, port, 0x1F, &page);
1035
1036 /* Switch to page 1*/
1037 aml_writePhyReg(unit, port, 0x1F, 0x1);
1038 /* Read data from register */
1039 aml_readPhyReg(unit, port, 0x14, &u32ext14);
1040
1041 /* Write data to register */
1042 if(TRUE == state)
1043 {
1044 u32ext14 |= BIT(4);
1045 }
1046 else
1047 {
1048 u32ext14 &= ~BIT(4);
1049 }
1050 u32ext14 &= ~BITS(2,3);
1051 u32ext14 |= time << 2;
1052
1053 /* Switch to page 1*/
1054 aml_writePhyReg(unit, port, 0x1F, 0x1);
1055 /* Read data from register */
1056 aml_writePhyReg(unit, port, 0x14, u32ext14);
1057
1058 /* Restore page */
1059 aml_writePhyReg(unit, port, 0x1F, page);
1060
1061 return AIR_E_OK;
1062}
1063
1064/* FUNCTION NAME: air_port_getSmtSpdDwn
1065 * PURPOSE:
1066 * Get Smart speed down feature for a specific port.
1067 *
1068 * INPUT:
1069 * unit -- Device ID
1070 * port -- Index of port number
1071 *
1072 * OUTPUT:
1073 * ptr_state -- FALSE:Disable
1074 * TRUE: Enable
1075 * ptr_time -- AIR_PORT_SSD_2T
1076 * AIR_PORT_SSD_3T
1077 * AIR_PORT_SSD_4T
1078 * AIR_PORT_SSD_5T
1079 * RETURN:
1080 * AIR_E_OK
1081 * AIR_E_BAD_PARAMETER
1082 *
1083 * NOTES:
1084 * None
1085 */
1086AIR_ERROR_NO_T
1087air_port_getSmtSpdDwn(
1088 const UI32_T unit,
1089 const UI32_T port,
1090 UI32_T *ptr_state,
1091 UI32_T *ptr_time)
1092{
1093 UI32_T u32ext14 = 0;
1094 UI32_T page = 0;
1095
1096 /* Mistake proofing for port checking */
1097 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
1098
1099 /* Mistake proofing for state checking */
1100 AIR_CHECK_PTR(ptr_state);
1101
1102 /* Mistake proofing for time checking */
1103 AIR_CHECK_PTR(ptr_time);
1104
1105 /* Backup page */
1106 aml_readPhyReg(unit, port, 0x1F, &page);
1107
1108 /* Switch to page 1*/
1109 aml_writePhyReg(unit, port, 0x1F, 0x1);
1110 /* Read data from register */
1111 aml_readPhyReg(unit, port, 0x14, &u32ext14);
1112
1113 (*ptr_state) = BITS_OFF_R(u32ext14, 4, 1);
1114 (*ptr_time) = BITS_OFF_R(u32ext14, 2, 2);
1115
1116 /* Restore page */
1117 aml_writePhyReg(unit, port, 0x1F, page);
1118
1119 return AIR_E_OK;
1120}
1121
1122/* FUNCTION NAME: air_port_setEnable
1123 * PURPOSE:
1124 * Set powerdown state for a specific port.
1125 *
1126 * INPUT:
1127 * unit -- Device ID
1128 * port -- Index of port number
1129 * state -- FALSE:Disable
1130 * TRUE: Enable
1131 * OUTPUT:
1132 * None
1133 *
1134 * RETURN:
1135 * AIR_E_OK
1136 * AIR_E_BAD_PARAMETER
1137 *
1138 * NOTES:
1139 * None
1140 */
1141AIR_ERROR_NO_T
1142air_port_setEnable(
1143 const UI32_T unit,
1144 const UI32_T port,
1145 const BOOL_T state)
1146{
1147 UI32_T u32dat = 0;
1148
1149 /* Mistake proofing for port checking */
1150 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
1151 AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
1152
1153 /* Read data from register */
1154 aml_readPhyReg(unit, port, 0x0, &u32dat);
1155
1156 if(TRUE == state)
1157 {
1158 /* Enable port, so disable powerdown bit */
1159 u32dat &= ~BIT(11);
1160 }
1161 else
1162 {
1163 /* Disable port, so enable powerdown bit */
1164 u32dat |= BIT(11);
1165 }
1166
1167 /* Write data to register */
1168 aml_writePhyReg(unit, port, 0x0, u32dat);
1169
1170 return AIR_E_OK;
1171}
1172
1173/* FUNCTION NAME: air_port_getEnable
1174 * PURPOSE:
1175 * Get powerdown state for a specific port.
1176 *
1177 * INPUT:
1178 * unit -- Device ID
1179 * port -- Index of port number
1180 *
1181 * OUTPUT:
1182 * ptr_state -- FALSE:Disable
1183 * TRUE: Enable
1184 * RETURN:
1185 * AIR_E_OK
1186 * AIR_E_BAD_PARAMETER
1187 *
1188 * NOTES:
1189 * None
1190 */
1191AIR_ERROR_NO_T
1192air_port_getEnable(
1193 const UI32_T unit,
1194 const UI32_T port,
1195 UI32_T *ptr_state)
1196{
1197 UI32_T u32dat = 0;
1198
1199 /* Mistake proofing for port checking */
1200 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
1201
1202 /* Mistake proofing for state checking */
1203 AIR_CHECK_PTR(ptr_state);
1204
1205 /* Read data from register */
1206 aml_readPhyReg(unit, port, 0x0, &u32dat);
1207
1208 (*ptr_state) = (~BITS_OFF_R(u32dat, 11, 1))&BIT(0);
1209
1210 return AIR_E_OK;
1211}
1212
1213/* FUNCTION NAME: air_port_setPortMatrix
1214 * PURPOSE:
1215 * Set port matrix from the specified device.
1216 *
1217 * INPUT:
1218 * unit -- Unit id
1219 * port -- Port id
1220 * port_bitmap -- Matrix port bitmap
1221 *
1222 * OUTPUT:
1223 * None
1224 *
1225 * RETURN:
1226 * AIR_E_OK
1227 * AIR_E_OTHERS
1228 * AIR_E_BAD_PARAMETER
1229 *
1230 * NOTES:
1231 * none
1232 */
1233AIR_ERROR_NO_T
1234air_port_setPortMatrix(
1235 const UI32_T unit,
1236 const UI32_T port,
1237 const UI32_T port_bitmap)
1238{
1239 AIR_ERROR_NO_T rc = AIR_E_OK;
1240
1241 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1242 AIR_PARAM_CHK((port_bitmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);
1243
1244 aml_writeReg(unit, PORTMATRIX(port), port_bitmap);
1245
1246 return rc;
1247}
1248
1249/* FUNCTION NAME: air_port_getPortMatrix
1250 * PURPOSE:
1251 * Get port matrix from the specified device.
1252 *
1253 * INPUT:
1254 * unit -- Unit id
1255 * port -- Port id
1256 *
1257 * OUTPUT:
1258 * p_port_bitmap -- Matrix port bitmap
1259 *
1260 * RETURN:
1261 * AIR_E_OK
1262 * AIR_E_OTHERS
1263 * AIR_E_BAD_PARAMETER
1264 *
1265 * NOTES:
1266 * none
1267 */
1268AIR_ERROR_NO_T
1269air_port_getPortMatrix(
1270 const UI32_T unit,
1271 const UI32_T port,
1272 UI32_T *p_port_bitmap)
1273{
1274 AIR_ERROR_NO_T rc = AIR_E_OK;
1275 UI32_T val = 0;
1276
1277 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1278 AIR_CHECK_PTR(p_port_bitmap);
1279
1280 aml_readReg(unit, PORTMATRIX(port), &val);
1281 *p_port_bitmap = val;
1282
1283 return rc;
1284}
1285
1286/* FUNCTION NAME: air_port_setVlanMode
1287 * PURPOSE:
1288 * Set port-based vlan mechanism from the specified device.
1289 *
1290 * INPUT:
1291 * unit -- Unit id
1292 * port -- Port id
1293 * mode -- Port vlan mode
1294 *
1295 * OUTPUT:
1296 * None
1297 *
1298 * RETURN:
1299 * AIR_E_OK
1300 * AIR_E_OTHERS
1301 * AIR_E_BAD_PARAMETER
1302 *
1303 * NOTES:
1304 * none
1305 */
1306AIR_ERROR_NO_T
1307air_port_setVlanMode(
1308 const UI32_T unit,
1309 const UI32_T port,
1310 const AIR_PORT_VLAN_MODE_T mode)
1311{
1312 AIR_ERROR_NO_T rc = AIR_E_OK;
1313 UI32_T val = 0;
1314
1315 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1316 AIR_PARAM_CHK((mode >= AIR_PORT_VLAN_MODE_LAST), AIR_E_BAD_PARAMETER);
1317
1318 aml_readReg(unit, PCR(port), &val);
1319 val &= ~PCR_PORT_VLAN_MASK;
1320 val |= (mode & PCR_PORT_VLAN_RELMASK) << PCR_PORT_VLAN_OFFT;
1321 aml_writeReg(unit, PCR(port), val);
1322
1323 return rc;
1324}
1325
1326/* FUNCTION NAME: air_port_getVlanMode
1327 * PURPOSE:
1328 * Get port-based vlan mechanism from the specified device.
1329 *
1330 * INPUT:
1331 * unit -- Unit id
1332 * port -- Port id
1333 *
1334 * OUTPUT:
1335 * p_mode -- Port vlan mode
1336 *
1337 * RETURN:
1338 * AIR_E_OK
1339 * AIR_E_OTHERS
1340 * AIR_E_BAD_PARAMETER
1341 *
1342 * NOTES:
1343 * none
1344 */
1345AIR_ERROR_NO_T
1346air_port_getVlanMode(
1347 const UI32_T unit,
1348 const UI32_T port,
1349 AIR_PORT_VLAN_MODE_T *p_mode)
1350{
1351 AIR_ERROR_NO_T rc = AIR_E_OK;
1352 UI32_T val = 0;
1353
1354 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1355 AIR_CHECK_PTR(p_mode);
1356
1357 aml_readReg(unit, PCR(port), &val);
1358 *p_mode = (val >> PCR_PORT_VLAN_OFFT) & PCR_PORT_VLAN_RELMASK;
1359
1360 return rc;
1361}
1362
1363/* FUNCTION NAME: air_port_setSpTag
1364 * PURPOSE:
1365 * Set special tag state of a specific port.
1366 *
1367 * INPUT:
1368 * unit -- Device ID
1369 * port -- Index of port number
1370 * sptag_en -- TRUE: Enable special tag
1371 * FALSE: Disable special tag
1372 * OUTPUT:
1373 * None
1374 *
1375 * RETURN:
1376 * AIR_E_OK
1377 * AIR_E_BAD_PARAMETER
1378 *
1379 * NOTES:
1380 * None
1381 */
1382AIR_ERROR_NO_T
1383air_port_setSpTag(
1384 const UI32_T unit,
1385 const UI32_T port,
1386 const BOOL_T sptag_en)
1387{
1388 UI32_T u32dat = 0;
1389
1390 /* Mistake proofing for port checking */
1391 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1392 AIR_PARAM_CHK(((TRUE != sptag_en) && (FALSE != sptag_en)), AIR_E_BAD_PARAMETER);
1393
1394 /* Read data from register */
1395 aml_readReg(unit, PVC(port), &u32dat);
1396
1397 /* Write data to register */
1398 if(TRUE == sptag_en)
1399 {
1400 u32dat |= PVC_SPTAG_EN_MASK;
1401 }
1402 else
1403 {
1404 u32dat &= ~PVC_SPTAG_EN_MASK;
1405 }
1406 aml_writeReg(unit, PVC(port), u32dat);
1407
1408 return AIR_E_OK;
1409}
1410
1411/* FUNCTION NAME: air_port_getSpTag
1412 * PURPOSE:
1413 * Get special tag state of a specific port.
1414 *
1415 * INPUT:
1416 * unit -- Device ID
1417 * port -- Index of port number
1418 * OUTPUT:
1419 * ptr_sptag_en -- TRUE: Special tag enable
1420 * FALSE: Special tag disable
1421 *
1422 * RETURN:
1423 * AIR_E_OK
1424 * AIR_E_BAD_PARAMETER
1425 *
1426 * NOTES:
1427 * None
1428 */
1429AIR_ERROR_NO_T
1430air_port_getSpTag(
1431 const UI32_T unit,
1432 const UI32_T port,
1433 BOOL_T *ptr_sptag_en)
1434{
1435 UI32_T u32dat = 0;
1436
1437 /* Mistake proofing for port checking */
1438 AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
1439
1440 /* Mistake proofing for state checking */
1441 AIR_CHECK_PTR(ptr_sptag_en);
1442
1443 /* Read data from register */
1444 aml_readReg(unit, PVC(port), &u32dat);
1445
1446 *ptr_sptag_en = (u32dat & PVC_SPTAG_EN_MASK) >> PVC_SPTAG_EN_OFFT;
1447
1448 return AIR_E_OK;
1449}
1450
1451/* FUNCTION NAME: air_port_set5GBaseRModeEnable
1452 * PURPOSE:
1453 * Set the port5 5GBase-R mode enable
1454 *
1455 * INPUT:
1456 * unit -- Device ID
1457 *
1458 * OUTPUT:
1459 * None
1460 *
1461 * RETURN:
1462 * AIR_E_OK
1463 * AIR_E_BAD_PARAMETER
1464 *
1465 * NOTES:
1466 * None
1467 */
1468AIR_ERROR_NO_T
1469air_port_set5GBaseRModeEn(
1470 const UI32_T unit)
1471{
1472 AIR_ERROR_NO_T ret = AIR_E_OK;
1473 UI32_T u32dat = 0;
1474
1475 /* PHYA Cal Enable (EFUSE) */
1476 aml_readReg(unit, INTF_CTRL_8, &u32dat);
1477 u32dat |= BIT(7);
1478 aml_writeReg(unit, INTF_CTRL_8, u32dat);
1479
1480 aml_readReg(unit, INTF_CTRL_9, &u32dat);
1481 u32dat |= BIT(31);
1482 aml_writeReg(unit, INTF_CTRL_9, u32dat);
1483
1484 /* PMA Init */
1485 /* PLL */
1486 aml_readReg(unit, RX_CTRL_26, &u32dat);
1487 u32dat |= BIT(23);
1488 u32dat &= (~BIT(24));
1489 u32dat |= BIT(26);
1490 aml_writeReg(unit, RX_CTRL_26, u32dat);
1491
1492 aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
1493 u32dat |= BITS(2, 3);
1494 aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
1495
1496 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1497 u32dat |= BITS(0, 1);
1498 u32dat &= ~(0x7 << 2);
1499 u32dat |= (0x5 << 2);
1500 u32dat &= ~(0x3 << 6);
1501 u32dat |= (0x1 << 6);
1502 u32dat &= ~(0x7 << 8);
1503 u32dat |= (0x3 << 8);
1504 u32dat |= BIT(29);
1505 u32dat &= ~BITS(12, 13);
1506 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1507
1508 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1509 u32dat &= ~BIT(2);
1510 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1511
1512 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1513 u32dat &= ~BIT(14);
1514 u32dat &= ~(0xf << 16);
1515 u32dat |= (0x8 << 16);
1516 u32dat &= ~BITS(20, 21);
1517 u32dat &= ~(0x3 << 24);
1518 u32dat |= (0x1 << 24);
1519 u32dat &= ~BIT(26);
1520 u32dat |= BIT(22);
1521 u32dat |= BIT(27);
1522 u32dat |= BIT(28);
1523 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1524
1525 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1526 u32dat &= ~(0x3 << 3);
1527 u32dat |= (0x1 << 3);
1528 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1529
1530 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1531 u32dat &= ~BIT(30);
1532 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1533
1534 aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
1535 u32dat |= BITS(16, 17);
1536 aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
1537
1538 aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x1c800000);
1539 aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x1c800000);
1540
1541 aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
1542 u32dat &= ~BIT(24);
1543 aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
1544
1545 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
1546 u32dat &= ~BIT(8);
1547 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
1548
1549 aml_readReg(unit, PLL_CTRL_3, &u32dat);
1550 u32dat &= ~BITS(0, 15);
1551 aml_writeReg(unit, PLL_CTRL_3, u32dat);
1552
1553 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1554 u32dat &= ~BITS(0, 1);
1555 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1556
1557 aml_readReg(unit, PLL_CTRL_3, &u32dat);
1558 u32dat &= ~BITS(16, 31);
1559 aml_writeReg(unit, PLL_CTRL_3, u32dat);
1560
1561 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
1562 u32dat &= ~BIT(9);
1563 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
1564
1565 aml_readReg(unit, RG_QP_PLL_IPLL_DIG_PWR_SEL, &u32dat);
1566 u32dat &= ~(0x3 << 25);
1567 u32dat |= (0x1 << 25);
1568 aml_writeReg(unit, RG_QP_PLL_IPLL_DIG_PWR_SEL, u32dat);
1569
1570 aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
1571 u32dat |= BIT(3);
1572 u32dat |= BIT(4);
1573 aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
1574
1575 aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
1576 u32dat &= ~(0x3 << 16);
1577 u32dat |= (0x2 << 16);
1578 aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
1579
1580 aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
1581 u32dat &= ~BIT(12);
1582 aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
1583
1584 /* RX Control */
1585 aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
1586 u32dat &= ~BITS(4, 5);
1587 aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
1588
1589 aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
1590 u32dat |= BIT(11);
1591 aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
1592
1593 aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
1594 u32dat &= ~(0x1f << 8);
1595 u32dat |= (0xc << 8);
1596 aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
1597
1598 aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
1599 u32dat |= BIT(13);
1600 aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
1601
1602 aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
1603 u32dat |= BIT(30);
1604 aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
1605
1606 aml_readReg(unit, PLL_CTRL_0, &u32dat);
1607 u32dat |= BIT(0);
1608 aml_writeReg(unit, PLL_CTRL_0, u32dat);
1609
1610 aml_readReg(unit, RX_DLY_0, &u32dat);
1611 u32dat &= ~(0xff << 0);
1612 u32dat |= (0x6f << 0);
1613 u32dat |= BITS(8, 13);
1614 aml_writeReg(unit, RX_DLY_0, u32dat);
1615
1616 aml_readReg(unit, RX_CTRL_42, &u32dat);
1617 u32dat &= ~(0x1fff << 0);
1618 u32dat |= (0x150 << 0);
1619 aml_writeReg(unit, RX_CTRL_42, u32dat);
1620
1621 aml_readReg(unit, RX_CTRL_2, &u32dat);
1622 u32dat &= ~(0x1fff << 16);
1623 u32dat |= (0x150 << 16);
1624 aml_writeReg(unit, RX_CTRL_2, u32dat);
1625
1626 aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
1627 u32dat |= BITS(0, 2);
1628 aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
1629
1630 aml_readReg(unit, RX_CTRL_8, &u32dat);
1631 u32dat &= ~(0xfff << 16);
1632 u32dat |= (0x200 << 16);
1633 aml_writeReg(unit, RX_CTRL_8, u32dat);
1634
1635 /* Frequency memter */
1636 aml_readReg(unit, RX_CTRL_5, &u32dat);
1637 u32dat &= ~(0xfffff << 10);
1638 u32dat |= (0x9 << 10);
1639 aml_writeReg(unit, RX_CTRL_5, u32dat);
1640
1641 aml_readReg(unit, RX_CTRL_6, &u32dat);
1642 u32dat &= ~(0xfffff << 0);
1643 u32dat |= (0x64 << 0);
1644 aml_writeReg(unit, RX_CTRL_6, u32dat);
1645
1646 aml_readReg(unit, RX_CTRL_7, &u32dat);
1647 u32dat &= ~(0xfffff << 0);
1648 u32dat |= (0x2710 << 0);
1649 aml_writeReg(unit, RX_CTRL_7, u32dat);
1650
1651 /* PCS Init */
1652 aml_readReg(unit, RG_USXGMII_AN_CONTROL_0, &u32dat);
1653 u32dat &= ~BIT(0);
1654 aml_writeReg(unit, RG_USXGMII_AN_CONTROL_0, u32dat);
1655
1656 aml_readReg(unit, USGMII_CTRL_0, &u32dat);
1657 u32dat |= BIT(2);
1658 aml_writeReg(unit, USGMII_CTRL_0, u32dat);
1659
1660 aml_readReg(unit, MSG_RX_CTRL_0, &u32dat);
1661 u32dat |= BIT(28);
1662 aml_writeReg(unit, MSG_RX_CTRL_0, u32dat);
1663
1664 aml_readReg(unit, QP_CK_RST_CTRL_4, &u32dat);
1665 u32dat |= BITS(14, 20);
1666 aml_writeReg(unit, QP_CK_RST_CTRL_4, u32dat);
1667
1668 /* bypass flow control to MAC */
1669 aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
1670 aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
1671
1672 return ret;
1673}
1674
1675/* FUNCTION NAME: air_port_setHsgmiiModeEnable
1676 * PURPOSE:
1677 * Set the port5 HSGMII mode enable
1678 *
1679 * INPUT:
1680 * unit -- Device ID
1681 *
1682 * OUTPUT:
1683 * None
1684 *
1685 * RETURN:
1686 * AIR_E_OK
1687 * AIR_E_BAD_PARAMETER
1688 *
1689 * NOTES:
1690 * None
1691 */
1692AIR_ERROR_NO_T
1693air_port_setHsgmiiModeEn(
1694 const UI32_T unit)
1695{
1696 AIR_ERROR_NO_T ret = AIR_E_OK;
1697 UI32_T u32dat = 0;
1698
1699 /* PLL */
1700 aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
1701 u32dat &= ~(0x3 << 2);
1702 u32dat |= (0x1 << 2);
1703 aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
1704
1705 /* PLL - LPF */
1706 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1707 u32dat &= ~(0x3 << 0);
1708 u32dat |= (0x1 << 0);
1709 u32dat &= ~(0x7 << 2);
1710 u32dat |= (0x5 << 2);
1711 u32dat &= ~BITS(6, 7);
1712 u32dat &= ~(0x7 << 8);
1713 u32dat |= (0x3 << 8);
1714 u32dat |= BIT(29);
1715 u32dat &= ~BITS(12, 13);
1716 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1717
1718 /* PLL - ICO */
1719 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1720 u32dat |= BIT(2);
1721 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1722
1723 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1724 u32dat &= ~BIT(14);
1725 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1726
1727 /* PLL - CHP */
1728 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1729 u32dat &= ~(0xf << 16);
1730 u32dat |= (0x6 << 16);
1731 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1732
1733
1734 /* PLL - PFD */
1735 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1736 u32dat &= ~(0x3 << 20);
1737 u32dat |= (0x1 << 20);
1738 u32dat &= ~(0x3 << 24);
1739 u32dat |= (0x1 << 24);
1740 u32dat &= ~BIT(26);
1741 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1742
1743 /* PLL - POSTDIV */
1744 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1745 u32dat |= BIT(22);
1746 u32dat &= ~BIT(27);
1747 u32dat &= ~BIT(28);
1748 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1749
1750 /* PLL - SDM */
1751 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1752 u32dat &= ~BITS(3, 4);
1753 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1754
1755 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1756 u32dat &= ~BIT(30);
1757 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1758
1759 aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
1760 u32dat &= ~(0x3 << 16);
1761 u32dat |= (0x1 << 16);
1762 aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
1763
1764 aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x7a000000);
1765 aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x7a000000);
1766
1767 aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
1768 u32dat &= ~BIT(24);
1769 aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
1770
1771 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
1772 u32dat &= ~BIT(8);
1773 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
1774
1775 /* PLL - SS */
1776 aml_readReg(unit, PLL_CTRL_3, &u32dat);
1777 u32dat &= ~BITS(0, 15);
1778 aml_writeReg(unit, PLL_CTRL_3, u32dat);
1779
1780 aml_readReg(unit, PLL_CTRL_4, &u32dat);
1781 u32dat &= ~BITS(0, 1);
1782 aml_writeReg(unit, PLL_CTRL_4, u32dat);
1783
1784 aml_readReg(unit, PLL_CTRL_3, &u32dat);
1785 u32dat &= ~BITS(16, 31);
1786 aml_writeReg(unit, PLL_CTRL_3, u32dat);
1787
1788 /* PLL - TDC */
1789 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
1790 u32dat &= ~BIT(9);
1791 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
1792
1793 aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
1794 u32dat |= BIT(3);
1795 u32dat |= BIT(4);
1796 aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
1797
1798 aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
1799 u32dat &= ~(0x3 << 16);
1800 u32dat |= (0x2 << 16);
1801 aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
1802
1803 /* TCL Disable (only for Co-SIM) */
1804 aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
1805 u32dat &= ~BIT(12);
1806 aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
1807
1808 /* TX Init */
1809 aml_readReg(unit, RG_QP_TX_MODE_16B_EN, &u32dat);
1810 u32dat &= ~BIT(0);
1811 u32dat &= ~(0xffff << 16);
1812 u32dat |= (0x4 << 16);
1813 aml_writeReg(unit, RG_QP_TX_MODE_16B_EN, u32dat);
1814
1815 /* RX Control */
1816 aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
1817 u32dat |= BIT(11);
1818 aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
1819
1820 aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
1821 u32dat &= ~(0x3 << 4);
1822 u32dat |= (0x1 << 4);
1823 aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
1824
1825 aml_readReg(unit, RG_QP_CDR_LPF_SETVALUE, &u32dat);
1826 u32dat &= ~(0xf << 25);
1827 u32dat |= (0x1 << 25);
1828 u32dat &= ~(0x7 << 29);
1829 u32dat |= (0x3 << 29);
1830 aml_writeReg(unit, RG_QP_CDR_LPF_SETVALUE, u32dat);
1831
1832 aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
1833 u32dat &= ~(0x1f << 8);
1834 u32dat |= (0xf << 8);
1835 aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
1836
1837 aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
1838 u32dat &= ~(0x3f << 0);
1839 u32dat |= (0x19 << 0);
1840 u32dat &= ~BIT(6);
1841 aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
1842
1843 aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
1844 u32dat &= ~(0x7f << 6);
1845 u32dat |= (0x21 << 6);
1846 u32dat &= ~(0x3 << 16);
1847 u32dat |= (0x2 << 16);
1848 u32dat &= ~BIT(13);
1849 aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
1850
1851 aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
1852 u32dat &= ~BIT(30);
1853 aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
1854
1855 aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
1856 u32dat &= ~(0x7 << 24);
1857 u32dat |= (0x4 << 24);
1858 aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
1859
1860 aml_readReg(unit, PLL_CTRL_0, &u32dat);
1861 u32dat |= BIT(0);
1862 aml_writeReg(unit, PLL_CTRL_0, u32dat);
1863
1864 aml_readReg(unit, RX_CTRL_26, &u32dat);
1865 u32dat &= ~BIT(23);
1866 u32dat |= BIT(26);
1867 aml_writeReg(unit, RX_CTRL_26, u32dat);
1868
1869 aml_readReg(unit, RX_DLY_0, &u32dat);
1870 u32dat &= ~(0xff << 0);
1871 u32dat |= (0x6f << 0);
1872 u32dat |= BITS(8, 13);
1873 aml_writeReg(unit, RX_DLY_0, u32dat);
1874
1875 aml_readReg(unit, RX_CTRL_42, &u32dat);
1876 u32dat &= ~(0x1fff << 0);
1877 u32dat |= (0x150 << 0);
1878 aml_writeReg(unit, RX_CTRL_42, u32dat);
1879
1880 aml_readReg(unit, RX_CTRL_2, &u32dat);
1881 u32dat &= ~(0x1fff << 16);
1882 u32dat |= (0x150 << 16);
1883 aml_writeReg(unit, RX_CTRL_2, u32dat);
1884
1885 aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
1886 u32dat &= ~(0x7 << 0);
1887 u32dat |= (0x1 << 0);
1888 aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
1889
1890 aml_readReg(unit, RX_CTRL_8, &u32dat);
1891 u32dat &= ~(0xfff << 16);
1892 u32dat |= (0x200 << 16);
1893 u32dat &= ~(0x7fff << 14);
1894 u32dat |= (0xfff << 14);
1895 aml_writeReg(unit, RX_CTRL_8, u32dat);
1896
1897 /* Frequency memter */
1898 aml_readReg(unit, RX_CTRL_5, &u32dat);
1899 u32dat &= ~(0xfffff << 10);
1900 u32dat |= (0x10 << 10);
1901 aml_writeReg(unit, RX_CTRL_5, u32dat);
1902
1903 aml_readReg(unit, RX_CTRL_6, &u32dat);
1904 u32dat &= ~(0xfffff << 0);
1905 u32dat |= (0x64 << 0);
1906 aml_writeReg(unit, RX_CTRL_6, u32dat);
1907
1908 aml_readReg(unit, RX_CTRL_7, &u32dat);
1909 u32dat &= ~(0xfffff << 0);
1910 u32dat |= (0x2710 << 0);
1911 aml_writeReg(unit, RX_CTRL_7, u32dat);
1912
1913 /* PCS Init */
1914 aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
1915 u32dat &= ~BIT(30);
1916 aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
1917
1918 /* Rate Adaption */
1919 aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
1920 u32dat &= ~BIT(31);
1921 aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
1922
1923 aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
1924 u32dat |= BIT(0);
1925 u32dat |= BIT(4);
1926 u32dat |= BITS(26, 27);
1927 aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
1928
1929 /* Disable AN */
1930 aml_readReg(unit, SGMII_REG_AN0, &u32dat);
1931 u32dat &= ~BIT(12);
1932 aml_writeReg(unit, SGMII_REG_AN0, u32dat);
1933
1934 /* Force Speed */
1935 aml_readReg(unit, SGMII_STS_CTRL_0, &u32dat);
1936 u32dat |= BIT(2);
1937 u32dat |= BITS(4, 5);
1938 aml_writeReg(unit, SGMII_STS_CTRL_0, u32dat);
1939
1940 /* bypass flow control to MAC */
1941 aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
1942 aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
1943
1944 return ret;
1945}
1946
1947/* FUNCTION NAME: air_port_setSgmiiMode
1948 * PURPOSE:
1949 * Set the port5 SGMII mode for AN or force
1950 *
1951 * INPUT:
1952 * unit -- Device ID
1953 * mode -- AIR_PORT_SGMII_MODE_AN
1954 * AIR_PORT_SGMII_MODE_FORCE
1955 * speed -- AIR_PORT_SPEED_10M: 10Mbps
1956 * AIR_PORT_SPEED_100M: 100Mbps
1957 * AIR_PORT_SPEED_1000M: 1Gbps
1958 *
1959 * OUTPUT:
1960 * None
1961 *
1962 * RETURN:
1963 * AIR_E_OK
1964 * AIR_E_BAD_PARAMETER
1965 *
1966 * NOTES:
1967 * None
1968 */
1969AIR_ERROR_NO_T
1970air_port_setSgmiiMode(
1971 const UI32_T unit,
1972 const UI32_T mode,
1973 const UI32_T speed)
1974{
1975 AIR_ERROR_NO_T ret = AIR_E_OK;
1976 UI32_T u32dat = 0;
1977
1978 AIR_PARAM_CHK(((AIR_PORT_SGMII_MODE_AN != mode) && (AIR_PORT_SGMII_MODE_FORCE != mode)), AIR_E_BAD_PARAMETER);
1979 AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
1980
1981 /* PMA Init */
1982 /* PLL */
1983 aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
1984 u32dat &= ~BITS(2, 3);
1985 aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
1986
1987 /* PLL - LPF */
1988 aml_readReg(unit, PLL_CTRL_2, &u32dat);
1989 u32dat &= ~(0x3 << 0);
1990 u32dat |= (0x1 << 0);
1991 u32dat &= ~(0x7 << 2);
1992 u32dat |= (0x5 << 2);
1993 u32dat &= ~BITS(6, 7);
1994 u32dat &= ~(0x7 << 8);
1995 u32dat |= (0x3 << 8);
1996 u32dat |= BIT(29);
1997 u32dat &= ~BITS(12, 13);
1998 aml_writeReg(unit, PLL_CTRL_2, u32dat);
1999
2000 /* PLL - ICO */
2001 aml_readReg(unit, PLL_CTRL_4, &u32dat);
2002 u32dat |= BIT(2);
2003 aml_writeReg(unit, PLL_CTRL_4, u32dat);
2004
2005 aml_readReg(unit, PLL_CTRL_2, &u32dat);
2006 u32dat &= ~BIT(14);
2007 aml_writeReg(unit, PLL_CTRL_2, u32dat);
2008
2009 /* PLL - CHP */
2010 aml_readReg(unit, PLL_CTRL_2, &u32dat);
2011 u32dat &= ~(0xf << 16);
2012 u32dat |= (0x4 << 16);
2013 aml_writeReg(unit, PLL_CTRL_2, u32dat);
2014
2015
2016 /* PLL - PFD */
2017 aml_readReg(unit, PLL_CTRL_2, &u32dat);
2018 u32dat &= ~(0x3 << 20);
2019 u32dat |= (0x1 << 20);
2020 u32dat &= ~(0x3 << 24);
2021 u32dat |= (0x1 << 24);
2022 u32dat &= ~BIT(26);
2023 aml_writeReg(unit, PLL_CTRL_2, u32dat);
2024
2025 /* PLL - POSTDIV */
2026 aml_readReg(unit, PLL_CTRL_2, &u32dat);
2027 u32dat |= BIT(22);
2028 u32dat &= ~BIT(27);
2029 u32dat &= ~BIT(28);
2030 aml_writeReg(unit, PLL_CTRL_2, u32dat);
2031
2032 /* PLL - SDM */
2033 aml_readReg(unit, PLL_CTRL_4, &u32dat);
2034 u32dat &= ~BITS(3, 4);
2035 aml_writeReg(unit, PLL_CTRL_4, u32dat);
2036
2037 aml_readReg(unit, PLL_CTRL_2, &u32dat);
2038 u32dat &= ~BIT(30);
2039 aml_writeReg(unit, PLL_CTRL_2, u32dat);
2040
2041 aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
2042 u32dat &= ~(0x3 << 16);
2043 u32dat |= (0x1 << 16);
2044 aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
2045
2046 aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x48000000);
2047 aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x48000000);
2048
2049 aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
2050 u32dat &= ~BIT(24);
2051 aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
2052
2053 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
2054 u32dat &= ~BIT(8);
2055 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
2056
2057 /* PLL - SS */
2058 aml_readReg(unit, PLL_CTRL_3, &u32dat);
2059 u32dat &= ~BITS(0, 15);
2060 aml_writeReg(unit, PLL_CTRL_3, u32dat);
2061
2062 aml_readReg(unit, PLL_CTRL_4, &u32dat);
2063 u32dat &= ~BITS(0, 1);
2064 aml_writeReg(unit, PLL_CTRL_4, u32dat);
2065
2066 aml_readReg(unit, PLL_CTRL_3, &u32dat);
2067 u32dat &= ~BITS(16, 31);
2068 aml_writeReg(unit, PLL_CTRL_3, u32dat);
2069
2070 /* PLL - TDC */
2071 aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
2072 u32dat &= ~BIT(9);
2073 aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
2074
2075 aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
2076 u32dat |= BIT(3);
2077 u32dat |= BIT(4);
2078 aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
2079
2080 aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
2081 u32dat &= ~(0x3 << 16);
2082 u32dat |= (0x2 << 16);
2083 aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
2084
2085 /* PLL - TCL Disable (only for Co-SIM) */
2086 aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
2087 u32dat &= ~BIT(12);
2088 aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
2089
2090 /* TX Init */
2091 aml_readReg(unit, RG_QP_TX_MODE_16B_EN, &u32dat);
2092 u32dat &= ~BIT(0);
2093 u32dat &= ~BITS(16, 31);
2094 aml_writeReg(unit, RG_QP_TX_MODE_16B_EN, u32dat);
2095
2096 /* RX Init */
2097 aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
2098 u32dat |= BIT(11);
2099 aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
2100
2101 aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
2102 u32dat &= ~(0x3 << 4);
2103 u32dat |= (0x2 << 4);
2104 aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
2105
2106 aml_readReg(unit, RG_QP_CDR_LPF_SETVALUE, &u32dat);
2107 u32dat &= ~(0xf << 25);
2108 u32dat |= (0x1 << 25);
2109 u32dat &= ~(0x7 << 29);
2110 u32dat |= (0x6 << 29);
2111 aml_writeReg(unit, RG_QP_CDR_LPF_SETVALUE, u32dat);
2112
2113 aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
2114 u32dat &= ~(0x1f << 8);
2115 u32dat |= (0xc << 8);
2116 aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
2117
2118 aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
2119 u32dat &= ~(0x3f << 0);
2120 u32dat |= (0x19 << 0);
2121 u32dat &= ~BIT(6);
2122 aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
2123
2124 aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
2125 u32dat &= ~(0x7f << 6);
2126 u32dat |= (0x21 << 6);
2127 u32dat &= ~(0x3 << 16);
2128 u32dat |= (0x2 << 16);
2129 u32dat &= ~BIT(13);
2130 aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
2131
2132 aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
2133 u32dat &= ~BIT(30);
2134 aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
2135
2136 aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
2137 u32dat &= ~(0x7 << 24);
2138 u32dat |= (0x4 << 24);
2139 aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
2140
2141 aml_readReg(unit, PLL_CTRL_0, &u32dat);
2142 u32dat |= BIT(0);
2143 aml_writeReg(unit, PLL_CTRL_0, u32dat);
2144
2145 aml_readReg(unit, RX_CTRL_26, &u32dat);
2146 u32dat &= ~BIT(23);
2147 if(AIR_PORT_SGMII_MODE_AN == mode)
2148 {
2149 u32dat |= BIT(26);
2150 }
2151 aml_writeReg(unit, RX_CTRL_26, u32dat);
2152
2153 aml_readReg(unit, RX_DLY_0, &u32dat);
2154 u32dat &= ~(0xff << 0);
2155 u32dat |= (0x6f << 0);
2156 u32dat |= BITS(8, 13);
2157 aml_writeReg(unit, RX_DLY_0, u32dat);
2158
2159 aml_readReg(unit, RX_CTRL_42, &u32dat);
2160 u32dat &= ~(0x1fff << 0);
2161 u32dat |= (0x150 << 0);
2162 aml_writeReg(unit, RX_CTRL_42, u32dat);
2163
2164 aml_readReg(unit, RX_CTRL_2, &u32dat);
2165 u32dat &= ~(0x1fff << 16);
2166 u32dat |= (0x150 << 16);
2167 aml_writeReg(unit, RX_CTRL_2, u32dat);
2168
2169 aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
2170 u32dat &= ~(0x7 << 0);
2171 u32dat |= (0x1 << 0);
2172 aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
2173
2174 aml_readReg(unit, RX_CTRL_8, &u32dat);
2175 u32dat &= ~(0xfff << 16);
2176 u32dat |= (0x200 << 16);
2177 u32dat &= ~(0x7fff << 0);
2178 u32dat |= (0xfff << 0);
2179 aml_writeReg(unit, RX_CTRL_8, u32dat);
2180
2181 /* Frequency memter */
2182 aml_readReg(unit, RX_CTRL_5, &u32dat);
2183 u32dat &= ~(0xfffff << 10);
2184 u32dat |= (0x28 << 10);
2185 aml_writeReg(unit, RX_CTRL_5, u32dat);
2186
2187 aml_readReg(unit, RX_CTRL_6, &u32dat);
2188 u32dat &= ~(0xfffff << 0);
2189 u32dat |= (0x64 << 0);
2190 aml_writeReg(unit, RX_CTRL_6, u32dat);
2191
2192 aml_readReg(unit, RX_CTRL_7, &u32dat);
2193 u32dat &= ~(0xfffff << 0);
2194 u32dat |= (0x2710 << 0);
2195 aml_writeReg(unit, RX_CTRL_7, u32dat);
2196
2197 if(AIR_PORT_SGMII_MODE_FORCE == mode)
2198 {
2199 /* PCS Init */
2200 aml_readReg(unit, QP_DIG_MODE_CTRL_0, &u32dat);
2201 u32dat &= ~BIT(0);
2202 if(AIR_PORT_SPEED_1000M == speed)
2203 {
2204 u32dat &= ~BITS(4, 5);
2205 }
2206 else if(AIR_PORT_SPEED_100M == speed)
2207 {
2208 u32dat &= ~(0x3 << 4);
2209 u32dat |= (0x1 << 4);
2210 }
2211 else
2212 {
2213 u32dat &= ~(0x3 << 4);
2214 u32dat |= (0x2 << 4);
2215 }
2216 aml_writeReg(unit, QP_DIG_MODE_CTRL_0, u32dat);
2217
2218 aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
2219 u32dat &= ~BIT(30);
2220 aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
2221
2222 /* Rate Adaption - GMII path config. */
2223 aml_readReg(unit, RG_AN_SGMII_MODE_FORCE, &u32dat);
2224 u32dat |= BIT(0);
2225 if(AIR_PORT_SPEED_1000M == speed)
2226 {
2227 u32dat &= ~BITS(4, 5);
2228 }
2229 else if(AIR_PORT_SPEED_100M == speed)
2230 {
2231 u32dat &= ~(0x3 << 4);
2232 u32dat |= (0x1 << 4);
2233 }
2234 else
2235 {
2236 u32dat &= ~(0x3 << 4);
2237 u32dat |= (0x2 << 4);
2238 }
2239 aml_writeReg(unit, RG_AN_SGMII_MODE_FORCE, u32dat);
2240
2241 aml_readReg(unit, SGMII_STS_CTRL_0, &u32dat);
2242 u32dat |= BIT(2);
2243 if(AIR_PORT_SPEED_1000M == speed)
2244 {
2245 u32dat &= ~(0x3 << 4);
2246 u32dat |= (0x2 << 4);
2247 }
2248 else if(AIR_PORT_SPEED_100M == speed)
2249 {
2250 u32dat &= ~(0x3 << 4);
2251 u32dat |= (0x1 << 4);
2252 }
2253 else
2254 {
2255 u32dat &= ~BITS(4, 5);
2256 }
2257 aml_writeReg(unit, SGMII_STS_CTRL_0, u32dat);
2258
2259 aml_readReg(unit, SGMII_REG_AN0, &u32dat);
2260 u32dat &= ~BIT(12);
2261 aml_writeReg(unit, SGMII_REG_AN0, u32dat);
2262
2263 aml_readReg(unit, PHY_RX_FORCE_CTRL_0, &u32dat);
2264 u32dat |= BIT(4);
2265 aml_writeReg(unit, PHY_RX_FORCE_CTRL_0, u32dat);
2266
2267 aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
2268 if(AIR_PORT_SPEED_1000M == speed)
2269 {
2270 u32dat &= ~BITS(0, 3);
2271 }
2272 else if(AIR_PORT_SPEED_100M == speed)
2273 {
2274 u32dat &= ~(0xf << 0);
2275 u32dat |= (0xc << 0);
2276 }
2277 else
2278 {
2279 u32dat |= BITS(0, 3);
2280 }
2281 u32dat |= BIT(28);
2282 aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
2283
2284 aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
2285 u32dat |= BIT(0);
2286 u32dat |= BIT(4);
2287 if(AIR_PORT_SPEED_1000M == speed)
2288 {
2289 u32dat |= BITS(26, 27);
2290 }
2291 else
2292 {
2293 u32dat &= ~BITS(26, 27);
2294 }
2295 aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
2296
2297 }
2298 else
2299 {
2300 /* PCS Init */
2301 aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
2302 u32dat &= ~BIT(30);
2303 aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
2304
2305 /* Set AN Ability - Interrupt */
2306 aml_readReg(unit, SGMII_REG_AN_FORCE_CL37, &u32dat);
2307 u32dat |= BIT(0);
2308 aml_writeReg(unit, SGMII_REG_AN_FORCE_CL37, u32dat);
2309
2310 aml_readReg(unit, SGMII_REG_AN_13, &u32dat);
2311 u32dat &= ~(0x3f << 0);
2312 u32dat |= (0xb << 0);
2313 u32dat |= BIT(8);
2314 aml_writeReg(unit, SGMII_REG_AN_13, u32dat);
2315
2316 /* Rate Adaption - GMII path config. */
2317 aml_readReg(unit, SGMII_REG_AN0, &u32dat);
2318 u32dat |= BIT(12);
2319 aml_writeReg(unit, SGMII_REG_AN0, u32dat);
2320
2321 aml_readReg(unit, MII_RA_AN_ENABLE, &u32dat);
2322 u32dat |= BIT(0);
2323 aml_writeReg(unit, MII_RA_AN_ENABLE, u32dat);
2324
2325 aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
2326 u32dat |= BIT(28);
2327 aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
2328
2329 aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
2330 u32dat |= BIT(0);
2331 u32dat |= BIT(4);
2332 u32dat |= BITS(26, 27);
2333 aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
2334
2335 /* Only for Co-SIM */
2336
2337 /* AN Speed up (Only for Co-SIM) */
2338
2339 /* Restart AN */
2340 aml_readReg(unit, SGMII_REG_AN0, &u32dat);
2341 u32dat |= BIT(9);
2342 u32dat |= BIT(15);
2343 aml_writeReg(unit, SGMII_REG_AN0, u32dat);
2344 }
2345
2346 /* bypass flow control to MAC */
2347 aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
2348 aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
2349
2350 return ret;
2351}
2352
2353/* FUNCTION NAME: air_port_setRmiiMode
2354 * PURPOSE:
2355 * Set the port5 RMII mode for 100Mbps or 10Mbps
2356 *
2357 * INPUT:
2358 * unit -- Device ID
2359 * speed -- AIR_PORT_SPEED_10M: 10Mbps
2360 * AIR_PORT_SPEED_100M: 100Mbps
2361 *
2362 * OUTPUT:
2363 * None
2364 *
2365 * RETURN:
2366 * AIR_E_OK
2367 * AIR_E_BAD_PARAMETER
2368 *
2369 * NOTES:
2370 * None
2371 */
2372AIR_ERROR_NO_T
2373air_port_setRmiiMode(
2374 const UI32_T unit,
2375 const UI32_T speed)
2376{
2377 AIR_ERROR_NO_T ret = AIR_E_OK;
2378 UI32_T u32dat = 0;
2379
2380 /* Mistake proofing for speed checking */
2381 AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_1000M), AIR_E_BAD_PARAMETER);
2382
2383 if(AIR_PORT_SPEED_100M == speed)
2384 {
2385 aml_writeReg(unit, PMCR(5), 0x93159000);
2386 aml_writeReg(unit, RG_P5MUX_MODE, 0x301);
2387 aml_writeReg(unit, RG_FORCE_CKDIR_SEL, 0x101);
2388 aml_writeReg(unit, RG_SWITCH_MODE, 0x101);
2389 aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x1010101);
2390 aml_writeReg(unit, CSR_RMII, 0x420102);
2391 aml_writeReg(unit, RG_RGMII_TXCK_C, 0x1100910);
2392 }
2393 else
2394 {
2395 aml_writeReg(unit, PMCR(5), 0x83159000);
2396 aml_writeReg(unit, RG_P5MUX_MODE, 0x301);
2397 aml_writeReg(unit, RG_FORCE_CKDIR_SEL, 0x101);
2398 aml_writeReg(unit, RG_SWITCH_MODE, 0x101);
2399 aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x1000101);
2400 aml_writeReg(unit, CSR_RMII, 0x420102);
2401 aml_writeReg(unit, RG_RGMII_TXCK_C, 0x1100910);
2402 }
2403
2404 return ret;
2405}
2406
2407/* FUNCTION NAME: air_port_setRgmiiMode
2408 * PURPOSE:
2409 * Set the port5 RGMII mode for 1Gbps or 100Mbps or 10Mbps
2410 *
2411 * INPUT:
2412 * unit -- Device ID
2413 * speed -- AIR_PORT_SPEED_10M: 10Mbps
2414 * AIR_PORT_SPEED_100M: 100Mbps
2415 * AIR_PORT_SPEED_1000M: 1Gbps
2416 *
2417 * OUTPUT:
2418 * None
2419 *
2420 * RETURN:
2421 * AIR_E_OK
2422 * AIR_E_BAD_PARAMETER
2423 *
2424 * NOTES:
2425 * None
2426 */
2427AIR_ERROR_NO_T
2428air_port_setRgmiiMode(
2429 const UI32_T unit,
2430 const UI32_T speed)
2431{
2432 AIR_ERROR_NO_T ret = AIR_E_OK;
2433 UI32_T u32dat = 0;
2434
2435 /* Mistake proofing for speed checking */
2436 AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
2437
2438 if(AIR_PORT_SPEED_1000M == speed)
2439 {
2440 aml_writeReg(unit, PMCR(5), 0xa3159000);
2441 aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x20101);
2442 }
2443 else if(AIR_PORT_SPEED_100M == speed)
2444 {
2445 aml_writeReg(unit, PMCR(5), 0x93159000);
2446 aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x10101);
2447 }
2448 else
2449 {
2450 aml_writeReg(unit, PMCR(5), 0x83159000);
2451 aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x101);
2452 }
2453
2454 return ret;
2455}
2456