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
386d0ce7
Commit
386d0ce7
authored
Apr 30, 2002
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge mandrakesoft.com:/home/jgarzik/vanilla/linus-2.5
into mandrakesoft.com:/home/jgarzik/repo/net-drivers-2.5
parents
afae6f7c
6502fb5d
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
385 additions
and
202 deletions
+385
-202
drivers/net/3c509.c
drivers/net/3c509.c
+189
-73
drivers/net/8139cp.c
drivers/net/8139cp.c
+2
-2
drivers/net/apne.c
drivers/net/apne.c
+58
-62
drivers/net/dgrs.c
drivers/net/dgrs.c
+21
-10
drivers/net/rrunner.c
drivers/net/rrunner.c
+3
-3
drivers/net/sgiseeq.c
drivers/net/sgiseeq.c
+12
-10
drivers/net/sun3lance.c
drivers/net/sun3lance.c
+100
-42
No files found.
drivers/net/3c509.c
View file @
386d0ce7
...
...
@@ -45,11 +45,13 @@
- Reviewed against 1.18 from scyld.com
v1.18a 17Nov2001 Jeff Garzik <jgarzik@mandrakesoft.com>
- ethtool support
v1.18b 1Mar2002 Zwane Mwaikambo <zwane@commfireservices.com>
- Power Management support
*/
#define DRV_NAME "3c509"
#define DRV_VERSION "1.18
a
"
#define DRV_RELDATE "1
7Nov2001
"
#define DRV_VERSION "1.18
b
"
#define DRV_RELDATE "1
Mar2002
"
/* A few values that may be tweaked. */
...
...
@@ -82,8 +84,9 @@ static int max_interrupt_work = 10;
#include <asm/bitops.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <linux/pm.h>
static
char
versionA
[]
__initdata
=
DRV_NAME
".c:"
DRV_VERSION
" "
DRV_RELDATE
"becker@scyld.com
\n
"
;
static
char
versionA
[]
__initdata
=
DRV_NAME
".c:"
DRV_VERSION
" "
DRV_RELDATE
"
becker@scyld.com
\n
"
;
static
char
versionB
[]
__initdata
=
"http://www.scyld.com/network/3c509.html
\n
"
;
#ifdef EL3_DEBUG
...
...
@@ -116,7 +119,8 @@ enum c509cmd {
FakeIntr
=
12
<<
11
,
AckIntr
=
13
<<
11
,
SetIntrEnb
=
14
<<
11
,
SetStatusEnb
=
15
<<
11
,
SetRxFilter
=
16
<<
11
,
SetRxThreshold
=
17
<<
11
,
SetTxThreshold
=
18
<<
11
,
SetTxStart
=
19
<<
11
,
StatsEnable
=
21
<<
11
,
StatsDisable
=
22
<<
11
,
StopCoax
=
23
<<
11
,};
StatsDisable
=
22
<<
11
,
StopCoax
=
23
<<
11
,
PowerUp
=
27
<<
11
,
PowerDown
=
28
<<
11
,
PowerAuto
=
29
<<
11
};
enum
c509status
{
IntLatch
=
0x0001
,
AdapterFailure
=
0x0002
,
TxComplete
=
0x0004
,
...
...
@@ -152,6 +156,9 @@ struct el3_private {
int
head
,
size
;
struct
sk_buff
*
queue
[
SKB_QUEUE_SIZE
];
char
mca_slot
;
#ifdef CONFIG_PM
struct
pm_dev
*
pmdev
;
#endif
};
static
int
id_port
__initdata
=
0x110
;
/* Start with 0x110 to avoid new sound cards.*/
static
struct
net_device
*
el3_root_dev
;
...
...
@@ -168,6 +175,13 @@ static int el3_close(struct net_device *dev);
static
void
set_multicast_list
(
struct
net_device
*
dev
);
static
void
el3_tx_timeout
(
struct
net_device
*
dev
);
static
int
netdev_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
);
static
void
el3_down
(
struct
net_device
*
dev
);
static
void
el3_up
(
struct
net_device
*
dev
);
#ifdef CONFIG_PM
static
int
el3_suspend
(
struct
pm_dev
*
pdev
);
static
int
el3_resume
(
struct
pm_dev
*
pdev
);
static
int
el3_pm_callback
(
struct
pm_dev
*
pdev
,
pm_request_t
rqst
,
void
*
data
);
#endif
#ifdef CONFIG_MCA
struct
el3_mca_adapters_struct
{
...
...
@@ -219,7 +233,7 @@ static u16 el3_isapnp_phys_addr[8][3];
#endif
/* __ISAPNP__ */
static
int
nopnp
;
int
__init
el3_probe
(
struct
net_device
*
dev
)
int
__init
el3_probe
(
struct
net_device
*
dev
,
int
card_idx
)
{
struct
el3_private
*
lp
;
short
lrs_state
=
0xff
,
i
;
...
...
@@ -525,6 +539,16 @@ int __init el3_probe(struct net_device *dev)
dev
->
watchdog_timeo
=
TX_TIMEOUT
;
dev
->
do_ioctl
=
netdev_ioctl
;
#ifdef CONFIG_PM
/* register power management */
lp
->
pmdev
=
pm_register
(
PM_ISA_DEV
,
card_idx
,
el3_pm_callback
);
if
(
lp
->
pmdev
)
{
struct
pm_dev
*
p
;
p
=
lp
->
pmdev
;
p
->
data
=
(
struct
net_device
*
)
dev
;
}
#endif
/* Fill in the generic fields of the device structure. */
ether_setup
(
dev
);
return
0
;
...
...
@@ -581,53 +605,7 @@ el3_open(struct net_device *dev)
printk
(
"%s: Opening, IRQ %d status@%x %4.4x.
\n
"
,
dev
->
name
,
dev
->
irq
,
ioaddr
+
EL3_STATUS
,
inw
(
ioaddr
+
EL3_STATUS
));
/* Activate board: this is probably unnecessary. */
outw
(
0x0001
,
ioaddr
+
4
);
/* Set the IRQ line. */
outw
((
dev
->
irq
<<
12
)
|
0x0f00
,
ioaddr
+
WN0_IRQ
);
/* Set the station address in window 2 each time opened. */
EL3WINDOW
(
2
);
for
(
i
=
0
;
i
<
6
;
i
++
)
outb
(
dev
->
dev_addr
[
i
],
ioaddr
+
i
);
if
(
dev
->
if_port
==
3
)
/* Start the thinnet transceiver. We should really wait 50ms...*/
outw
(
StartCoax
,
ioaddr
+
EL3_CMD
);
else
if
(
dev
->
if_port
==
0
)
{
/* 10baseT interface, enabled link beat and jabber check. */
EL3WINDOW
(
4
);
outw
(
inw
(
ioaddr
+
WN4_MEDIA
)
|
MEDIA_TP
,
ioaddr
+
WN4_MEDIA
);
}
/* Switch to the stats window, and clear all stats by reading. */
outw
(
StatsDisable
,
ioaddr
+
EL3_CMD
);
EL3WINDOW
(
6
);
for
(
i
=
0
;
i
<
9
;
i
++
)
inb
(
ioaddr
+
i
);
inw
(
ioaddr
+
10
);
inw
(
ioaddr
+
12
);
/* Switch to register set 1 for normal use. */
EL3WINDOW
(
1
);
/* Accept b-case and phys addr only. */
outw
(
SetRxFilter
|
RxStation
|
RxBroadcast
,
ioaddr
+
EL3_CMD
);
outw
(
StatsEnable
,
ioaddr
+
EL3_CMD
);
/* Turn on statistics. */
netif_start_queue
(
dev
);
outw
(
RxEnable
,
ioaddr
+
EL3_CMD
);
/* Enable the receiver. */
outw
(
TxEnable
,
ioaddr
+
EL3_CMD
);
/* Enable transmitter. */
/* Allow status bits to be seen. */
outw
(
SetStatusEnb
|
0xff
,
ioaddr
+
EL3_CMD
);
/* Ack all pending events, and set active indicator mask. */
outw
(
AckIntr
|
IntLatch
|
TxAvailable
|
RxEarly
|
IntReq
,
ioaddr
+
EL3_CMD
);
outw
(
SetIntrEnb
|
IntLatch
|
TxAvailable
|
TxComplete
|
RxComplete
|
StatsFull
,
ioaddr
+
EL3_CMD
);
el3_up
(
dev
);
if
(
el3_debug
>
3
)
printk
(
"%s: Opened 3c509 IRQ %d status %4.4x.
\n
"
,
...
...
@@ -986,23 +964,7 @@ el3_close(struct net_device *dev)
if
(
el3_debug
>
2
)
printk
(
"%s: Shutting down ethercard.
\n
"
,
dev
->
name
);
netif_stop_queue
(
dev
);
/* Turn off statistics ASAP. We update lp->stats below. */
outw
(
StatsDisable
,
ioaddr
+
EL3_CMD
);
/* Disable the receiver and transmitter. */
outw
(
RxDisable
,
ioaddr
+
EL3_CMD
);
outw
(
TxDisable
,
ioaddr
+
EL3_CMD
);
if
(
dev
->
if_port
==
3
)
/* Turn off thinnet power. Green! */
outw
(
StopCoax
,
ioaddr
+
EL3_CMD
);
else
if
(
dev
->
if_port
==
0
)
{
/* Disable link beat and jabber, if_port may change ere next open(). */
EL3WINDOW
(
4
);
outw
(
inw
(
ioaddr
+
WN4_MEDIA
)
&
~
MEDIA_TP
,
ioaddr
+
WN4_MEDIA
);
}
el3_down
(
dev
);
free_irq
(
dev
->
irq
,
dev
);
/* Switching back to window 0 disables the IRQ. */
...
...
@@ -1010,7 +972,6 @@ el3_close(struct net_device *dev)
/* But we explicitly zero the IRQ line select anyway. */
outw
(
0x0f00
,
ioaddr
+
WN0_IRQ
);
update_stats
(
dev
);
return
0
;
}
...
...
@@ -1093,6 +1054,156 @@ static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
return
rc
;
}
static
void
el3_down
(
struct
net_device
*
dev
)
{
int
ioaddr
=
dev
->
base_addr
;
netif_stop_queue
(
dev
);
/* Turn off statistics ASAP. We update lp->stats below. */
outw
(
StatsDisable
,
ioaddr
+
EL3_CMD
);
/* Disable the receiver and transmitter. */
outw
(
RxDisable
,
ioaddr
+
EL3_CMD
);
outw
(
TxDisable
,
ioaddr
+
EL3_CMD
);
if
(
dev
->
if_port
==
3
)
/* Turn off thinnet power. Green! */
outw
(
StopCoax
,
ioaddr
+
EL3_CMD
);
else
if
(
dev
->
if_port
==
0
)
{
/* Disable link beat and jabber, if_port may change ere next open(). */
EL3WINDOW
(
4
);
outw
(
inw
(
ioaddr
+
WN4_MEDIA
)
&
~
MEDIA_TP
,
ioaddr
+
WN4_MEDIA
);
}
outw
(
SetIntrEnb
|
0x0000
,
ioaddr
+
EL3_CMD
);
update_stats
(
dev
);
}
static
void
el3_up
(
struct
net_device
*
dev
)
{
int
i
;
int
ioaddr
=
dev
->
base_addr
;
/* Activating the board required and does no harm otherwise */
outw
(
0x0001
,
ioaddr
+
4
);
/* Set the IRQ line. */
outw
((
dev
->
irq
<<
12
)
|
0x0f00
,
ioaddr
+
WN0_IRQ
);
/* Set the station address in window 2 each time opened. */
EL3WINDOW
(
2
);
for
(
i
=
0
;
i
<
6
;
i
++
)
outb
(
dev
->
dev_addr
[
i
],
ioaddr
+
i
);
if
(
dev
->
if_port
==
3
)
/* Start the thinnet transceiver. We should really wait 50ms...*/
outw
(
StartCoax
,
ioaddr
+
EL3_CMD
);
else
if
(
dev
->
if_port
==
0
)
{
/* 10baseT interface, enabled link beat and jabber check. */
EL3WINDOW
(
4
);
outw
(
inw
(
ioaddr
+
WN4_MEDIA
)
|
MEDIA_TP
,
ioaddr
+
WN4_MEDIA
);
}
/* Switch to the stats window, and clear all stats by reading. */
outw
(
StatsDisable
,
ioaddr
+
EL3_CMD
);
EL3WINDOW
(
6
);
for
(
i
=
0
;
i
<
9
;
i
++
)
inb
(
ioaddr
+
i
);
inw
(
ioaddr
+
10
);
inw
(
ioaddr
+
12
);
/* Switch to register set 1 for normal use. */
EL3WINDOW
(
1
);
/* Accept b-case and phys addr only. */
outw
(
SetRxFilter
|
RxStation
|
RxBroadcast
,
ioaddr
+
EL3_CMD
);
outw
(
StatsEnable
,
ioaddr
+
EL3_CMD
);
/* Turn on statistics. */
outw
(
RxEnable
,
ioaddr
+
EL3_CMD
);
/* Enable the receiver. */
outw
(
TxEnable
,
ioaddr
+
EL3_CMD
);
/* Enable transmitter. */
/* Allow status bits to be seen. */
outw
(
SetStatusEnb
|
0xff
,
ioaddr
+
EL3_CMD
);
/* Ack all pending events, and set active indicator mask. */
outw
(
AckIntr
|
IntLatch
|
TxAvailable
|
RxEarly
|
IntReq
,
ioaddr
+
EL3_CMD
);
outw
(
SetIntrEnb
|
IntLatch
|
TxAvailable
|
TxComplete
|
RxComplete
|
StatsFull
,
ioaddr
+
EL3_CMD
);
netif_start_queue
(
dev
);
}
/* Power Management support functions */
#ifdef CONFIG_PM
static
int
el3_suspend
(
struct
pm_dev
*
pdev
)
{
unsigned
long
flags
;
struct
net_device
*
dev
;
struct
el3_private
*
lp
;
int
ioaddr
;
if
(
!
pdev
&&
!
pdev
->
data
)
return
-
EINVAL
;
dev
=
(
struct
net_device
*
)
pdev
->
data
;
lp
=
(
struct
el3_private
*
)
dev
->
priv
;
ioaddr
=
dev
->
base_addr
;
spin_lock_irqsave
(
&
lp
->
lock
,
flags
);
if
(
netif_running
(
dev
))
netif_device_detach
(
dev
);
el3_down
(
dev
);
outw
(
PowerDown
,
ioaddr
+
EL3_CMD
);
spin_unlock_irqrestore
(
&
lp
->
lock
,
flags
);
return
0
;
}
static
int
el3_resume
(
struct
pm_dev
*
pdev
)
{
unsigned
long
flags
;
struct
net_device
*
dev
;
struct
el3_private
*
lp
;
int
ioaddr
;
if
(
!
pdev
&&
!
pdev
->
data
)
return
-
EINVAL
;
dev
=
(
struct
net_device
*
)
pdev
->
data
;
lp
=
(
struct
el3_private
*
)
dev
->
priv
;
ioaddr
=
dev
->
base_addr
;
spin_lock_irqsave
(
&
lp
->
lock
,
flags
);
outw
(
PowerUp
,
ioaddr
+
EL3_CMD
);
el3_up
(
dev
);
if
(
netif_running
(
dev
))
netif_device_attach
(
dev
);
spin_unlock_irqrestore
(
&
lp
->
lock
,
flags
);
return
0
;
}
static
int
el3_pm_callback
(
struct
pm_dev
*
pdev
,
pm_request_t
rqst
,
void
*
data
)
{
switch
(
rqst
)
{
case
PM_SUSPEND
:
return
el3_suspend
(
pdev
);
case
PM_RESUME
:
return
el3_resume
(
pdev
);
}
return
0
;
}
#endif
/* CONFIG_PM */
#ifdef MODULE
/* Parameters that may be passed into the module. */
static
int
debug
=
-
1
;
...
...
@@ -1122,7 +1233,7 @@ init_module(void)
el3_debug
=
debug
;
el3_root_dev
=
NULL
;
while
(
el3_probe
(
0
)
==
0
)
{
while
(
el3_probe
(
0
,
el3_cards
)
==
0
)
{
if
(
irq
[
el3_cards
]
>
1
)
el3_root_dev
->
irq
=
irq
[
el3_cards
];
if
(
xcvr
[
el3_cards
]
>=
0
)
...
...
@@ -1145,6 +1256,11 @@ cleanup_module(void)
if
(
lp
->
mca_slot
!=-
1
)
mca_mark_as_unused
(
lp
->
mca_slot
);
#endif
#ifdef CONFIG_PM
if
(
lp
->
pmdev
)
pm_unregister
(
lp
->
pmdev
);
#endif
next_dev
=
lp
->
next_dev
;
unregister_netdev
(
el3_root_dev
);
release_region
(
el3_root_dev
->
base_addr
,
EL3_IO_EXTENT
);
...
...
drivers/net/8139cp.c
View file @
386d0ce7
drivers/net/apne.c
View file @
386d0ce7
...
...
@@ -54,19 +54,19 @@
#define NE_BASE (dev->base_addr)
#define NE_CMD 0x00
#define NE_DATAPORT 0x10
/* NatSemi-defined port window offset. */
#define NE_RESET 0x1f
+GAYLE_ODD
/* Issue a read to reset, a write to clear. */
#define NE_RESET 0x1f
/* Issue a read to reset, a write to clear. */
#define NE_IO_EXTENT 0x20
#define NE_EN0_ISR 0x07
+GAYLE_ODD
#define NE_EN0_ISR 0x07
#define NE_EN0_DCFG 0x0e
#define NE_EN0_RSARLO 0x08
#define NE_EN0_RSARHI
0x09+GAYLE_ODD
#define NE_EN0_RSARHI
0x09
#define NE_EN0_RCNTLO 0x0a
#define NE_EN0_RXCR 0x0c
#define NE_EN0_TXCR 0x0d
+GAYLE_ODD
#define NE_EN0_RCNTHI
0x0b+GAYLE_ODD
#define NE_EN0_IMR 0x0f
+GAYLE_ODD
#define NE_EN0_TXCR 0x0d
#define NE_EN0_RCNTHI
0x0b
#define NE_EN0_IMR 0x0f
#define NE1SM_START_PG 0x20
/* First page of TX buffer */
#define NE1SM_STOP_PG 0x40
/* Last page +1 of RX ring */
...
...
@@ -157,7 +157,7 @@ int __init apne_probe(struct net_device *dev)
printk
(
"ethernet PCMCIA card inserted
\n
"
);
if
(
init_pcmcia
())
return
apne_probe1
(
dev
,
IOBASE
+
GAYLE_IO
);
return
apne_probe1
(
dev
,
IOBASE
);
else
return
(
-
ENODEV
);
...
...
@@ -174,11 +174,6 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
int
neX000
,
ctron
;
#endif
static
unsigned
version_printed
;
static
u32
pcmcia_offsets
[
16
]
=
{
0
,
1
+
GAYLE_ODD
,
2
,
3
+
GAYLE_ODD
,
4
,
5
+
GAYLE_ODD
,
6
,
7
+
GAYLE_ODD
,
8
,
9
+
GAYLE_ODD
,
0xa
,
0xb
+
GAYLE_ODD
,
0xc
,
0xd
+
GAYLE_ODD
,
0xe
,
0xf
+
GAYLE_ODD
};
if
(
ei_debug
&&
version_printed
++
==
0
)
printk
(
version
);
...
...
@@ -188,15 +183,15 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
/* Reset card. Who knows what dain-bramaged state it was left in. */
{
unsigned
long
reset_start_time
=
jiffies
;
writeb
(
read
b
(
ioaddr
+
NE_RESET
),
ioaddr
+
NE_RESET
);
outb
(
in
b
(
ioaddr
+
NE_RESET
),
ioaddr
+
NE_RESET
);
while
((
read
b
(
ioaddr
+
NE_EN0_ISR
)
&
ENISR_RESET
)
==
0
)
while
((
in
b
(
ioaddr
+
NE_EN0_ISR
)
&
ENISR_RESET
)
==
0
)
if
(
jiffies
-
reset_start_time
>
2
*
HZ
/
100
)
{
printk
(
" not found (no reset ack).
\n
"
);
return
-
ENODEV
;
}
write
b
(
0xff
,
ioaddr
+
NE_EN0_ISR
);
/* Ack all intr. */
out
b
(
0xff
,
ioaddr
+
NE_EN0_ISR
);
/* Ack all intr. */
}
#ifndef MANUAL_HWADDR0
...
...
@@ -222,13 +217,13 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
{
E8390_RREAD
+
E8390_START
,
NE_CMD
},
};
for
(
i
=
0
;
i
<
sizeof
(
program_seq
)
/
sizeof
(
program_seq
[
0
]);
i
++
)
{
write
b
(
program_seq
[
i
].
value
,
ioaddr
+
program_seq
[
i
].
offset
);
out
b
(
program_seq
[
i
].
value
,
ioaddr
+
program_seq
[
i
].
offset
);
}
}
for
(
i
=
0
;
i
<
32
/*sizeof(SA_prom)*/
;
i
+=
2
)
{
SA_prom
[
i
]
=
read
b
(
ioaddr
+
NE_DATAPORT
);
SA_prom
[
i
+
1
]
=
read
b
(
ioaddr
+
NE_DATAPORT
);
SA_prom
[
i
]
=
in
b
(
ioaddr
+
NE_DATAPORT
);
SA_prom
[
i
+
1
]
=
in
b
(
ioaddr
+
NE_DATAPORT
);
if
(
SA_prom
[
i
]
!=
SA_prom
[
i
+
1
])
wordlength
=
1
;
}
...
...
@@ -244,7 +239,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
if
(
wordlength
==
2
)
{
/* We must set the 8390 for word mode. */
write
b
(
0x49
,
ioaddr
+
NE_EN0_DCFG
);
out
b
(
0x49
,
ioaddr
+
NE_EN0_DCFG
);
start_page
=
NESM_START_PG
;
stop_page
=
NESM_STOP_PG
;
}
else
{
...
...
@@ -271,7 +266,7 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
#else
wordlength
=
2
;
/* We must set the 8390 for word mode. */
write
b
(
0x49
,
ioaddr
+
NE_EN0_DCFG
);
out
b
(
0x49
,
ioaddr
+
NE_EN0_DCFG
);
start_page
=
NESM_START_PG
;
stop_page
=
NESM_STOP_PG
;
...
...
@@ -314,7 +309,6 @@ static int __init apne_probe1(struct net_device *dev, int ioaddr)
ei_status
.
block_input
=
&
apne_block_input
;
ei_status
.
block_output
=
&
apne_block_output
;
ei_status
.
get_8390_hdr
=
&
apne_get_8390_hdr
;
ei_status
.
reg_offset
=
pcmcia_offsets
;
dev
->
open
=
&
apne_open
;
dev
->
stop
=
&
apne_close
;
NS8390_init
(
dev
,
0
);
...
...
@@ -354,18 +348,18 @@ apne_reset_8390(struct net_device *dev)
if
(
ei_debug
>
1
)
printk
(
"resetting the 8390 t=%ld..."
,
jiffies
);
writeb
(
read
b
(
NE_BASE
+
NE_RESET
),
NE_BASE
+
NE_RESET
);
outb
(
in
b
(
NE_BASE
+
NE_RESET
),
NE_BASE
+
NE_RESET
);
ei_status
.
txing
=
0
;
ei_status
.
dmaing
=
0
;
/* This check _should_not_ be necessary, omit eventually. */
while
((
read
b
(
NE_BASE
+
NE_EN0_ISR
)
&
ENISR_RESET
)
==
0
)
while
((
in
b
(
NE_BASE
+
NE_EN0_ISR
)
&
ENISR_RESET
)
==
0
)
if
(
jiffies
-
reset_start_time
>
2
*
HZ
/
100
)
{
printk
(
"%s: ne_reset_8390() did not complete.
\n
"
,
dev
->
name
);
break
;
}
write
b
(
ENISR_RESET
,
NE_BASE
+
NE_EN0_ISR
);
/* Ack intr. */
out
b
(
ENISR_RESET
,
NE_BASE
+
NE_EN0_ISR
);
/* Ack intr. */
}
/* Grab the 8390 specific header. Similar to the block_input routine, but
...
...
@@ -390,25 +384,25 @@ apne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_pa
}
ei_status
.
dmaing
|=
0x01
;
write
b
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
write
b
(
sizeof
(
struct
e8390_pkt_hdr
),
nic_base
+
NE_EN0_RCNTLO
);
write
b
(
0
,
nic_base
+
NE_EN0_RCNTHI
);
write
b
(
0
,
nic_base
+
NE_EN0_RSARLO
);
/* On page boundary */
write
b
(
ring_page
,
nic_base
+
NE_EN0_RSARHI
);
write
b
(
E8390_RREAD
+
E8390_START
,
nic_base
+
NE_CMD
);
out
b
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
out
b
(
sizeof
(
struct
e8390_pkt_hdr
),
nic_base
+
NE_EN0_RCNTLO
);
out
b
(
0
,
nic_base
+
NE_EN0_RCNTHI
);
out
b
(
0
,
nic_base
+
NE_EN0_RSARLO
);
/* On page boundary */
out
b
(
ring_page
,
nic_base
+
NE_EN0_RSARHI
);
out
b
(
E8390_RREAD
+
E8390_START
,
nic_base
+
NE_CMD
);
if
(
ei_status
.
word16
)
{
ptrs
=
(
short
*
)
hdr
;
for
(
cnt
=
0
;
cnt
<
(
sizeof
(
struct
e8390_pkt_hdr
)
>>
1
);
cnt
++
)
*
ptrs
++
=
read
w
(
NE_BASE
+
NE_DATAPORT
);
*
ptrs
++
=
in
w
(
NE_BASE
+
NE_DATAPORT
);
}
else
{
ptrc
=
(
char
*
)
hdr
;
for
(
cnt
=
0
;
cnt
<
sizeof
(
struct
e8390_pkt_hdr
);
cnt
++
)
*
ptrc
++
=
read
b
(
NE_BASE
+
NE_DATAPORT
);
*
ptrc
++
=
in
b
(
NE_BASE
+
NE_DATAPORT
);
}
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
hdr
->
count
=
WORDSWAP
(
hdr
->
count
);
...
...
@@ -418,7 +412,7 @@ apne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_pa
/* Block input and output, similar to the Crynwr packet driver. If you
are porting to a new ethercard, look at the packet driver source for hints.
The NEx000 doesn't share the on-board packet memory -- you have to put
the packet out through the "remote DMA" dataport using
write
b. */
the packet out through the "remote DMA" dataport using
out
b. */
static
void
apne_block_input
(
struct
net_device
*
dev
,
int
count
,
struct
sk_buff
*
skb
,
int
ring_offset
)
...
...
@@ -437,27 +431,27 @@ apne_block_input(struct net_device *dev, int count, struct sk_buff *skb, int rin
return
;
}
ei_status
.
dmaing
|=
0x01
;
write
b
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
write
b
(
count
&
0xff
,
nic_base
+
NE_EN0_RCNTLO
);
write
b
(
count
>>
8
,
nic_base
+
NE_EN0_RCNTHI
);
write
b
(
ring_offset
&
0xff
,
nic_base
+
NE_EN0_RSARLO
);
write
b
(
ring_offset
>>
8
,
nic_base
+
NE_EN0_RSARHI
);
write
b
(
E8390_RREAD
+
E8390_START
,
nic_base
+
NE_CMD
);
out
b
(
E8390_NODMA
+
E8390_PAGE0
+
E8390_START
,
nic_base
+
NE_CMD
);
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
out
b
(
count
&
0xff
,
nic_base
+
NE_EN0_RCNTLO
);
out
b
(
count
>>
8
,
nic_base
+
NE_EN0_RCNTHI
);
out
b
(
ring_offset
&
0xff
,
nic_base
+
NE_EN0_RSARLO
);
out
b
(
ring_offset
>>
8
,
nic_base
+
NE_EN0_RSARHI
);
out
b
(
E8390_RREAD
+
E8390_START
,
nic_base
+
NE_CMD
);
if
(
ei_status
.
word16
)
{
ptrs
=
(
short
*
)
buf
;
for
(
cnt
=
0
;
cnt
<
(
count
>>
1
);
cnt
++
)
*
ptrs
++
=
read
w
(
NE_BASE
+
NE_DATAPORT
);
*
ptrs
++
=
in
w
(
NE_BASE
+
NE_DATAPORT
);
if
(
count
&
0x01
)
{
buf
[
count
-
1
]
=
read
b
(
NE_BASE
+
NE_DATAPORT
);
buf
[
count
-
1
]
=
in
b
(
NE_BASE
+
NE_DATAPORT
);
}
}
else
{
ptrc
=
(
char
*
)
buf
;
for
(
cnt
=
0
;
cnt
<
count
;
cnt
++
)
*
ptrc
++
=
read
b
(
NE_BASE
+
NE_DATAPORT
);
*
ptrc
++
=
in
b
(
NE_BASE
+
NE_DATAPORT
);
}
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x01
;
}
...
...
@@ -486,30 +480,30 @@ apne_block_output(struct net_device *dev, int count,
}
ei_status
.
dmaing
|=
0x01
;
/* We should already be in page 0, but to be safe... */
write
b
(
E8390_PAGE0
+
E8390_START
+
E8390_NODMA
,
nic_base
+
NE_CMD
);
out
b
(
E8390_PAGE0
+
E8390_START
+
E8390_NODMA
,
nic_base
+
NE_CMD
);
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Now the normal output. */
write
b
(
count
&
0xff
,
nic_base
+
NE_EN0_RCNTLO
);
write
b
(
count
>>
8
,
nic_base
+
NE_EN0_RCNTHI
);
write
b
(
0x00
,
nic_base
+
NE_EN0_RSARLO
);
write
b
(
start_page
,
nic_base
+
NE_EN0_RSARHI
);
out
b
(
count
&
0xff
,
nic_base
+
NE_EN0_RCNTLO
);
out
b
(
count
>>
8
,
nic_base
+
NE_EN0_RCNTHI
);
out
b
(
0x00
,
nic_base
+
NE_EN0_RSARLO
);
out
b
(
start_page
,
nic_base
+
NE_EN0_RSARHI
);
write
b
(
E8390_RWRITE
+
E8390_START
,
nic_base
+
NE_CMD
);
out
b
(
E8390_RWRITE
+
E8390_START
,
nic_base
+
NE_CMD
);
if
(
ei_status
.
word16
)
{
ptrs
=
(
short
*
)
buf
;
for
(
cnt
=
0
;
cnt
<
count
>>
1
;
cnt
++
)
write
w
(
*
ptrs
++
,
NE_BASE
+
NE_DATAPORT
);
out
w
(
*
ptrs
++
,
NE_BASE
+
NE_DATAPORT
);
}
else
{
ptrc
=
(
char
*
)
buf
;
for
(
cnt
=
0
;
cnt
<
count
;
cnt
++
)
write
b
(
*
ptrc
++
,
NE_BASE
+
NE_DATAPORT
);
out
b
(
*
ptrc
++
,
NE_BASE
+
NE_DATAPORT
);
}
dma_start
=
jiffies
;
while
((
read
b
(
NE_BASE
+
NE_EN0_ISR
)
&
ENISR_RDC
)
==
0
)
while
((
in
b
(
NE_BASE
+
NE_EN0_ISR
)
&
ENISR_RDC
)
==
0
)
if
(
jiffies
-
dma_start
>
2
*
HZ
/
100
)
{
/* 20ms */
printk
(
"%s: timeout waiting for Tx RDC.
\n
"
,
dev
->
name
);
apne_reset_8390
(
dev
);
...
...
@@ -517,7 +511,7 @@ apne_block_output(struct net_device *dev, int count,
break
;
}
write
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
out
b
(
ENISR_RDC
,
nic_base
+
NE_EN0_ISR
);
/* Ack intr. */
ei_status
.
dmaing
&=
~
0x01
;
return
;
}
...
...
@@ -611,7 +605,9 @@ static int init_pcmcia(void)
}
#endif
writeb
(
config
,
GAYLE_ATTRIBUTE
+
offset
);
out_8
(
GAYLE_ATTRIBUTE
+
offset
,
config
);
return
1
;
}
MODULE_LICENSE
(
"GPL"
);
drivers/net/dgrs.c
View file @
386d0ce7
...
...
@@ -1153,9 +1153,7 @@ dgrs_probe1(struct net_device *dev)
*/
rc
=
dgrs_download
(
dev
);
if
(
rc
)
{
return
rc
;
}
goto
err_out
;
/*
* Get ether address of board
...
...
@@ -1169,7 +1167,8 @@ dgrs_probe1(struct net_device *dev)
if
(
dev
->
dev_addr
[
0
]
&
1
)
{
printk
(
"%s: Illegal Ethernet Address
\n
"
,
dev
->
name
);
return
(
-
ENXIO
);
rc
=
-
ENXIO
;
goto
err_out
;
}
/*
...
...
@@ -1178,9 +1177,10 @@ dgrs_probe1(struct net_device *dev)
*/
if
(
priv
->
plxreg
)
OUTL
(
dev
->
base_addr
+
PLX_LCL2PCI_DOORBELL
,
1
);
rc
=
request_irq
(
dev
->
irq
,
&
dgrs_intr
,
SA_SHIRQ
,
"RightSwitch"
,
dev
);
if
(
rc
)
return
(
rc
)
;
goto
err_out
;
priv
->
intrcnt
=
0
;
for
(
i
=
jiffies
+
2
*
HZ
+
HZ
/
2
;
time_after
(
i
,
jiffies
);
)
...
...
@@ -1191,15 +1191,21 @@ dgrs_probe1(struct net_device *dev)
}
if
(
priv
->
intrcnt
<
2
)
{
printk
(
"%s: Not interrupting on IRQ %d (%d)
\n
"
,
printk
(
KERN_ERR
"%s: Not interrupting on IRQ %d (%d)
\n
"
,
dev
->
name
,
dev
->
irq
,
priv
->
intrcnt
);
return
(
-
ENXIO
);
rc
=
-
ENXIO
;
goto
err_free_irq
;
}
/*
* Register the /proc/ioports information...
*/
request_region
(
dev
->
base_addr
,
256
,
"RightSwitch"
);
if
(
!
request_region
(
dev
->
base_addr
,
256
,
"RightSwitch"
))
{
printk
(
KERN_ERR
"%s: io 0x%3lX, which is busy.
\n
"
,
dev
->
name
,
dev
->
base_addr
);
rc
=
-
EBUSY
;
goto
err_free_irq
;
}
/*
* Entry points...
...
...
@@ -1211,7 +1217,12 @@ dgrs_probe1(struct net_device *dev)
dev
->
set_multicast_list
=
&
dgrs_set_multicast_list
;
dev
->
do_ioctl
=
&
dgrs_ioctl
;
return
(
0
);
return
rc
;
err_free_irq:
free_irq
(
dev
->
irq
,
dev
);
err_out:
return
rc
;
}
int
__init
...
...
drivers/net/rrunner.c
View file @
386d0ce7
...
...
@@ -75,13 +75,13 @@ static inline void netif_start_queue(struct net_device *dev)
#define rr_mark_net_bh(foo) mark_bh(foo)
#define rr_if_busy(dev) dev->tbusy
#define rr_if_running(dev) dev->start
/* Currently unused. */
#define rr_if_down(dev)
{do{dev->start = 0;}while (0);}
#define rr_if_down(dev)
do { dev->start = 0; } while (0)
#else
#define NET_BH 0
#define rr_mark_net_bh(foo)
{do{} while(0);}
#define rr_mark_net_bh(foo)
do { } while(0)
#define rr_if_busy(dev) netif_queue_stopped(dev)
#define rr_if_running(dev) netif_running(dev)
#define rr_if_down(dev)
{do{} while(0);}
#define rr_if_down(dev)
do { } while(0)
#endif
#include "rrunner.h"
...
...
drivers/net/sgiseeq.c
View file @
386d0ce7
/* $Id: sgiseeq.c,v 1.17 2000/03/27 23:02:57 ralf Exp $
*
/*
* sgiseeq.c: Seeq8003 ethernet driver for SGI machines.
*
* Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/types.h>
#include <linux/interrupt.h>
...
...
@@ -450,20 +450,22 @@ static int sgiseeq_open(struct net_device *dev)
unsigned
long
flags
;
int
err
;
save_flags
(
flags
);
cli
();
if
(
request_irq
(
dev
->
irq
,
sgiseeq_interrupt
,
0
,
sgiseeqstr
,
(
void
*
)
dev
))
{
__save_and_cli
(
flags
);
err
=
-
EAGAIN
;
if
(
request_irq
(
dev
->
irq
,
sgiseeq_interrupt
,
0
,
sgiseeqstr
,
dev
))
{
printk
(
"Seeq8003: Can't get irq %d
\n
"
,
dev
->
irq
);
restore_flags
(
flags
);
return
-
EAGAIN
;
goto
out
;
}
err
=
init_seeq
(
dev
,
sp
,
sregs
);
if
(
err
)
return
err
;
goto
out
;
netif_start_queue
(
dev
);
restore_flags
(
flags
);
return
0
;
out:
__restore_flags
(
flags
);
return
err
;
}
static
int
sgiseeq_close
(
struct
net_device
*
dev
)
...
...
drivers/net/sun3lance.c
View file @
386d0ce7
...
...
@@ -21,7 +21,7 @@
*/
static
char
*
version
=
"sun3lance.c: v1.
1 11/17/1999 Sam Creasey (sammy@oh.verio.com
)
\n
"
;
static
char
*
version
=
"sun3lance.c: v1.
2 1/12/2001 Sam Creasey (sammy@sammy.net
)
\n
"
;
#include <linux/module.h>
...
...
@@ -35,16 +35,24 @@ static char *version = "sun3lance.c: v1.1 11/17/1999 Sam Creasey (sammy@oh.veri
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <asm/setup.h>
#include <asm/irq.h>
#include <asm/bitops.h>
#include <asm/io.h>
#include <asm/idprom.h>
#include <asm/pgtable.h>
#include <asm/
sun3mmu
.h>
#include <asm/
pgalloc
.h>
#include <asm/dvma.h>
#include <asm/idprom.h>
#include <asm/machines.h>
#ifdef CONFIG_SUN3
#include <asm/sun3mmu.h>
#else
#include <asm/sun3xprom.h>
#endif
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
...
...
@@ -62,7 +70,7 @@ static char *version = "sun3lance.c: v1.1 11/17/1999 Sam Creasey (sammy@oh.veri
* 3 = debug, print even more debug infos (packet data)
*/
#define LANCE_DEBUG
1
#define LANCE_DEBUG
0
#ifdef LANCE_DEBUG
static
int
lance_debug
=
LANCE_DEBUG
;
...
...
@@ -139,7 +147,7 @@ struct lance_memory {
struct
lance_tx_head
tx_head
[
TX_RING_SIZE
];
struct
lance_rx_head
rx_head
[
RX_RING_SIZE
];
char
rx_data
[
RX_RING_SIZE
][
PKT_BUF_SZ
];
char
tx_data
[
R
X_RING_SIZE
][
PKT_BUF_SZ
];
char
tx_data
[
T
X_RING_SIZE
][
PKT_BUF_SZ
];
};
/* The driver's private device structure */
...
...
@@ -247,15 +255,27 @@ int __init sun3lance_probe( struct net_device *dev )
{
static
int
found
;
/* check that this machine has an onboard lance */
switch
(
idprom
->
id_machtype
)
{
case
SM_SUN3
|
SM_3_50
:
case
SM_SUN3
|
SM_3_60
:
case
SM_SUN3X
|
SM_3_80
:
/* these machines have lance */
break
;
default:
return
(
-
ENODEV
);
}
if
(
found
)
return
(
ENODEV
);
return
(
-
ENODEV
);
if
(
lance_probe
(
dev
))
{
found
=
1
;
return
(
0
);
}
return
(
ENODEV
);
return
(
-
ENODEV
);
}
static
int
__init
lance_probe
(
struct
net_device
*
dev
)
...
...
@@ -269,6 +289,7 @@ static int __init lance_probe( struct net_device *dev)
volatile
unsigned
short
*
ioaddr_probe
;
unsigned
short
tmp1
,
tmp2
;
#ifdef CONFIG_SUN3
/* LANCE_OBIO can be found within the IO pmeg with some effort */
for
(
ioaddr
=
0xfe00000
;
ioaddr
<
(
0xfe00000
+
SUN3_PMEG_SIZE
);
ioaddr
+=
SUN3_PTE_SIZE
)
{
...
...
@@ -286,6 +307,9 @@ static int __init lance_probe( struct net_device *dev)
if
(
!
found
)
return
0
;
#else
ioaddr
=
SUN3X_LANCE
;
#endif
/* test to see if there's really a lance here */
/* (CSRO_INIT shouldn't be readable) */
...
...
@@ -311,8 +335,9 @@ static int __init lance_probe( struct net_device *dev)
return
0
;
}
lp
=
(
struct
lance_private
*
)
dev
->
priv
;
MEM
=
(
struct
lance_memory
*
)
sun3_dvma_malloc
(
sizeof
(
struct
lance_memory
));
MEM
=
dvma_malloc_align
(
sizeof
(
struct
lance_memory
),
0x10000
);
lp
->
iobase
=
(
volatile
unsigned
short
*
)
ioaddr
;
dev
->
base_addr
=
(
unsigned
long
)
ioaddr
;
/* informational only */
...
...
@@ -346,20 +371,19 @@ static int __init lance_probe( struct net_device *dev)
MEM
->
init
.
mode
=
0x0000
;
MEM
->
init
.
filter
[
0
]
=
0x00000000
;
MEM
->
init
.
filter
[
1
]
=
0x00000000
;
MEM
->
init
.
rdra
=
sun3_dvma_vtop
(
MEM
->
rx_head
);
MEM
->
init
.
rdra
=
dvma_vtob
(
MEM
->
rx_head
);
MEM
->
init
.
rlen
=
(
RX_LOG_RING_SIZE
<<
13
)
|
(
sun3_dvma_vtop
(
MEM
->
rx_head
)
>>
16
);
MEM
->
init
.
tdra
=
sun3_dvma_vtop
(
MEM
->
tx_head
);
(
dvma_vtob
(
MEM
->
rx_head
)
>>
16
);
MEM
->
init
.
tdra
=
dvma_vtob
(
MEM
->
tx_head
);
MEM
->
init
.
tlen
=
(
TX_LOG_RING_SIZE
<<
13
)
|
(
sun3_dvma_vtop
(
MEM
->
tx_head
)
>>
16
);
(
dvma_vtob
(
MEM
->
tx_head
)
>>
16
);
DPRINTK
(
2
,
(
"initaddr: %08lx rx_ring: %08lx tx_ring: %08lx
\n
"
,
sun3_dvma_vtop
(
&
(
MEM
->
init
)),
sun3_dvma_vtop
(
MEM
->
rx_head
),
(
sun3_dvma_vtop
(
MEM
->
tx_head
))));
dvma_vtob
(
&
(
MEM
->
init
)),
dvma_vtob
(
MEM
->
rx_head
),
(
dvma_vtob
(
MEM
->
tx_head
))));
if
(
did_version
++
==
0
)
DPRINTK
(
1
,
(
version
)
);
printk
(
version
);
/* The LANCE-specific entries in the device structure. */
dev
->
open
=
&
lance_open
;
...
...
@@ -386,16 +410,8 @@ static int lance_open( struct net_device *dev )
REGA
(
CSR0
)
=
CSR0_STOP
;
/* tell the lance the address of its init block */
REGA
(
CSR1
)
=
sun3_dvma_vtop
(
&
(
MEM
->
init
));
REGA
(
CSR2
)
=
sun3_dvma_vtop
(
&
(
MEM
->
init
))
>>
16
;
lance_init_ring
(
dev
);
/* Re-initialize the LANCE, and start it when done. */
REGA
(
CSR3
)
=
CSR3_BSWP
;
/* From now on, AREG is kept to point to CSR0 */
REGA
(
CSR0
)
=
CSR0_INIT
;
...
...
@@ -434,23 +450,52 @@ static void lance_init_ring( struct net_device *dev )
lp
->
old_rx
=
lp
->
old_tx
=
0
;
for
(
i
=
0
;
i
<
TX_RING_SIZE
;
i
++
)
{
MEM
->
tx_head
[
i
].
base
=
sun3_dvma_vtop
(
MEM
->
tx_data
[
i
]);
MEM
->
tx_head
[
i
].
base
=
dvma_vtob
(
MEM
->
tx_data
[
i
]);
MEM
->
tx_head
[
i
].
flag
=
0
;
MEM
->
tx_head
[
i
].
base_hi
=
(
sun3_dvma_vtop
(
MEM
->
tx_data
[
i
]))
>>
16
;
(
dvma_vtob
(
MEM
->
tx_data
[
i
]))
>>
16
;
MEM
->
tx_head
[
i
].
length
=
0
;
MEM
->
tx_head
[
i
].
misc
=
0
;
}
for
(
i
=
0
;
i
<
RX_RING_SIZE
;
i
++
)
{
MEM
->
rx_head
[
i
].
base
=
sun3_dvma_vtop
(
MEM
->
rx_data
[
i
]);
MEM
->
rx_head
[
i
].
flag
=
T
MD1_OWN_CHIP
;
MEM
->
rx_head
[
i
].
base
=
dvma_vtob
(
MEM
->
rx_data
[
i
]);
MEM
->
rx_head
[
i
].
flag
=
R
MD1_OWN_CHIP
;
MEM
->
rx_head
[
i
].
base_hi
=
(
sun3_dvma_vtop
(
MEM
->
rx_data
[
i
]))
>>
16
;
(
dvma_vtob
(
MEM
->
rx_data
[
i
]))
>>
16
;
MEM
->
rx_head
[
i
].
buf_length
=
-
PKT_BUF_SZ
|
0xf000
;
MEM
->
rx_head
[
i
].
msg_length
=
0
;
}
/* tell the card it's ether address, bytes swapped */
MEM
->
init
.
hwaddr
[
0
]
=
dev
->
dev_addr
[
1
];
MEM
->
init
.
hwaddr
[
1
]
=
dev
->
dev_addr
[
0
];
MEM
->
init
.
hwaddr
[
2
]
=
dev
->
dev_addr
[
3
];
MEM
->
init
.
hwaddr
[
3
]
=
dev
->
dev_addr
[
2
];
MEM
->
init
.
hwaddr
[
4
]
=
dev
->
dev_addr
[
5
];
MEM
->
init
.
hwaddr
[
5
]
=
dev
->
dev_addr
[
4
];
MEM
->
init
.
mode
=
0x0000
;
MEM
->
init
.
filter
[
0
]
=
0x00000000
;
MEM
->
init
.
filter
[
1
]
=
0x00000000
;
MEM
->
init
.
rdra
=
dvma_vtob
(
MEM
->
rx_head
);
MEM
->
init
.
rlen
=
(
RX_LOG_RING_SIZE
<<
13
)
|
(
dvma_vtob
(
MEM
->
rx_head
)
>>
16
);
MEM
->
init
.
tdra
=
dvma_vtob
(
MEM
->
tx_head
);
MEM
->
init
.
tlen
=
(
TX_LOG_RING_SIZE
<<
13
)
|
(
dvma_vtob
(
MEM
->
tx_head
)
>>
16
);
/* tell the lance the address of its init block */
REGA
(
CSR1
)
=
dvma_vtob
(
&
(
MEM
->
init
));
REGA
(
CSR2
)
=
dvma_vtob
(
&
(
MEM
->
init
))
>>
16
;
#ifdef CONFIG_SUN3X
REGA
(
CSR3
)
=
CSR3_BSWP
|
CSR3_ACON
|
CSR3_BCON
;
#else
REGA
(
CSR3
)
=
CSR3_BSWP
;
#endif
}
...
...
@@ -520,13 +565,22 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
}
AREG
=
CSR0
;
//
DPRINTK( 2, ( "%s: lance_start_xmit() called, csr0 %4.4x.\n",
//
dev->name, DREG ));
DPRINTK
(
2
,
(
"%s: lance_start_xmit() called, csr0 %4.4x.
\n
"
,
dev
->
name
,
DREG
));
#ifdef CONFIG_SUN3X
/* this weirdness doesn't appear on sun3... */
if
(
!
(
DREG
&
CSR0_INIT
))
{
DPRINTK
(
1
,
(
"INIT not set, reinitializing...
\n
"
));
REGA
(
CSR0
)
=
CSR0_STOP
;
lance_init_ring
(
dev
);
REGA
(
CSR0
)
=
CSR0_INIT
|
CSR0_STRT
;
}
#endif
/* Fill in a Tx ring entry */
#if 0
if (lance_debug >=
3
) {
if (lance_debug >=
2
) {
u_char *p;
int i;
printk( "%s: TX pkt %d type 0x%04x from ", dev->name,
...
...
@@ -566,7 +620,10 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
lp
->
stats
.
tx_bytes
+=
skb
->
len
;
/* Trigger an immediate send poll. */
REGA
(
CSR0
)
=
CSR0_INEA
|
CSR0_TDMD
;
REGA
(
CSR0
)
=
CSR0_INEA
|
CSR0_TDMD
|
CSR0_STRT
;
AREG
=
CSR0
;
DPRINTK
(
2
,
(
"%s: lance_start_xmit() exiting, csr0 %4.4x.
\n
"
,
dev
->
name
,
DREG
));
dev
->
trans_start
=
jiffies
;
dev_kfree_skb
(
skb
);
...
...
@@ -599,12 +656,13 @@ static void lance_interrupt( int irq, void *dev_id, struct pt_regs *fp)
in_interrupt
=
1
;
still_more:
flush_cache_all
();
AREG
=
CSR0
;
csr0
=
DREG
;
/* ack interrupts */
DREG
=
csr0
&
(
CSR0_TINT
|
CSR0_RINT
);
DREG
=
csr0
&
(
CSR0_TINT
|
CSR0_RINT
|
CSR0_IDON
);
/* clear errors */
if
(
csr0
&
CSR0_ERR
)
...
...
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