Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
af291057
Commit
af291057
authored
Aug 28, 2002
by
Tim Hockin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Natsemi ethernet fixes:
* cleanup options * formatting * fix RX FIFO Overrun * WoL interrupt fix
parent
989b9792
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
29 additions
and
17 deletions
+29
-17
drivers/net/natsemi.c
drivers/net/natsemi.c
+29
-17
No files found.
drivers/net/natsemi.c
View file @
af291057
...
@@ -112,6 +112,13 @@
...
@@ -112,6 +112,13 @@
* Get rid of cable_magic flag
* Get rid of cable_magic flag
* use new (National provided) solution for cable magic issue
* use new (National provided) solution for cable magic issue
version 1.0.16:
* call netdev_rx() for RxErrors (Manfred Spraul)
* formatting and cleanups
* change options and full_duplex arrays to be zero
initialized
* enable only the WoL and PHY interrupts in wol mode
TODO:
TODO:
* big endian support with CFG:BEM instead of cpu_to_le32
* big endian support with CFG:BEM instead of cpu_to_le32
* support for an external PHY
* support for an external PHY
...
@@ -150,8 +157,8 @@
...
@@ -150,8 +157,8 @@
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#define DRV_NAME "natsemi"
#define DRV_NAME "natsemi"
#define DRV_VERSION "1.07+LK1.0.1
5
"
#define DRV_VERSION "1.07+LK1.0.1
6
"
#define DRV_RELDATE "
Jul 23
, 2002"
#define DRV_RELDATE "
Aug 28
, 2002"
/* Updated to recommendations in pci-skeleton v2.03. */
/* Updated to recommendations in pci-skeleton v2.03. */
...
@@ -196,8 +203,8 @@ static int rx_copybreak;
...
@@ -196,8 +203,8 @@ static int rx_copybreak;
The media type is usually passed in 'options[]'.
The media type is usually passed in 'options[]'.
*/
*/
#define MAX_UNITS 8
/* More are supported, limit only on options */
#define MAX_UNITS 8
/* More are supported, limit only on options */
static
int
options
[
MAX_UNITS
]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
}
;
static
int
options
[
MAX_UNITS
];
static
int
full_duplex
[
MAX_UNITS
]
=
{
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
,
-
1
}
;
static
int
full_duplex
[
MAX_UNITS
];
/* Operational parameters that are set at compile time. */
/* Operational parameters that are set at compile time. */
...
@@ -781,7 +788,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
...
@@ -781,7 +788,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
option
=
dev
->
mem_start
;
option
=
dev
->
mem_start
;
/* The lower four bits are the media type. */
/* The lower four bits are the media type. */
if
(
option
>
0
)
{
if
(
option
)
{
if
(
option
&
0x200
)
if
(
option
&
0x200
)
np
->
full_duplex
=
1
;
np
->
full_duplex
=
1
;
if
(
option
&
15
)
if
(
option
&
15
)
...
@@ -789,7 +796,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
...
@@ -789,7 +796,7 @@ static int __devinit natsemi_probe1 (struct pci_dev *pdev,
"%s: ignoring user supplied media type %d"
,
"%s: ignoring user supplied media type %d"
,
dev
->
name
,
option
&
15
);
dev
->
name
,
option
&
15
);
}
}
if
(
find_cnt
<
MAX_UNITS
&&
full_duplex
[
find_cnt
]
>
0
)
if
(
find_cnt
<
MAX_UNITS
&&
full_duplex
[
find_cnt
])
np
->
full_duplex
=
1
;
np
->
full_duplex
=
1
;
/* The chip-specific entries in the device structure. */
/* The chip-specific entries in the device structure. */
...
@@ -1388,8 +1395,8 @@ static int alloc_ring(struct net_device *dev)
...
@@ -1388,8 +1395,8 @@ static int alloc_ring(struct net_device *dev)
{
{
struct
netdev_private
*
np
=
dev
->
priv
;
struct
netdev_private
*
np
=
dev
->
priv
;
np
->
rx_ring
=
pci_alloc_consistent
(
np
->
pci_dev
,
np
->
rx_ring
=
pci_alloc_consistent
(
np
->
pci_dev
,
sizeof
(
struct
netdev_desc
)
*
(
RX_RING_SIZE
+
TX_RING_SIZE
),
sizeof
(
struct
netdev_desc
)
*
(
RX_RING_SIZE
+
TX_RING_SIZE
),
&
np
->
ring_dma
);
&
np
->
ring_dma
);
if
(
!
np
->
rx_ring
)
if
(
!
np
->
rx_ring
)
return
-
ENOMEM
;
return
-
ENOMEM
;
np
->
tx_ring
=
&
np
->
rx_ring
[
RX_RING_SIZE
];
np
->
tx_ring
=
&
np
->
rx_ring
[
RX_RING_SIZE
];
...
@@ -1593,10 +1600,14 @@ static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
...
@@ -1593,10 +1600,14 @@ static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
if
(
intr_status
==
0
)
if
(
intr_status
==
0
)
break
;
break
;
if
(
intr_status
&
(
IntrRxDone
|
IntrRxIntr
|
RxStatusFIFOOver
|
IntrRxErr
|
IntrRxOverrun
))
if
(
intr_status
&
(
IntrRxDone
|
IntrRxIntr
|
RxStatusFIFOOver
|
IntrRxErr
|
IntrRxOverrun
))
{
netdev_rx
(
dev
);
netdev_rx
(
dev
);
}
if
(
intr_status
&
(
IntrTxDone
|
IntrTxIntr
|
IntrTxIdle
|
IntrTxErr
)
)
{
if
(
intr_status
&
(
IntrTxDone
|
IntrTxIntr
|
IntrTxIdle
|
IntrTxErr
))
{
spin_lock
(
&
np
->
lock
);
spin_lock
(
&
np
->
lock
);
netdev_tx_done
(
dev
);
netdev_tx_done
(
dev
);
spin_unlock
(
&
np
->
lock
);
spin_unlock
(
&
np
->
lock
);
...
@@ -1607,16 +1618,16 @@ static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
...
@@ -1607,16 +1618,16 @@ static void intr_handler(int irq, void *dev_instance, struct pt_regs *rgs)
netdev_error
(
dev
,
intr_status
);
netdev_error
(
dev
,
intr_status
);
if
(
--
boguscnt
<
0
)
{
if
(
--
boguscnt
<
0
)
{
printk
(
KERN_WARNING
"%s: Too much work at interrupt, "
if
(
netif_msg_intr
(
np
))
"status=%#08x.
\n
"
,
printk
(
KERN_WARNING
dev
->
name
,
intr_status
);
"%s: Too much work at interrupt, "
"status=%#08x.
\n
"
,
dev
->
name
,
intr_status
);
break
;
break
;
}
}
}
while
(
1
);
}
while
(
1
);
if
(
netif_msg_intr
(
np
))
if
(
netif_msg_intr
(
np
))
printk
(
KERN_DEBUG
"%s: exiting interrupt.
\n
"
,
printk
(
KERN_DEBUG
"%s: exiting interrupt.
\n
"
,
dev
->
name
);
dev
->
name
);
}
}
/* This routine is logically part of the interrupt handler, but separated
/* This routine is logically part of the interrupt handler, but separated
...
@@ -2392,7 +2403,8 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr)
...
@@ -2392,7 +2403,8 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr)
/* enable the WOL interrupt.
/* enable the WOL interrupt.
* Could be used to send a netlink message.
* Could be used to send a netlink message.
*/
*/
writel
(
readl
(
ioaddr
+
IntrMask
)
|
WOLPkt
,
ioaddr
+
IntrMask
);
writel
(
WOLPkt
|
LinkChange
,
ioaddr
+
IntrMask
);
writel
(
1
,
ioaddr
+
IntrEnable
);
}
}
}
}
...
@@ -2451,7 +2463,7 @@ static int netdev_close(struct net_device *dev)
...
@@ -2451,7 +2463,7 @@ static int netdev_close(struct net_device *dev)
drain_ring
(
dev
);
drain_ring
(
dev
);
free_ring
(
dev
);
free_ring
(
dev
);
{
{
u32
wol
=
readl
(
ioaddr
+
WOLCmd
)
&
WakeOptsSummary
;
u32
wol
=
readl
(
ioaddr
+
WOLCmd
)
&
WakeOptsSummary
;
if
(
wol
)
{
if
(
wol
)
{
/* restart the NIC in WOL mode.
/* restart the NIC in WOL mode.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment