* Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
@ 2005-02-17 21:44 Andrew Morton
2005-02-18 11:20 ` Herbert Xu
0 siblings, 1 reply; 7+ messages in thread
From: Andrew Morton @ 2005-02-17 21:44 UTC (permalink / raw)
To: netdev
Begin forwarded message:
Date: Thu, 17 Feb 2005 10:39:03 -0800
From: bugme-daemon@osdl.org
To: bugme-new@lists.osdl.org
Subject: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
http://bugme.osdl.org/show_bug.cgi?id=4223
Summary: sis900 kernel oop at boot
Kernel Version: 2.6.10
Status: NEW
Severity: low
Owner: acme@conectiva.com.br
Submitter: mangus@deprecated.it
Distribution: Slackware 10.1
Hardware Environment:
Software Environment:
Problem Description:
kernel oop at boot time , it happens once for now.
Steps to reproduce:
don't know..
here is the trace
Feb 15 18:26:20 saturno kernel: Unable to handle kernel NULL pointer
dereference at virtual address 0000000e
Feb 15 18:26:20 saturno kernel: printing eip:
Feb 15 18:26:20 saturno kernel: e1113417
Feb 15 18:26:20 saturno kernel: *pde = 00000000
Feb 15 18:26:20 saturno kernel: Oops: 0000 [#1]
Feb 15 18:26:20 saturno kernel: PREEMPT
Feb 15 18:26:20 saturno kernel: Modules linked in: sis900 nvidia 8250_pci 8250
serial_core psmouse
Feb 15 18:26:20 saturno kernel: CPU: 0
Feb 15 18:26:20 saturno kernel: EIP: 0060:[<e1113417>] Tainted: P
VLI
Feb 15 18:26:20 saturno kernel: EFLAGS: 00010296 (2.6.10-M7)
Feb 15 18:26:20 saturno kernel: EIP is at sis900_check_mode+0x17/0xa0 [sis900]
Feb 15 18:26:20 saturno kernel: eax: 00000000 ebx: dfd38000 ecx: 10501010
edx: 0000ec18
Feb 15 18:26:20 saturno kernel: esi: 00000000 edi: 0000ec00 ebp: dfd38220
esp: deaede88
Feb 15 18:26:20 saturno kernel: ds: 007b es: 007b ss: 0068
Feb 15 18:26:20 saturno kernel: Process ifconfig (pid: 1145,
threadinfo=deaec000 task=c16fe020)
Feb 15 18:26:20 saturno kernel: Stack: 00000000 00000000 00000000 00000001
dfd38000 0000ec00 e1112cc9 dfd38000
Feb 15 18:26:20 saturno kernel: 00000000 00000001 dfd38000 dfd38000
9100007b dfd38000 00000000 00001043
Feb 15 18:26:20 saturno kernel: 00000000 c027c435 dfd38000 dabe1540
c0280314 dfd38000 00001002 c027d9d3
Feb 15 18:26:20 saturno kernel: Call Trace:
Feb 15 18:26:20 saturno kernel: [<e1112cc9>] sis900_open+0xe9/0x130 [sis900]
Feb 15 18:26:20 saturno kernel: [<c027c435>] dev_open+0x85/0xa0
Feb 15 18:26:20 saturno kernel: [<c0280314>] dev_mc_upload+0x24/0x50
Feb 15 18:26:20 saturno kernel: [<c027d9d3>] dev_change_flags+0x53/0x130
Feb 15 18:26:20 saturno kernel: [<c027c305>] dev_load+0x25/0x70
Feb 15 18:26:20 saturno kernel: [<c02b7be7>] devinet_ioctl+0x257/0x5d0
Feb 15 18:26:20 saturno kernel: [<c02ba146>] inet_ioctl+0x66/0xb0
Feb 15 18:26:20 saturno kernel: [<c02734d9>] sock_ioctl+0xc9/0x240
Feb 15 18:26:20 saturno kernel: [<c015fc6a>] sys_ioctl+0xca/0x230
Feb 15 18:26:20 saturno kernel: [<c01026c7>] syscall_call+0x7/0xb
Feb 15 18:26:20 saturno kernel: Code: df e9 2d ff ff ff 8d b4 26 00 00 00 00
8d bc 27 00 00 00 00 83 ec 18 89 74 24 10 8b 74 24 20 89 5c 24 0c 8b 5c 24 1c
89 7c 24 14 <80> 7e 0e 02 8b 7b 68 8b 4b 18 74 3d 8d 51 04 ed 83 c8 10 ef 89
Feb 15 18:26:20 saturno kernel: <6>eth0: Using transceiver found at address 1
as default
Feb 15 18:27:25 saturno portmap[2561]: cannot bind udp: Address already in use
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-02-17 21:44 Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot Andrew Morton
@ 2005-02-18 11:20 ` Herbert Xu
2005-02-18 18:17 ` Daniele Venzano
2005-03-05 8:45 ` Fw: " Herbert Xu
0 siblings, 2 replies; 7+ messages in thread
From: Herbert Xu @ 2005-02-18 11:20 UTC (permalink / raw)
To: Andrew Morton; +Cc: netdev, mangus, jgarzik, webvenza
> Feb 15 18:26:20 saturno kernel: Unable to handle kernel NULL pointer
> dereference at virtual address 0000000e
> Feb 15 18:26:20 saturno kernel: printing eip:
> Feb 15 18:26:20 saturno kernel: e1113417
> Feb 15 18:26:20 saturno kernel: *pde = 00000000
> Feb 15 18:26:20 saturno kernel: Oops: 0000 [#1]
> Feb 15 18:26:20 saturno kernel: PREEMPT
> Feb 15 18:26:20 saturno kernel: Modules linked in: sis900 nvidia 8250_pci 8250
> serial_core psmouse
> Feb 15 18:26:20 saturno kernel: CPU: 0
> Feb 15 18:26:20 saturno kernel: EIP: 0060:[<e1113417>] Tainted: P
> VLI
> Feb 15 18:26:20 saturno kernel: EFLAGS: 00010296 (2.6.10-M7)
> Feb 15 18:26:20 saturno kernel: EIP is at sis900_check_mode+0x17/0xa0 [sis900]
OK, this happened because we got preempted before sis900_mii_probe
finished setting the sis_priv->mii. Theoretically this can happen
with SMP as well but I suppose the number of SMP machines with sis900
is fairly small.
Anyway, the fix is to make sure that sis900_mii_probe is done before
the device can be opened. This patch does it by moving the setup
after register_netdevice into the netdev init function.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
===== drivers/net/sis900.c 1.62 vs edited =====
--- 1.62/drivers/net/sis900.c 2005-01-11 03:52:27 +11:00
+++ edited/drivers/net/sis900.c 2005-02-18 22:15:13 +11:00
@@ -365,6 +365,48 @@
return 0;
}
+static int __devinit sis900_init_netdev(struct net_device *net_dev)
+{
+ struct sis900_private *sis_priv = netdev_priv(net_dev);
+ struct pci_dev *pci_dev = sis_priv->pci_dev;
+ long ioaddr = net_dev->base_addr;
+ struct pci_dev *dev;
+ int ret;
+ u8 revision;
+
+ /* Get Mac address according to the chip revision */
+ pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
+
+ if (revision == SIS630E_900_REV)
+ ret = sis630e_get_mac_addr(pci_dev, net_dev);
+ else if ((revision > 0x81) && (revision <= 0x90) )
+ ret = sis635_get_mac_addr(pci_dev, net_dev);
+ else if (revision == SIS96x_900_REV)
+ ret = sis96x_get_mac_addr(pci_dev, net_dev);
+ else
+ ret = sis900_get_mac_addr(pci_dev, net_dev);
+
+ if (ret == 0)
+ return -ENODEV;
+
+ /* 630ET : set the mii access mode as software-mode */
+ if (revision == SIS630ET_900_REV)
+ outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
+
+ /* probe for mii transceiver */
+ if (sis900_mii_probe(net_dev) == 0)
+ return -ENODEV;
+
+ /* save our host bridge revision */
+ dev = pci_get_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, NULL);
+ if (dev) {
+ pci_read_config_byte(dev, PCI_CLASS_REVISION, &sis_priv->host_bridge_rev);
+ pci_dev_put(dev);
+ }
+
+ return 0;
+}
+
/**
* sis900_probe - Probe for sis900 device
* @pci_dev: the sis900 pci device
@@ -381,12 +423,10 @@
{
struct sis900_private *sis_priv;
struct net_device *net_dev;
- struct pci_dev *dev;
dma_addr_t ring_dma;
void *ring_space;
long ioaddr;
int i, ret;
- u8 revision;
char *card_name = card_names[pci_id->driver_data];
/* when built into the kernel, we only print version if device is found */
@@ -456,45 +496,11 @@
net_dev->tx_timeout = sis900_tx_timeout;
net_dev->watchdog_timeo = TX_TIMEOUT;
net_dev->ethtool_ops = &sis900_ethtool_ops;
+ net_dev->init = &sis900_init_netdev;
ret = register_netdev(net_dev);
if (ret)
goto err_unmap_rx;
-
- /* Get Mac address according to the chip revision */
- pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &revision);
- ret = 0;
-
- if (revision == SIS630E_900_REV)
- ret = sis630e_get_mac_addr(pci_dev, net_dev);
- else if ((revision > 0x81) && (revision <= 0x90) )
- ret = sis635_get_mac_addr(pci_dev, net_dev);
- else if (revision == SIS96x_900_REV)
- ret = sis96x_get_mac_addr(pci_dev, net_dev);
- else
- ret = sis900_get_mac_addr(pci_dev, net_dev);
-
- if (ret == 0) {
- ret = -ENODEV;
- goto err_out_unregister;
- }
-
- /* 630ET : set the mii access mode as software-mode */
- if (revision == SIS630ET_900_REV)
- outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
-
- /* probe for mii transceiver */
- if (sis900_mii_probe(net_dev) == 0) {
- ret = -ENODEV;
- goto err_out_unregister;
- }
-
- /* save our host bridge revision */
- dev = pci_get_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, NULL);
- if (dev) {
- pci_read_config_byte(dev, PCI_CLASS_REVISION, &sis_priv->host_bridge_rev);
- pci_dev_put(dev);
- }
/* print some information about our NIC */
printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name,
@@ -505,8 +511,6 @@
return 0;
- err_out_unregister:
- unregister_netdev(net_dev);
err_unmap_rx:
pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring,
sis_priv->rx_ring_dma);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-02-18 11:20 ` Herbert Xu
@ 2005-02-18 18:17 ` Daniele Venzano
2005-02-18 22:18 ` Herbert Xu
2005-03-05 8:45 ` Fw: " Herbert Xu
1 sibling, 1 reply; 7+ messages in thread
From: Daniele Venzano @ 2005-02-18 18:17 UTC (permalink / raw)
To: Herbert Xu; +Cc: netdev, Andrew Morton, mangus, jgarzik
On 18/feb/05, at 12:20, Herbert Xu wrote:
> OK, this happened because we got preempted before sis900_mii_probe
> finished setting the sis_priv->mii. Theoretically this can happen
> with SMP as well but I suppose the number of SMP machines with sis900
> is fairly small.
>
> Anyway, the fix is to make sure that sis900_mii_probe is done before
> the device can be opened. This patch does it by moving the setup
> after register_netdevice into the netdev init function.
I think the patch is ok, but it will not apply with the latest changes
I sent to Jeff Garzik (see
<http://gkernel.bkbits.net:8080/netdev-2.6/related/drivers/net/
sis900.c?nav=index.html|src/.|src/drivers|src/drivers/net>.
Don't know if this is a problem, since those changes have not yet
reached Linus tree.
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Daniele Venzano <webvenza@libero.it>
--
Daniele Venzano
http://teg.homeunix.org
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-02-18 18:17 ` Daniele Venzano
@ 2005-02-18 22:18 ` Herbert Xu
0 siblings, 0 replies; 7+ messages in thread
From: Herbert Xu @ 2005-02-18 22:18 UTC (permalink / raw)
To: Daniele Venzano; +Cc: netdev, Andrew Morton, mangus, jgarzik
[-- Attachment #1: Type: text/plain, Size: 740 bytes --]
On Fri, Feb 18, 2005 at 07:17:06PM +0100, Daniele Venzano wrote:
>
> I think the patch is ok, but it will not apply with the latest changes
> I sent to Jeff Garzik (see
> <http://gkernel.bkbits.net:8080/netdev-2.6/related/drivers/net/
> sis900.c?nav=index.html|src/.|src/drivers|src/drivers/net>.
> Don't know if this is a problem, since those changes have not yet
> reached Linus tree.
Thanks for the pointer. I've rediffed the patch against netdev-2.6.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
[-- Attachment #2: p --]
[-- Type: text/plain, Size: 4170 bytes --]
===== drivers/net/sis900.c 1.67 vs edited =====
--- 1.67/drivers/net/sis900.c 2005-01-27 11:00:00 +11:00
+++ edited/drivers/net/sis900.c 2005-02-19 09:16:13 +11:00
@@ -373,6 +373,55 @@
return 0;
}
+static int __devinit sis900_init_netdev(struct net_device *net_dev)
+{
+ struct sis900_private *sis_priv = netdev_priv(net_dev);
+ struct pci_dev *pci_dev = sis_priv->pci_dev;
+ long ioaddr = net_dev->base_addr;
+ struct pci_dev *dev;
+ int ret;
+
+ /* Get Mac address according to the chip revision */
+ pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev));
+ if (netif_msg_probe(sis_priv))
+ printk(KERN_DEBUG "%s: detected revision %2.2x, "
+ "trying to get MAC address...\n",
+ net_dev->name, sis_priv->chipset_rev);
+
+ if (sis_priv->chipset_rev == SIS630E_900_REV)
+ ret = sis630e_get_mac_addr(pci_dev, net_dev);
+ else if ((sis_priv->chipset_rev > 0x81) && (sis_priv->chipset_rev <= 0x90))
+ ret = sis635_get_mac_addr(pci_dev, net_dev);
+ else if (sis_priv->chipset_rev == SIS96x_900_REV)
+ ret = sis96x_get_mac_addr(pci_dev, net_dev);
+ else
+ ret = sis900_get_mac_addr(pci_dev, net_dev);
+
+ if (ret == 0) {
+ printk(KERN_WARNING "%s: Cannot read MAC address.\n", net_dev->name);
+ return -ENODEV;
+ }
+
+ /* 630ET : set the mii access mode as software-mode */
+ if (sis_priv->chipset_rev == SIS630ET_900_REV)
+ outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
+
+ /* probe for mii transceiver */
+ if (sis900_mii_probe(net_dev) == 0) {
+ printk(KERN_WARNING "%s: Error probing MII device.\n", net_dev->name);
+ return -ENODEV;
+ }
+
+ /* save our host bridge revision */
+ dev = pci_get_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, NULL);
+ if (dev) {
+ pci_read_config_byte(dev, PCI_CLASS_REVISION, &sis_priv->host_bridge_rev);
+ pci_dev_put(dev);
+ }
+
+ return 0;
+}
+
/**
* sis900_probe - Probe for sis900 device
* @pci_dev: the sis900 pci device
@@ -389,7 +438,6 @@
{
struct sis900_private *sis_priv;
struct net_device *net_dev;
- struct pci_dev *dev;
dma_addr_t ring_dma;
void *ring_space;
long ioaddr;
@@ -463,6 +511,7 @@
net_dev->tx_timeout = sis900_tx_timeout;
net_dev->watchdog_timeo = TX_TIMEOUT;
net_dev->ethtool_ops = &sis900_ethtool_ops;
+ net_dev->init = &sis900_init_netdev;
if (sis900_debug > 0)
sis_priv->msg_enable = sis900_debug;
@@ -472,47 +521,6 @@
ret = register_netdev(net_dev);
if (ret)
goto err_unmap_rx;
-
- /* Get Mac address according to the chip revision */
- pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev));
- if(netif_msg_probe(sis_priv))
- printk(KERN_DEBUG "%s: detected revision %2.2x, "
- "trying to get MAC address...\n",
- net_dev->name, sis_priv->chipset_rev);
-
- ret = 0;
- if (sis_priv->chipset_rev == SIS630E_900_REV)
- ret = sis630e_get_mac_addr(pci_dev, net_dev);
- else if ((sis_priv->chipset_rev > 0x81) && (sis_priv->chipset_rev <= 0x90) )
- ret = sis635_get_mac_addr(pci_dev, net_dev);
- else if (sis_priv->chipset_rev == SIS96x_900_REV)
- ret = sis96x_get_mac_addr(pci_dev, net_dev);
- else
- ret = sis900_get_mac_addr(pci_dev, net_dev);
-
- if (ret == 0) {
- printk(KERN_WARNING "%s: Cannot read MAC address.\n", net_dev->name);
- ret = -ENODEV;
- goto err_out_unregister;
- }
-
- /* 630ET : set the mii access mode as software-mode */
- if (sis_priv->chipset_rev == SIS630ET_900_REV)
- outl(ACCESSMODE | inl(ioaddr + cr), ioaddr + cr);
-
- /* probe for mii transceiver */
- if (sis900_mii_probe(net_dev) == 0) {
- printk(KERN_WARNING "%s: Error probing MII device.\n", net_dev->name);
- ret = -ENODEV;
- goto err_out_unregister;
- }
-
- /* save our host bridge revision */
- dev = pci_get_device(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_630, NULL);
- if (dev) {
- pci_read_config_byte(dev, PCI_CLASS_REVISION, &sis_priv->host_bridge_rev);
- pci_dev_put(dev);
- }
/* print some information about our NIC */
printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name,
@@ -523,8 +531,6 @@
return 0;
- err_out_unregister:
- unregister_netdev(net_dev);
err_unmap_rx:
pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring,
sis_priv->rx_ring_dma);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-02-18 11:20 ` Herbert Xu
2005-02-18 18:17 ` Daniele Venzano
@ 2005-03-05 8:45 ` Herbert Xu
2005-08-19 8:04 ` Jeff Garzik
1 sibling, 1 reply; 7+ messages in thread
From: Herbert Xu @ 2005-03-05 8:45 UTC (permalink / raw)
To: Andrew Morton; +Cc: netdev, mangus, jgarzik, webvenza
[-- Attachment #1: Type: text/plain, Size: 1710 bytes --]
Hi:
Here is the version that moves the necessary code above register_netdev
instead of using init. It's against netdev-2.6.
> Feb 15 18:26:20 saturno kernel: Unable to handle kernel NULL pointer
> dereference at virtual address 0000000e
> Feb 15 18:26:20 saturno kernel: printing eip:
> Feb 15 18:26:20 saturno kernel: e1113417
> Feb 15 18:26:20 saturno kernel: *pde = 00000000
> Feb 15 18:26:20 saturno kernel: Oops: 0000 [#1]
> Feb 15 18:26:20 saturno kernel: PREEMPT
> Feb 15 18:26:20 saturno kernel: Modules linked in: sis900 nvidia 8250_pci 8250
> serial_core psmouse
> Feb 15 18:26:20 saturno kernel: CPU: 0
> Feb 15 18:26:20 saturno kernel: EIP: 0060:[<e1113417>] Tainted: P
> VLI
> Feb 15 18:26:20 saturno kernel: EFLAGS: 00010296 (2.6.10-M7)
> Feb 15 18:26:20 saturno kernel: EIP is at sis900_check_mode+0x17/0xa0 [sis900]
OK, this happened because we got preempted before sis900_mii_probe
finished setting the sis_priv->mii. Theoretically this can happen
with SMP as well but I suppose the number of SMP machines with sis900
is fairly small.
Anyway, the fix is to make sure that sis900_mii_probe is done before
the device can be opened. This patch does it by moving the setup
before register_netdevice.
Since the netdev name is not available before register_netdev, I've
changed the relevant printk's to use pci_name instead. Note that
one of those printk's may be called after register_netdev as well.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Cheers,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
[-- Attachment #2: p --]
[-- Type: text/plain, Size: 4672 bytes --]
===== drivers/net/sis900.c 1.69 vs edited =====
--- 1.69/drivers/net/sis900.c 2005-03-03 17:34:44 +11:00
+++ edited/drivers/net/sis900.c 2005-03-05 19:32:29 +11:00
@@ -245,7 +245,7 @@
signature = (u16) read_eeprom(ioaddr, EEPROMSignature);
if (signature == 0xffff || signature == 0x0000) {
printk (KERN_WARNING "%s: Error EERPOM read %x\n",
- net_dev->name, signature);
+ pci_name(pci_dev), signature);
return 0;
}
@@ -277,7 +277,8 @@
if (!isa_bridge)
isa_bridge = pci_get_device(PCI_VENDOR_ID_SI, 0x0018, isa_bridge);
if (!isa_bridge) {
- printk(KERN_WARNING "%s: Can not find ISA bridge\n", net_dev->name);
+ printk(KERN_WARNING "%s: Can not find ISA bridge\n",
+ pci_name(pci_dev));
return 0;
}
pci_read_config_byte(isa_bridge, 0x48, ®);
@@ -396,6 +397,7 @@
long ioaddr;
int i, ret;
char *card_name = card_names[pci_id->driver_data];
+ const char *dev_name = pci_name(pci_dev);
/* when built into the kernel, we only print version if device is found */
#ifndef MODULE
@@ -473,17 +475,13 @@
sis_priv->msg_enable = sis900_debug;
else
sis_priv->msg_enable = SIS900_DEF_MSG;
-
- ret = register_netdev(net_dev);
- if (ret)
- goto err_unmap_rx;
/* Get Mac address according to the chip revision */
pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &(sis_priv->chipset_rev));
if(netif_msg_probe(sis_priv))
printk(KERN_DEBUG "%s: detected revision %2.2x, "
"trying to get MAC address...\n",
- net_dev->name, sis_priv->chipset_rev);
+ dev_name, sis_priv->chipset_rev);
ret = 0;
if (sis_priv->chipset_rev == SIS630E_900_REV)
@@ -496,9 +494,9 @@
ret = sis900_get_mac_addr(pci_dev, net_dev);
if (ret == 0) {
- printk(KERN_WARNING "%s: Cannot read MAC address.\n", net_dev->name);
+ printk(KERN_WARNING "%s: Cannot read MAC address.\n", dev_name);
ret = -ENODEV;
- goto err_out_unregister;
+ goto err_unmap_rx;
}
/* 630ET : set the mii access mode as software-mode */
@@ -507,9 +505,10 @@
/* probe for mii transceiver */
if (sis900_mii_probe(net_dev) == 0) {
- printk(KERN_WARNING "%s: Error probing MII device.\n", net_dev->name);
+ printk(KERN_WARNING "%s: Error probing MII device.\n",
+ dev_name);
ret = -ENODEV;
- goto err_out_unregister;
+ goto err_unmap_rx;
}
/* save our host bridge revision */
@@ -519,6 +518,10 @@
pci_dev_put(dev);
}
+ ret = register_netdev(net_dev);
+ if (ret)
+ goto err_unmap_rx;
+
/* print some information about our NIC */
printk(KERN_INFO "%s: %s at %#lx, IRQ %d, ", net_dev->name,
card_name, ioaddr, net_dev->irq);
@@ -528,8 +531,6 @@
return 0;
- err_out_unregister:
- unregister_netdev(net_dev);
err_unmap_rx:
pci_free_consistent(pci_dev, RX_TOTAL_SIZE, sis_priv->rx_ring,
sis_priv->rx_ring_dma);
@@ -556,6 +557,7 @@
static int __init sis900_mii_probe(struct net_device * net_dev)
{
struct sis900_private * sis_priv = net_dev->priv;
+ const char *dev_name = pci_name(sis_priv->pci_dev);
u16 poll_bit = MII_STAT_LINK, status = 0;
unsigned long timeout = jiffies + 5 * HZ;
int phy_addr;
@@ -576,7 +578,7 @@
if (netif_msg_probe(sis_priv))
printk(KERN_DEBUG "%s: MII at address %d"
" not accessible\n",
- net_dev->name, phy_addr);
+ dev_name, phy_addr);
continue;
}
@@ -609,7 +611,7 @@
(mii_status & (MII_STAT_CAN_TX_FDX | MII_STAT_CAN_TX)) ? LAN : HOME;
printk(KERN_INFO "%s: %s transceiver found "
"at address %d.\n",
- net_dev->name,
+ dev_name,
mii_chip_table[i].name,
phy_addr);
break;
@@ -617,14 +619,13 @@
if( !mii_chip_table[i].phy_id1 ) {
printk(KERN_INFO "%s: Unknown PHY transceiver found at address %d.\n",
- net_dev->name, phy_addr);
+ dev_name, phy_addr);
mii_phy->phy_types = UNKNOWN;
}
}
if (sis_priv->mii == NULL) {
- printk(KERN_INFO "%s: No MII transceivers found!\n",
- net_dev->name);
+ printk(KERN_INFO "%s: No MII transceivers found!\n", dev_name);
return 0;
}
@@ -649,7 +650,7 @@
poll_bit ^= (mdio_read(net_dev, sis_priv->cur_phy, MII_STATUS) & poll_bit);
if (time_after_eq(jiffies, timeout)) {
printk(KERN_WARNING "%s: reset phy and link down now\n",
- net_dev->name);
+ dev_name);
return -ETIME;
}
}
@@ -718,7 +719,7 @@
sis_priv->mii = default_phy;
sis_priv->cur_phy = default_phy->phy_addr;
printk(KERN_INFO "%s: Using transceiver found at address %d as default\n",
- net_dev->name,sis_priv->cur_phy);
+ pci_name(sis_priv->pci_dev), sis_priv->cur_phy);
}
status = mdio_read(net_dev, sis_priv->cur_phy, MII_CONTROL);
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-03-05 8:45 ` Fw: " Herbert Xu
@ 2005-08-19 8:04 ` Jeff Garzik
2005-08-19 8:08 ` Herbert Xu
0 siblings, 1 reply; 7+ messages in thread
From: Jeff Garzik @ 2005-08-19 8:04 UTC (permalink / raw)
To: Herbert Xu; +Cc: Andrew Morton, netdev, mangus, webvenza
Herbert Xu wrote:
> Hi:
>
> Here is the version that moves the necessary code above register_netdev
> instead of using init. It's against netdev-2.6.
>
>
>>Feb 15 18:26:20 saturno kernel: Unable to handle kernel NULL pointer
>>dereference at virtual address 0000000e
>>Feb 15 18:26:20 saturno kernel: printing eip:
>>Feb 15 18:26:20 saturno kernel: e1113417
>>Feb 15 18:26:20 saturno kernel: *pde = 00000000
>>Feb 15 18:26:20 saturno kernel: Oops: 0000 [#1]
>>Feb 15 18:26:20 saturno kernel: PREEMPT
>>Feb 15 18:26:20 saturno kernel: Modules linked in: sis900 nvidia 8250_pci 8250
>>serial_core psmouse
>>Feb 15 18:26:20 saturno kernel: CPU: 0
>>Feb 15 18:26:20 saturno kernel: EIP: 0060:[<e1113417>] Tainted: P
>>VLI
>>Feb 15 18:26:20 saturno kernel: EFLAGS: 00010296 (2.6.10-M7)
>>Feb 15 18:26:20 saturno kernel: EIP is at sis900_check_mode+0x17/0xa0 [sis900]
>
>
> OK, this happened because we got preempted before sis900_mii_probe
> finished setting the sis_priv->mii. Theoretically this can happen
> with SMP as well but I suppose the number of SMP machines with sis900
> is fairly small.
>
> Anyway, the fix is to make sure that sis900_mii_probe is done before
> the device can be opened. This patch does it by moving the setup
> before register_netdevice.
>
> Since the netdev name is not available before register_netdev, I've
> changed the relevant printk's to use pci_name instead. Note that
> one of those printk's may be called after register_netdev as well.
>
> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Is this patch still needed?
Jeff
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot
2005-08-19 8:04 ` Jeff Garzik
@ 2005-08-19 8:08 ` Herbert Xu
0 siblings, 0 replies; 7+ messages in thread
From: Herbert Xu @ 2005-08-19 8:08 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Andrew Morton, netdev, mangus, webvenza
On Fri, Aug 19, 2005 at 04:04:55AM -0400, Jeff Garzik wrote:
> Herbert Xu wrote:
> >Hi:
> >
> >Here is the version that moves the necessary code above register_netdev
> >instead of using init. It's against netdev-2.6.
> >
> >
> >>Feb 15 18:26:20 saturno kernel: Unable to handle kernel NULL pointer
> >>dereference at virtual address 0000000e
> >>Feb 15 18:26:20 saturno kernel: printing eip:
> >>Feb 15 18:26:20 saturno kernel: e1113417
> >>Feb 15 18:26:20 saturno kernel: *pde = 00000000
> >>Feb 15 18:26:20 saturno kernel: Oops: 0000 [#1]
> >>Feb 15 18:26:20 saturno kernel: PREEMPT
> >>Feb 15 18:26:20 saturno kernel: Modules linked in: sis900 nvidia 8250_pci
> >>8250
> >>serial_core psmouse
> >>Feb 15 18:26:20 saturno kernel: CPU: 0
> >>Feb 15 18:26:20 saturno kernel: EIP: 0060:[<e1113417>] Tainted: P
> >>VLI
> >>Feb 15 18:26:20 saturno kernel: EFLAGS: 00010296 (2.6.10-M7)
> >>Feb 15 18:26:20 saturno kernel: EIP is at sis900_check_mode+0x17/0xa0
> >>[sis900]
> >
> >
> >OK, this happened because we got preempted before sis900_mii_probe
> >finished setting the sis_priv->mii. Theoretically this can happen
> >with SMP as well but I suppose the number of SMP machines with sis900
> >is fairly small.
> >
> >Anyway, the fix is to make sure that sis900_mii_probe is done before
> >the device can be opened. This patch does it by moving the setup
> >before register_netdevice.
> >
> >Since the netdev name is not available before register_netdev, I've
> >changed the relevant printk's to use pci_name instead. Note that
> >one of those printk's may be called after register_netdev as well.
> >
> >Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
>
> Is this patch still needed?
Nope, because you applied this months ago :)
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2005-08-19 8:08 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-17 21:44 Fw: [Bugme-new] [Bug 4223] New: sis900 kernel oop at boot Andrew Morton
2005-02-18 11:20 ` Herbert Xu
2005-02-18 18:17 ` Daniele Venzano
2005-02-18 22:18 ` Herbert Xu
2005-03-05 8:45 ` Fw: " Herbert Xu
2005-08-19 8:04 ` Jeff Garzik
2005-08-19 8:08 ` Herbert Xu
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).