Ejemplo n.º 1
0
static void pcnet_reset_8390(void)
{
	int i, r;

	PRINTK("nic base is %lx\n", nic_base);

#if 1
	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);
	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
	n2k_outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, E8390_CMD);
	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);
	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD));
#endif
	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD);

	n2k_outb(n2k_inb(nic_base + PCNET_RESET), PCNET_RESET);

	for (i = 0; i < 100; i++) {
		if ((r = (n2k_inb(EN0_ISR) & ENISR_RESET)) != 0)
			break;
		PRINTK("got %x in reset\n", r);
		my_udelay(100);
	}
	n2k_outb(ENISR_RESET, EN0_ISR); /* Ack intr. */

	if (i == 100)
		printf("pcnet_reset_8390() did not complete.\n");
} /* pcnet_reset_8390 */
int my_check_delay(long delay)
{
	struct timeval tv_start ;
	struct timeval tv_end ;
	volatile unsigned long time_diff ;
	int result ;
	int max_try = 3;
	do_gettimeofday(&tv_start) ;
	while(1){
		time_diff = my_udelay(delay) ;
		do_gettimeofday(&tv_end) ;
		time_diff = my_check_diff_time(tv_start, tv_end);
		if(time_diff >= delay || max_try-- <= 0)
			break ;
	}
	if( (time_diff > (delay + delay)) || (time_diff < (delay - delay/2))){
		printk("delay routine err req %d actual %d \n", delay, time_diff) ;
		return -1 ;
	}

	return 0 ;
}