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
5ca259f3
Commit
5ca259f3
authored
Apr 26, 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
95065ad3
632b9c99
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
167 additions
and
24 deletions
+167
-24
drivers/net/tg3.c
drivers/net/tg3.c
+132
-24
drivers/net/tg3.h
drivers/net/tg3.h
+35
-0
No files found.
drivers/net/tg3.c
View file @
5ca259f3
...
...
@@ -56,8 +56,8 @@
#define DRV_MODULE_NAME "tg3"
#define PFX DRV_MODULE_NAME ": "
#define DRV_MODULE_VERSION "3.
1
"
#define DRV_MODULE_RELDATE "April
3
, 2004"
#define DRV_MODULE_VERSION "3.
2
"
#define DRV_MODULE_RELDATE "April
26
, 2004"
#define TG3_DEF_MAC_MODE 0
#define TG3_DEF_RX_MODE 0
...
...
@@ -126,6 +126,8 @@
/* minimum number of free TX descriptors required to wake up TX process */
#define TG3_TX_WAKEUP_THRESH (TG3_TX_RING_SIZE / 4)
#define TG3_NUM_STATS 25
/* number of ETHTOOL_GSTATS u64's */
static
char
version
[]
__devinitdata
=
DRV_MODULE_NAME
".c:v"
DRV_MODULE_VERSION
" ("
DRV_MODULE_RELDATE
")
\n
"
;
...
...
@@ -199,6 +201,37 @@ static struct pci_device_id tg3_pci_tbl[] = {
MODULE_DEVICE_TABLE
(
pci
,
tg3_pci_tbl
);
struct
{
char
string
[
ETH_GSTRING_LEN
];
}
ethtool_stats_keys
[
TG3_NUM_STATS
]
=
{
{
"rx_fragments"
},
{
"rx_ucast_packets"
},
{
"rx_bcast_packets"
},
{
"rx_fcs_errors"
},
{
"rx_xon_pause_rcvd"
},
{
"rx_xoff_pause_rcvd"
},
{
"rx_mac_ctrl_rcvd"
},
{
"rx_xoff_entered"
},
{
"rx_frame_too_long_errors"
},
{
"rx_jabbers"
},
{
"rx_undersize_packets"
},
{
"rx_in_length_errors"
},
{
"rx_out_length_errors"
},
{
"tx_xon_sent"
},
{
"tx_xoff_sent"
},
{
"tx_flow_control"
},
{
"tx_mac_errors"
},
{
"tx_single_collisions"
},
{
"tx_mult_collisions"
},
{
"tx_deferred"
},
{
"tx_excessive_collisions"
},
{
"tx_late_collisions"
},
{
"tx_ucast_packets"
},
{
"tx_mcast_packets"
},
{
"tx_bcast_packets"
}
};
static
void
tg3_write_indirect_reg32
(
struct
tg3
*
tp
,
u32
off
,
u32
val
)
{
if
((
tp
->
tg3_flags
&
TG3_FLAG_PCIX_TARGET_HWBUG
)
!=
0
)
{
...
...
@@ -700,14 +733,29 @@ static int tg3_phy_reset(struct tg3 *tp)
tg3_writephy
(
tp
,
0x1c
,
0x8d68
);
tg3_writephy
(
tp
,
0x1c
,
0x8d68
);
}
if
(
tp
->
tg3_flags2
&
TG3_FLG2_PHY_BER_BUG
)
{
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x0c00
);
tg3_writephy
(
tp
,
MII_TG3_DSP_ADDRESS
,
0x000a
);
tg3_writephy
(
tp
,
MII_TG3_DSP_RW_PORT
,
0x310b
);
tg3_writephy
(
tp
,
MII_TG3_DSP_ADDRESS
,
0x201f
);
tg3_writephy
(
tp
,
MII_TG3_DSP_RW_PORT
,
0x9506
);
tg3_writephy
(
tp
,
MII_TG3_DSP_ADDRESS
,
0x401f
);
tg3_writephy
(
tp
,
MII_TG3_DSP_RW_PORT
,
0x14e2
);
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x0400
);
}
/* Set Extended packet length bit (bit 14) on all chips that */
/* support jumbo frames */
if
((
tp
->
phy_id
&
PHY_ID_MASK
)
==
PHY_ID_BCM5401
||
(
tp
->
phy_id
&
PHY_ID_MASK
)
==
PHY_ID_BCM5411
)
{
if
((
tp
->
phy_id
&
PHY_ID_MASK
)
==
PHY_ID_BCM5401
)
{
/* Cannot do read-modify-write on 5401 */
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x4c20
);
}
else
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
!=
ASIC_REV_5705
)
{
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x4400
);
u32
phy_reg
;
/* Set bit 14 with read-modify-write to preserve other bits */
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x0007
);
tg3_readphy
(
tp
,
MII_TG3_AUX_CTRL
,
&
phy_reg
);
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
phy_reg
|
0x4000
);
}
tg3_phy_set_wirespeed
(
tp
);
return
0
;
...
...
@@ -1060,8 +1108,6 @@ static int tg3_phy_copper_begin(struct tg3 *tp)
u32
new_adv
;
int
i
;
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x0400
);
if
(
tp
->
link_config
.
phy_is_low_power
)
{
/* Entering low power mode. Disable gigabit and
* 100baseT advertisements.
...
...
@@ -3910,7 +3956,7 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
#define TG3_TSO_FW_START_ADDR 0x08000000
#define TG3_TSO_FW_TEXT_ADDR 0x08000000
#define TG3_TSO_FW_TEXT_LEN 0x1a90
#define TG3_TSO_FW_RODATA_ADDR 0x08001a90
0
#define TG3_TSO_FW_RODATA_ADDR 0x08001a90
#define TG3_TSO_FW_RODATA_LEN 0x60
#define TG3_TSO_FW_DATA_ADDR 0x08001b20
#define TG3_TSO_FW_DATA_LEN 0x20
...
...
@@ -5574,6 +5620,7 @@ static int tg3_open(struct net_device *dev)
#endif
static
struct
net_device_stats
*
tg3_get_stats
(
struct
net_device
*
);
static
struct
tg3_ethtool_stats
*
tg3_get_estats
(
struct
tg3
*
);
static
int
tg3_close
(
struct
net_device
*
dev
)
{
...
...
@@ -5605,6 +5652,8 @@ static int tg3_close(struct net_device *dev)
memcpy
(
&
tp
->
net_stats_prev
,
tg3_get_stats
(
tp
->
dev
),
sizeof
(
tp
->
net_stats_prev
));
memcpy
(
&
tp
->
estats_prev
,
tg3_get_estats
(
tp
),
sizeof
(
tp
->
estats_prev
));
tg3_free_consistent
(
tp
);
...
...
@@ -5647,6 +5696,49 @@ static unsigned long calc_crc_errors(struct tg3 *tp)
return
get_stat64
(
&
hw_stats
->
rx_fcs_errors
);
}
#define ESTAT_ADD(member) \
estats->member = old_estats->member + \
get_stat64(&hw_stats->member)
static
struct
tg3_ethtool_stats
*
tg3_get_estats
(
struct
tg3
*
tp
)
{
struct
tg3_ethtool_stats
*
estats
=
&
tp
->
estats
;
struct
tg3_ethtool_stats
*
old_estats
=
&
tp
->
estats_prev
;
struct
tg3_hw_stats
*
hw_stats
=
tp
->
hw_stats
;
if
(
!
hw_stats
)
return
old_estats
;
ESTAT_ADD
(
rx_fragments
);
ESTAT_ADD
(
rx_ucast_packets
);
ESTAT_ADD
(
rx_bcast_packets
);
ESTAT_ADD
(
rx_fcs_errors
);
ESTAT_ADD
(
rx_xon_pause_rcvd
);
ESTAT_ADD
(
rx_xoff_pause_rcvd
);
ESTAT_ADD
(
rx_mac_ctrl_rcvd
);
ESTAT_ADD
(
rx_xoff_entered
);
ESTAT_ADD
(
rx_frame_too_long_errors
);
ESTAT_ADD
(
rx_jabbers
);
ESTAT_ADD
(
rx_undersize_packets
);
ESTAT_ADD
(
rx_in_length_errors
);
ESTAT_ADD
(
rx_out_length_errors
);
ESTAT_ADD
(
tx_xon_sent
);
ESTAT_ADD
(
tx_xoff_sent
);
ESTAT_ADD
(
tx_flow_control
);
ESTAT_ADD
(
tx_mac_errors
);
ESTAT_ADD
(
tx_single_collisions
);
ESTAT_ADD
(
tx_mult_collisions
);
ESTAT_ADD
(
tx_deferred
);
ESTAT_ADD
(
tx_excessive_collisions
);
ESTAT_ADD
(
tx_late_collisions
);
ESTAT_ADD
(
tx_ucast_packets
);
ESTAT_ADD
(
tx_mcast_packets
);
ESTAT_ADD
(
tx_bcast_packets
);
return
estats
;
}
static
struct
net_device_stats
*
tg3_get_stats
(
struct
net_device
*
dev
)
{
struct
tg3
*
tp
=
dev
->
priv
;
...
...
@@ -6170,7 +6262,31 @@ static int tg3_set_tx_csum(struct net_device *dev, u32 data)
return
0
;
}
static
int
tg3_get_stats_count
(
struct
net_device
*
dev
)
{
return
TG3_NUM_STATS
;
}
static
void
tg3_get_strings
(
struct
net_device
*
dev
,
u32
stringset
,
u8
*
buf
)
{
switch
(
stringset
)
{
case
ETH_SS_STATS
:
memcpy
(
buf
,
&
ethtool_stats_keys
,
sizeof
(
ethtool_stats_keys
));
break
;
default:
WARN_ON
(
1
);
/* we need a WARN() */
break
;
}
}
static
void
tg3_get_ethtool_stats
(
struct
net_device
*
dev
,
struct
ethtool_stats
*
estats
,
u64
*
tmp_stats
)
{
struct
tg3
*
tp
=
dev
->
priv
;
memcpy
(
tmp_stats
,
&
tp
->
estats
,
sizeof
(
tp
->
estats
));
}
static
int
tg3_ioctl
(
struct
net_device
*
dev
,
struct
ifreq
*
ifr
,
int
cmd
)
{
struct
mii_ioctl_data
*
data
=
(
struct
mii_ioctl_data
*
)
&
ifr
->
ifr_data
;
...
...
@@ -6267,6 +6383,9 @@ static struct ethtool_ops tg3_ethtool_ops = {
.
get_tso
=
ethtool_op_get_tso
,
.
set_tso
=
tg3_set_tso
,
#endif
.
get_strings
=
tg3_get_strings
,
.
get_stats_count
=
tg3_get_stats_count
,
.
get_ethtool_stats
=
tg3_get_ethtool_stats
,
};
/* Chips other than 5700/5701 use the NVRAM for fetching info. */
...
...
@@ -6605,21 +6724,6 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
return
err
;
}
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5703
)
{
tg3_writephy
(
tp
,
MII_TG3_AUX_CTRL
,
0x4c00
);
tg3_writephy
(
tp
,
MII_TG3_DSP_ADDRESS
,
0x201f
);
tg3_writephy
(
tp
,
MII_TG3_DSP_RW_PORT
,
0x2aaa
);
}
if
((
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5704
)
&&
(
tp
->
pci_chip_rev_id
==
CHIPREV_ID_5704_A0
))
{
tg3_writephy
(
tp
,
0x1c
,
0x8d68
);
tg3_writephy
(
tp
,
0x1c
,
0x8d68
);
}
/* Enable Ethernet@WireSpeed */
tg3_phy_set_wirespeed
(
tp
);
if
(
!
err
&&
((
tp
->
phy_id
&
PHY_ID_MASK
)
==
PHY_ID_BCM5401
))
{
err
=
tg3_init_5401phy_dsp
(
tp
);
}
...
...
@@ -6934,6 +7038,10 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
if
(
tp
->
pci_chip_rev_id
==
CHIPREV_ID_5704_A0
)
tp
->
tg3_flags2
|=
TG3_FLG2_PHY_5704_A0_BUG
;
/* Note: 5705 also needs this flag set to improve bit error rate. */
if
(
GET_ASIC_REV
(
tp
->
pci_chip_rev_id
)
==
ASIC_REV_5705
)
tp
->
tg3_flags2
|=
TG3_FLG2_PHY_BER_BUG
;
/* Only 5701 and later support tagged irq status mode.
* Also, 5788 chips cannot use tagged irq status.
*
...
...
drivers/net/tg3.h
View file @
5ca259f3
...
...
@@ -1817,6 +1817,37 @@ struct tg3_bufmgr_config {
u32
dma_high_water
;
};
struct
tg3_ethtool_stats
{
/* Statistics maintained by Receive MAC. */
u64
rx_fragments
;
u64
rx_ucast_packets
;
u64
rx_bcast_packets
;
u64
rx_fcs_errors
;
u64
rx_xon_pause_rcvd
;
u64
rx_xoff_pause_rcvd
;
u64
rx_mac_ctrl_rcvd
;
u64
rx_xoff_entered
;
u64
rx_frame_too_long_errors
;
u64
rx_jabbers
;
u64
rx_undersize_packets
;
u64
rx_in_length_errors
;
u64
rx_out_length_errors
;
/* Statistics maintained by Transmit MAC. */
u64
tx_xon_sent
;
u64
tx_xoff_sent
;
u64
tx_flow_control
;
u64
tx_mac_errors
;
u64
tx_single_collisions
;
u64
tx_mult_collisions
;
u64
tx_deferred
;
u64
tx_excessive_collisions
;
u64
tx_late_collisions
;
u64
tx_ucast_packets
;
u64
tx_mcast_packets
;
u64
tx_bcast_packets
;
};
struct
tg3
{
/* begin "general, frequently-used members" cacheline section */
...
...
@@ -1880,6 +1911,9 @@ struct tg3 {
/* begin "everything else" cacheline(s) section */
struct
net_device_stats
net_stats
;
struct
net_device_stats
net_stats_prev
;
struct
tg3_ethtool_stats
estats
;
struct
tg3_ethtool_stats
estats_prev
;
unsigned
long
phy_crc_errors
;
u32
rx_offset
;
...
...
@@ -1929,6 +1963,7 @@ struct tg3 {
#define TG3_FLG2_TSO_CAPABLE 0x00000020
#define TG3_FLG2_PHY_ADC_BUG 0x00000040
#define TG3_FLG2_PHY_5704_A0_BUG 0x00000080
#define TG3_FLG2_PHY_BER_BUG 0x00000100
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