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;
|