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
4e58aec8
Commit
4e58aec8
authored
Jul 02, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/tg3-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
9b94975a
87b2b8f5
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
167 additions
and
216 deletions
+167
-216
drivers/net/tg3.c
drivers/net/tg3.c
+120
-214
drivers/net/tg3.h
drivers/net/tg3.h
+47
-2
No files found.
drivers/net/tg3.c
View file @
4e58aec8
/*
* tg3.c: Broadcom Tigon3 ethernet driver.
*
* Copyright (C) 2001, 2002, 2003 David S. Miller (davem@redhat.com)
* Copyright (C) 2001, 2002, 2003
, 2004
David S. Miller (davem@redhat.com)
* Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
* Copyright (C) 2004 Sun Microsystems Inc.
*/
#include <linux/config.h>
...
...
@@ -56,8 +57,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.
6
"
#define DRV_MODULE_RELDATE "Ju
ne 1
2, 2004"
#define DRV_MODULE_VERSION "3.
7
"
#define DRV_MODULE_RELDATE "Ju
ly
2, 2004"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
...
...
@@ -1961,6 +1962,67 @@ static int tg3_fiber_aneg_smachine(struct tg3 *tp,
return
ret
;
}
static
int
fiber_autoneg
(
struct
tg3
*
tp
,
u32
*
flags
)
{
int
res
=
0
;
if
(
tp
->
tg3_flags2
&
TG3_FLG2_HW_AUTONEG
)
{
u32
dig_status
;
dig_status
=
tr32
(
SG_DIG_STATUS
);
*
flags
=
0
;
if
(
dig_status
&
SG_DIG_PARTNER_ASYM_PAUSE
)
*
flags
|=
MR_LP_ADV_ASYM_PAUSE
;
if
(
dig_status
&
SG_DIG_PARTNER_PAUSE_CAPABLE
)
*
flags
|=
MR_LP_ADV_SYM_PAUSE
;
if
((
dig_status
&
SG_DIG_AUTONEG_COMPLETE
)
&&
!
(
dig_status
&
(
SG_DIG_AUTONEG_ERROR
|
SG_DIG_PARTNER_FAULT_MASK
)))
res
=
1
;
}
else
{
struct
tg3_fiber_aneginfo
aninfo
;
int
status
=
ANEG_FAILED
;
unsigned
int
tick
;
u32
tmp
;
tw32_f
(
MAC_TX_AUTO_NEG
,
0
);
tmp
=
tp
->
mac_mode
&
~
MAC_MODE_PORT_MODE_MASK
;
tw32_f
(
MAC_MODE
,
tmp
|
MAC_MODE_PORT_MODE_GMII
);
udelay
(
40
);
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
|
MAC_MODE_SEND_CONFIGS
);
udelay
(
40
);
memset
(
&
aninfo
,
0
,
sizeof
(
aninfo
));
aninfo
.
flags
|=
MR_AN_ENABLE
;
aninfo
.
state
=
ANEG_STATE_UNKNOWN
;
aninfo
.
cur_time
=
0
;
tick
=
0
;
while
(
++
tick
<
195000
)
{
status
=
tg3_fiber_aneg_smachine
(
tp
,
&
aninfo
);
if
(
status
==
ANEG_DONE
||
status
==
ANEG_FAILED
)
break
;
udelay
(
1
);
}
tp
->
mac_mode
&=
~
MAC_MODE_SEND_CONFIGS
;
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
);
udelay
(
40
);
*
flags
=
aninfo
.
flags
;
if
(
status
==
ANEG_DONE
&&
(
aninfo
.
flags
&
(
MR_AN_COMPLETE
|
MR_LINK_OK
|
MR_LP_ADV_FULL_DUPLEX
)))
res
=
1
;
}
return
res
;
}
static
int
tg3_setup_fiber_phy
(
struct
tg3
*
tp
,
int
force_reset
)
{
u32
orig_pause_cfg
;
...
...
@@ -1980,6 +2042,20 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
);
udelay
(
40
);
if
(
tp
->
tg3_flags2
&
TG3_FLG2_HW_AUTONEG
)
{
/* Allow time for the hardware to auto-negotiate (195ms) */
unsigned
int
tick
=
0
;
while
(
++
tick
<
195000
)
{
if
(
tr32
(
SG_DIG_STATUS
)
&
SG_DIG_AUTONEG_COMPLETE
)
break
;
udelay
(
1
);
}
if
(
tick
>=
195000
)
printk
(
KERN_INFO
PFX
"%s: HW autoneg failed !
\n
"
,
tp
->
dev
->
name
);
}
/* Reset when initting first time or we have a link. */
if
(
!
(
tp
->
tg3_flags
&
TG3_FLAG_INIT_COMPLETE
)
||
(
tr32
(
MAC_STATUS
)
&
MAC_STATUS_PCS_SYNCED
))
{
...
...
@@ -2031,53 +2107,18 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
udelay
(
40
);
current_link_up
=
0
;
if
(
tr32
(
MAC_STATUS
)
&
MAC_STATUS_PCS_SYNCED
)
{
if
(
tp
->
link_config
.
autoneg
==
AUTONEG_ENABLE
&&
!
(
tp
->
tg3_flags
&
TG3_FLAG_GOT_SERDES_FLOWCTL
))
{
struct
tg3_fiber_aneginfo
aninfo
;
int
status
=
ANEG_FAILED
;
unsigned
int
tick
;
u32
tmp
;
memset
(
&
aninfo
,
0
,
sizeof
(
aninfo
));
aninfo
.
flags
|=
(
MR_AN_ENABLE
);
tw32
(
MAC_TX_AUTO_NEG
,
0
);
tmp
=
tp
->
mac_mode
&
~
MAC_MODE_PORT_MODE_MASK
;
tw32_f
(
MAC_MODE
,
tmp
|
MAC_MODE_PORT_MODE_GMII
);
udelay
(
40
);
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
|
MAC_MODE_SEND_CONFIGS
);
udelay
(
40
);
aninfo
.
state
=
ANEG_STATE_UNKNOWN
;
aninfo
.
cur_time
=
0
;
tick
=
0
;
while
(
++
tick
<
195000
)
{
status
=
tg3_fiber_aneg_smachine
(
tp
,
&
aninfo
);
if
(
status
==
ANEG_DONE
||
status
==
ANEG_FAILED
)
break
;
udelay
(
1
);
}
tp
->
mac_mode
&=
~
MAC_MODE_SEND_CONFIGS
;
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
);
udelay
(
40
);
if
(
status
==
ANEG_DONE
&&
(
aninfo
.
flags
&
(
MR_AN_COMPLETE
|
MR_LINK_OK
|
MR_LP_ADV_FULL_DUPLEX
)))
{
if
(
tr32
(
MAC_STATUS
)
&
MAC_STATUS_PCS_SYNCED
)
{
if
(
tp
->
link_config
.
autoneg
==
AUTONEG_ENABLE
)
{
u32
flags
;
if
(
fiber_autoneg
(
tp
,
&
flags
))
{
u32
local_adv
,
remote_adv
;
local_adv
=
ADVERTISE_PAUSE_CAP
;
remote_adv
=
0
;
if
(
aninfo
.
flags
&
MR_LP_ADV_SYM_PAUSE
)
remote_adv
|=
LPA_PAUSE_CAP
;
if
(
aninfo
.
flags
&
MR_LP_ADV_ASYM_PAUSE
)
if
(
flags
&
MR_LP_ADV_SYM_PAUSE
)
remote_adv
|=
LPA_PAUSE_CAP
;
if
(
flags
&
MR_LP_ADV_ASYM_PAUSE
)
remote_adv
|=
LPA_PAUSE_ASYM
;
tg3_setup_flow_control
(
tp
,
local_adv
,
remote_adv
);
...
...
@@ -2104,8 +2145,10 @@ static int tg3_setup_fiber_phy(struct tg3 *tp, int force_reset)
}
else
{
/* Forcing 1000FD link up. */
current_link_up
=
1
;
tp
->
tg3_flags
|=
TG3_FLAG_GOT_SERDES_FLOWCTL
;
}
}
}
else
tp
->
tg3_flags
&=
~
TG3_FLAG_GOT_SERDES_FLOWCTL
;
tp
->
mac_mode
&=
~
MAC_MODE_LINK_POLARITY
;
tw32_f
(
MAC_MODE
,
tp
->
mac_mode
);
...
...
@@ -2811,11 +2854,10 @@ static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
u32
base
=
(
u32
)
mapping
&
0xffffffff
;
return
((
base
>
0xffffdcc0
)
&&
((
u64
)
mapping
>>
32
)
==
0
&&
(
base
+
len
+
8
<
base
));
}
static
int
tg3_start_xmit
_4gbug
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
static
int
tg3_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
tg3
*
tp
=
netdev_priv
(
dev
);
dma_addr_t
mapping
;
...
...
@@ -3019,165 +3061,6 @@ static int tg3_start_xmit_4gbug(struct sk_buff *skb, struct net_device *dev)
return
0
;
}
static
int
tg3_start_xmit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
tg3
*
tp
=
netdev_priv
(
dev
);
dma_addr_t
mapping
;
u32
len
,
entry
,
base_flags
,
mss
;
unsigned
long
flags
;
len
=
skb_headlen
(
skb
);
/* No BH disabling for tx_lock here. We are running in BH disabled
* context and TX reclaim runs via tp->poll inside of a software
* interrupt. Rejoice!
*
* Actually, things are not so simple. If we are to take a hw
* IRQ here, we can deadlock, consider:
*
* CPU1 CPU2
* tg3_start_xmit
* take tp->tx_lock
* tg3_timer
* take tp->lock
* tg3_interrupt
* spin on tp->lock
* spin on tp->tx_lock
*
* So we really do need to disable interrupts when taking
* tx_lock here.
*/
spin_lock_irqsave
(
&
tp
->
tx_lock
,
flags
);
/* This is a hard error, log it. */
if
(
unlikely
(
TX_BUFFS_AVAIL
(
tp
)
<=
(
skb_shinfo
(
skb
)
->
nr_frags
+
1
)))
{
netif_stop_queue
(
dev
);
spin_unlock_irqrestore
(
&
tp
->
tx_lock
,
flags
);
printk
(
KERN_ERR
PFX
"%s: BUG! Tx Ring full when queue awake!
\n
"
,
dev
->
name
);
return
1
;
}
entry
=
tp
->
tx_prod
;
base_flags
=
0
;
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
base_flags
|=
TXD_FLAG_TCPUDP_CSUM
;
#if TG3_TSO_SUPPORT != 0
mss
=
0
;
if
(
skb
->
len
>
(
tp
->
dev
->
mtu
+
ETH_HLEN
)
&&
(
mss
=
skb_shinfo
(
skb
)
->
tso_size
)
!=
0
)
{
int
tcp_opt_len
,
ip_tcp_len
;
tcp_opt_len
=
((
skb
->
h
.
th
->
doff
-
5
)
*
4
);
ip_tcp_len
=
(
skb
->
nh
.
iph
->
ihl
*
4
)
+
sizeof
(
struct
tcphdr
);
base_flags
|=
(
TXD_FLAG_CPU_PRE_DMA
|
TXD_FLAG_CPU_POST_DMA
);
skb
->
nh
.
iph
->
check
=
0
;
skb
->
nh
.
iph
->
tot_len
=
ntohs
(
mss
+
ip_tcp_len
+
tcp_opt_len
);
skb
->
h
.
th
->
check
=
~
csum_tcpudp_magic
(
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
0
,
IPPROTO_TCP
,
0
);
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5705
)
{
if
(
tcp_opt_len
||
skb
->
nh
.
iph
->
ihl
>
5
)
{
int
tsflags
;
tsflags
=
((
skb
->
nh
.
iph
->
ihl
-
5
)
+
(
tcp_opt_len
>>
2
));
mss
|=
(
tsflags
<<
11
);
}
}
else
{
if
(
tcp_opt_len
||
skb
->
nh
.
iph
->
ihl
>
5
)
{
int
tsflags
;
tsflags
=
((
skb
->
nh
.
iph
->
ihl
-
5
)
+
(
tcp_opt_len
>>
2
));
base_flags
|=
tsflags
<<
12
;
}
}
}
#else
mss
=
0
;
#endif
#if TG3_VLAN_TAG_USED
if
(
tp
->
vlgrp
!=
NULL
&&
vlan_tx_tag_present
(
skb
))
base_flags
|=
(
TXD_FLAG_VLAN
|
(
vlan_tx_tag_get
(
skb
)
<<
16
));
#endif
/* Queue skb data, a.k.a. the main skb fragment. */
mapping
=
pci_map_single
(
tp
->
pdev
,
skb
->
data
,
len
,
PCI_DMA_TODEVICE
);
tp
->
tx_buffers
[
entry
].
skb
=
skb
;
pci_unmap_addr_set
(
&
tp
->
tx_buffers
[
entry
],
mapping
,
mapping
);
tg3_set_txd
(
tp
,
entry
,
mapping
,
len
,
base_flags
,
(
skb_shinfo
(
skb
)
->
nr_frags
==
0
)
|
(
mss
<<
1
));
entry
=
NEXT_TX
(
entry
);
/* Now loop through additional data fragments, and queue them. */
if
(
skb_shinfo
(
skb
)
->
nr_frags
>
0
)
{
unsigned
int
i
,
last
;
last
=
skb_shinfo
(
skb
)
->
nr_frags
-
1
;
for
(
i
=
0
;
i
<=
last
;
i
++
)
{
skb_frag_t
*
frag
=
&
skb_shinfo
(
skb
)
->
frags
[
i
];
len
=
frag
->
size
;
mapping
=
pci_map_page
(
tp
->
pdev
,
frag
->
page
,
frag
->
page_offset
,
len
,
PCI_DMA_TODEVICE
);
tp
->
tx_buffers
[
entry
].
skb
=
NULL
;
pci_unmap_addr_set
(
&
tp
->
tx_buffers
[
entry
],
mapping
,
mapping
);
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5750
)
tg3_set_txd
(
tp
,
entry
,
mapping
,
len
,
base_flags
,
(
i
==
last
)
|
(
mss
<<
1
));
else
tg3_set_txd
(
tp
,
entry
,
mapping
,
len
,
base_flags
,
(
i
==
last
));
entry
=
NEXT_TX
(
entry
);
}
}
/* Packets are ready, update Tx producer idx local and on card.
* We know this is not a 5700 (by virtue of not being a chip
* requiring the 4GB overflow workaround) so we can safely omit
* the double-write bug tests.
*/
if
(
tp
->
tg3_flags
&
TG3_FLAG_HOST_TXDS
)
{
tw32_tx_mbox
((
MAILBOX_SNDHOST_PROD_IDX_0
+
TG3_64BIT_REG_LOW
),
entry
);
}
else
{
/* First, make sure tg3 sees last descriptor fully
* in SRAM.
*/
if
(
tp
->
tg3_flags
&
TG3_FLAG_MBOX_WRITE_REORDER
)
tr32
(
MAILBOX_SNDNIC_PROD_IDX_0
+
TG3_64BIT_REG_LOW
);
tw32_tx_mbox
((
MAILBOX_SNDNIC_PROD_IDX_0
+
TG3_64BIT_REG_LOW
),
entry
);
}
tp
->
tx_prod
=
entry
;
if
(
TX_BUFFS_AVAIL
(
tp
)
<=
(
MAX_SKB_FRAGS
+
1
))
netif_stop_queue
(
dev
);
spin_unlock_irqrestore
(
&
tp
->
tx_lock
,
flags
);
dev
->
trans_start
=
jiffies
;
return
0
;
}
static
inline
void
tg3_set_mtu
(
struct
net_device
*
dev
,
struct
tg3
*
tp
,
int
new_mtu
)
{
...
...
@@ -5363,6 +5246,26 @@ static int tg3_reset_hw(struct tg3 *tp)
*/
tw32_f
(
MAC_LOW_WMARK_MAX_RX_FRAME
,
2
);
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5704
&&
tp
->
phy_id
==
PHY_ID_SERDES
)
{
/* Enable hardware link auto-negotiation */
u32
digctrl
,
txctrl
;
digctrl
=
SG_DIG_USING_HW_AUTONEG
|
SG_DIG_CRC16_CLEAR_N
|
SG_DIG_LOCAL_DUPLEX_STATUS
|
SG_DIG_LOCAL_LINK_STATUS
|
(
2
<<
SG_DIG_SPEED_STATUS_SHIFT
)
|
SG_DIG_FIBER_MODE
|
SG_DIG_GBIC_ENABLE
;
txctrl
=
tr32
(
MAC_SERDES_CFG
);
tw32_f
(
MAC_SERDES_CFG
,
txctrl
|
MAC_SERDES_CFG_EDGE_SELECT
);
tw32_f
(
SG_DIG_CTRL
,
digctrl
|
SG_DIG_SOFT_RESET
);
tr32
(
SG_DIG_CTRL
);
udelay
(
5
);
tw32_f
(
SG_DIG_CTRL
,
digctrl
);
tp
->
tg3_flags2
|=
TG3_FLG2_HW_AUTONEG
;
}
err
=
tg3_setup_phy
(
tp
,
1
);
if
(
err
)
return
err
;
...
...
@@ -6696,6 +6599,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
case
SIOCGMIIREG
:
{
u32
mii_regval
;
if
(
tp
->
phy_id
==
PHY_ID_SERDES
)
break
;
/* We have no PHY */
spin_lock_irq
(
&
tp
->
lock
);
err
=
tg3_readphy
(
tp
,
data
->
reg_num
&
0x1f
,
&
mii_regval
);
spin_unlock_irq
(
&
tp
->
lock
);
...
...
@@ -6706,6 +6612,9 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
}
case
SIOCSMIIREG
:
if
(
tp
->
phy_id
==
PHY_ID_SERDES
)
break
;
/* We have no PHY */
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
...
...
@@ -7636,13 +7545,10 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
else
tp
->
tg3_flags
&=
~
TG3_FLAG_TXD_MBOX_HWBUG
;
/*
5700 chips can get confused if TX buffers straddle the
* 4GB address boundary in some cases.
/*
It seems all chips can get confused if TX buffers
*
straddle the
4GB address boundary in some cases.
*/
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5700
)
tp
->
dev
->
hard_start_xmit
=
tg3_start_xmit_4gbug
;
else
tp
->
dev
->
hard_start_xmit
=
tg3_start_xmit
;
tp
->
dev
->
hard_start_xmit
=
tg3_start_xmit
;
tp
->
rx_offset
=
2
;
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5701
&&
...
...
drivers/net/tg3.h
View file @
4e58aec8
/* $Id: tg3.h,v 1.37.2.32 2002/03/11 12:18:18 davem Exp $
* tg3.h: Definitions for Broadcom Tigon3 ethernet driver.
*
* Copyright (C) 2001, 2002 David S. Miller (davem@redhat.com)
* Copyright (C) 2001, 2002
, 2003, 2004
David S. Miller (davem@redhat.com)
* Copyright (C) 2001 Jeff Garzik (jgarzik@pobox.com)
* Copyright (C) 2004 Sun Microsystems Inc.
*/
#ifndef _T3_H
...
...
@@ -116,6 +117,7 @@
#define CHIPREV_ID_5704_A0 0x2000
#define CHIPREV_ID_5704_A1 0x2001
#define CHIPREV_ID_5704_A2 0x2002
#define CHIPREV_ID_5704_A3 0x2003
#define CHIPREV_ID_5705_A0 0x3000
#define CHIPREV_ID_5705_A1 0x3001
#define CHIPREV_ID_5705_A2 0x3002
...
...
@@ -518,8 +520,50 @@
#define MAC_EXTADDR_11_HIGH 0x00000588
#define MAC_EXTADDR_11_LOW 0x0000058c
#define MAC_SERDES_CFG 0x00000590
#define MAC_SERDES_CFG_EDGE_SELECT 0x00001000
#define MAC_SERDES_STAT 0x00000594
/* 0x598 --> 0x600 unused */
/* 0x598 --> 0x5b0 unused */
#define SG_DIG_CTRL 0x000005b0
#define SG_DIG_USING_HW_AUTONEG 0x80000000
#define SG_DIG_SOFT_RESET 0x40000000
#define SG_DIG_DISABLE_LINKRDY 0x20000000
#define SG_DIG_CRC16_CLEAR_N 0x01000000
#define SG_DIG_EN10B 0x00800000
#define SG_DIG_CLEAR_STATUS 0x00400000
#define SG_DIG_LOCAL_DUPLEX_STATUS 0x00200000
#define SG_DIG_LOCAL_LINK_STATUS 0x00100000
#define SG_DIG_SPEED_STATUS_MASK 0x000c0000
#define SG_DIG_SPEED_STATUS_SHIFT 18
#define SG_DIG_JUMBO_PACKET_DISABLE 0x00020000
#define SG_DIG_RESTART_AUTONEG 0x00010000
#define SG_DIG_FIBER_MODE 0x00008000
#define SG_DIG_REMOTE_FAULT_MASK 0x00006000
#define SG_DIG_PAUSE_MASK 0x00001800
#define SG_DIG_GBIC_ENABLE 0x00000400
#define SG_DIG_CHECK_END_ENABLE 0x00000200
#define SG_DIG_SGMII_AUTONEG_TIMER 0x00000100
#define SG_DIG_CLOCK_PHASE_SELECT 0x00000080
#define SG_DIG_GMII_INPUT_SELECT 0x00000040
#define SG_DIG_MRADV_CRC16_SELECT 0x00000020
#define SG_DIG_COMMA_DETECT_ENABLE 0x00000010
#define SG_DIG_AUTONEG_TIMER_REDUCE 0x00000008
#define SG_DIG_AUTONEG_LOW_ENABLE 0x00000004
#define SG_DIG_REMOTE_LOOPBACK 0x00000002
#define SG_DIG_LOOPBACK 0x00000001
#define SG_DIG_STATUS 0x000005b4
#define SG_DIG_CRC16_BUS_MASK 0xffff0000
#define SG_DIG_PARTNER_FAULT_MASK 0x00600000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_PARTNER_ASYM_PAUSE 0x00100000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_PARTNER_PAUSE_CAPABLE 0x00080000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_PARTNER_HALF_DUPLEX 0x00040000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_PARTNER_FULL_DUPLEX 0x00020000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_PARTNER_NEXT_PAGE 0x00010000
/* If !MRADV_CRC16_SELECT */
#define SG_DIG_AUTONEG_STATE_MASK 0x00000ff0
#define SG_DIG_COMMA_DETECTOR 0x00000008
#define SG_DIG_MAC_ACK_STATUS 0x00000004
#define SG_DIG_AUTONEG_COMPLETE 0x00000002
#define SG_DIG_AUTONEG_ERROR 0x00000001
/* 0x5b8 --> 0x600 unused */
#define MAC_TX_MAC_STATE_BASE 0x00000600
/* 16 bytes */
#define MAC_RX_MAC_STATE_BASE 0x00000610
/* 20 bytes */
/* 0x624 --> 0x800 unused */
...
...
@@ -2044,6 +2088,7 @@ struct tg3 {
#define TG3_FLG2_PHY_BER_BUG 0x00000100
#define TG3_FLG2_PCI_EXPRESS 0x00000200
#define TG3_FLG2_ASF_NEW_HANDSHAKE 0x00000400
#define TG3_FLG2_HW_AUTONEG 0x00000800
u32
split_mode_max_reqs
;
#define SPLIT_MODE_5704_MAX_REQ 3
...
...
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