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
e0d3e322
Commit
e0d3e322
authored
Apr 13, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge redhat.com:/spare/repo/netdev-2.6/8139cp
into redhat.com:/spare/repo/net-drivers-2.6
parents
4d72de23
93eb7437
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
127 additions
and
102 deletions
+127
-102
drivers/net/8139cp.c
drivers/net/8139cp.c
+127
-102
No files found.
drivers/net/8139cp.c
View file @
e0d3e322
/* 8139cp.c: A Linux PCI Ethernet driver for the RealTek 8139C+ chips. */
/*
Copyright 2001
,2002
Jeff Garzik <jgarzik@pobox.com>
Copyright 2001
-2004
Jeff Garzik <jgarzik@pobox.com>
Copyright (C) 2001, 2002 David S. Miller (davem@redhat.com) [tg3.c]
Copyright (C) 2000, 2001 David S. Miller (davem@redhat.com) [sungem.c]
...
...
@@ -48,8 +48,8 @@
*/
#define DRV_NAME "8139cp"
#define DRV_VERSION "1.
1
"
#define DRV_RELDATE "
Aug 30, 2003
"
#define DRV_VERSION "1.
2
"
#define DRV_RELDATE "
Mar 22, 2004
"
#include <linux/config.h>
...
...
@@ -69,6 +69,7 @@
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/cache.h>
#include <asm/io.h>
#include <asm/uaccess.h>
...
...
@@ -334,36 +335,36 @@ struct cp_extra_stats {
};
struct
cp_private
{
unsigned
tx_head
;
unsigned
tx_tail
;
unsigned
rx_tail
;
void
*
regs
;
struct
net_device
*
dev
;
spinlock_t
lock
;
u32
msg_enable
;
struct
pci_dev
*
pdev
;
u32
rx_config
;
u16
cpcmd
;
struct
net_device_stats
net_stats
;
struct
cp_extra_stats
cp_stats
;
struct
cp_dma_stats
*
nic_stats
;
dma_addr_t
nic_stats_dma
;
unsigned
rx_tail
____cacheline_aligned
;
struct
cp_desc
*
rx_ring
;
struct
cp_desc
*
tx_ring
;
struct
ring_info
tx_skb
[
CP_TX_RING_SIZE
];
struct
ring_info
rx_skb
[
CP_RX_RING_SIZE
];
unsigned
rx_buf_sz
;
unsigned
tx_head
____cacheline_aligned
;
unsigned
tx_tail
;
struct
cp_desc
*
tx_ring
;
struct
ring_info
tx_skb
[
CP_TX_RING_SIZE
];
dma_addr_t
ring_dma
;
#if CP_VLAN_TAG_USED
struct
vlan_group
*
vlgrp
;
#endif
u32
msg_enable
;
struct
net_device_stats
net_stats
;
struct
cp_extra_stats
cp_stats
;
struct
cp_dma_stats
*
nic_stats
;
dma_addr_t
nic_stats_dma
;
struct
pci_dev
*
pdev
;
u32
rx_config
;
u16
cpcmd
;
unsigned
int
wol_enabled
:
1
;
/* Is Wake-on-LAN enabled? */
u32
power_state
[
16
];
...
...
@@ -424,25 +425,27 @@ static struct {
#if CP_VLAN_TAG_USED
static
void
cp_vlan_rx_register
(
struct
net_device
*
dev
,
struct
vlan_group
*
grp
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
cp
->
vlgrp
=
grp
;
cp
->
cpcmd
|=
RxVlanOn
;
cpw16
(
CpCmd
,
cp
->
cpcmd
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
}
static
void
cp_vlan_rx_kill_vid
(
struct
net_device
*
dev
,
unsigned
short
vid
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
cp
->
cpcmd
&=
~
RxVlanOn
;
cpw16
(
CpCmd
,
cp
->
cpcmd
);
if
(
cp
->
vlgrp
)
cp
->
vlgrp
->
vlan_devices
[
vid
]
=
NULL
;
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
}
#endif
/* CP_VLAN_TAG_USED */
...
...
@@ -510,7 +513,7 @@ static inline unsigned int cp_rx_csum_ok (u32 status)
static
int
cp_rx_poll
(
struct
net_device
*
dev
,
int
*
budget
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
unsigned
rx_tail
=
cp
->
rx_tail
;
unsigned
rx_work
=
dev
->
quota
;
unsigned
rx
;
...
...
@@ -630,9 +633,13 @@ static irqreturn_t
cp_interrupt
(
int
irq
,
void
*
dev_instance
,
struct
pt_regs
*
regs
)
{
struct
net_device
*
dev
=
dev_instance
;
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
;
u16
status
;
if
(
unlikely
(
dev
==
NULL
))
return
IRQ_NONE
;
cp
=
netdev_priv
(
dev
);
status
=
cpr16
(
IntrStatus
);
if
(
!
status
||
(
status
==
0xFFFF
))
return
IRQ_NONE
;
...
...
@@ -648,20 +655,23 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
/* close possible race's with dev_close */
if
(
unlikely
(
!
netif_running
(
dev
)))
{
cpw16
(
IntrMask
,
0
);
goto
out
;
spin_unlock
(
&
cp
->
lock
);
return
IRQ_HANDLED
;
}
if
(
status
&
(
RxOK
|
RxErr
|
RxEmpty
|
RxFIFOOvr
))
{
if
(
status
&
(
RxOK
|
RxErr
|
RxEmpty
|
RxFIFOOvr
))
if
(
netif_rx_schedule_prep
(
dev
))
{
cpw16_f
(
IntrMask
,
cp_norx_intr_mask
);
__netif_rx_schedule
(
dev
);
}
}
if
(
status
&
(
TxOK
|
TxErr
|
TxEmpty
|
SWInt
))
cp_tx
(
cp
);
if
(
status
&
LinkChg
)
mii_check_media
(
&
cp
->
mii_if
,
netif_msg_link
(
cp
),
FALSE
);
spin_unlock
(
&
cp
->
lock
);
if
(
status
&
PciErr
)
{
u16
pci_status
;
...
...
@@ -672,8 +682,7 @@ cp_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
/* TODO: reset hardware */
}
out:
spin_unlock
(
&
cp
->
lock
);
return
IRQ_HANDLED
;
}
...
...
@@ -736,7 +745,7 @@ static void cp_tx (struct cp_private *cp)
static
int
cp_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
unsigned
entry
;
u32
eor
;
#if CP_VLAN_TAG_USED
...
...
@@ -894,7 +903,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
static
void
__cp_set_rx_mode
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
u32
mc_filter
[
2
];
/* Multicast hash filter */
int
i
,
rx_mode
;
u32
tmp
;
...
...
@@ -939,7 +948,7 @@ static void __cp_set_rx_mode (struct net_device *dev)
static
void
cp_set_rx_mode
(
struct
net_device
*
dev
)
{
unsigned
long
flags
;
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
spin_lock_irqsave
(
&
cp
->
lock
,
flags
);
__cp_set_rx_mode
(
dev
);
...
...
@@ -955,35 +964,28 @@ static void __cp_get_stats(struct cp_private *cp)
static
struct
net_device_stats
*
cp_get_stats
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
/* The chip only need report frame silently dropped. */
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
if
(
netif_running
(
dev
)
&&
netif_device_present
(
dev
))
__cp_get_stats
(
cp
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
&
cp
->
net_stats
;
}
static
void
cp_stop_hw
(
struct
cp_private
*
cp
)
{
struct
net_device
*
dev
=
cp
->
dev
;
cpw16
(
IntrStatus
,
~
(
cpr16
(
IntrStatus
)));
cpw16_f
(
IntrMask
,
0
);
cpw8
(
Cmd
,
0
);
cpw16_f
(
CpCmd
,
0
);
cpw16
(
IntrStatus
,
~
(
cpr16
(
IntrStatus
)));
synchronize_irq
(
dev
->
irq
);
udelay
(
10
);
cpw16_f
(
IntrStatus
,
~
(
cpr16
(
IntrStatus
)));
cp
->
rx_tail
=
0
;
cp
->
tx_head
=
cp
->
tx_tail
=
0
;
(
void
)
dev
;
/* avoid compiler warning when synchronize_irq()
* disappears during !CONFIG_SMP
*/
}
static
void
cp_reset_hw
(
struct
cp_private
*
cp
)
...
...
@@ -1012,6 +1014,7 @@ static inline void cp_start_hw (struct cp_private *cp)
static
void
cp_init_hw
(
struct
cp_private
*
cp
)
{
struct
net_device
*
dev
=
cp
->
dev
;
dma_addr_t
ring_dma
;
cp_reset_hw
(
cp
);
...
...
@@ -1037,10 +1040,13 @@ static void cp_init_hw (struct cp_private *cp)
cpw32_f
(
HiTxRingAddr
,
0
);
cpw32_f
(
HiTxRingAddr
+
4
,
0
);
cpw32_f
(
RxRingAddr
,
cp
->
ring_dma
);
cpw32_f
(
RxRingAddr
+
4
,
0
);
/* FIXME: 64-bit PCI */
cpw32_f
(
TxRingAddr
,
cp
->
ring_dma
+
(
sizeof
(
struct
cp_desc
)
*
CP_RX_RING_SIZE
));
cpw32_f
(
TxRingAddr
+
4
,
0
);
/* FIXME: 64-bit PCI */
ring_dma
=
cp
->
ring_dma
;
cpw32_f
(
RxRingAddr
,
ring_dma
&
0xffffffff
);
cpw32_f
(
RxRingAddr
+
4
,
(
ring_dma
>>
16
)
>>
16
);
ring_dma
+=
sizeof
(
struct
cp_desc
)
*
CP_RX_RING_SIZE
;
cpw32_f
(
TxRingAddr
,
ring_dma
&
0xffffffff
);
cpw32_f
(
TxRingAddr
+
4
,
(
ring_dma
>>
16
)
>>
16
);
cpw16
(
MultiIntr
,
0
);
...
...
@@ -1154,7 +1160,7 @@ static void cp_free_rings (struct cp_private *cp)
static
int
cp_open
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
int
rc
;
if
(
netif_msg_ifup
(
cp
))
...
...
@@ -1184,19 +1190,24 @@ static int cp_open (struct net_device *dev)
static
int
cp_close
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
if
(
netif_msg_ifdown
(
cp
))
printk
(
KERN_DEBUG
"%s: disabling interface
\n
"
,
dev
->
name
);
spin_lock_irqsave
(
&
cp
->
lock
,
flags
);
netif_stop_queue
(
dev
);
netif_carrier_off
(
dev
);
spin_lock_irq
(
&
cp
->
lock
);
cp_stop_hw
(
cp
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irqrestore
(
&
cp
->
lock
,
flags
);
synchronize_irq
(
dev
->
irq
);
free_irq
(
dev
->
irq
,
dev
);
cp_free_rings
(
cp
);
return
0
;
}
...
...
@@ -1204,8 +1215,9 @@ static int cp_close (struct net_device *dev)
#ifdef BROKEN
static
int
cp_change_mtu
(
struct
net_device
*
dev
,
int
new_mtu
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
int
rc
;
unsigned
long
flags
;
/* check for invalid MTU, according to hardware limits */
if
(
new_mtu
<
CP_MIN_MTU
||
new_mtu
>
CP_MAX_MTU
)
...
...
@@ -1218,7 +1230,7 @@ static int cp_change_mtu(struct net_device *dev, int new_mtu)
return
0
;
}
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
cp_stop_hw
(
cp
);
/* stop h/w and free rings */
cp_clean_rings
(
cp
);
...
...
@@ -1229,7 +1241,7 @@ static int cp_change_mtu(struct net_device *dev, int new_mtu)
rc
=
cp_init_rings
(
cp
);
/* realloc and restart h/w */
cp_start_hw
(
cp
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
rc
;
}
...
...
@@ -1248,7 +1260,7 @@ static char mii_2_8139_map[8] = {
static
int
mdio_read
(
struct
net_device
*
dev
,
int
phy_id
,
int
location
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
return
location
<
8
&&
mii_2_8139_map
[
location
]
?
readw
(
cp
->
regs
+
mii_2_8139_map
[
location
])
:
0
;
...
...
@@ -1258,7 +1270,7 @@ static int mdio_read(struct net_device *dev, int phy_id, int location)
static
void
mdio_write
(
struct
net_device
*
dev
,
int
phy_id
,
int
location
,
int
value
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
if
(
location
==
0
)
{
cpw8
(
Cfg9346
,
Cfg9346_Unlock
);
...
...
@@ -1326,7 +1338,7 @@ static void netdev_get_wol (struct cp_private *cp,
static
void
cp_get_drvinfo
(
struct
net_device
*
dev
,
struct
ethtool_drvinfo
*
info
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
strcpy
(
info
->
driver
,
DRV_NAME
);
strcpy
(
info
->
version
,
DRV_VERSION
);
...
...
@@ -1345,55 +1357,57 @@ static int cp_get_stats_count (struct net_device *dev)
static
int
cp_get_settings
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
cmd
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
int
rc
;
unsigned
long
flags
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
rc
=
mii_ethtool_gset
(
&
cp
->
mii_if
,
cmd
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
rc
;
}
static
int
cp_set_settings
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
cmd
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
int
rc
;
unsigned
long
flags
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
rc
=
mii_ethtool_sset
(
&
cp
->
mii_if
,
cmd
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
rc
;
}
static
int
cp_nway_reset
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
return
mii_nway_restart
(
&
cp
->
mii_if
);
}
static
u32
cp_get_msglevel
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
return
cp
->
msg_enable
;
}
static
void
cp_set_msglevel
(
struct
net_device
*
dev
,
u32
value
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
cp
->
msg_enable
=
value
;
}
static
u32
cp_get_rx_csum
(
struct
net_device
*
dev
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
return
(
cpr16
(
CpCmd
)
&
RxChkSum
)
?
1
:
0
;
}
static
int
cp_set_rx_csum
(
struct
net_device
*
dev
,
u32
data
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
u16
cmd
=
cp
->
cpcmd
,
newcmd
;
newcmd
=
cmd
;
...
...
@@ -1404,10 +1418,12 @@ static int cp_set_rx_csum(struct net_device *dev, u32 data)
newcmd
&=
~
RxChkSum
;
if
(
newcmd
!=
cmd
)
{
spin_lock_irq
(
&
cp
->
lock
);
unsigned
long
flags
;
spin_lock_irqsave
(
&
cp
->
lock
,
flags
);
cp
->
cpcmd
=
newcmd
;
cpw16_f
(
CpCmd
,
newcmd
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
}
return
0
;
...
...
@@ -1416,35 +1432,38 @@ static int cp_set_rx_csum(struct net_device *dev, u32 data)
static
void
cp_get_regs
(
struct
net_device
*
dev
,
struct
ethtool_regs
*
regs
,
void
*
p
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
if
(
regs
->
len
<
CP_REGS_SIZE
)
return
/* -EINVAL */
;
regs
->
version
=
CP_REGS_VER
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
memcpy_fromio
(
p
,
cp
->
regs
,
CP_REGS_SIZE
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
}
static
void
cp_get_wol
(
struct
net_device
*
dev
,
struct
ethtool_wolinfo
*
wol
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
netdev_get_wol
(
cp
,
wol
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
}
static
int
cp_set_wol
(
struct
net_device
*
dev
,
struct
ethtool_wolinfo
*
wol
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
);
unsigned
long
flags
;
int
rc
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
rc
=
netdev_set_wol
(
cp
,
wol
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
rc
;
}
...
...
@@ -1464,13 +1483,13 @@ static void cp_get_strings (struct net_device *dev, u32 stringset, u8 *buf)
static
void
cp_get_ethtool_stats
(
struct
net_device
*
dev
,
struct
ethtool_stats
*
estats
,
u64
*
tmp_stats
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
unsigned
int
work
=
100
;
int
i
;
/* begin NIC statistics dump */
cpw32
(
StatsAddr
+
4
,
0
);
/* FIXME: 64-bit PCI */
cpw32
(
StatsAddr
,
cp
->
nic_stats_dma
|
DumpStats
);
cpw32
(
StatsAddr
+
4
,
(
cp
->
nic_stats_dma
>>
16
)
>>
16
);
cpw32
(
StatsAddr
,
(
cp
->
nic_stats_dma
&
0xffffffff
)
|
DumpStats
);
cpr32
(
StatsAddr
);
while
(
work
--
>
0
)
{
...
...
@@ -1526,16 +1545,17 @@ static struct ethtool_ops cp_ethtool_ops = {
static
int
cp_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
rq
,
int
cmd
)
{
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
struct
mii_ioctl_data
*
mii
=
(
struct
mii_ioctl_data
*
)
&
rq
->
ifr_data
;
int
rc
;
unsigned
long
flags
;
if
(
!
netif_running
(
dev
))
return
-
EINVAL
;
spin_lock_irq
(
&
cp
->
lock
);
spin_lock_irq
save
(
&
cp
->
lock
,
flags
);
rc
=
generic_mii_ioctl
(
&
cp
->
mii_if
,
mii
,
cmd
,
NULL
);
spin_unlock_irq
(
&
cp
->
lock
);
spin_unlock_irq
restore
(
&
cp
->
lock
,
flags
);
return
rc
;
}
...
...
@@ -1639,7 +1659,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
SET_MODULE_OWNER
(
dev
);
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
cp
=
dev
->
priv
;
cp
=
netdev_priv
(
dev
)
;
cp
->
pdev
=
pdev
;
cp
->
dev
=
dev
;
cp
->
msg_enable
=
(
debug
<
0
?
CP_DEF_MSG_ENABLE
:
debug
);
...
...
@@ -1664,12 +1684,6 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if
(
rc
)
goto
err_out_mwi
;
if
(
pdev
->
irq
<
2
)
{
rc
=
-
EIO
;
printk
(
KERN_ERR
PFX
"invalid irq (%d) for pci dev %s
\n
"
,
pdev
->
irq
,
pci_name
(
pdev
));
goto
err_out_res
;
}
pciaddr
=
pci_resource_start
(
pdev
,
1
);
if
(
!
pciaddr
)
{
rc
=
-
EIO
;
...
...
@@ -1686,22 +1700,30 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
/* Configure DMA attributes. */
if
((
sizeof
(
dma_addr_t
)
>
32
)
&&
!
pci_set_consistent_dma_mask
(
pdev
,
0xffffffffffffffffULL
)
&&
!
pci_set_dma_mask
(
pdev
,
0xffffffffffffffffULL
))
{
pci_using_dac
=
1
;
}
else
{
pci_using_dac
=
0
;
rc
=
pci_set_dma_mask
(
pdev
,
0xffffffffULL
);
if
(
rc
)
{
printk
(
KERN_ERR
PFX
"No usable DMA configuration, "
"aborting.
\n
"
);
goto
err_out_res
;
}
pci_using_dac
=
0
;
rc
=
pci_set_consistent_dma_mask
(
pdev
,
0xffffffffULL
);
if
(
rc
)
{
printk
(
KERN_ERR
PFX
"No usable consistent DMA configuration, "
"aborting.
\n
"
);
goto
err_out_res
;
}
}
cp
->
cpcmd
=
(
pci_using_dac
?
PCIDAC
:
0
)
|
PCIMulRW
|
RxChkSum
|
CpRxOn
|
CpTxOn
;
regs
=
ioremap
_nocache
(
pciaddr
,
CP_REGS_SIZE
);
regs
=
ioremap
(
pciaddr
,
CP_REGS_SIZE
);
if
(
!
regs
)
{
rc
=
-
EIO
;
printk
(
KERN_ERR
PFX
"Cannot map PCI MMIO (%lx@%lx) on pci dev %s
\n
"
,
...
...
@@ -1742,6 +1764,9 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
dev
->
vlan_rx_kill_vid
=
cp_vlan_rx_kill_vid
;
#endif
if
(
pci_using_dac
)
dev
->
features
|=
NETIF_F_HIGHDMA
;
dev
->
irq
=
pdev
->
irq
;
rc
=
register_netdev
(
dev
);
...
...
@@ -1783,7 +1808,7 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
static
void
cp_remove_one
(
struct
pci_dev
*
pdev
)
{
struct
net_device
*
dev
=
pci_get_drvdata
(
pdev
);
struct
cp_private
*
cp
=
dev
->
priv
;
struct
cp_private
*
cp
=
netdev_priv
(
dev
)
;
if
(
!
dev
)
BUG
();
...
...
@@ -1805,7 +1830,7 @@ static int cp_suspend (struct pci_dev *pdev, u32 state)
unsigned
long
flags
;
dev
=
pci_get_drvdata
(
pdev
);
cp
=
dev
->
priv
;
cp
=
netdev_priv
(
dev
)
;
if
(
!
dev
||
!
netif_running
(
dev
))
return
0
;
...
...
@@ -1834,7 +1859,7 @@ static int cp_resume (struct pci_dev *pdev)
struct
cp_private
*
cp
;
dev
=
pci_get_drvdata
(
pdev
);
cp
=
dev
->
priv
;
cp
=
netdev_priv
(
dev
)
;
netif_device_attach
(
dev
);
...
...
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