--- a/src/driver/T1Hndlr.c 2009-07-27 09:05:03.000000000 +0200 +++ b/src/driver/T1Hndlr.c 2011-09-24 17:15:50.000000000 +0200 @@ -68,7 +68,7 @@ printf("S Block Found\n"); #endif - if ( pucRBuffer[1] & 0x03 ) { + if ( (pucRBuffer[1] & 0x03) == 0x03 ) { #ifdef T1_DEBUG printf("WTX Request Made\n"); #endif @@ -436,6 +436,7 @@ dwRBufferLen = MAX_BUFFER_SIZE; rv = T1_ACSTransaction(Lun, slotIndex, ucTBuffer, dwRemaining+4, ucRBuffer, &dwRBufferLen ); + do { tv = T1_GetResponseType( ucRBuffer, dwRBufferLen ); #ifdef T1_DEBUG @@ -462,6 +463,8 @@ break; } + } while (tv == T1_SBLOCK_WTXREQUEST); + iPrevSequence = ucRBuffer[1] & 0x40; #ifdef T1_DEBUG printf("CASE 2: more data: %s\n", ucRBuffer[1]&0x20? "AVAILABLE":"NOT AVAILABLE"); @@ -498,8 +501,10 @@ do { /* Create the R-block */ + unsigned char NR = (~ucRBuffer[1]>>6)&0x01; + ucTBuffer[0] = 0x00; /* DF Nad */ - ucTBuffer[1] = (ucRChainNum%2)?0x90:0x80; /* N(R) */ + ucTBuffer[1] = NR?0x90:0x80; /* N(R) */ ucTBuffer[2] = 0x00; /* Len = 0 */ ucTBuffer[3] = T1CalculateLRC( ucTBuffer, 3 ); /* Lrc */ dwRBufferLen = MAX_BUFFER_SIZE;