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
14 * Feature : Packet Scheduling related functions
18 #include <rtl8367c_asicdrv_scheduling.h>
20 * rtl8367c_setAsicLeakyBucketParameter
22 * Set Leaky Bucket Parameters
24 * tick - Tick is used for time slot size unit
25 * token - Token is used for adding budget in each time slot
30 * RT_ERR_SMI - SMI access error
31 * RT_ERR_TICK - Invalid TICK
32 * RT_ERR_TOKEN - Invalid TOKEN
36 ret_t
rtl8367c_setAsicLeakyBucketParameter(rtk_uint32 tick
, rtk_uint32 token
)
46 retVal
= rtl8367c_setAsicRegBits(RTL8367C_LEAKY_BUCKET_TICK_REG
, RTL8367C_LEAKY_BUCKET_TICK_MASK
, tick
);
48 if(retVal
!= RT_ERR_OK
)
51 retVal
= rtl8367c_setAsicRegBits(RTL8367C_LEAKY_BUCKET_TOKEN_REG
, RTL8367C_LEAKY_BUCKET_TOKEN_MASK
, token
);
56 * rtl8367c_getAsicLeakyBucketParameter
58 * Get Leaky Bucket Parameters
60 * tick - Tick is used for time slot size unit
61 * token - Token is used for adding budget in each time slot
66 * RT_ERR_SMI - SMI access error
70 ret_t
rtl8367c_getAsicLeakyBucketParameter(rtk_uint32
*tick
, rtk_uint32
*token
)
74 retVal
= rtl8367c_getAsicRegBits(RTL8367C_LEAKY_BUCKET_TICK_REG
, RTL8367C_LEAKY_BUCKET_TICK_MASK
, tick
);
76 if(retVal
!= RT_ERR_OK
)
79 retVal
= rtl8367c_getAsicRegBits(RTL8367C_LEAKY_BUCKET_TOKEN_REG
, RTL8367C_LEAKY_BUCKET_TOKEN_MASK
, token
);
84 * rtl8367c_setAsicAprMeter
86 * Set per-port per-queue APR shared meter index
88 * port - Physical port number (0~10)
90 * apridx - dedicated shared meter index for APR (0~7)
95 * RT_ERR_SMI - SMI access error
96 * RT_ERR_PORT_ID - Invalid port number
97 * RT_ERR_QUEUE_ID - Invalid queue id
98 * RT_ERR_FILTER_METER_ID - Invalid meter
102 ret_t
rtl8367c_setAsicAprMeter(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32 apridx
)
107 if(port
> RTL8367C_PORTIDMAX
)
108 return RT_ERR_PORT_ID
;
110 if(qid
> RTL8367C_QIDMAX
)
111 return RT_ERR_QUEUE_ID
;
113 if(apridx
> RTL8367C_PORT_QUEUE_METER_INDEX_MAX
)
114 return RT_ERR_FILTER_METER_ID
;
117 retVal
= rtl8367c_setAsicRegBits(RTL8367C_SCHEDULE_PORT_APR_METER_REG(port
, qid
), RTL8367C_SCHEDULE_PORT_APR_METER_MASK(qid
), apridx
);
119 regAddr
= RTL8367C_REG_SCHEDULE_PORT8_APR_METER_CTRL0
+ ((port
-8) << 1) + (qid
/ 5);
120 retVal
= rtl8367c_setAsicRegBits(regAddr
, RTL8367C_SCHEDULE_PORT_APR_METER_MASK(qid
), apridx
);
126 * rtl8367c_getAsicAprMeter
128 * Get per-port per-queue APR shared meter index
130 * port - Physical port number (0~10)
132 * apridx - dedicated shared meter index for APR (0~7)
136 * RT_ERR_OK - Success
137 * RT_ERR_SMI - SMI access error
138 * RT_ERR_PORT_ID - Invalid port number
139 * RT_ERR_QUEUE_ID - Invalid queue id
143 ret_t
rtl8367c_getAsicAprMeter(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32
*apridx
)
148 if(port
> RTL8367C_PORTIDMAX
)
149 return RT_ERR_PORT_ID
;
151 if(qid
> RTL8367C_QIDMAX
)
152 return RT_ERR_QUEUE_ID
;
155 retVal
= rtl8367c_getAsicRegBits(RTL8367C_SCHEDULE_PORT_APR_METER_REG(port
, qid
), RTL8367C_SCHEDULE_PORT_APR_METER_MASK(qid
), apridx
);
157 regAddr
= RTL8367C_REG_SCHEDULE_PORT8_APR_METER_CTRL0
+ ((port
-8) << 1) + (qid
/ 5);
158 retVal
= rtl8367c_getAsicRegBits(regAddr
, RTL8367C_SCHEDULE_PORT_APR_METER_MASK(qid
), apridx
);
164 * rtl8367c_setAsicAprEnable
166 * Set per-port APR enable
168 * port - Physical port number (0~7)
169 * aprEnable - APR enable setting 1:enable 0:disable
173 * RT_ERR_OK - Success
174 * RT_ERR_SMI - SMI access error
175 * RT_ERR_PORT_ID - Invalid port number
179 ret_t
rtl8367c_setAsicAprEnable(rtk_uint32 port
, rtk_uint32 aprEnable
)
183 if(port
> RTL8367C_PORTIDMAX
)
184 return RT_ERR_PORT_ID
;
186 retVal
= rtl8367c_setAsicRegBit(RTL8367C_SCHEDULE_APR_CTRL_REG
, RTL8367C_SCHEDULE_APR_CTRL_OFFSET(port
), aprEnable
);
191 * rtl8367c_getAsicAprEnable
193 * Get per-port APR enable
195 * port - Physical port number (0~7)
196 * aprEnable - APR enable setting 1:enable 0:disable
200 * RT_ERR_OK - Success
201 * RT_ERR_SMI - SMI access error
202 * RT_ERR_PORT_ID - Invalid port number
206 ret_t
rtl8367c_getAsicAprEnable(rtk_uint32 port
, rtk_uint32
*aprEnable
)
210 if(port
> RTL8367C_PORTIDMAX
)
211 return RT_ERR_PORT_ID
;
213 retVal
= rtl8367c_getAsicRegBit(RTL8367C_SCHEDULE_APR_CTRL_REG
, RTL8367C_SCHEDULE_APR_CTRL_OFFSET(port
), aprEnable
);
218 * rtl8367c_setAsicWFQWeight
220 * Set weight of a queue
222 * port - Physical port number (0~10)
223 * qid - The queue ID wanted to set
224 * qWeight - The weight value wanted to set (valid:0~127)
228 * RT_ERR_OK - Success
229 * RT_ERR_SMI - SMI access error
230 * RT_ERR_PORT_ID - Invalid port number
231 * RT_ERR_QUEUE_ID - Invalid queue id
232 * RT_ERR_QOS_QUEUE_WEIGHT - Invalid queue weight
236 ret_t
rtl8367c_setAsicWFQWeight(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32 qWeight
)
240 /* Invalid input parameter */
241 if(port
> RTL8367C_PORTIDMAX
)
242 return RT_ERR_PORT_ID
;
244 if(qid
> RTL8367C_QIDMAX
)
245 return RT_ERR_QUEUE_ID
;
247 if(qWeight
> RTL8367C_QWEIGHTMAX
&& qid
> 0)
248 return RT_ERR_QOS_QUEUE_WEIGHT
;
250 retVal
= rtl8367c_setAsicReg(RTL8367C_SCHEDULE_PORT_QUEUE_WFQ_WEIGHT_REG(port
, qid
), qWeight
);
255 * rtl8367c_getAsicWFQWeight
257 * Get weight of a queue
259 * port - Physical port number (0~10)
260 * qid - The queue ID wanted to set
261 * qWeight - The weight value wanted to set (valid:0~127)
265 * RT_ERR_OK - Success
266 * RT_ERR_SMI - SMI access error
267 * RT_ERR_PORT_ID - Invalid port number
268 * RT_ERR_QUEUE_ID - Invalid queue id
272 ret_t
rtl8367c_getAsicWFQWeight(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32
*qWeight
)
277 /* Invalid input parameter */
278 if(port
> RTL8367C_PORTIDMAX
)
279 return RT_ERR_PORT_ID
;
281 if(qid
> RTL8367C_QIDMAX
)
282 return RT_ERR_QUEUE_ID
;
285 retVal
= rtl8367c_getAsicReg(RTL8367C_SCHEDULE_PORT_QUEUE_WFQ_WEIGHT_REG(port
, qid
), qWeight
);
290 * rtl8367c_setAsicWFQBurstSize
292 * Set WFQ leaky bucket burst size
294 * burstsize - Leaky bucket burst size, unit byte
298 * RT_ERR_OK - Success
299 * RT_ERR_SMI - SMI access error
303 ret_t
rtl8367c_setAsicWFQBurstSize(rtk_uint32 burstsize
)
307 retVal
= rtl8367c_setAsicReg(RTL8367C_SCHEDULE_WFQ_BURST_SIZE_REG
, burstsize
);
312 * rtl8367c_getAsicWFQBurstSize
314 * Get WFQ leaky bucket burst size
316 * burstsize - Leaky bucket burst size, unit byte
320 * RT_ERR_OK - Success
321 * RT_ERR_SMI - SMI access error
325 ret_t
rtl8367c_getAsicWFQBurstSize(rtk_uint32
*burstsize
)
329 retVal
= rtl8367c_getAsicReg(RTL8367C_SCHEDULE_WFQ_BURST_SIZE_REG
, burstsize
);
334 * rtl8367c_setAsicQueueType
336 * Set type of a queue
338 * port - Physical port number (0~10)
339 * qid - The queue ID wanted to set
340 * queueType - The specified queue type. 0b0: Strict priority, 0b1: WFQ
344 * RT_ERR_OK - Success
345 * RT_ERR_SMI - SMI access error
346 * RT_ERR_PORT_ID - Invalid port number
347 * RT_ERR_QUEUE_ID - Invalid queue id
351 ret_t
rtl8367c_setAsicQueueType(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32 queueType
)
355 /* Invalid input parameter */
356 if(port
> RTL8367C_PORTIDMAX
)
357 return RT_ERR_PORT_ID
;
359 if(qid
> RTL8367C_QIDMAX
)
360 return RT_ERR_QUEUE_ID
;
362 /* Set Related Registers */
363 retVal
= rtl8367c_setAsicRegBit(RTL8367C_SCHEDULE_QUEUE_TYPE_REG(port
), RTL8367C_SCHEDULE_QUEUE_TYPE_OFFSET(port
, qid
),queueType
);
368 * rtl8367c_getAsicQueueType
370 * Get type of a queue
372 * port - Physical port number (0~7)
373 * qid - The queue ID wanted to set
374 * queueType - The specified queue type. 0b0: Strict priority, 0b1: WFQ
378 * RT_ERR_OK - Success
379 * RT_ERR_SMI - SMI access error
380 * RT_ERR_PORT_ID - Invalid port number
381 * RT_ERR_QUEUE_ID - Invalid queue id
385 ret_t
rtl8367c_getAsicQueueType(rtk_uint32 port
, rtk_uint32 qid
, rtk_uint32
*queueType
)
389 /* Invalid input parameter */
390 if(port
> RTL8367C_PORTIDMAX
)
391 return RT_ERR_PORT_ID
;
393 if(qid
> RTL8367C_QIDMAX
)
394 return RT_ERR_QUEUE_ID
;
396 retVal
= rtl8367c_getAsicRegBit(RTL8367C_SCHEDULE_QUEUE_TYPE_REG(port
), RTL8367C_SCHEDULE_QUEUE_TYPE_OFFSET(port
, qid
),queueType
);
401 * rtl8367c_setAsicPortEgressRate
403 * Set per-port egress rate
405 * port - Physical port number (0~10)
410 * RT_ERR_OK - Success
411 * RT_ERR_SMI - SMI access error
412 * RT_ERR_PORT_ID - Invalid port number
413 * RT_ERR_QOS_EBW_RATE - Invalid bandwidth/rate
417 ret_t
rtl8367c_setAsicPortEgressRate(rtk_uint32 port
, rtk_uint32 rate
)
420 rtk_uint32 regAddr
, regData
;
422 if(port
> RTL8367C_PORTIDMAX
)
423 return RT_ERR_PORT_ID
;
425 if(rate
> RTL8367C_QOS_GRANULARTY_MAX
)
426 return RT_ERR_QOS_EBW_RATE
;
428 regAddr
= RTL8367C_PORT_EGRESSBW_LSB_REG(port
);
429 regData
= RTL8367C_QOS_GRANULARTY_LSB_MASK
& rate
;
431 retVal
= rtl8367c_setAsicReg(regAddr
, regData
);
433 if(retVal
!= RT_ERR_OK
)
436 regAddr
= RTL8367C_PORT_EGRESSBW_MSB_REG(port
);
437 regData
= (RTL8367C_QOS_GRANULARTY_MSB_MASK
& rate
) >> RTL8367C_QOS_GRANULARTY_MSB_OFFSET
;
439 retVal
= rtl8367c_setAsicRegBits(regAddr
, RTL8367C_PORT6_EGRESSBW_CTRL1_MASK
, regData
);
444 * rtl8367c_getAsicPortEgressRate
446 * Get per-port egress rate
448 * port - Physical port number (0~10)
453 * RT_ERR_OK - Success
454 * RT_ERR_SMI - SMI access error
455 * RT_ERR_PORT_ID - Invalid port number
459 ret_t
rtl8367c_getAsicPortEgressRate(rtk_uint32 port
, rtk_uint32
*rate
)
462 rtk_uint32 regAddr
, regData
,regData2
;
464 if(port
> RTL8367C_PORTIDMAX
)
465 return RT_ERR_PORT_ID
;
467 regAddr
= RTL8367C_PORT_EGRESSBW_LSB_REG(port
);
469 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
470 if(retVal
!= RT_ERR_OK
)
473 regAddr
= RTL8367C_PORT_EGRESSBW_MSB_REG(port
);
474 retVal
= rtl8367c_getAsicRegBits(regAddr
, RTL8367C_PORT6_EGRESSBW_CTRL1_MASK
, ®Data2
);
475 if(retVal
!= RT_ERR_OK
)
478 *rate
= regData
| (regData2
<< RTL8367C_QOS_GRANULARTY_MSB_OFFSET
);
483 * rtl8367c_setAsicPortEgressRateIfg
485 * Set per-port egress rate calculate include/exclude IFG
487 * ifg - 1:include IFG 0:exclude IFG
491 * RT_ERR_OK - Success
492 * RT_ERR_SMI - SMI access error
496 ret_t
rtl8367c_setAsicPortEgressRateIfg(rtk_uint32 ifg
)
500 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_SCHEDULE_WFQ_CTRL
, RTL8367C_SCHEDULE_WFQ_CTRL_OFFSET
, ifg
);
505 * rtl8367c_getAsicPortEgressRateIfg
507 * Get per-port egress rate calculate include/exclude IFG
509 * ifg - 1:include IFG 0:exclude IFG
513 * RT_ERR_OK - Success
514 * RT_ERR_SMI - SMI access error
518 ret_t
rtl8367c_getAsicPortEgressRateIfg(rtk_uint32
*ifg
)
522 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_SCHEDULE_WFQ_CTRL
, RTL8367C_SCHEDULE_WFQ_CTRL_OFFSET
, ifg
);