diff options
author | Udayan Kumar <udayan.kumar@gmail.com> | 2007-07-03 22:20:47 -0400 |
---|---|---|
committer | Udayan Kumar <udayan.kumar@gmail.com> | 2007-07-14 21:08:05 -0400 |
commit | 5e91a38269ea5e80e27f143a62b6aa926ff0ddcf (patch) | |
tree | e87bb83738e6ed48efe6e3da98ddbc2412545bba /src/drivers/net/natsemi.c | |
parent | 0d4ecfa63c70e77e1755d490d3caa61e3453bf07 (diff) | |
download | ipxe-5e91a38269ea5e80e27f143a62b6aa926ff0ddcf.tar.gz |
interrupt in natsemi
Diffstat (limited to 'src/drivers/net/natsemi.c')
-rw-r--r-- | src/drivers/net/natsemi.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/drivers/net/natsemi.c b/src/drivers/net/natsemi.c index 67c18b8e8..9c8d4581a 100644 --- a/src/drivers/net/natsemi.c +++ b/src/drivers/net/natsemi.c @@ -445,7 +445,7 @@ static void nat_close ( struct net_device *netdev ) { free_iob( nat->iobuf[i] ); } /* disable interrupts */ - outl(0,nat->ioaddr +IntrEnable); + outl(0,nat->ioaddr + IntrMask) ; } /** @@ -498,11 +498,21 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) { struct natsemi_nic *nat = netdev->priv; unsigned int status; unsigned int rx_status; + unsigned int intr_status; unsigned int rx_len; struct io_buffer *rx_iob; int i; + outl(1,nat->ioaddr +IntrEnable); + /* read the interrupt register */ + intr_status=inl(nat->ioaddr+IntrStatus); + if(!intr_status) + goto end; + /* check the status of packets given to card for transmission */ + DBG("Intr status %X\n",intr_status); + + i=nat->tx_dirty; while(i!=nat->tx_cur) { @@ -551,7 +561,7 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) { rx_iob = alloc_iob(rx_len); if(!rx_iob) /* leave packet for next call to poll*/ - return; + goto end; memcpy(iob_put(rx_iob,rx_len), bus_to_virt(nat->rx[nat->rx_cur].bufptr),rx_len); @@ -565,9 +575,11 @@ static void nat_poll ( struct net_device *netdev, unsigned int rx_quota ) { rx_status=(unsigned int)nat->rx[nat->rx_cur].cmdsts; } +end: /* re-enable the potentially idle receive state machine */ - outl(RxOn, nat->ioaddr + ChipCmd); + outl(RxOn, nat->ioaddr + ChipCmd); + outl(1,nat->ioaddr +IntrEnable); } |