2 * Copyright (C) 2013 Realtek Semiconductor Corp.
5 * Unless you and Realtek execute a separate written software license
6 * agreement governing use of this software, this software is licensed
7 * to you under the terms of the GNU General Public License version 2,
8 * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
11 * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
13 * Purpose : RTL8367C switch high-level API for RTL8367C
18 #include <rtl8367c_asicdrv.h>
20 #if defined(RTK_X86_ASICDRV)
26 /*for driver verify testing only*/
27 #ifdef CONFIG_RTL8367C_ASICDRV_TEST
28 #define CLE_VIRTUAL_REG_SIZE 0x10000
29 rtk_uint16 CleVirtualReg
[CLE_VIRTUAL_REG_SIZE
];
32 #if defined(CONFIG_RTL865X_CLE) || defined (RTK_X86_CLE)
33 rtk_uint32 cleDebuggingDisplay
;
36 #ifdef EMBEDDED_SUPPORT
37 extern void setReg(rtk_uint16
, rtk_uint16
);
38 extern rtk_uint16
getReg(rtk_uint16
);
42 * rtl8367c_setAsicRegBit
44 * Set a bit value of a specified register
46 * reg - register's address
48 * value - value to set. It can be value 0 or 1.
53 * RT_ERR_SMI - SMI access error
54 * RT_ERR_INPUT - Invalid input parameter
56 * Set a bit of a specified register to 1 or 0.
58 ret_t
rtl8367c_setAsicRegBit(rtk_uint32 reg
, rtk_uint32 bit
, rtk_uint32 value
)
61 #if defined(RTK_X86_ASICDRV)
65 if(bit
>= RTL8367C_REGBITLENGTH
)
68 retVal
= Access_Read(reg
, 2, ®Data
);
72 if(0x8367B == cleDebuggingDisplay
)
73 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
76 regData
= regData
| (1 << bit
);
78 regData
= regData
& (~(1 << bit
));
80 retVal
= Access_Write(reg
,2, regData
);
84 if(0x8367B == cleDebuggingDisplay
)
85 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, regData
);
88 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
90 if(bit
>= RTL8367C_REGBITLENGTH
)
93 else if(reg
>= CLE_VIRTUAL_REG_SIZE
)
94 return RT_ERR_OUT_OF_RANGE
;
98 CleVirtualReg
[reg
] = CleVirtualReg
[reg
] | (1 << bit
);
102 CleVirtualReg
[reg
] = CleVirtualReg
[reg
] & (~(1 << bit
));
105 if(0x8367B == cleDebuggingDisplay
)
106 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, CleVirtualReg
[reg
]);
108 #elif defined(EMBEDDED_SUPPORT)
111 if(reg
> RTL8367C_REGDATAMAX
|| value
> 1)
115 tmp
&= (1 << bitIdx
);
116 tmp
|= (value
<< bitIdx
);
123 if(bit
>= RTL8367C_REGBITLENGTH
)
126 retVal
= smi_read(reg
, ®Data
);
127 if(retVal
!= RT_ERR_OK
)
130 #ifdef CONFIG_RTL865X_CLE
131 if(0x8367B == cleDebuggingDisplay
)
132 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
135 regData
= regData
| (1 << bit
);
137 regData
= regData
& (~(1 << bit
));
139 retVal
= smi_write(reg
, regData
);
140 if(retVal
!= RT_ERR_OK
)
143 #ifdef CONFIG_RTL865X_CLE
144 if(0x8367B == cleDebuggingDisplay
)
145 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, regData
);
152 * rtl8367c_getAsicRegBit
154 * Get a bit value of a specified register
156 * reg - register's address
158 * value - value to get.
162 * RT_ERR_OK - Success
163 * RT_ERR_SMI - SMI access error
164 * RT_ERR_INPUT - Invalid input parameter
168 ret_t
rtl8367c_getAsicRegBit(rtk_uint32 reg
, rtk_uint32 bit
, rtk_uint32
*pValue
)
171 #if defined(RTK_X86_ASICDRV)
176 if(bit
>= RTL8367C_REGBITLENGTH
)
179 retVal
= Access_Read(reg
, 2, ®Data
);
183 *pValue
= (regData
& (0x1 << bit
)) >> bit
;
185 if(0x8367B == cleDebuggingDisplay
)
186 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
188 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
190 if(bit
>= RTL8367C_REGBITLENGTH
)
193 if(reg
>= CLE_VIRTUAL_REG_SIZE
)
194 return RT_ERR_OUT_OF_RANGE
;
196 *pValue
= (CleVirtualReg
[reg
] & (0x1 << bit
)) >> bit
;
198 if(0x8367B == cleDebuggingDisplay
)
199 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, CleVirtualReg
[reg
]);
201 #elif defined(EMBEDDED_SUPPORT)
204 if(reg
> RTL8367C_REGDATAMAX
)
215 retVal
= smi_read(reg
, ®Data
);
216 if(retVal
!= RT_ERR_OK
)
219 #ifdef CONFIG_RTL865X_CLE
220 if(0x8367B == cleDebuggingDisplay
)
221 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
224 *pValue
= (regData
& (0x1 << bit
)) >> bit
;
230 * rtl8367c_setAsicRegBits
232 * Set bits value of a specified register
234 * reg - register's address
235 * bits - bits mask for setting
236 * value - bits value for setting
240 * RT_ERR_OK - Success
241 * RT_ERR_SMI - SMI access error
242 * RT_ERR_INPUT - Invalid input parameter
244 * Set bits of a specified register to value. Both bits and value are be treated as bit-mask
246 ret_t
rtl8367c_setAsicRegBits(rtk_uint32 reg
, rtk_uint32 bits
, rtk_uint32 value
)
249 #if defined(RTK_X86_ASICDRV)
253 rtk_uint32 bitsShift
;
254 rtk_uint32 valueShifted
;
256 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
260 while(!(bits
& (1 << bitsShift
)))
263 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
267 valueShifted
= value
<< bitsShift
;
268 if(valueShifted
> RTL8367C_REGDATAMAX
)
271 retVal
= Access_Read(reg
, 2, ®Data
);
275 if(0x8367B == cleDebuggingDisplay
)
276 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
278 regData
= regData
& (~bits
);
279 regData
= regData
| (valueShifted
& bits
);
281 retVal
= Access_Write(reg
,2, regData
);
285 if(0x8367B == cleDebuggingDisplay
)
286 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, regData
);
288 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
290 rtk_uint32 bitsShift
;
291 rtk_uint32 valueShifted
;
293 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
297 while(!(bits
& (1 << bitsShift
)))
300 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
303 valueShifted
= value
<< bitsShift
;
305 if(valueShifted
> RTL8367C_REGDATAMAX
)
308 if(reg
>= CLE_VIRTUAL_REG_SIZE
)
309 return RT_ERR_OUT_OF_RANGE
;
311 regData
= CleVirtualReg
[reg
] & (~bits
);
312 regData
= regData
| (valueShifted
& bits
);
314 CleVirtualReg
[reg
] = regData
;
316 if(0x8367B == cleDebuggingDisplay
)
317 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, regData
);
319 #elif defined(EMBEDDED_SUPPORT)
321 rtk_uint32 bitsShift
;
322 rtk_uint32 valueShifted
;
324 if(reg
> RTL8367C_REGDATAMAX
)
327 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
331 while(!(bits
& (1 << bitsShift
)))
334 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
338 valueShifted
= value
<< bitsShift
;
339 if(valueShifted
> RTL8367C_REGDATAMAX
)
342 regData
= getReg(reg
);
343 regData
= regData
& (~bits
);
344 regData
= regData
| (valueShifted
& bits
);
346 setReg(reg
, regData
);
351 rtk_uint32 bitsShift
;
352 rtk_uint32 valueShifted
;
354 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
358 while(!(bits
& (1 << bitsShift
)))
361 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
364 valueShifted
= value
<< bitsShift
;
366 if(valueShifted
> RTL8367C_REGDATAMAX
)
369 retVal
= smi_read(reg
, ®Data
);
370 if(retVal
!= RT_ERR_OK
)
372 #ifdef CONFIG_RTL865X_CLE
373 if(0x8367B == cleDebuggingDisplay
)
374 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
377 regData
= regData
& (~bits
);
378 regData
= regData
| (valueShifted
& bits
);
380 retVal
= smi_write(reg
, regData
);
381 if(retVal
!= RT_ERR_OK
)
383 #ifdef CONFIG_RTL865X_CLE
384 if(0x8367B == cleDebuggingDisplay
)
385 PRINT("W[0x%4.4x]=0x%4.4x\n", reg
, regData
);
391 * rtl8367c_getAsicRegBits
393 * Get bits value of a specified register
395 * reg - register's address
396 * bits - bits mask for setting
397 * value - bits value for setting
401 * RT_ERR_OK - Success
402 * RT_ERR_SMI - SMI access error
403 * RT_ERR_INPUT - Invalid input parameter
407 ret_t
rtl8367c_getAsicRegBits(rtk_uint32 reg
, rtk_uint32 bits
, rtk_uint32
*pValue
)
410 #if defined(RTK_X86_ASICDRV)
414 rtk_uint32 bitsShift
;
416 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
420 while(!(bits
& (1 << bitsShift
)))
423 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
427 retVal
= Access_Read(reg
, 2, ®Data
);
431 *pValue
= (regData
& bits
) >> bitsShift
;
433 if(0x8367B == cleDebuggingDisplay
)
434 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
436 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
437 rtk_uint32 bitsShift
;
439 if(bits
>= (1 << RTL8367C_REGBITLENGTH
) )
443 while(!(bits
& (1 << bitsShift
)))
446 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
450 if(reg
>= CLE_VIRTUAL_REG_SIZE
)
451 return RT_ERR_OUT_OF_RANGE
;
453 *pValue
= (CleVirtualReg
[reg
] & bits
) >> bitsShift
;
455 if(0x8367B == cleDebuggingDisplay
)
456 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, CleVirtualReg
[reg
]);
458 #elif defined(EMBEDDED_SUPPORT)
460 rtk_uint32 bitsShift
;
462 if(reg
> RTL8367C_REGDATAMAX
)
465 if(bits
>= (1UL << RTL8367C_REGBITLENGTH
) )
469 while(!(bits
& (1UL << bitsShift
)))
472 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
476 regData
= getReg(reg
);
477 *value
= (regData
& bits
) >> bitsShift
;
482 rtk_uint32 bitsShift
;
484 if(bits
>= (1<<RTL8367C_REGBITLENGTH
) )
488 while(!(bits
& (1 << bitsShift
)))
491 if(bitsShift
>= RTL8367C_REGBITLENGTH
)
495 retVal
= smi_read(reg
, ®Data
);
496 if(retVal
!= RT_ERR_OK
) return RT_ERR_SMI
;
498 *pValue
= (regData
& bits
) >> bitsShift
;
499 #ifdef CONFIG_RTL865X_CLE
500 if(0x8367B == cleDebuggingDisplay
)
501 PRINT("R[0x%4.4x]=0x%4.4x\n",reg
, regData
);
508 * rtl8367c_setAsicReg
510 * Set content of asic register
512 * reg - register's address
513 * value - Value setting to register
517 * RT_ERR_OK - Success
518 * RT_ERR_SMI - SMI access error
520 * The value will be set to ASIC mapping address only and it is always return RT_ERR_OK while setting un-mapping address registers
522 ret_t
rtl8367c_setAsicReg(rtk_uint32 reg
, rtk_uint32 value
)
524 #if defined(RTK_X86_ASICDRV)/*RTK-CNSD2-NickWu-20061222: for x86 compile*/
528 retVal
= Access_Write(reg
,2,value
);
529 if(TRUE
!= retVal
) return RT_ERR_SMI
;
531 if(0x8367B == cleDebuggingDisplay
)
532 PRINT("W[0x%4.4x]=0x%4.4x\n",reg
,value
);
534 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
537 if(reg
== RTL8367C_REG_MIB_ADDRESS
)
539 CleVirtualReg
[RTL8367C_MIB_COUNTER_BASE_REG
] = 0x1;
540 CleVirtualReg
[RTL8367C_MIB_COUNTER_BASE_REG
+1] = 0x2;
541 CleVirtualReg
[RTL8367C_MIB_COUNTER_BASE_REG
+2] = 0x3;
542 CleVirtualReg
[RTL8367C_MIB_COUNTER_BASE_REG
+3] = 0x4;
545 if(reg
>= CLE_VIRTUAL_REG_SIZE
)
546 return RT_ERR_OUT_OF_RANGE
;
548 CleVirtualReg
[reg
] = value
;
550 if(0x8367B == cleDebuggingDisplay
)
551 PRINT("W[0x%4.4x]=0x%4.4x\n",reg
,CleVirtualReg
[reg
]);
553 #elif defined(EMBEDDED_SUPPORT)
554 if(reg
> RTL8367C_REGDATAMAX
|| value
> RTL8367C_REGDATAMAX
)
562 retVal
= smi_write(reg
, value
);
563 if(retVal
!= RT_ERR_OK
)
565 #ifdef CONFIG_RTL865X_CLE
566 if(0x8367B == cleDebuggingDisplay
)
567 PRINT("W[0x%4.4x]=0x%4.4x\n",reg
,value
);
575 * rtl8367c_getAsicReg
577 * Get content of asic register
579 * reg - register's address
580 * value - Value setting to register
584 * RT_ERR_OK - Success
585 * RT_ERR_SMI - SMI access error
587 * Value 0x0000 will be returned for ASIC un-mapping address
589 ret_t
rtl8367c_getAsicReg(rtk_uint32 reg
, rtk_uint32
*pValue
)
592 #if defined(RTK_X86_ASICDRV)
597 retVal
= Access_Read(reg
, 2, ®Data
);
603 if(0x8367B == cleDebuggingDisplay
)
604 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);
606 #elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
607 if(reg
>= CLE_VIRTUAL_REG_SIZE
)
608 return RT_ERR_OUT_OF_RANGE
;
610 *pValue
= CleVirtualReg
[reg
];
612 if(0x8367B == cleDebuggingDisplay
)
613 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, CleVirtualReg
[reg
]);
615 #elif defined(EMBEDDED_SUPPORT)
616 if(reg
> RTL8367C_REGDATAMAX
)
619 *value
= getReg(reg
);
625 retVal
= smi_read(reg
, ®Data
);
626 if(retVal
!= RT_ERR_OK
)
630 #ifdef CONFIG_RTL865X_CLE
631 if(0x8367B == cleDebuggingDisplay
)
632 PRINT("R[0x%4.4x]=0x%4.4x\n", reg
, regData
);