Skip to content

Commit e37d147

Browse files
committed
[Credo][Ycable] do not locker whole debug_dump_registers() function to avoid acquire lock timeout error
Signed-off-by: Xinyu <[email protected]>
1 parent 993f739 commit e37d147

File tree

1 file changed

+101
-93
lines changed

1 file changed

+101
-93
lines changed

sonic_y_cable/credo/y_cable_credo.py

Lines changed: 101 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -3113,53 +3113,48 @@ def debug_dump_registers(self, option=None):
31133113
which would help diagnose the cable for proper functioning
31143114
"""
31153115
if self.platform_chassis is not None:
3116-
with self.rlock.acquire_timeout(RLocker.ACQUIRE_LOCK_TIMEOUT) as lock_status:
3117-
if lock_status:
3118-
result = {}
3119-
result['pn'] = self.get_part_number()
3120-
result['sn'] = self.get_serial_number()
3121-
result['uart_stat'] = self.get_uart_stat()
3122-
result['nic_temp'] = self.get_nic_temperature()
3123-
result['nic_voltage'] = self.get_nic_voltage()
3124-
result['fw_init_status'] = self.get_dsp_fw_init_stat()
3125-
result['serdes_detect'] = self.get_dsp_link_Dect()
3126-
3127-
lanes = [0,1,2,3,12,13,14,15,20,21,22,23]
3128-
3129-
for ln in list(lanes):
3130-
data = self.get_serdes_params(ln)
3131-
serdes = {}
3132-
serdes['ch_est'] = struct.unpack_from('<f', data[ 4 : 8])[0]
3133-
serdes['of'] = struct.unpack_from('<H', data[ 8 : 10])[0]
3134-
serdes['hf'] = struct.unpack_from('<H', data[ 10 : 12])[0]
3135-
serdes['ctle1'] = struct.unpack_from('<H', data[ 14 : 16])[0]
3136-
serdes['ctle2'] = struct.unpack_from('<H', data[ 16 : 18])[0]
3137-
serdes['delta'] = struct.unpack_from('<h', data[ 18 : 20])[0]
3138-
serdes['eye'] = struct.unpack_from('<H', data[ 30 : 32])[0]
3139-
serdes['ppm'] = struct.unpack_from('<h', data[ 40 : 42])[0]
3140-
serdes['adp_cnt'] = struct.unpack_from('<H', data[ 56 : 58])[0]
3141-
serdes['adp_done'] = struct.unpack_from('<B', data[ 58 : 59])[0]
3142-
serdes['agc_g1'] = struct.unpack_from('<H', data[ 59 : 61])[0]
3143-
serdes['agc_g2'] = struct.unpack_from('<H', data[ 61 : 63])[0]
3144-
serdes['exit_code'] = struct.unpack_from('<H', data[112 :114])[0]
3145-
serdes['pll_tx'] = struct.unpack_from('<H', data[ 42 : 44])[0]
3146-
serdes['pll_rx'] = struct.unpack_from('<H', data[ 44 : 46])[0]
3147-
serdes['f1'] = struct.unpack_from('<h', data[ 46 : 48])[0]
3148-
serdes['f2'] = struct.unpack_from('<h', data[ 48 : 50])[0]
3149-
serdes['f3'] = struct.unpack_from('<h', data[ 50 : 52])[0]
3150-
serdes['temp'] = struct.unpack_from('<b', data[111 :112])[0]
3151-
3152-
result['serde_lane_%d' % ln] = serdes
3153-
else:
3154-
self.log_error('acquire lock timeout, failed to dump registers')
3155-
return YCable.EEPROM_ERROR
3116+
result = {}
3117+
result['pn'] = self.get_part_number()
3118+
result['sn'] = self.get_serial_number()
3119+
result['uart_stat'] = self.get_uart_stat()
3120+
result['nic_temp'] = self.get_nic_temperature()
3121+
result['nic_voltage'] = self.get_nic_voltage()
3122+
result['fw_init_status'] = self.get_dsp_fw_init_stat()
3123+
result['serdes_detect'] = self.get_dsp_link_detect()
3124+
3125+
lanes = [0,1,2,3,12,13,14,15,20,21,22,23]
3126+
3127+
for ln in list(lanes):
3128+
data = self.get_serdes_params(ln)
3129+
serdes = {}
3130+
serdes['ch_est'] = struct.unpack_from('<f', data[ 4 : 8])[0]
3131+
serdes['of'] = struct.unpack_from('<H', data[ 8 : 10])[0]
3132+
serdes['hf'] = struct.unpack_from('<H', data[ 10 : 12])[0]
3133+
serdes['ctle1'] = struct.unpack_from('<H', data[ 14 : 16])[0]
3134+
serdes['ctle2'] = struct.unpack_from('<H', data[ 16 : 18])[0]
3135+
serdes['delta'] = struct.unpack_from('<h', data[ 18 : 20])[0]
3136+
serdes['eye'] = struct.unpack_from('<H', data[ 30 : 32])[0]
3137+
serdes['ppm'] = struct.unpack_from('<h', data[ 40 : 42])[0]
3138+
serdes['adp_cnt'] = struct.unpack_from('<H', data[ 56 : 58])[0]
3139+
serdes['adp_done'] = struct.unpack_from('<B', data[ 58 : 59])[0]
3140+
serdes['agc_g1'] = struct.unpack_from('<H', data[ 59 : 61])[0]
3141+
serdes['agc_g2'] = struct.unpack_from('<H', data[ 61 : 63])[0]
3142+
serdes['exit_code'] = struct.unpack_from('<H', data[112 :114])[0]
3143+
serdes['pll_tx'] = struct.unpack_from('<H', data[ 42 : 44])[0]
3144+
serdes['pll_rx'] = struct.unpack_from('<H', data[ 44 : 46])[0]
3145+
serdes['f1'] = struct.unpack_from('<h', data[ 46 : 48])[0]
3146+
serdes['f2'] = struct.unpack_from('<h', data[ 48 : 50])[0]
3147+
serdes['f3'] = struct.unpack_from('<h', data[ 50 : 52])[0]
3148+
serdes['temp'] = struct.unpack_from('<b', data[111 :112])[0]
3149+
3150+
result['serde_lane_%d' % ln] = serdes
31563151
else:
31573152
self.log_error("platform_chassis is not loaded, failed to dump registers")
31583153
return YCable.EEPROM_ERROR
31593154

31603155
return result
31613156

3162-
def get_dsp_link_Dect(self):
3157+
def get_dsp_link_detect(self):
31633158
"""
31643159
This API returns rdy/sd of DSP.
31653160
The port on which this API is called for can be referred using self.port.
@@ -3197,20 +3192,24 @@ def get_dsp_fw_init_stat(self):
31973192
"""
31983193

31993194
if self.platform_chassis is not None:
3200-
result = {}
3201-
3202-
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3203-
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_DSP_LOADFW_STAT
3204-
status = self.send_vsc(vsc_req_form)
3205-
if status != YCable.MCU_EC_NO_ERROR:
3206-
self.log_error('Get DSP firmware init status error (error code:0x%04X)' % (status))
3207-
return result
3195+
with self.rlock.acquire_timeout(RLocker.ACQUIRE_LOCK_TIMEOUT) as lock_status:
3196+
if lock_status:
3197+
result = {}
32083198

3209-
result['err_code'] = self.read_mmap(YCable.MIS_PAGE_VSC, 134)
3210-
result['err_stat'] = self.read_mmap(YCable.MIS_PAGE_VSC, 135)
3199+
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3200+
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_DSP_LOADFW_STAT
3201+
status = self.send_vsc(vsc_req_form)
3202+
if status != YCable.MCU_EC_NO_ERROR:
3203+
self.log_error('Get DSP firmware init status error (error code:0x%04X)' % (status))
3204+
return result
32113205

3206+
result['err_code'] = self.read_mmap(YCable.MIS_PAGE_VSC, 134)
3207+
result['err_stat'] = self.read_mmap(YCable.MIS_PAGE_VSC, 135)
3208+
else:
3209+
self.log_error('acquire lock timeout, failed to get init status')
3210+
return YCable.EEPROM_ERROR
32123211
else:
3213-
self.log_error("platform_chassis is not loaded, failed to get init. status of DSP firmware")
3212+
self.log_error("platform_chassis is not loaded, failed to get init status")
32143213

32153214
return result
32163215

@@ -3229,34 +3228,38 @@ def get_uart_stat(self):
32293228
uartPort = {}
32303229
result = {}
32313230

3232-
for option in range(2):
3233-
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3234-
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_UART_STAT
3235-
vsc_req_form[YCable.VSC_BYTE_OPTION] = option
3236-
status = self.send_vsc(vsc_req_form)
3237-
if status != YCable.MCU_EC_NO_ERROR:
3238-
self.log_error('Dump Uart statstics error (error code:0x%04X)' % (status))
3239-
return result
3240-
3241-
addr = 128
3242-
3243-
for idx in range(1, 3):
3244-
cnt['TxPktCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3245-
addr += 4
3246-
cnt['RxPktCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3247-
addr += 4
3248-
cnt['AckCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3249-
addr += 4
3250-
cnt['NackCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3251-
addr += 4
3252-
cnt['TxRetryCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3253-
addr += 4
3254-
cnt['TxAbortCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3255-
addr += 4
3256-
uartPort['UART%d' % idx] = cnt
3257-
if option == 0: result['Local'] = uartPort
3258-
else: result['Remote'] = uartPort
3259-
3231+
with self.rlock.acquire_timeout(RLocker.ACQUIRE_LOCK_TIMEOUT) as lock_status:
3232+
if lock_status:
3233+
for option in range(2):
3234+
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3235+
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_UART_STAT
3236+
vsc_req_form[YCable.VSC_BYTE_OPTION] = option
3237+
status = self.send_vsc(vsc_req_form)
3238+
if status != YCable.MCU_EC_NO_ERROR:
3239+
self.log_error('Dump Uart statstics error (error code:0x%04X)' % (status))
3240+
return result
3241+
3242+
addr = 128
3243+
3244+
for idx in range(1, 3):
3245+
cnt['TxPktCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3246+
addr += 4
3247+
cnt['RxPktCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3248+
addr += 4
3249+
cnt['AckCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3250+
addr += 4
3251+
cnt['NackCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3252+
addr += 4
3253+
cnt['TxRetryCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3254+
addr += 4
3255+
cnt['TxAbortCnt'] = (self.read_mmap(YCable.MIS_PAGE_FC, addr + 3) << 24) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 2) << 16) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 1) << 8) | (self.read_mmap(YCable.MIS_PAGE_FC, addr + 0) << 0)
3256+
addr += 4
3257+
uartPort['UART%d' % idx] = cnt
3258+
if option == 0: result['Local'] = uartPort
3259+
else: result['Remote'] = uartPort
3260+
else:
3261+
self.log_error('acquire lock timeout, failed to get uart statistics')
3262+
return YCable.EEPROM_ERROR
32603263
else:
32613264
self.log_error("platform_chassis is not loaded, failed to get Uart statstics")
32623265

@@ -3276,20 +3279,25 @@ def get_serdes_params(self, lane):
32763279
raw data of serdes information
32773280
"""
32783281
if self.platform_chassis is not None:
3279-
ln = lane
3282+
with self.rlock.acquire_timeout(RLocker.ACQUIRE_LOCK_TIMEOUT) as lock_status:
3283+
if lock_status:
3284+
ln = lane
32803285

3281-
result = {}
3282-
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3283-
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_SERDES_INFO
3284-
vsc_req_form[YCable.VSC_BYTE_OPTION] = 0
3285-
vsc_req_form[YCable.VSC_BYTE_ADDR0] = ln & 0xFF
3286-
vsc_req_form[YCable.VSC_BYTE_DATA0] = 1
3287-
status = self.send_vsc(vsc_req_form)
3288-
if status != YCable.MCU_EC_NO_ERROR:
3289-
self.log_error('Dump Serdes Info error (error code:0x%04X)' % (status))
3290-
return result
3291-
3292-
result = self.read_mmap(YCable.MIS_PAGE_FC, 128, 128)
3286+
result = {}
3287+
vsc_req_form = [None] * (YCable.VSC_CMD_ATTRIBUTE_LENGTH)
3288+
vsc_req_form[YCable.VSC_BYTE_OPCODE] = YCable.VSC_OPCODE_SERDES_INFO
3289+
vsc_req_form[YCable.VSC_BYTE_OPTION] = 0
3290+
vsc_req_form[YCable.VSC_BYTE_ADDR0] = ln & 0xFF
3291+
vsc_req_form[YCable.VSC_BYTE_DATA0] = 1
3292+
status = self.send_vsc(vsc_req_form)
3293+
if status != YCable.MCU_EC_NO_ERROR:
3294+
self.log_error('Dump Serdes Info error (error code:0x%04X)' % (status))
3295+
return result
3296+
3297+
result = self.read_mmap(YCable.MIS_PAGE_FC, 128, 128)
3298+
else:
3299+
self.log_error('acquire lock timeout, failed to get serdes param')
3300+
return YCable.EEPROM_ERROR
32933301
else:
32943302
self.log_error("platform_chassis is not loaded, failed to get serdes params")
32953303

0 commit comments

Comments
 (0)