Send 명령 체크 루틴

안녕하세요

아래의 코드는 mac raw 모드에서 send를 구현 한 것입니다.
코드의 내용 중 493 line의 udelay에 대해 질문이 있습니다.

475 static int w5100_raw_send(struct eth_device *dev, volatile void *packet, int len) 476 { 477 uint16_t ret=0; 478 uint8_t sn=0; 479 uint16_t ptr = 0; 480 if (len > getSn_TXBUF_SIZE(sn)) ret = getSn_TXBUF_SIZE(sn); // check size not to exceed MAX size. 481 else ret = len; 482 483 ptr = w5100_read8( Sn_TX_WR0(sn) ); 484 ptr = ((ptr & 0x00ff) << 8) + w5100_read8(Sn_TX_WR1(sn)); 485 486 write_data(sn, packet, ptr, len); 487 ptr += len; 488 w5100_write8( Sn_TX_WR0(sn) ,(uint8_t)((ptr & 0xff00) >> 8)); 489 w5100_write8( Sn_TX_WR1(sn),(uint8_t)(ptr & 0x00ff)); 490 491 w5100_write8(Sn_CR(sn),Sn_CR_SEND); 492 493 udelay(10); 494 495 while( w5100_read8(Sn_CR(sn)) ); 496 while ( (w5100_read8(Sn_IR(sn)) & Sn_IR_SENDOK) != Sn_IR_SENDOK ); 497 498 w5100_write8(Sn_IR(sn), Sn_IR_SENDOK); 499 return 0; 500 }

여타 wiznet에서 제공되는 w5100/w5500 관련 소스코드에는 Sn_CR_SEND 명령을 보내고 난 이후에
Sn_CR을 체크 하는 루틴의 중간에 delay 부분이 없습니다.
이 delay는 제가 넣은 것으로 사실상 delay가 없으면 495 line에서 빠져나오지를 못하기 때문에 넣은 미봉책입니다.

제가 이해가 안되는 것은 만약 에이직에서 명령 처리에 대한 처리 시간이 필요하다면 당연히 495 line에서 약간의 시간 경과 후(udelay(10)정도의) 다음 행을 실행 하여야 하지만 이상하게도 493 line의 udelay가 없으면 495 line에서 holding 됩니다.

이 부분의 원인이 무엇인지, 아니면 다른 부분에 문제가 있는지 검토 부탁 드립니다.
단순 udelay 10에서 해결된다면 문제가 안되겠지만 저 시간은 udelay 4 ~ udelay 10까지가 변동이 있습니다.
그렇다는 얘기는 udelay 10도 안전한 delay value는 아닐 수 있다는 것인데, 무한정 delay만을 줄 수 없어 문의 드립니다.

감사합니다.

delay를 안해줘도 command register가 클리어 될때까지 기다린다면 이상없이 동작하는 것이 맞습니다.

w5100_read8 와 w5100_write8 코드를 볼 수 있을까요??

그러네요… 다시 보니 volatile이 빠져있어서 문제가 생기는 것 같습니다.

감사합니다.