Print this page
re #6892 rb1796 no ENXIO after clock validation in todpc_rtcget


 357         unsigned char   mon_alrm;
 358 
 359         ASSERT(MUTEX_HELD(&tod_lock));
 360 
 361         day_alrm = pc_rtc_offset.day_alrm;
 362         mon_alrm = pc_rtc_offset.mon_alrm;
 363         if (pc_rtc_offset.century != 0) {
 364                 century = pc_rtc_offset.century;
 365         }
 366 
 367         for (;;) {
 368                 if (vrt_try-- < 0)
 369                         return (ENXIO);
 370                 outb(RTC_ADDR, RTC_D);          /* check if clock valid */
 371                 reg = inb(RTC_DATA);
 372                 if ((reg & RTC_VRT) != 0)
 373                         break;
 374                 drv_usecwait(5000);             /* Delay for 5000 us */
 375         }
 376 
 377 
 378 checkuip:
 379         if (uip_try-- < 0)
 380                 return (EAGAIN);
 381         outb(RTC_ADDR, RTC_A);          /* check if update in progress */
 382         reg = inb(RTC_DATA);
 383         if (reg & RTC_UIP) {
 384                 tenmicrosec();
 385                 goto checkuip;
 386         }
 387 
 388         for (i = 0, rawp = buf; i < RTC_NREG; i++) {
 389                 outb(RTC_ADDR, i);
 390                 *rawp++ = inb(RTC_DATA);
 391         }
 392         outb(RTC_ADDR, century); /* do century */
 393         ((struct rtc_t *)buf)->rtc_century = inb(RTC_DATA);
 394 
 395         if (day_alrm > 0) {
 396                 outb(RTC_ADDR, day_alrm);
 397                 ((struct rtc_t *)buf)->rtc_adom = inb(RTC_DATA) & 0x3f;




 357         unsigned char   mon_alrm;
 358 
 359         ASSERT(MUTEX_HELD(&tod_lock));
 360 
 361         day_alrm = pc_rtc_offset.day_alrm;
 362         mon_alrm = pc_rtc_offset.mon_alrm;
 363         if (pc_rtc_offset.century != 0) {
 364                 century = pc_rtc_offset.century;
 365         }
 366 
 367         for (;;) {
 368                 if (vrt_try-- < 0)
 369                         return (ENXIO);
 370                 outb(RTC_ADDR, RTC_D);          /* check if clock valid */
 371                 reg = inb(RTC_DATA);
 372                 if ((reg & RTC_VRT) != 0)
 373                         break;
 374                 drv_usecwait(5000);             /* Delay for 5000 us */
 375         }
 376 

 377 checkuip:
 378         if (uip_try-- < 0)
 379                 return (EAGAIN);
 380         outb(RTC_ADDR, RTC_A);          /* check if update in progress */
 381         reg = inb(RTC_DATA);
 382         if (reg & RTC_UIP) {
 383                 tenmicrosec();
 384                 goto checkuip;
 385         }
 386 
 387         for (i = 0, rawp = buf; i < RTC_NREG; i++) {
 388                 outb(RTC_ADDR, i);
 389                 *rawp++ = inb(RTC_DATA);
 390         }
 391         outb(RTC_ADDR, century); /* do century */
 392         ((struct rtc_t *)buf)->rtc_century = inb(RTC_DATA);
 393 
 394         if (day_alrm > 0) {
 395                 outb(RTC_ADDR, day_alrm);
 396                 ((struct rtc_t *)buf)->rtc_adom = inb(RTC_DATA) & 0x3f;