> From: Don Bowman [mailto:don@;sandvine.com]
> In bge_rxeof(), there can end up being a condition which causes
> the driver to endlessly interrupt.
> 
> if (bge_newbuf_std(sc, sc->bge_std, NULL) == ENOBUFS) {
>     ifp->if_ierrors++;
>     bge_newbuf_std(sc, sc->bge_std, m);
>     continue;
> }
> 
> happens. Now, bge_newbuf_std returns ENOBUFS. 'm' is also NULL.
> This causes the received packet to not be dequeued, and the driver
> will then go straight back into interrupt as the chip will 
> reassert the interrupt as soon as we return.

More information... It would appear that we're looping here
in the rx interrupt, the variable 'stdcnt' which counts
the number of standard-sized packets pulled off per iteration
is huge (indicating we've overrun the ring multiple times).

    while(sc->bge_rx_saved_considx !=
        sc->bge_rdata->bge_status_block.bge_idx[0].bge_rx_prod_idx) {

is the construct that controls when we exit the loop. Clearly
in my case this is never becoming false.
I see 'sc->bge_rx_saved_considx' as 201, and the RHS of the 
expression as 38442. This doesn't seem correct, I think that
both numbers must be <= BGE_SSLOTS. 

(kgdb) p/x *cur_rx
$10 = {bge_addr = {bge_addr_hi = 0x0, bge_addr_lo = 0xca2d802}, 
  bge_len = 0x4a, bge_idx = 0xc8, bge_flags = 0x7004, bge_type = 0x0, 
  bge_tcp_udp_csum = 0x9992, bge_ip_csum = 0xffff, bge_vlan_tag = 0x0, 
  bge_error_flag = 0x0, bge_rsvd = 0x0, bge_opaque = 0x0}

Any suggestions anyone?


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message

Reply via email to