patch-2.4.21 linux-2.4.21/arch/ppc/8xx_io/enet.c
Next file: linux-2.4.21/arch/ppc/8xx_io/fec.c
Previous file: linux-2.4.21/arch/ppc/8xx_io/commproc.c
Back to the patch index
Back to the overall index
- Lines: 139
- Date:
2003-06-13 07:51:31.000000000 -0700
- Orig file:
linux-2.4.20/arch/ppc/8xx_io/enet.c
- Orig date:
2001-10-17 14:37:01.000000000 -0700
diff -urN linux-2.4.20/arch/ppc/8xx_io/enet.c linux-2.4.21/arch/ppc/8xx_io/enet.c
@@ -1,7 +1,4 @@
/*
- * BK Id: SCCS/s.enet.c 1.17 10/11/01 11:55:47 trini
- */
-/*
* Ethernet driver for Motorola MPC8xx.
* Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
*
@@ -48,6 +45,7 @@
#include <asm/bitops.h>
#include <asm/uaccess.h>
#include <asm/commproc.h>
+#include <asm/irq.h>
/*
* Theory of Operation
@@ -140,14 +138,13 @@
cbd_t *dirty_tx; /* The ring entries to be free()ed. */
scc_t *sccp;
struct net_device_stats stats;
- uint tx_full;
+ uint tx_free;
spinlock_t lock;
};
static int scc_enet_open(struct net_device *dev);
static int scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
static int scc_enet_rx(struct net_device *dev);
-static void scc_enet_interrupt(void *dev_id, struct pt_regs *regs);
static int scc_enet_close(struct net_device *dev);
static struct net_device_stats *scc_enet_get_stats(struct net_device *dev);
static void set_multicast_list(struct net_device *dev);
@@ -201,9 +198,9 @@
bdp = cep->cur_tx;
#ifndef final_version
- if (bdp->cbd_sc & BD_ENET_TX_READY) {
+ if (!cep->tx_free || (bdp->cbd_sc & BD_ENET_TX_READY)) {
/* Ooops. All transmit buffers are full. Bail out.
- * This should not happen, since cep->tx_busy should be set.
+ * This should not happen, since the tx queue should be stopped.
*/
printk("%s: tx queue full!.\n", dev->name);
return 1;
@@ -255,10 +252,8 @@
else
bdp++;
- if (bdp->cbd_sc & BD_ENET_TX_READY) {
+ if (!--cep->tx_free)
netif_stop_queue(dev);
- cep->tx_full = 1;
- }
cep->cur_tx = (cbd_t *)bdp;
@@ -278,8 +273,8 @@
{
int i;
cbd_t *bdp;
- printk(" Ring data dump: cur_tx %p%s cur_rx %p.\n",
- cep->cur_tx, cep->tx_full ? " (full)" : "",
+ printk(" Ring data dump: cur_tx %p tx_free %d cur_rx %p.\n",
+ cep->cur_tx, cep->tx_free,
cep->cur_rx);
bdp = cep->tx_bd_base;
for (i = 0 ; i < TX_RING_SIZE; i++, bdp++)
@@ -295,7 +290,7 @@
bdp->cbd_bufaddr);
}
#endif
- if (!cep->tx_full)
+ if (cep->tx_free)
netif_wake_queue(dev);
}
@@ -303,7 +298,7 @@
* This is called from the CPM handler, not the MPC core interrupt.
*/
static void
-scc_enet_interrupt(void *dev_id, struct pt_regs *regs)
+scc_enet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
struct net_device *dev = dev_id;
volatile struct scc_enet_private *cep;
@@ -339,7 +334,7 @@
spin_lock(&cep->lock);
bdp = cep->dirty_tx;
while ((bdp->cbd_sc&BD_ENET_TX_READY)==0) {
- if ((bdp==cep->cur_tx) && (cep->tx_full == 0))
+ if (cep->tx_free == TX_RING_SIZE)
break;
if (bdp->cbd_sc & BD_ENET_TX_HB) /* No heartbeat */
@@ -395,8 +390,7 @@
/* Since we have freed up a buffer, the ring is no longer
* full.
*/
- if (cep->tx_full) {
- cep->tx_full = 0;
+ if (!cep->tx_free++) {
if (netif_queue_stopped(dev))
netif_wake_queue(dev);
}
@@ -422,13 +416,10 @@
}
/* Check for receive busy, i.e. packets coming but no place to
- * put them. This "can't happen" because the receive interrupt
- * is tossing previous frames.
+ * put them.
*/
- if (int_events & SCCE_ENET_BSY) {
+ if (int_events & SCCE_ENET_BSY)
cep->stats.rx_dropped++;
- printk("CPM ENET: BSY can't happen.\n");
- }
return;
}
@@ -752,6 +743,7 @@
cep->tx_bd_base = (cbd_t *)&cp->cp_dpmem[i];
cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
+ cep->tx_free = TX_RING_SIZE;
cep->cur_rx = cep->rx_bd_base;
/* Issue init Rx BD command for SCC.
@@ -880,7 +872,9 @@
/* Install our interrupt handler.
*/
- cpm_install_handler(CPMVEC_ENET, scc_enet_interrupt, dev);
+ if ((request_irq(CPM_IRQ_OFFSET + CPMVEC_ENET, scc_enet_interrupt,
+ 0, cpm_int_name[CPMVEC_ENET], dev)) != 0)
+ panic("Could not allocate SCC ethernet IRQ!");
/* Set GSMR_H to enable all normal operating modes.
* Set GSMR_L to enable Ethernet to MC68160.
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)