void waiton_timer2(unsigned int ticks) { load_timer2(ticks); while(timer2_running()) { poll_interruptions(); } }
static void rtl_disable(struct nic *nic) { /* reset the chip */ outb(CmdReset, ioaddr + ChipCmd); /* 10 ms timeout */ load_timer2(10*TICKS_PER_MS); while ((inb(ioaddr + ChipCmd) & CmdReset) != 0 && timer2_running()) /* wait */; }
static void rtl_reset(struct nic* nic) { int i; outb(CmdReset, ioaddr + ChipCmd); cur_rx = 0; cur_tx = 0; /* Give the chip 10ms to finish the reset. */ load_timer2(10*TICKS_PER_MS); while ((inb(ioaddr + ChipCmd) & CmdReset) != 0 && timer2_running()) /* wait */; for (i = 0; i < ETH_ALEN; i++) outb(nic->node_addr[i], ioaddr + MAC0 + i); /* Must enable Tx/Rx before setting transfer thresholds! */ outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd); outl((RX_FIFO_THRESH<<13) | (RX_BUF_LEN_IDX<<11) | (RX_DMA_BURST<<8), ioaddr + RxConfig); /* accept no frames yet! */ outl((TX_DMA_BURST<<8)|0x03000000, ioaddr + TxConfig); /* The Linux driver changes Config1 here to use a different LED pattern * for half duplex or full/autodetect duplex (for full/autodetect, the * outputs are TX/RX, Link10/100, FULL, while for half duplex it uses * TX/RX, Link100, Link10). This is messy, because it doesn't match * the inscription on the mounting bracket. It should not be changed * from the configuration EEPROM default, because the card manufacturer * should have set that to match the card. */ #ifdef DEBUG_RX printf("rx ring address is %X\n",(unsigned long)rx_ring); #endif outl((unsigned long)rx_ring, ioaddr + RxBuf); /* Start the chip's Tx and Rx process. */ outl(0, ioaddr + RxMissed); /* set_rx_mode */ outb(AcceptBroadcast|AcceptMyPhys, ioaddr + RxConfig); /* If we add multicast support, the MAR0 register would have to be * initialized to 0xffffffffffffffff (two 32 bit accesses). Etherboot * only needs broadcast (for ARP/RARP/BOOTP/DHCP) and unicast. */ outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd); /* Disable all known interrupts by setting the interrupt mask. */ outw(0, ioaddr + IntrMask); }
void udelay(unsigned int usecs) { load_timer2((usecs * TICKS_PER_MS) / 1000); while ((inb(PPC_PORTB) & PPCB_T2OUT) == 0); }
void timer2_udelay ( unsigned long usecs ) { load_timer2 ( ( usecs * TIMER2_TICKS_PER_SEC ) / ( 1000 * 1000 ) ); while (timer2_running()) { /* Do nothing */ } }
void waiton_timer2(unsigned int ticks) { load_timer2(ticks); while ((UCOS_INB(PPC_PORTB) & PPCB_T2OUT) == 0) ; }
static void w89c840_transmit( struct nic *nic, const char *d, unsigned int t, unsigned int s, const char *p) { unsigned entry; int transmit_status; entry = w840private.cur_tx % TX_RING_SIZE; memcpy (tx_packet, d, ETH_ALEN); memcpy (tx_packet + ETH_ALEN, nic->node_addr, ETH_ALEN); *((char *) tx_packet + 12) = t >> 8; *((char *) tx_packet + 13) = t; memcpy (tx_packet + ETH_HLEN, p, s); s += ETH_HLEN; while (s < ETH_ZLEN) *((char *) tx_packet + ETH_HLEN + (s++)) = 0; w840private.tx_ring[entry].buffer1 = virt_to_le32desc(tx_packet); w840private.tx_ring[entry].length = (DescWholePkt | s); if (entry >= TX_RING_SIZE-1) w840private.tx_ring[entry].length |= (DescIntr | DescEndRing); w840private.tx_ring[entry].status = (DescOwn); w840private.cur_tx++; w840private.tx_q_bytes += s; writel(0, ioaddr + TxStartDemand); if ((w840private.drv_flags & HasBrokenTx) && w840private.tx_q_bytes > TX_BUG_FIFO_LIMIT) { w840private.tx_full = 1; } #if defined(W89C840_DEBUG) printf("winbond-840 : Transmit frame # %d size %d queued in slot %d.\n", w840private.cur_tx, s, entry); #endif transmit_status = w840private.tx_ring[entry].status; load_timer2(TX_TIMEOUT); { u32 intr_stat = 0; while (1) { intr_stat = readl(ioaddr + IntrStatus); #if defined(W89C840_DEBUG) decode_interrupt(intr_stat); #endif if (intr_stat & (NormalIntr | IntrTxDone)) { while ( (transmit_status & DescOwn) && timer2_running()) { transmit_status = w840private.tx_ring[entry].status; } writel(intr_stat & 0x0001ffff, ioaddr + IntrStatus); break; } } } if ((transmit_status & DescOwn) == 0) { #if defined(W89C840_DEBUG) printf("winbond-840 : transmission complete after %d wait loop iterations, status %X\n", TX_LOOP_COUNT - transmit_loop_counter, w840private.tx_ring[entry].status); #endif return; } printf("winbond-840 : transmission TIMEOUT : status %X\n", w840private.tx_ring[entry].status); return; }