Ethernet Shield mi blocca tutto !

Mi sto leggendo il datasheet del W5100 e lo sto confrontando con quello che fa la libreria.

Prima di trasmettere un dato l'Arduino va a leggere nel W5100 qual è lo spazio disponibile per la trasmissione. Stessa cosa per la ricezione.

W5100.cpp

uint16_t W5100Class::getTXFreeSize(SOCKET s)
{
  uint16_t val=0, val1=0;
  do {
    val1 = readSnTX_FSR(s);
    if (val1 != 0)
      val = readSnTX_FSR(s);
  } 
  while (val != val1);
  return val;
}

uint16_t W5100Class::getRXReceivedSize(SOCKET s)
{
  uint16_t val=0,val1=0;
  do {
    val1 = readSnRX_RSR(s);
    if (val1 != 0)
      val = readSnRX_RSR(s);
  } 
  while (val != val1);
  return val;
}

Perché viene fatta la lettura due volte dello stesso registro fino a che le due letture non coincidono?