121121#define VCR_SEMAPHORE62 0x0 /* semaphore Domain */
122122#define VCR_CMD_ADDR 0x100000 /* mailbox addr */
123123#define VCR_CMD_SIZE_ADDR 0x1000 /* mailbox size */
124+ #define VCR_SYNDROME_OFFSET 0x1008
125+ #define SYNDROME_OFFSET 0x3f8
126+ #define SYNDROME_BITOFF 0
127+ #define SYNDROME_BITLEN 24
128+
124129
125130#define EXT_MBOX_DMA_OFF 0x8
126131
@@ -359,6 +364,15 @@ static MError set_busy_bit(mfile* mf, u_int32_t* reg, int busy_bit_offset)
359364 return MWRITE4_ICMD (mf , mf -> icmd .ctrl_addr , * reg );
360365}
361366
367+ static MError get_syndrome (mfile * mf , u_int32_t * reg , int syndrome_bit_offset , int syndrome_bit_len )
368+ {
369+ DBG_PRINTF ("Reading syndrome from addr=0x%x\n" , mf -> icmd .syndrome_addr );
370+ int rc = MREAD4_ICMD (mf , mf -> icmd .syndrome_addr , reg );
371+ CHECK_RC (rc );
372+
373+ return EXTRACT ((* reg ), syndrome_bit_offset , syndrome_bit_len );
374+ }
375+
362376static int set_sleep ()
363377{
364378 char * icmd_sleep_env ;
@@ -801,6 +815,12 @@ static int icmd_send_command_com(mfile * mf,
801815
802816 /* get status */
803817 ret = translate_status (EXTRACT (reg , STATUS_BITOFF , STATUS_BITLEN ));
818+
819+ if (ret != ME_OK )
820+ {
821+ mf -> icmd .syndrome = get_syndrome (mf , & reg , SYNDROME_BITOFF , SYNDROME_BITLEN );
822+ }
823+
804824 CHECK_RC_GO_TO (ret , cleanup );
805825
806826 DBG_PRINTF ("-D- Reading command from mailbox" );
@@ -976,6 +996,7 @@ static int icmd_init_cr(mfile* mf)
976996 u_int32_t cmd_ptr_addr ;
977997 u_int32_t reg = 0x0 ;
978998 u_int32_t hw_id = 0x0 ;
999+ mf -> icmd .syndrome = 0 ;
9791000
9801001#ifndef __FreeBSD__
9811002 u_int32_t dev_type = 0 ;
@@ -1135,6 +1156,8 @@ static int icmd_init_cr(mfile* mf)
11351156
11361157 mf -> icmd .cmd_addr = EXTRACT (reg , CMD_PTR_BITOFF , mf -> icmd .cmd_ptr_bitlen );
11371158 mf -> icmd .ctrl_addr = mf -> icmd .cmd_addr + CTRL_OFFSET ;
1159+ mf -> icmd .syndrome_addr = mf -> icmd .cmd_addr + SYNDROME_OFFSET ;
1160+ DBG_PRINTF ("-D- iCMD syndrom addr: 0x%x\n" , mf -> icmd .syndrome_addr );
11381161 break ;
11391162
11401163 case ME_ICMD_STATUS_CR_FAIL :
@@ -1243,6 +1266,8 @@ static int icmd_init_vcr(mfile* mf)
12431266 mf -> icmd .cmd_addr = VCR_CMD_ADDR ;
12441267 mf -> icmd .ctrl_addr = VCR_CTRL_ADDR ;
12451268 mf -> icmd .semaphore_addr = VCR_SEMAPHORE62 ;
1269+ mf -> icmd .syndrome_addr = VCR_SYNDROME_OFFSET ;
1270+ mf -> icmd .syndrome = 0 ;
12461271 DBG_PRINTF ("-D- Getting VCR_CMD_SIZE_ADDR\n" );
12471272
12481273 rc = icmd_take_semaphore_com (mf , pid );
@@ -1262,6 +1287,7 @@ static int icmd_init_vcr(mfile* mf)
12621287 mf -> icmd .icmd_opened = 1 ;
12631288 DBG_PRINTF ("-D- iCMD command addr: 0x%x\n" , mf -> icmd .cmd_addr );
12641289 DBG_PRINTF ("-D- iCMD ctrl addr: 0x%x\n" , mf -> icmd .ctrl_addr );
1290+ DBG_PRINTF ("-D- iCMD syndrom addr: 0x%x\n" , mf -> icmd .syndrome_addr );
12651291 DBG_PRINTF ("-D- iCMD semaphore addr(semaphore space): 0x%x\n" , mf -> icmd .semaphore_addr );
12661292 DBG_PRINTF ("-D- iCMD max mailbox size: 0x%x size %d\n" , mf -> icmd .max_cmd_size , size );
12671293 DBG_PRINTF ("-D- iCMD stat_cfg_not_done addr: 0x%x:%d\n" , mf -> icmd .static_cfg_not_done_addr ,
0 commit comments