patch-2.4.22 linux-2.4.22/arch/ppc/8260_io/enet.c
Next file: linux-2.4.22/arch/ppc/8260_io/fcc_enet.c
Previous file: linux-2.4.22/arch/parisc/math-emu/sfsub.c
Back to the patch index
Back to the overall index
- Lines: 143
- Date:
2003-08-25 04:44:40.000000000 -0700
- Orig file:
linux-2.4.21/arch/ppc/8260_io/enet.c
- Orig date:
2003-06-13 07:51:31.000000000 -0700
diff -urN linux-2.4.21/arch/ppc/8260_io/enet.c linux-2.4.22/arch/ppc/8260_io/enet.c
@@ -115,7 +115,7 @@
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;
};
@@ -175,9 +175,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_full should be set.
+ * This should not happen, since the tx queue should be stopped.
*/
printk("%s: tx queue full!.\n", dev->name);
return 1;
@@ -206,7 +206,7 @@
cep->stats.tx_bytes += skb->len;
cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
-
+
spin_lock_irq(&cep->lock);
/* Send it on its way. Tell CPM its ready, interrupt when done,
@@ -223,10 +223,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;
@@ -246,8 +244,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;
printk(" Tx @base %p :\n", bdp);
@@ -265,7 +263,7 @@
bdp->cbd_bufaddr);
}
#endif
- if (!cep->tx_full)
+ if (cep->tx_free)
netif_wake_queue(dev);
}
@@ -309,7 +307,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 */
@@ -365,8 +363,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);
}
@@ -395,13 +392,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("SCC ENET: BSY can't happen.\n");
- }
return;
}
@@ -429,7 +423,7 @@
for (;;) {
if (bdp->cbd_sc & BD_ENET_RX_EMPTY)
break;
-
+
#ifndef final_version
/* Since we have allocated space to hold a complete frame, both
* the first and last indicators should be set.
@@ -549,7 +543,7 @@
ep = (scc_enet_t *)dev->base_addr;
if (dev->flags&IFF_PROMISC) {
-
+
/* Log any net taps. */
printk("%s: Promiscuous mode enabled.\n", dev->name);
cep->sccp->scc_pmsr |= SCC_PSMR_PRO;
@@ -576,8 +570,8 @@
dmi = dev->mc_list;
- for (i=0; i<dev->mc_count; i++) {
-
+ for (i=0; i<dev->mc_count; i++, dmi = dmi->next) {
+
/* Only support group multicast for now.
*/
if (!(dmi->dmi_addr[0] & 1))
@@ -664,7 +658,7 @@
(PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
io->iop_pdirc &=
~(PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
- io->iop_psorc &=
+ io->iop_psorc &=
~(PC_ENET_RENA | PC_ENET_TXCLK | PC_ENET_RXCLK);
io->iop_psorc |= PC_ENET_CLSN;
@@ -693,6 +687,7 @@
cep->tx_bd_base = (cbd_t *)&immap->im_dprambase[i];
cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
+ cep->tx_free = TX_RING_SIZE;
cep->cur_rx = cep->rx_bd_base;
ep->sen_genscc.scc_rfcr = CPMFCR_GBL | CPMFCR_EB;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)