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
Kirill Smelkov
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
Hide 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
;
}
...
...
@@ -1092,7 +1053,157 @@ 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
)
...
...
@@ -1144,7 +1255,12 @@ cleanup_module(void)
#ifdef CONFIG_MCA
if
(
lp
->
mca_slot
!=-
1
)
mca_mark_as_unused
(
lp
->
mca_slot
);
#endif
#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
...
...
@@ -37,8 +37,8 @@
* Investigate using High Priority Tx Queue with skb->priority
* Adjust Rx FIFO threshold and Max Rx DMA burst on Rx FIFO error
* Adjust Tx FIFO threshold and Max Tx DMA burst on Tx FIFO error
* Implement Tx software interrupt mitigation via
Tx descriptor bit
* Implement Tx software interrupt mitigation via
Tx descriptor bit
* The real minimum of CP_MIN_MTU is 4 bytes. However,
for this to be supported, one must(?) turn on packet padding.
...
...
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_IO_EXTENT 0x20
#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_RCNTLO 0x0a
#define NE_EN0_RSARLO
0x08
#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,12 +174,7 @@ 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,16 +1191,22 @@ 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 */
...
...
@@ -151,8 +159,8 @@ struct lance_private {
int
old_tx
,
old_rx
;
/* ring entry to be processed */
struct
net_device_stats
stats
;
/* These two must be longs for set_bit() */
long
tx_full
;
long
lock
;
long
tx_full
;
long
lock
;
};
/* I/O register access macros */
...
...
@@ -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 */
...
...
@@ -331,7 +356,7 @@ static int __init lance_probe( struct net_device *dev)
/* copy in the ethernet address from the prom */
for
(
i
=
0
;
i
<
6
;
i
++
)
dev
->
dev_addr
[
i
]
=
idprom
->
id_ethaddr
[
i
];
/* 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
];
...
...
@@ -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
}
...
...
@@ -512,7 +557,7 @@ static int lance_start_xmit( struct sk_buff *skb, struct net_device *dev )
stopping the queue for a bit... */
netif_stop_queue
(
dev
);
if
(
test_and_set_bit
(
0
,
(
void
*
)
&
lp
->
lock
)
!=
0
)
{
printk
(
"%s: tx queue lock!.
\n
"
,
dev
->
name
);
/* don't clear dev->tbusy flag. */
...
...
@@ -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
);
...
...
@@ -597,14 +654,15 @@ static void lance_interrupt( int irq, void *dev_id, struct pt_regs *fp)
if
(
in_interrupt
)
DPRINTK
(
2
,
(
"%s: Re-entering the interrupt handler.
\n
"
,
dev
->
name
));
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