* Tulip 21040 hangs with ifconfig promisc
@ 2004-03-14 16:54 Krzysztof Halasa
2004-03-17 16:29 ` [PATCH] 2.6.x " Krzysztof Halasa
0 siblings, 1 reply; 3+ messages in thread
From: Krzysztof Halasa @ 2004-03-14 16:54 UTC (permalink / raw)
To: linux-kernel; +Cc: netdev
Hi,
This is:
Linux version ~2.6.4 (Red Hat Linux 3.3.2-1)) SMP kernel, UNI CPU.
(as of Mar 12 in bkcvs/linux-2.5/).
Acorp VIA77 mobo - AMD-K6 3D 500 MHz + VIA MVP3 chipset.
SMC EtherPower^2 (dual DECchip 21040 + 21050 PCI-PCI bridge)
All running out of ramdisk.
Doing "ifconfig eth0 promisc" kills the ethernet. Interrupts are gone,
nothing in dmesg. -promisc nor ifconfig down/up doesn't fix it,
only driver rmmod/insmod does.
de2104x PCI Ethernet driver v0.6 (Sep 1, 2003)
eth0: 21040 at 0xca81e000, 00:00:c0:d8:66:e0, IRQ 11
eth1: 21040 at 0xca820000, 00:00:c0:16:1b:c0, IRQ 12
eth0: enabling interface
eth0: set link 10baseT-HD
eth0: mode 0xfffc0040, sia 0xffffffc4,0xffff8f01,0xffffffff,0xffff0000
eth0: set mode 0xfffc0000, set sia 0x8f01,0xffff,0x0
eth0: link up, media 10baseT-HD
device eth0 entered promiscuous mode
Any idea?
--
Krzysztof Halasa, B*FH
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] 2.6.x Re: Tulip 21040 hangs with ifconfig promisc
2004-03-14 16:54 Tulip 21040 hangs with ifconfig promisc Krzysztof Halasa
@ 2004-03-17 16:29 ` Krzysztof Halasa
2004-03-17 19:36 ` [PATCH] old-tulip 2104x update Jeff Garzik
0 siblings, 1 reply; 3+ messages in thread
From: Krzysztof Halasa @ 2004-03-17 16:29 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
[-- Attachment #1: Type: text/plain, Size: 508 bytes --]
Hi,
Bug (2.6.x Linux, DE21040 tulip):
> Doing "ifconfig eth0 promisc" kills the ethernet. Interrupts are gone,
> nothing in dmesg. -promisc nor ifconfig down/up doesn't fix it,
> only driver rmmod/insmod does.
The attached patch fixes the problem: de->macmode variable,
meant to shadow MacMode (CSR6) register, was used inconsistently,
causing some updates to this register to be dropped.
2.4 kernel doesn't shadow this register at all, so I removed
shadowing from 2.6 as well.
--
Krzysztof Halasa, B*FH
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: de2104x-macmode.patch --]
[-- Type: text/x-patch, Size: 2508 bytes --]
--- linux-2.6/drivers/net/tulip/de2104x.c 14 Mar 2004 17:05:37 -0000 1.24
+++ linux-2.6/drivers/net/tulip/de2104x.c 17 Mar 2004 16:14:48 -0000
@@ -303,7 +303,6 @@
struct net_device_stats net_stats;
struct pci_dev *pdev;
- u32 macmode;
u16 setup_frame[DE_SETUP_FRAME_WORDS];
@@ -732,7 +731,7 @@
struct de_desc *txd;
struct de_desc *dummy_txd = NULL;
- macmode = de->macmode & ~(AcceptAllMulticast | AcceptAllPhys);
+ macmode = dr32(MacMode) & ~(AcceptAllMulticast | AcceptAllPhys);
if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
macmode |= AcceptAllMulticast | AcceptAllPhys;
@@ -805,10 +804,8 @@
dw32(TxPoll, NormalTxPoll);
out:
- if (macmode != de->macmode) {
- dw32 (MacMode, macmode);
- de->macmode = macmode;
- }
+ if (macmode != dr32(MacMode))
+ dw32(MacMode, macmode);
}
static void de_set_rx_mode (struct net_device *dev)
@@ -923,6 +920,7 @@
static void de_set_media (struct de_private *de)
{
unsigned media = de->media_type;
+ u32 macmode = dr32(MacMode);
if (de_is_running(de))
BUG();
@@ -940,9 +938,9 @@
mdelay(10);
if (media == DE_MEDIA_TP_FD)
- de->macmode |= FullDuplex;
+ macmode |= FullDuplex;
else
- de->macmode &= ~FullDuplex;
+ macmode &= ~FullDuplex;
if (netif_msg_link(de)) {
printk(KERN_INFO "%s: set link %s\n"
@@ -951,9 +949,11 @@
de->dev->name, media_name[media],
de->dev->name, dr32(MacMode), dr32(SIAStatus),
dr32(CSR13), dr32(CSR14), dr32(CSR15),
- de->dev->name, de->macmode, de->media[media].csr13,
+ de->dev->name, macmode, de->media[media].csr13,
de->media[media].csr14, de->media[media].csr15);
}
+ if (macmode != dr32(MacMode))
+ dw32(MacMode, macmode);
}
static void de_next_media (struct de_private *de, u32 *media,
@@ -1235,11 +1235,12 @@
static int de_init_hw (struct de_private *de)
{
struct net_device *dev = de->dev;
+ u32 macmode;
int rc;
de_adapter_wake(de);
- de->macmode = dr32(MacMode) & ~MacModeClear;
+ macmode = dr32(MacMode) & ~MacModeClear;
rc = de_reset_mac(de);
if (rc)
@@ -1250,7 +1251,7 @@
dw32(RxRingAddr, de->ring_dma);
dw32(TxRingAddr, de->ring_dma + (sizeof(struct de_desc) * DE_RX_RING_SIZE));
- dw32(MacMode, RxTx | de->macmode);
+ dw32(MacMode, RxTx | macmode);
dr32(RxMissed); /* self-clearing */
@@ -1501,7 +1502,7 @@
break;
}
- if (de->macmode & FullDuplex)
+ if (dr32(MacMode) & FullDuplex)
ecmd->duplex = DUPLEX_FULL;
else
ecmd->duplex = DUPLEX_HALF;
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH] old-tulip 2104x update
2004-03-17 16:29 ` [PATCH] 2.6.x " Krzysztof Halasa
@ 2004-03-17 19:36 ` Jeff Garzik
0 siblings, 0 replies; 3+ messages in thread
From: Jeff Garzik @ 2004-03-17 19:36 UTC (permalink / raw)
To: netdev
Cc: Krzysztof Halasa, lars.vahlenberg, Geert Uytterhoeven,
Rask Ingemann Lambertsen
[-- Attachment #1: Type: text/plain, Size: 172 bytes --]
Here's a patch versus 2.6 upstream, and also the complete driver if
that's easier.
Anybody wanna give it a test?
And Rask, don't you have some other patches?
Jeff
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 3351 bytes --]
diff -Nru a/drivers/net/tulip/de2104x.c b/drivers/net/tulip/de2104x.c
--- a/drivers/net/tulip/de2104x.c Wed Mar 17 14:33:43 2004
+++ b/drivers/net/tulip/de2104x.c Wed Mar 17 14:33:43 2004
@@ -28,8 +28,8 @@
*/
#define DRV_NAME "de2104x"
-#define DRV_VERSION "0.6"
-#define DRV_RELDATE "Sep 1, 2003"
+#define DRV_VERSION "0.7"
+#define DRV_RELDATE "Mar 17, 2004"
#include <linux/config.h>
#include <linux/module.h>
@@ -303,7 +303,6 @@
struct net_device_stats net_stats;
struct pci_dev *pdev;
- u32 macmode;
u16 setup_frame[DE_SETUP_FRAME_WORDS];
@@ -732,7 +731,7 @@
struct de_desc *txd;
struct de_desc *dummy_txd = NULL;
- macmode = de->macmode & ~(AcceptAllMulticast | AcceptAllPhys);
+ macmode = dr32(MacMode) & ~(AcceptAllMulticast | AcceptAllPhys);
if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
macmode |= AcceptAllMulticast | AcceptAllPhys;
@@ -805,10 +804,8 @@
dw32(TxPoll, NormalTxPoll);
out:
- if (macmode != de->macmode) {
- dw32 (MacMode, macmode);
- de->macmode = macmode;
- }
+ if (macmode != dr32(MacMode))
+ dw32(MacMode, macmode);
}
static void de_set_rx_mode (struct net_device *dev)
@@ -923,6 +920,7 @@
static void de_set_media (struct de_private *de)
{
unsigned media = de->media_type;
+ u32 macmode = dr32(MacMode);
if (de_is_running(de))
BUG();
@@ -940,9 +938,9 @@
mdelay(10);
if (media == DE_MEDIA_TP_FD)
- de->macmode |= FullDuplex;
+ macmode |= FullDuplex;
else
- de->macmode &= ~FullDuplex;
+ macmode &= ~FullDuplex;
if (netif_msg_link(de)) {
printk(KERN_INFO "%s: set link %s\n"
@@ -951,9 +949,11 @@
de->dev->name, media_name[media],
de->dev->name, dr32(MacMode), dr32(SIAStatus),
dr32(CSR13), dr32(CSR14), dr32(CSR15),
- de->dev->name, de->macmode, de->media[media].csr13,
+ de->dev->name, macmode, de->media[media].csr13,
de->media[media].csr14, de->media[media].csr15);
}
+ if (macmode != dr32(MacMode))
+ dw32(MacMode, macmode);
}
static void de_next_media (struct de_private *de, u32 *media,
@@ -1173,18 +1173,18 @@
u32 status, tmp;
/*
- * Reset MAC. Copied from de4x5.c.
+ * Reset MAC. de4x5.c and tulip.c examined for "advice"
+ * in this area.
*/
- tmp = dr32 (BusMode);
- if (tmp == 0xffffffff)
- return -ENODEV;
- mdelay (1);
+ if (dr32(BusMode) == 0xffffffff)
+ return -EBUSY;
- dw32 (BusMode, tmp | CmdReset);
+ /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
+ dw32 (BusMode, CmdReset);
mdelay (1);
- dw32 (BusMode, tmp);
+ dw32 (BusMode, de_bus_mode);
mdelay (1);
for (tmp = 0; tmp < 5; tmp++) {
@@ -1235,11 +1235,12 @@
static int de_init_hw (struct de_private *de)
{
struct net_device *dev = de->dev;
+ u32 macmode;
int rc;
de_adapter_wake(de);
- de->macmode = dr32(MacMode) & ~MacModeClear;
+ macmode = dr32(MacMode) & ~MacModeClear;
rc = de_reset_mac(de);
if (rc)
@@ -1250,7 +1251,7 @@
dw32(RxRingAddr, de->ring_dma);
dw32(TxRingAddr, de->ring_dma + (sizeof(struct de_desc) * DE_RX_RING_SIZE));
- dw32(MacMode, RxTx | de->macmode);
+ dw32(MacMode, RxTx | macmode);
dr32(RxMissed); /* self-clearing */
@@ -1501,7 +1502,7 @@
break;
}
- if (de->macmode & FullDuplex)
+ if (dr32(MacMode) & FullDuplex)
ecmd->duplex = DUPLEX_FULL;
else
ecmd->duplex = DUPLEX_HALF;
[-- Attachment #3: de2104x.c.bz2 --]
[-- Type: application/x-bzip2, Size: 13738 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2004-03-17 19:36 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-14 16:54 Tulip 21040 hangs with ifconfig promisc Krzysztof Halasa
2004-03-17 16:29 ` [PATCH] 2.6.x " Krzysztof Halasa
2004-03-17 19:36 ` [PATCH] old-tulip 2104x update Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).