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
c0bc8721
Commit
c0bc8721
authored
Jul 05, 2006
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'upstream' of
git://lost.foo-projects.org/~ahkok/git/netdev-2.6
into upstream
Conflicts: drivers/net/e1000/e1000_main.c
parents
bce305f4
e4ac9773
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
2520 additions
and
391 deletions
+2520
-391
drivers/net/e1000/e1000.h
drivers/net/e1000/e1000.h
+8
-2
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_ethtool.c
+85
-56
drivers/net/e1000/e1000_hw.c
drivers/net/e1000/e1000_hw.c
+1657
-115
drivers/net/e1000/e1000_hw.h
drivers/net/e1000/e1000_hw.h
+392
-6
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+265
-113
drivers/net/e1000/e1000_osdep.h
drivers/net/e1000/e1000_osdep.h
+13
-0
drivers/net/e1000/e1000_param.c
drivers/net/e1000/e1000_param.c
+100
-99
No files found.
drivers/net/e1000/e1000.h
View file @
c0bc8721
...
...
@@ -68,7 +68,6 @@
#ifdef NETIF_F_TSO
#include <net/checksum.h>
#endif
#include <linux/workqueue.h>
#include <linux/mii.h>
#include <linux/ethtool.h>
#include <linux/if_vlan.h>
...
...
@@ -143,6 +142,7 @@ struct e1000_adapter;
#define AUTO_ALL_MODES 0
#define E1000_EEPROM_82544_APM 0x0004
#define E1000_EEPROM_ICH8_APME 0x0004
#define E1000_EEPROM_APME 0x0400
#ifndef E1000_MASTER_SLAVE
...
...
@@ -254,7 +254,6 @@ struct e1000_adapter {
spinlock_t
tx_queue_lock
;
#endif
atomic_t
irq_sem
;
struct
work_struct
watchdog_task
;
struct
work_struct
reset_task
;
uint8_t
fc_autoneg
;
...
...
@@ -339,8 +338,14 @@ struct e1000_adapter {
#ifdef NETIF_F_TSO
boolean_t
tso_force
;
#endif
boolean_t
smart_power_down
;
/* phy smart power down */
unsigned
long
flags
;
};
enum
e1000_state_t
{
__E1000_DRIVER_TESTING
,
__E1000_RESETTING
,
};
/* e1000_main.c */
extern
char
e1000_driver_name
[];
...
...
@@ -348,6 +353,7 @@ extern char e1000_driver_version[];
int
e1000_up
(
struct
e1000_adapter
*
adapter
);
void
e1000_down
(
struct
e1000_adapter
*
adapter
);
void
e1000_reset
(
struct
e1000_adapter
*
adapter
);
void
e1000_reinit_locked
(
struct
e1000_adapter
*
adapter
);
int
e1000_setup_all_tx_resources
(
struct
e1000_adapter
*
adapter
);
void
e1000_free_all_tx_resources
(
struct
e1000_adapter
*
adapter
);
int
e1000_setup_all_rx_resources
(
struct
e1000_adapter
*
adapter
);
...
...
drivers/net/e1000/e1000_ethtool.c
View file @
c0bc8721
...
...
@@ -109,7 +109,8 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
SUPPORTED_1000baseT_Full
|
SUPPORTED_Autoneg
|
SUPPORTED_TP
);
if
(
hw
->
phy_type
==
e1000_phy_ife
)
ecmd
->
supported
&=
~
SUPPORTED_1000baseT_Full
;
ecmd
->
advertising
=
ADVERTISED_TP
;
if
(
hw
->
autoneg
==
1
)
{
...
...
@@ -203,11 +204,9 @@ e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
/* reset the link */
if
(
netif_running
(
adapter
->
netdev
))
{
e1000_down
(
adapter
);
e1000_reset
(
adapter
);
e1000_up
(
adapter
);
}
else
if
(
netif_running
(
adapter
->
netdev
))
e1000_reinit_locked
(
adapter
);
else
e1000_reset
(
adapter
);
return
0
;
...
...
@@ -254,10 +253,9 @@ e1000_set_pauseparam(struct net_device *netdev,
hw
->
original_fc
=
hw
->
fc
;
if
(
adapter
->
fc_autoneg
==
AUTONEG_ENABLE
)
{
if
(
netif_running
(
adapter
->
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
else
if
(
netif_running
(
adapter
->
netdev
))
e1000_reinit_locked
(
adapter
);
else
e1000_reset
(
adapter
);
}
else
return
((
hw
->
media_type
==
e1000_media_type_fiber
)
?
...
...
@@ -279,10 +277,9 @@ e1000_set_rx_csum(struct net_device *netdev, uint32_t data)
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
adapter
->
rx_csum
=
data
;
if
(
netif_running
(
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
else
if
(
netif_running
(
netdev
))
e1000_reinit_locked
(
adapter
);
else
e1000_reset
(
adapter
);
return
0
;
}
...
...
@@ -577,6 +574,7 @@ e1000_get_drvinfo(struct net_device *netdev,
case
e1000_82572
:
case
e1000_82573
:
case
e1000_80003es2lan
:
case
e1000_ich8lan
:
sprintf
(
firmware_version
,
"%d.%d-%d"
,
(
eeprom_data
&
0xF000
)
>>
12
,
(
eeprom_data
&
0x0FF0
)
>>
4
,
...
...
@@ -631,6 +629,9 @@ e1000_set_ringparam(struct net_device *netdev,
tx_ring_size
=
sizeof
(
struct
e1000_tx_ring
)
*
adapter
->
num_tx_queues
;
rx_ring_size
=
sizeof
(
struct
e1000_rx_ring
)
*
adapter
->
num_rx_queues
;
while
(
test_and_set_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
))
msleep
(
1
);
if
(
netif_running
(
adapter
->
netdev
))
e1000_down
(
adapter
);
...
...
@@ -691,9 +692,11 @@ e1000_set_ringparam(struct net_device *netdev,
adapter
->
rx_ring
=
rx_new
;
adapter
->
tx_ring
=
tx_new
;
if
((
err
=
e1000_up
(
adapter
)))
return
err
;
goto
err_setup
;
}
clear_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
);
return
0
;
err_setup_tx:
e1000_free_all_rx_resources
(
adapter
);
...
...
@@ -701,6 +704,8 @@ e1000_set_ringparam(struct net_device *netdev,
adapter
->
rx_ring
=
rx_old
;
adapter
->
tx_ring
=
tx_old
;
e1000_up
(
adapter
);
err_setup:
clear_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
);
return
err
;
}
...
...
@@ -754,6 +759,7 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
toggle
=
0x7FFFF3FF
;
break
;
case
e1000_82573
:
case
e1000_ich8lan
:
toggle
=
0x7FFFF033
;
break
;
default:
...
...
@@ -773,11 +779,12 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
}
/* restore previous status */
E1000_WRITE_REG
(
&
adapter
->
hw
,
STATUS
,
before
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
REG_PATTERN_TEST
(
FCAL
,
0xFFFFFFFF
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
FCAH
,
0x0000FFFF
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
FCT
,
0x0000FFFF
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
VET
,
0x0000FFFF
,
0xFFFFFFFF
);
}
REG_PATTERN_TEST
(
RDTR
,
0x0000FFFF
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
RDBAH
,
0xFFFFFFFF
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
RDLEN
,
0x000FFF80
,
0x000FFFFF
);
...
...
@@ -790,20 +797,22 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
REG_PATTERN_TEST
(
TDLEN
,
0x000FFF80
,
0x000FFFFF
);
REG_SET_AND_CHECK
(
RCTL
,
0xFFFFFFFF
,
0x00000000
);
REG_SET_AND_CHECK
(
RCTL
,
0x06DFB3FE
,
0x003FFFFB
);
before
=
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
?
0x06C3B33E
:
0x06DFB3FE
);
REG_SET_AND_CHECK
(
RCTL
,
before
,
0x003FFFFB
);
REG_SET_AND_CHECK
(
TCTL
,
0xFFFFFFFF
,
0x00000000
);
if
(
adapter
->
hw
.
mac_type
>=
e1000_82543
)
{
REG_SET_AND_CHECK
(
RCTL
,
0x06DFB3FE
,
0xFFFFFFFF
);
REG_SET_AND_CHECK
(
RCTL
,
before
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
RDBAL
,
0xFFFFFFF0
,
0xFFFFFFFF
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
REG_PATTERN_TEST
(
TXCW
,
0xC000FFFF
,
0x0000FFFF
);
REG_PATTERN_TEST
(
TDBAL
,
0xFFFFFFF0
,
0xFFFFFFFF
);
REG_PATTERN_TEST
(
TIDV
,
0x0000FFFF
,
0x0000FFFF
);
for
(
i
=
0
;
i
<
E1000_RAR_ENTRIES
;
i
++
)
{
REG_PATTERN_TEST
(
RA
+
((
i
<<
1
)
<<
2
),
0xFFFFFFFF
,
0xFFFFFFFF
);
value
=
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
?
E1000_RAR_ENTRIES_ICH8LAN
:
E1000_RAR_ENTRIES
);
for
(
i
=
0
;
i
<
value
;
i
++
)
{
REG_PATTERN_TEST
(
RA
+
(((
i
<<
1
)
+
1
)
<<
2
),
0x8003FFFF
,
0xFFFFFFFF
);
}
...
...
@@ -817,7 +826,9 @@ e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data)
}
for
(
i
=
0
;
i
<
E1000_MC_TBL_SIZE
;
i
++
)
value
=
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
?
E1000_MC_TBL_SIZE_ICH8LAN
:
E1000_MC_TBL_SIZE
);
for
(
i
=
0
;
i
<
value
;
i
++
)
REG_PATTERN_TEST
(
MTA
+
(
i
<<
2
),
0xFFFFFFFF
,
0xFFFFFFFF
);
*
data
=
0
;
...
...
@@ -889,6 +900,8 @@ e1000_intr_test(struct e1000_adapter *adapter, uint64_t *data)
/* Test each interrupt */
for
(;
i
<
10
;
i
++
)
{
if
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
&&
i
==
8
)
continue
;
/* Interrupt to test */
mask
=
1
<<
i
;
...
...
@@ -1246,8 +1259,22 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
}
else
if
(
adapter
->
hw
.
phy_type
==
e1000_phy_gg82563
)
{
e1000_write_phy_reg
(
&
adapter
->
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
0x1C
E
);
0x1C
C
);
}
ctrl_reg
=
E1000_READ_REG
(
&
adapter
->
hw
,
CTRL
);
if
(
adapter
->
hw
.
phy_type
==
e1000_phy_ife
)
{
/* force 100, set loopback */
e1000_write_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
0x6100
);
/* Now set up the MAC to the same speed/duplex as the PHY. */
ctrl_reg
&=
~
E1000_CTRL_SPD_SEL
;
/* Clear the speed sel bits */
ctrl_reg
|=
(
E1000_CTRL_FRCSPD
|
/* Set the Force Speed Bit */
E1000_CTRL_FRCDPX
|
/* Set the Force Duplex Bit */
E1000_CTRL_SPD_100
|
/* Force Speed to 100 */
E1000_CTRL_FD
);
/* Force Duplex to FULL */
}
else
{
/* force 1000, set loopback */
e1000_write_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
0x4140
);
...
...
@@ -1258,6 +1285,7 @@ e1000_integrated_phy_loopback(struct e1000_adapter *adapter)
E1000_CTRL_FRCDPX
|
/* Set the Force Duplex Bit */
E1000_CTRL_SPD_1000
|
/* Force Speed to 1000 */
E1000_CTRL_FD
);
/* Force Duplex to FULL */
}
if
(
adapter
->
hw
.
media_type
==
e1000_media_type_copper
&&
adapter
->
hw
.
phy_type
==
e1000_phy_m88
)
{
...
...
@@ -1317,6 +1345,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
case
e1000_82572
:
case
e1000_82573
:
case
e1000_80003es2lan
:
case
e1000_ich8lan
:
return
e1000_integrated_phy_loopback
(
adapter
);
break
;
...
...
@@ -1568,6 +1597,7 @@ e1000_diag_test(struct net_device *netdev,
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
boolean_t
if_running
=
netif_running
(
netdev
);
set_bit
(
__E1000_DRIVER_TESTING
,
&
adapter
->
flags
);
if
(
eth_test
->
flags
==
ETH_TEST_FL_OFFLINE
)
{
/* Offline tests */
...
...
@@ -1582,7 +1612,8 @@ e1000_diag_test(struct net_device *netdev,
eth_test
->
flags
|=
ETH_TEST_FL_FAILED
;
if
(
if_running
)
e1000_down
(
adapter
);
/* indicate we're in test mode */
dev_close
(
netdev
);
else
e1000_reset
(
adapter
);
...
...
@@ -1607,8 +1638,9 @@ e1000_diag_test(struct net_device *netdev,
adapter
->
hw
.
autoneg
=
autoneg
;
e1000_reset
(
adapter
);
clear_bit
(
__E1000_DRIVER_TESTING
,
&
adapter
->
flags
);
if
(
if_running
)
e1000_up
(
adapter
);
dev_open
(
netdev
);
}
else
{
/* Online tests */
if
(
e1000_link_test
(
adapter
,
&
data
[
4
]))
...
...
@@ -1619,6 +1651,8 @@ e1000_diag_test(struct net_device *netdev,
data
[
1
]
=
0
;
data
[
2
]
=
0
;
data
[
3
]
=
0
;
clear_bit
(
__E1000_DRIVER_TESTING
,
&
adapter
->
flags
);
}
msleep_interruptible
(
4
*
1000
);
}
...
...
@@ -1778,21 +1812,18 @@ e1000_phys_id(struct net_device *netdev, uint32_t data)
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
msleep_interruptible
(
data
*
1000
);
del_timer_sync
(
&
adapter
->
blink_timer
);
}
else
if
(
adapter
->
hw
.
mac_type
<
e1000_82573
)
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
E1000_LEDCTL_LED0_BLINK
|
E1000_LEDCTL_LED2_BLINK
|
(
E1000_LEDCTL_MODE_LED_ON
<<
E1000_LEDCTL_LED2_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LINK_ACTIVITY
<<
E1000_LEDCTL_LED0_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LED_OFF
<<
E1000_LEDCTL_LED1_MODE_SHIFT
))
);
}
else
if
(
adapter
->
hw
.
phy_type
==
e1000_phy_ife
)
{
if
(
!
adapter
->
blink_timer
.
function
)
{
init_timer
(
&
adapter
->
blink_timer
);
adapter
->
blink_timer
.
function
=
e1000_led_blink_callback
;
adapter
->
blink_timer
.
data
=
(
unsigned
long
)
adapter
;
}
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
msleep_interruptible
(
data
*
1000
);
del_timer_sync
(
&
adapter
->
blink_timer
);
e1000_write_phy_reg
(
&
(
adapter
->
hw
),
IFE_PHY_SPECIAL_CONTROL_LED
,
0
);
}
else
{
E1000_WRITE_REG
(
&
adapter
->
hw
,
LEDCTL
,
(
E1000_LEDCTL_LED2_BLINK_RATE
|
E1000_LEDCTL_LED1_BLINK
|
E1000_LEDCTL_LED2_BLINK
|
(
E1000_LEDCTL_MODE_LED_ON
<<
E1000_LEDCTL_LED2_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LINK_ACTIVITY
<<
E1000_LEDCTL_LED1_MODE_SHIFT
)
|
(
E1000_LEDCTL_MODE_LED_OFF
<<
E1000_LEDCTL_LED0_MODE_SHIFT
)));
e1000_blink_led_start
(
&
adapter
->
hw
);
msleep_interruptible
(
data
*
1000
);
}
...
...
@@ -1807,10 +1838,8 @@ static int
e1000_nway_reset
(
struct
net_device
*
netdev
)
{
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
if
(
netif_running
(
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
if
(
netif_running
(
netdev
))
e1000_reinit_locked
(
adapter
);
return
0
;
}
...
...
drivers/net/e1000/e1000_hw.c
View file @
c0bc8721
...
...
@@ -101,7 +101,8 @@ static void e1000_write_reg_io(struct e1000_hw *hw, uint32_t offset,
#define E1000_WRITE_REG_IO(a, reg, val) \
e1000_write_reg_io((a), E1000_##reg, val)
static
int32_t
e1000_configure_kmrn_for_10_100
(
struct
e1000_hw
*
hw
);
static
int32_t
e1000_configure_kmrn_for_10_100
(
struct
e1000_hw
*
hw
,
uint16_t
duplex
);
static
int32_t
e1000_configure_kmrn_for_1000
(
struct
e1000_hw
*
hw
);
/* IGP cable length table */
...
...
@@ -156,6 +157,14 @@ e1000_set_phy_type(struct e1000_hw *hw)
hw
->
phy_type
=
e1000_phy_igp
;
break
;
}
case
IGP03E1000_E_PHY_ID
:
hw
->
phy_type
=
e1000_phy_igp_3
;
break
;
case
IFE_E_PHY_ID
:
case
IFE_PLUS_E_PHY_ID
:
case
IFE_C_E_PHY_ID
:
hw
->
phy_type
=
e1000_phy_ife
;
break
;
case
GG82563_E_PHY_ID
:
if
(
hw
->
mac_type
==
e1000_80003es2lan
)
{
hw
->
phy_type
=
e1000_phy_gg82563
;
...
...
@@ -332,6 +341,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
break
;
case
E1000_DEV_ID_82541EI
:
case
E1000_DEV_ID_82541EI_MOBILE
:
case
E1000_DEV_ID_82541ER_LOM
:
hw
->
mac_type
=
e1000_82541
;
break
;
case
E1000_DEV_ID_82541ER
:
...
...
@@ -341,6 +351,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
hw
->
mac_type
=
e1000_82541_rev_2
;
break
;
case
E1000_DEV_ID_82547EI
:
case
E1000_DEV_ID_82547EI_MOBILE
:
hw
->
mac_type
=
e1000_82547
;
break
;
case
E1000_DEV_ID_82547GI
:
...
...
@@ -354,6 +365,7 @@ e1000_set_mac_type(struct e1000_hw *hw)
case
E1000_DEV_ID_82572EI_COPPER
:
case
E1000_DEV_ID_82572EI_FIBER
:
case
E1000_DEV_ID_82572EI_SERDES
:
case
E1000_DEV_ID_82572EI
:
hw
->
mac_type
=
e1000_82572
;
break
;
case
E1000_DEV_ID_82573E
:
...
...
@@ -361,16 +373,29 @@ e1000_set_mac_type(struct e1000_hw *hw)
case
E1000_DEV_ID_82573L
:
hw
->
mac_type
=
e1000_82573
;
break
;
case
E1000_DEV_ID_80003ES2LAN_COPPER_SPT
:
case
E1000_DEV_ID_80003ES2LAN_SERDES_SPT
:
case
E1000_DEV_ID_80003ES2LAN_COPPER_DPT
:
case
E1000_DEV_ID_80003ES2LAN_SERDES_DPT
:
hw
->
mac_type
=
e1000_80003es2lan
;
break
;
case
E1000_DEV_ID_ICH8_IGP_M_AMT
:
case
E1000_DEV_ID_ICH8_IGP_AMT
:
case
E1000_DEV_ID_ICH8_IGP_C
:
case
E1000_DEV_ID_ICH8_IFE
:
case
E1000_DEV_ID_ICH8_IGP_M
:
hw
->
mac_type
=
e1000_ich8lan
;
break
;
default:
/* Should never have loaded on this device */
return
-
E1000_ERR_MAC_TYPE
;
}
switch
(
hw
->
mac_type
)
{
case
e1000_ich8lan
:
hw
->
swfwhw_semaphore_present
=
TRUE
;
hw
->
asf_firmware_present
=
TRUE
;
break
;
case
e1000_80003es2lan
:
hw
->
swfw_sync_present
=
TRUE
;
/* fall through */
...
...
@@ -423,6 +448,7 @@ e1000_set_media_type(struct e1000_hw *hw)
case
e1000_82542_rev2_1
:
hw
->
media_type
=
e1000_media_type_fiber
;
break
;
case
e1000_ich8lan
:
case
e1000_82573
:
/* The STATUS_TBIMODE bit is reserved or reused for the this
* device.
...
...
@@ -527,6 +553,14 @@ e1000_reset_hw(struct e1000_hw *hw)
}
while
(
timeout
);
}
/* Workaround for ICH8 bit corruption issue in FIFO memory */
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* Set Tx and Rx buffer allocation to 8k apiece. */
E1000_WRITE_REG
(
hw
,
PBA
,
E1000_PBA_8K
);
/* Set Packet Buffer Size to 16k. */
E1000_WRITE_REG
(
hw
,
PBS
,
E1000_PBS_16K
);
}
/* Issue a global reset to the MAC. This will reset the chip's
* transmit, receive, DMA, and link units. It will not effect
* the current PCI configuration. The global reset bit is self-
...
...
@@ -550,6 +584,20 @@ e1000_reset_hw(struct e1000_hw *hw)
/* Reset is performed on a shadow of the control register */
E1000_WRITE_REG
(
hw
,
CTRL_DUP
,
(
ctrl
|
E1000_CTRL_RST
));
break
;
case
e1000_ich8lan
:
if
(
!
hw
->
phy_reset_disable
&&
e1000_check_phy_reset_block
(
hw
)
==
E1000_SUCCESS
)
{
/* e1000_ich8lan PHY HW reset requires MAC CORE reset
* at the same time to make sure the interface between
* MAC and the external PHY is reset.
*/
ctrl
|=
E1000_CTRL_PHY_RST
;
}
e1000_get_software_flag
(
hw
);
E1000_WRITE_REG
(
hw
,
CTRL
,
(
ctrl
|
E1000_CTRL_RST
));
msec_delay
(
5
);
break
;
default:
E1000_WRITE_REG
(
hw
,
CTRL
,
(
ctrl
|
E1000_CTRL_RST
));
break
;
...
...
@@ -591,6 +639,7 @@ e1000_reset_hw(struct e1000_hw *hw)
/* fall through */
case
e1000_82571
:
case
e1000_82572
:
case
e1000_ich8lan
:
case
e1000_80003es2lan
:
ret_val
=
e1000_get_auto_rd_done
(
hw
);
if
(
ret_val
)
...
...
@@ -633,6 +682,12 @@ e1000_reset_hw(struct e1000_hw *hw)
e1000_pci_set_mwi
(
hw
);
}
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
uint32_t
kab
=
E1000_READ_REG
(
hw
,
KABGTXD
);
kab
|=
E1000_KABGTXD_BGSQLBIAS
;
E1000_WRITE_REG
(
hw
,
KABGTXD
,
kab
);
}
return
E1000_SUCCESS
;
}
...
...
@@ -675,9 +730,12 @@ e1000_init_hw(struct e1000_hw *hw)
/* Disabling VLAN filtering. */
DEBUGOUT
(
"Initializing the IEEE VLAN
\n
"
);
/* VET hardcoded to standard value and VFTA removed in ICH8 LAN */
if
(
hw
->
mac_type
!=
e1000_ich8lan
)
{
if
(
hw
->
mac_type
<
e1000_82545_rev_3
)
E1000_WRITE_REG
(
hw
,
VET
,
0
);
e1000_clear_vfta
(
hw
);
}
/* For 82542 (rev 2.0), disable MWI and put the receiver into reset */
if
(
hw
->
mac_type
==
e1000_82542_rev2_0
)
{
...
...
@@ -705,8 +763,14 @@ e1000_init_hw(struct e1000_hw *hw)
/* Zero out the Multicast HASH table */
DEBUGOUT
(
"Zeroing the MTA
\n
"
);
mta_size
=
E1000_MC_TBL_SIZE
;
for
(
i
=
0
;
i
<
mta_size
;
i
++
)
if
(
hw
->
mac_type
==
e1000_ich8lan
)
mta_size
=
E1000_MC_TBL_SIZE_ICH8LAN
;
for
(
i
=
0
;
i
<
mta_size
;
i
++
)
{
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
/* use write flush to prevent Memory Write Block (MWB) from
* occuring when accessing our register space */
E1000_WRITE_FLUSH
(
hw
);
}
/* Set the PCI priority bit correctly in the CTRL register. This
* determines if the adapter gives priority to receives, or if it
...
...
@@ -744,6 +808,10 @@ e1000_init_hw(struct e1000_hw *hw)
break
;
}
/* More time needed for PHY to initialize */
if
(
hw
->
mac_type
==
e1000_ich8lan
)
msec_delay
(
15
);
/* Call a subroutine to configure the link and setup flow control. */
ret_val
=
e1000_setup_link
(
hw
);
...
...
@@ -757,6 +825,7 @@ e1000_init_hw(struct e1000_hw *hw)
case
e1000_82571
:
case
e1000_82572
:
case
e1000_82573
:
case
e1000_ich8lan
:
case
e1000_80003es2lan
:
ctrl
|=
E1000_TXDCTL_COUNT_DESC
;
break
;
...
...
@@ -795,6 +864,7 @@ e1000_init_hw(struct e1000_hw *hw)
/* Fall through */
case
e1000_82571
:
case
e1000_82572
:
case
e1000_ich8lan
:
ctrl
=
E1000_READ_REG
(
hw
,
TXDCTL1
);
ctrl
=
(
ctrl
&
~
E1000_TXDCTL_WTHRESH
)
|
E1000_TXDCTL_FULL_TX_DESC_WB
;
if
(
hw
->
mac_type
>=
e1000_82571
)
...
...
@@ -818,6 +888,11 @@ e1000_init_hw(struct e1000_hw *hw)
*/
e1000_clear_hw_cntrs
(
hw
);
/* ICH8 No-snoop bits are opposite polarity.
* Set to snoop by default after reset. */
if
(
hw
->
mac_type
==
e1000_ich8lan
)
e1000_set_pci_ex_no_snoop
(
hw
,
PCI_EX_82566_SNOOP_ALL
);
if
(
hw
->
device_id
==
E1000_DEV_ID_82546GB_QUAD_COPPER
||
hw
->
device_id
==
E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3
)
{
ctrl_ext
=
E1000_READ_REG
(
hw
,
CTRL_EXT
);
...
...
@@ -905,6 +980,7 @@ e1000_setup_link(struct e1000_hw *hw)
*/
if
(
hw
->
fc
==
e1000_fc_default
)
{
switch
(
hw
->
mac_type
)
{
case
e1000_ich8lan
:
case
e1000_82573
:
hw
->
fc
=
e1000_fc_full
;
break
;
...
...
@@ -971,9 +1047,12 @@ e1000_setup_link(struct e1000_hw *hw)
*/
DEBUGOUT
(
"Initializing the Flow Control address, type and timer regs
\n
"
);
E1000_WRITE_REG
(
hw
,
FCAL
,
FLOW_CONTROL_ADDRESS_LOW
);
E1000_WRITE_REG
(
hw
,
FCAH
,
FLOW_CONTROL_ADDRESS_HIGH
);
/* FCAL/H and FCT are hardcoded to standard values in e1000_ich8lan. */
if
(
hw
->
mac_type
!=
e1000_ich8lan
)
{
E1000_WRITE_REG
(
hw
,
FCT
,
FLOW_CONTROL_TYPE
);
E1000_WRITE_REG
(
hw
,
FCAH
,
FLOW_CONTROL_ADDRESS_HIGH
);
E1000_WRITE_REG
(
hw
,
FCAL
,
FLOW_CONTROL_ADDRESS_LOW
);
}
E1000_WRITE_REG
(
hw
,
FCTTV
,
hw
->
fc_pause_time
);
...
...
@@ -1237,12 +1316,13 @@ e1000_copper_link_igp_setup(struct e1000_hw *hw)
/* Wait 10ms for MAC to configure PHY from eeprom settings */
msec_delay
(
15
);
if
(
hw
->
mac_type
!=
e1000_ich8lan
)
{
/* Configure activity LED after PHY reset */
led_ctrl
=
E1000_READ_REG
(
hw
,
LEDCTL
);
led_ctrl
&=
IGP_ACTIVITY_LED_MASK
;
led_ctrl
|=
(
IGP_ACTIVITY_LED_ENABLE
|
IGP_LED3_MODE
);
E1000_WRITE_REG
(
hw
,
LEDCTL
,
led_ctrl
);
}
/* disable lplu d3 during driver init */
ret_val
=
e1000_set_d3_lplu_state
(
hw
,
FALSE
);
...
...
@@ -1478,8 +1558,7 @@ e1000_copper_link_ggp_setup(struct e1000_hw *hw)
if
(
ret_val
)
return
ret_val
;
/* Enable Pass False Carrier on the PHY */
phy_data
|=
GG82563_KMCR_PASS_FALSE_CARRIER
;
phy_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
ret_val
=
e1000_write_phy_reg
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
phy_data
);
...
...
@@ -1562,28 +1641,40 @@ e1000_copper_link_mgp_setup(struct e1000_hw *hw)
if
(
hw
->
disable_polarity_correction
==
1
)
phy_data
|=
M88E1000_PSCR_POLARITY_REVERSAL
;
ret_val
=
e1000_write_phy_reg
(
hw
,
M88E1000_PHY_SPEC_CTRL
,
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
if
(
hw
->
phy_revision
<
M88E1011_I_REV_4
)
{
/* Force TX_CLK in the Extended PHY Specific Control Register
* to 25MHz clock.
*/
ret_val
=
e1000_read_phy_reg
(
hw
,
M88E1000_EXT_PHY_SPEC_CTRL
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
phy_data
|=
M88E1000_EPSCR_TX_CLK_25
;
if
(
hw
->
phy_revision
<
M88E1011_I_REV_4
)
{
if
((
hw
->
phy_revision
==
E1000_REVISION_2
)
&&
(
hw
->
phy_id
==
M88E1111_I_PHY_ID
))
{
/* Vidalia Phy, set the downshift counter to 5x */
phy_data
&=
~
(
M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK
);
phy_data
|=
M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X
;
ret_val
=
e1000_write_phy_reg
(
hw
,
M88E1000_EXT_PHY_SPEC_CTRL
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
else
{
/* Configure Master and Slave downshift values */
phy_data
&=
~
(
M88E1000_EPSCR_MASTER_DOWNSHIFT_MASK
|
M88E1000_EPSCR_SLAVE_DOWNSHIFT_MASK
);
phy_data
|=
(
M88E1000_EPSCR_MASTER_DOWNSHIFT_1X
|
M88E1000_EPSCR_SLAVE_DOWNSHIFT_1X
);
ret_val
=
e1000_write_phy_reg
(
hw
,
M88E1000_EXT_PHY_SPEC_CTRL
,
phy_data
);
if
(
ret_val
)
ret_val
=
e1000_write_phy_reg
(
hw
,
M88E1000_EXT_PHY_SPEC_CTRL
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
}
/* SW Reset the PHY so all changes take effect */
ret_val
=
e1000_phy_reset
(
hw
);
...
...
@@ -1620,6 +1711,10 @@ e1000_copper_link_autoneg(struct e1000_hw *hw)
if
(
hw
->
autoneg_advertised
==
0
)
hw
->
autoneg_advertised
=
AUTONEG_ADVERTISE_SPEED_DEFAULT
;
/* IFE phy only supports 10/100 */
if
(
hw
->
phy_type
==
e1000_phy_ife
)
hw
->
autoneg_advertised
&=
AUTONEG_ADVERTISE_10_100_ALL
;
DEBUGOUT
(
"Reconfiguring auto-neg advertisement params
\n
"
);
ret_val
=
e1000_phy_setup_autoneg
(
hw
);
if
(
ret_val
)
{
...
...
@@ -1717,6 +1812,26 @@ e1000_setup_copper_link(struct e1000_hw *hw)
DEBUGFUNC
(
"e1000_setup_copper_link"
);
switch
(
hw
->
mac_type
)
{
case
e1000_80003es2lan
:
case
e1000_ich8lan
:
/* Set the mac to wait the maximum time between each
* iteration and increase the max iterations when
* polling the phy; this fixes erroneous timeouts at 10Mbps. */
ret_val
=
e1000_write_kmrn_reg
(
hw
,
GG82563_REG
(
0x34
,
4
),
0xFFFF
);
if
(
ret_val
)
return
ret_val
;
ret_val
=
e1000_read_kmrn_reg
(
hw
,
GG82563_REG
(
0x34
,
9
),
&
reg_data
);
if
(
ret_val
)
return
ret_val
;
reg_data
|=
0x3F
;
ret_val
=
e1000_write_kmrn_reg
(
hw
,
GG82563_REG
(
0x34
,
9
),
reg_data
);
if
(
ret_val
)
return
ret_val
;
default:
break
;
}
/* Check if it is a valid PHY and set PHY mode if necessary. */
ret_val
=
e1000_copper_link_preconfig
(
hw
);
if
(
ret_val
)
...
...
@@ -1724,10 +1839,8 @@ e1000_setup_copper_link(struct e1000_hw *hw)
switch
(
hw
->
mac_type
)
{
case
e1000_80003es2lan
:
ret_val
=
e1000_read_kmrn_reg
(
hw
,
E1000_KUMCTRLSTA_OFFSET_INB_CTRL
,
&
reg_data
);
if
(
ret_val
)
return
ret_val
;
/* Kumeran registers are written-only */
reg_data
=
E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT
;
reg_data
|=
E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING
;
ret_val
=
e1000_write_kmrn_reg
(
hw
,
E1000_KUMCTRLSTA_OFFSET_INB_CTRL
,
reg_data
);
...
...
@@ -1739,6 +1852,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
}
if
(
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
{
ret_val
=
e1000_copper_link_igp_setup
(
hw
);
if
(
ret_val
)
...
...
@@ -1803,7 +1917,7 @@ e1000_setup_copper_link(struct e1000_hw *hw)
* hw - Struct containing variables accessed by shared code
******************************************************************************/
static
int32_t
e1000_configure_kmrn_for_10_100
(
struct
e1000_hw
*
hw
)
e1000_configure_kmrn_for_10_100
(
struct
e1000_hw
*
hw
,
uint16_t
duplex
)
{
int32_t
ret_val
=
E1000_SUCCESS
;
uint32_t
tipg
;
...
...
@@ -1823,6 +1937,18 @@ e1000_configure_kmrn_for_10_100(struct e1000_hw *hw)
tipg
|=
DEFAULT_80003ES2LAN_TIPG_IPGT_10_100
;
E1000_WRITE_REG
(
hw
,
TIPG
,
tipg
);
ret_val
=
e1000_read_phy_reg
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
&
reg_data
);
if
(
ret_val
)
return
ret_val
;
if
(
duplex
==
HALF_DUPLEX
)
reg_data
|=
GG82563_KMCR_PASS_FALSE_CARRIER
;
else
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
ret_val
=
e1000_write_phy_reg
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
);
return
ret_val
;
}
...
...
@@ -1847,6 +1973,14 @@ e1000_configure_kmrn_for_1000(struct e1000_hw *hw)
tipg
|=
DEFAULT_80003ES2LAN_TIPG_IPGT_1000
;
E1000_WRITE_REG
(
hw
,
TIPG
,
tipg
);
ret_val
=
e1000_read_phy_reg
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
&
reg_data
);
if
(
ret_val
)
return
ret_val
;
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
ret_val
=
e1000_write_phy_reg
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
);
return
ret_val
;
}
...
...
@@ -1869,10 +2003,13 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
if
(
ret_val
)
return
ret_val
;
if
(
hw
->
phy_type
!=
e1000_phy_ife
)
{
/* Read the MII 1000Base-T Control Register (Address 9). */
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_1000T_CTRL
,
&
mii_1000t_ctrl_reg
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
}
else
mii_1000t_ctrl_reg
=
0
;
/* Need to parse both autoneg_advertised and fc and set up
* the appropriate PHY registers. First we will parse for
...
...
@@ -1923,6 +2060,9 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
if
(
hw
->
autoneg_advertised
&
ADVERTISE_1000_FULL
)
{
DEBUGOUT
(
"Advertise 1000mb Full duplex
\n
"
);
mii_1000t_ctrl_reg
|=
CR_1000T_FD_CAPS
;
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
DEBUGOUT
(
"e1000_phy_ife is a 10/100 PHY. Gigabit speed is not supported.
\n
"
);
}
}
/* Check for a software override of the flow control settings, and
...
...
@@ -1984,9 +2124,11 @@ e1000_phy_setup_autoneg(struct e1000_hw *hw)
DEBUGOUT1
(
"Auto-Neg Advertising %x
\n
"
,
mii_autoneg_adv_reg
);
if
(
hw
->
phy_type
!=
e1000_phy_ife
)
{
ret_val
=
e1000_write_phy_reg
(
hw
,
PHY_1000T_CTRL
,
mii_1000t_ctrl_reg
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
}
return
E1000_SUCCESS
;
}
...
...
@@ -2089,6 +2231,18 @@ e1000_phy_force_speed_duplex(struct e1000_hw *hw)
/* Need to reset the PHY or these changes will be ignored */
mii_ctrl_reg
|=
MII_CR_RESET
;
/* Disable MDI-X support for 10/100 */
}
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_data
&=
~
IFE_PMC_AUTO_MDIX
;
phy_data
&=
~
IFE_PMC_FORCE_MDIX
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IFE_PHY_MDIX_CONTROL
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
else
{
/* Clear Auto-Crossover to force MDI manually. IGP requires MDI
* forced whenever speed or duplex are forced.
...
...
@@ -2721,8 +2875,12 @@ e1000_check_for_link(struct e1000_hw *hw)
*/
if
(
hw
->
tbi_compatibility_en
)
{
uint16_t
speed
,
duplex
;
e1000_get_speed_and_duplex
(
hw
,
&
speed
,
&
duplex
);
if
(
speed
!=
SPEED_1000
)
{
ret_val
=
e1000_get_speed_and_duplex
(
hw
,
&
speed
,
&
duplex
);
if
(
ret_val
)
{
DEBUGOUT
(
"Error getting link speed and duplex
\n
"
);
return
ret_val
;
}
if
(
speed
!=
SPEED_1000
)
{
/* If link speed is not set to gigabit speed, we do not need
* to enable TBI compatibility.
*/
...
...
@@ -2889,7 +3047,13 @@ e1000_get_speed_and_duplex(struct e1000_hw *hw,
if
(
*
speed
==
SPEED_1000
)
ret_val
=
e1000_configure_kmrn_for_1000
(
hw
);
else
ret_val
=
e1000_configure_kmrn_for_10_100
(
hw
);
ret_val
=
e1000_configure_kmrn_for_10_100
(
hw
,
*
duplex
);
if
(
ret_val
)
return
ret_val
;
}
if
((
hw
->
phy_type
==
e1000_phy_igp_3
)
&&
(
*
speed
==
SPEED_1000
))
{
ret_val
=
e1000_kumeran_lock_loss_workaround
(
hw
);
if
(
ret_val
)
return
ret_val
;
}
...
...
@@ -3079,6 +3243,9 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)
DEBUGFUNC
(
"e1000_swfw_sync_acquire"
);
if
(
hw
->
swfwhw_semaphore_present
)
return
e1000_get_software_flag
(
hw
);
if
(
!
hw
->
swfw_sync_present
)
return
e1000_get_hw_eeprom_semaphore
(
hw
);
...
...
@@ -3118,6 +3285,11 @@ e1000_swfw_sync_release(struct e1000_hw *hw, uint16_t mask)
DEBUGFUNC
(
"e1000_swfw_sync_release"
);
if
(
hw
->
swfwhw_semaphore_present
)
{
e1000_release_software_flag
(
hw
);
return
;
}
if
(
!
hw
->
swfw_sync_present
)
{
e1000_put_hw_eeprom_semaphore
(
hw
);
return
;
...
...
@@ -3160,7 +3332,8 @@ e1000_read_phy_reg(struct e1000_hw *hw,
if
(
e1000_swfw_sync_acquire
(
hw
,
swfw
))
return
-
E1000_ERR_SWFW_SYNC
;
if
((
hw
->
phy_type
==
e1000_phy_igp
||
if
((
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
&&
(
reg_addr
>
MAX_PHY_MULTI_PAGE_REG
))
{
ret_val
=
e1000_write_phy_reg_ex
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
...
...
@@ -3299,7 +3472,8 @@ e1000_write_phy_reg(struct e1000_hw *hw,
if
(
e1000_swfw_sync_acquire
(
hw
,
swfw
))
return
-
E1000_ERR_SWFW_SYNC
;
if
((
hw
->
phy_type
==
e1000_phy_igp
||
if
((
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
&&
(
reg_addr
>
MAX_PHY_MULTI_PAGE_REG
))
{
ret_val
=
e1000_write_phy_reg_ex
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
...
...
@@ -3514,7 +3688,7 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
E1000_WRITE_FLUSH
(
hw
);
if
(
hw
->
mac_type
>=
e1000_82571
)
msec_delay
(
10
);
msec_delay
_irq
(
10
);
e1000_swfw_sync_release
(
hw
,
swfw
);
}
else
{
/* Read the Extended Device Control Register, assert the PHY_RESET_DIR
...
...
@@ -3544,6 +3718,12 @@ e1000_phy_hw_reset(struct e1000_hw *hw)
ret_val
=
e1000_get_phy_cfg_done
(
hw
);
e1000_release_software_semaphore
(
hw
);
if
((
hw
->
mac_type
==
e1000_ich8lan
)
&&
(
hw
->
phy_type
==
e1000_phy_igp_3
))
{
ret_val
=
e1000_init_lcd_from_nvm
(
hw
);
if
(
ret_val
)
return
ret_val
;
}
return
ret_val
;
}
...
...
@@ -3572,9 +3752,11 @@ e1000_phy_reset(struct e1000_hw *hw)
case
e1000_82541_rev_2
:
case
e1000_82571
:
case
e1000_82572
:
case
e1000_ich8lan
:
ret_val
=
e1000_phy_hw_reset
(
hw
);
if
(
ret_val
)
return
ret_val
;
break
;
default:
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_CTRL
,
&
phy_data
);
...
...
@@ -3596,12 +3778,121 @@ e1000_phy_reset(struct e1000_hw *hw)
return
E1000_SUCCESS
;
}
/******************************************************************************
* Work-around for 82566 power-down: on D3 entry-
* 1) disable gigabit link
* 2) write VR power-down enable
* 3) read it back
* if successful continue, else issue LCD reset and repeat
*
* hw - struct containing variables accessed by shared code
******************************************************************************/
void
e1000_phy_powerdown_workaround
(
struct
e1000_hw
*
hw
)
{
int32_t
reg
;
uint16_t
phy_data
;
int32_t
retry
=
0
;
DEBUGFUNC
(
"e1000_phy_powerdown_workaround"
);
if
(
hw
->
phy_type
!=
e1000_phy_igp_3
)
return
;
do
{
/* Disable link */
reg
=
E1000_READ_REG
(
hw
,
PHY_CTRL
);
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
reg
|
E1000_PHY_CTRL_GBE_DISABLE
|
E1000_PHY_CTRL_NOND0A_GBE_DISABLE
);
/* Write VR power-down enable */
e1000_read_phy_reg
(
hw
,
IGP3_VR_CTRL
,
&
phy_data
);
e1000_write_phy_reg
(
hw
,
IGP3_VR_CTRL
,
phy_data
|
IGP3_VR_CTRL_MODE_SHUT
);
/* Read it back and test */
e1000_read_phy_reg
(
hw
,
IGP3_VR_CTRL
,
&
phy_data
);
if
((
phy_data
&
IGP3_VR_CTRL_MODE_SHUT
)
||
retry
)
break
;
/* Issue PHY reset and repeat at most one more time */
reg
=
E1000_READ_REG
(
hw
,
CTRL
);
E1000_WRITE_REG
(
hw
,
CTRL
,
reg
|
E1000_CTRL_PHY_RST
);
retry
++
;
}
while
(
retry
);
return
;
}
/******************************************************************************
* Work-around for 82566 Kumeran PCS lock loss:
* On link status change (i.e. PCI reset, speed change) and link is up and
* speed is gigabit-
* 0) if workaround is optionally disabled do nothing
* 1) wait 1ms for Kumeran link to come up
* 2) check Kumeran Diagnostic register PCS lock loss bit
* 3) if not set the link is locked (all is good), otherwise...
* 4) reset the PHY
* 5) repeat up to 10 times
* Note: this is only called for IGP3 copper when speed is 1gb.
*
* hw - struct containing variables accessed by shared code
******************************************************************************/
int32_t
e1000_kumeran_lock_loss_workaround
(
struct
e1000_hw
*
hw
)
{
int32_t
ret_val
;
int32_t
reg
;
int32_t
cnt
;
uint16_t
phy_data
;
if
(
hw
->
kmrn_lock_loss_workaround_disabled
)
return
E1000_SUCCESS
;
/* Make sure link is up before proceeding. If not just return.
* Attempting this while link is negotiating fouls up link
* stability */
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_STATUS
,
&
phy_data
);
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_STATUS
,
&
phy_data
);
if
(
phy_data
&
MII_SR_LINK_STATUS
)
{
for
(
cnt
=
0
;
cnt
<
10
;
cnt
++
)
{
/* read once to clear */
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP3_KMRN_DIAG
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
/* and again to get new status */
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP3_KMRN_DIAG
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
/* check for PCS lock */
if
(
!
(
phy_data
&
IGP3_KMRN_DIAG_PCS_LOCK_LOSS
))
return
E1000_SUCCESS
;
/* Issue PHY reset */
e1000_phy_hw_reset
(
hw
);
msec_delay_irq
(
5
);
}
/* Disable GigE link negotiation */
reg
=
E1000_READ_REG
(
hw
,
PHY_CTRL
);
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
reg
|
E1000_PHY_CTRL_GBE_DISABLE
|
E1000_PHY_CTRL_NOND0A_GBE_DISABLE
);
/* unable to acquire PCS lock */
return
E1000_ERR_PHY
;
}
return
E1000_SUCCESS
;
}
/******************************************************************************
* Probes the expected PHY address for known PHY IDs
*
* hw - Struct containing variables accessed by shared code
******************************************************************************/
static
int32_t
int32_t
e1000_detect_gig_phy
(
struct
e1000_hw
*
hw
)
{
int32_t
phy_init_status
,
ret_val
;
...
...
@@ -3613,7 +3904,7 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
/* The 82571 firmware may still be configuring the PHY. In this
* case, we cannot access the PHY until the configuration is done. So
* we explicitly set the PHY values. */
if
(
hw
->
mac_type
==
e1000_82571
||
if
(
hw
->
mac_type
==
e1000_82571
||
hw
->
mac_type
==
e1000_82572
)
{
hw
->
phy_id
=
IGP01E1000_I_PHY_ID
;
hw
->
phy_type
=
e1000_phy_igp_2
;
...
...
@@ -3631,7 +3922,7 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
/* Read the PHY ID Registers to identify which PHY is onboard. */
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_ID1
,
&
phy_id_high
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
hw
->
phy_id
=
(
uint32_t
)
(
phy_id_high
<<
16
);
...
...
@@ -3669,6 +3960,12 @@ e1000_detect_gig_phy(struct e1000_hw *hw)
case
e1000_80003es2lan
:
if
(
hw
->
phy_id
==
GG82563_E_PHY_ID
)
match
=
TRUE
;
break
;
case
e1000_ich8lan
:
if
(
hw
->
phy_id
==
IGP03E1000_E_PHY_ID
)
match
=
TRUE
;
if
(
hw
->
phy_id
==
IFE_E_PHY_ID
)
match
=
TRUE
;
if
(
hw
->
phy_id
==
IFE_PLUS_E_PHY_ID
)
match
=
TRUE
;
if
(
hw
->
phy_id
==
IFE_C_E_PHY_ID
)
match
=
TRUE
;
break
;
default:
DEBUGOUT1
(
"Invalid MAC type %d
\n
"
,
hw
->
mac_type
);
return
-
E1000_ERR_CONFIG
;
...
...
@@ -3783,6 +4080,53 @@ e1000_phy_igp_get_info(struct e1000_hw *hw,
return
E1000_SUCCESS
;
}
/******************************************************************************
* Get PHY information from various PHY registers for ife PHY only.
*
* hw - Struct containing variables accessed by shared code
* phy_info - PHY information structure
******************************************************************************/
int32_t
e1000_phy_ife_get_info
(
struct
e1000_hw
*
hw
,
struct
e1000_phy_info
*
phy_info
)
{
int32_t
ret_val
;
uint16_t
phy_data
,
polarity
;
DEBUGFUNC
(
"e1000_phy_ife_get_info"
);
phy_info
->
downshift
=
(
e1000_downshift
)
hw
->
speed_downgraded
;
phy_info
->
extended_10bt_distance
=
e1000_10bt_ext_dist_enable_normal
;
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_info
->
polarity_correction
=
(
phy_data
&
IFE_PSC_AUTO_POLARITY_DISABLE
)
>>
IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT
;
if
(
phy_info
->
polarity_correction
==
e1000_polarity_reversal_enabled
)
{
ret_val
=
e1000_check_polarity
(
hw
,
&
polarity
);
if
(
ret_val
)
return
ret_val
;
}
else
{
/* Polarity is forced. */
polarity
=
(
phy_data
&
IFE_PSC_FORCE_POLARITY
)
>>
IFE_PSC_FORCE_POLARITY_SHIFT
;
}
phy_info
->
cable_polarity
=
polarity
;
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_info
->
mdix_mode
=
(
phy_data
&
(
IFE_PMC_AUTO_MDIX
|
IFE_PMC_FORCE_MDIX
))
>>
IFE_PMC_MDIX_MODE_SHIFT
;
return
E1000_SUCCESS
;
}
/******************************************************************************
* Get PHY information from various PHY registers fot m88 PHY only.
*
...
...
@@ -3898,9 +4242,12 @@ e1000_phy_get_info(struct e1000_hw *hw,
return
-
E1000_ERR_CONFIG
;
}
if
(
hw
->
phy_type
==
e1000_phy_igp
||
if
(
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
return
e1000_phy_igp_get_info
(
hw
,
phy_info
);
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
return
e1000_phy_ife_get_info
(
hw
,
phy_info
);
else
return
e1000_phy_m88_get_info
(
hw
,
phy_info
);
}
...
...
@@ -4049,6 +4396,35 @@ e1000_init_eeprom_params(struct e1000_hw *hw)
eeprom
->
use_eerd
=
TRUE
;
eeprom
->
use_eewr
=
FALSE
;
break
;
case
e1000_ich8lan
:
{
int32_t
i
=
0
;
uint32_t
flash_size
=
E1000_READ_ICH8_REG
(
hw
,
ICH8_FLASH_GFPREG
);
eeprom
->
type
=
e1000_eeprom_ich8
;
eeprom
->
use_eerd
=
FALSE
;
eeprom
->
use_eewr
=
FALSE
;
eeprom
->
word_size
=
E1000_SHADOW_RAM_WORDS
;
/* Zero the shadow RAM structure. But don't load it from NVM
* so as to save time for driver init */
if
(
hw
->
eeprom_shadow_ram
!=
NULL
)
{
for
(
i
=
0
;
i
<
E1000_SHADOW_RAM_WORDS
;
i
++
)
{
hw
->
eeprom_shadow_ram
[
i
].
modified
=
FALSE
;
hw
->
eeprom_shadow_ram
[
i
].
eeprom_word
=
0xFFFF
;
}
}
hw
->
flash_base_addr
=
(
flash_size
&
ICH8_GFPREG_BASE_MASK
)
*
ICH8_FLASH_SECTOR_SIZE
;
hw
->
flash_bank_size
=
((
flash_size
>>
16
)
&
ICH8_GFPREG_BASE_MASK
)
+
1
;
hw
->
flash_bank_size
-=
(
flash_size
&
ICH8_GFPREG_BASE_MASK
);
hw
->
flash_bank_size
*=
ICH8_FLASH_SECTOR_SIZE
;
hw
->
flash_bank_size
/=
2
*
sizeof
(
uint16_t
);
break
;
}
default:
break
;
}
...
...
@@ -4469,7 +4845,10 @@ e1000_read_eeprom(struct e1000_hw *hw,
return
ret_val
;
}
if
(
eeprom
->
type
==
e1000_eeprom_spi
)
{
if
(
eeprom
->
type
==
e1000_eeprom_ich8
)
return
e1000_read_eeprom_ich8
(
hw
,
offset
,
words
,
data
);
if
(
eeprom
->
type
==
e1000_eeprom_spi
)
{
uint16_t
word_in
;
uint8_t
read_opcode
=
EEPROM_READ_OPCODE_SPI
;
...
...
@@ -4636,7 +5015,10 @@ e1000_is_onboard_nvm_eeprom(struct e1000_hw *hw)
DEBUGFUNC
(
"e1000_is_onboard_nvm_eeprom"
);
if
(
hw
->
mac_type
==
e1000_82573
)
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
return
FALSE
;
if
(
hw
->
mac_type
==
e1000_82573
)
{
eecd
=
E1000_READ_REG
(
hw
,
EECD
);
/* Isolate bits 15 & 16 */
...
...
@@ -4686,8 +5068,22 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw)
}
}
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
{
if
(
e1000_read_eeprom
(
hw
,
i
,
1
,
&
eeprom_data
)
<
0
)
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* Drivers must allocate the shadow ram structure for the
* EEPROM checksum to be updated. Otherwise, this bit as well
* as the checksum must both be set correctly for this
* validation to pass.
*/
e1000_read_eeprom
(
hw
,
0x19
,
1
,
&
eeprom_data
);
if
((
eeprom_data
&
0x40
)
==
0
)
{
eeprom_data
|=
0x40
;
e1000_write_eeprom
(
hw
,
0x19
,
1
,
&
eeprom_data
);
e1000_update_eeprom_checksum
(
hw
);
}
}
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
{
if
(
e1000_read_eeprom
(
hw
,
i
,
1
,
&
eeprom_data
)
<
0
)
{
DEBUGOUT
(
"EEPROM Read Error
\n
"
);
return
-
E1000_ERR_EEPROM
;
}
...
...
@@ -4713,6 +5109,7 @@ e1000_validate_eeprom_checksum(struct e1000_hw *hw)
int32_t
e1000_update_eeprom_checksum
(
struct
e1000_hw
*
hw
)
{
uint32_t
ctrl_ext
;
uint16_t
checksum
=
0
;
uint16_t
i
,
eeprom_data
;
...
...
@@ -4731,6 +5128,14 @@ e1000_update_eeprom_checksum(struct e1000_hw *hw)
return
-
E1000_ERR_EEPROM
;
}
else
if
(
hw
->
eeprom
.
type
==
e1000_eeprom_flash
)
{
e1000_commit_shadow_ram
(
hw
);
}
else
if
(
hw
->
eeprom
.
type
==
e1000_eeprom_ich8
)
{
e1000_commit_shadow_ram
(
hw
);
/* Reload the EEPROM, or else modifications will not appear
* until after next adapter reset. */
ctrl_ext
=
E1000_READ_REG
(
hw
,
CTRL_EXT
);
ctrl_ext
|=
E1000_CTRL_EXT_EE_RST
;
E1000_WRITE_REG
(
hw
,
CTRL_EXT
,
ctrl_ext
);
msec_delay
(
10
);
}
return
E1000_SUCCESS
;
}
...
...
@@ -4770,6 +5175,9 @@ e1000_write_eeprom(struct e1000_hw *hw,
if
(
eeprom
->
use_eewr
==
TRUE
)
return
e1000_write_eeprom_eewr
(
hw
,
offset
,
words
,
data
);
if
(
eeprom
->
type
==
e1000_eeprom_ich8
)
return
e1000_write_eeprom_ich8
(
hw
,
offset
,
words
,
data
);
/* Prepare the EEPROM for writing */
if
(
e1000_acquire_eeprom
(
hw
)
!=
E1000_SUCCESS
)
return
-
E1000_ERR_EEPROM
;
...
...
@@ -4957,11 +5365,17 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
uint32_t
flop
=
0
;
uint32_t
i
=
0
;
int32_t
error
=
E1000_SUCCESS
;
uint32_t
old_bank_offset
=
0
;
uint32_t
new_bank_offset
=
0
;
uint32_t
sector_retries
=
0
;
uint8_t
low_byte
=
0
;
uint8_t
high_byte
=
0
;
uint8_t
temp_byte
=
0
;
boolean_t
sector_write_failed
=
FALSE
;
if
(
hw
->
mac_type
==
e1000_82573
)
{
/* The flop register will be used to determine if flash type is STM */
flop
=
E1000_READ_REG
(
hw
,
FLOP
);
if
(
hw
->
mac_type
==
e1000_82573
)
{
for
(
i
=
0
;
i
<
attempts
;
i
++
)
{
eecd
=
E1000_READ_REG
(
hw
,
EECD
);
if
((
eecd
&
E1000_EECD_FLUPD
)
==
0
)
{
...
...
@@ -4995,6 +5409,106 @@ e1000_commit_shadow_ram(struct e1000_hw *hw)
}
}
if
(
hw
->
mac_type
==
e1000_ich8lan
&&
hw
->
eeprom_shadow_ram
!=
NULL
)
{
/* We're writing to the opposite bank so if we're on bank 1,
* write to bank 0 etc. We also need to erase the segment that
* is going to be written */
if
(
!
(
E1000_READ_REG
(
hw
,
EECD
)
&
E1000_EECD_SEC1VAL
))
{
new_bank_offset
=
hw
->
flash_bank_size
*
2
;
old_bank_offset
=
0
;
e1000_erase_ich8_4k_segment
(
hw
,
1
);
}
else
{
old_bank_offset
=
hw
->
flash_bank_size
*
2
;
new_bank_offset
=
0
;
e1000_erase_ich8_4k_segment
(
hw
,
0
);
}
do
{
sector_write_failed
=
FALSE
;
/* Loop for every byte in the shadow RAM,
* which is in units of words. */
for
(
i
=
0
;
i
<
E1000_SHADOW_RAM_WORDS
;
i
++
)
{
/* Determine whether to write the value stored
* in the other NVM bank or a modified value stored
* in the shadow RAM */
if
(
hw
->
eeprom_shadow_ram
[
i
].
modified
==
TRUE
)
{
low_byte
=
(
uint8_t
)
hw
->
eeprom_shadow_ram
[
i
].
eeprom_word
;
e1000_read_ich8_byte
(
hw
,
(
i
<<
1
)
+
old_bank_offset
,
&
temp_byte
);
udelay
(
100
);
error
=
e1000_verify_write_ich8_byte
(
hw
,
(
i
<<
1
)
+
new_bank_offset
,
low_byte
);
if
(
error
!=
E1000_SUCCESS
)
sector_write_failed
=
TRUE
;
high_byte
=
(
uint8_t
)(
hw
->
eeprom_shadow_ram
[
i
].
eeprom_word
>>
8
);
e1000_read_ich8_byte
(
hw
,
(
i
<<
1
)
+
old_bank_offset
+
1
,
&
temp_byte
);
udelay
(
100
);
}
else
{
e1000_read_ich8_byte
(
hw
,
(
i
<<
1
)
+
old_bank_offset
,
&
low_byte
);
udelay
(
100
);
error
=
e1000_verify_write_ich8_byte
(
hw
,
(
i
<<
1
)
+
new_bank_offset
,
low_byte
);
if
(
error
!=
E1000_SUCCESS
)
sector_write_failed
=
TRUE
;
e1000_read_ich8_byte
(
hw
,
(
i
<<
1
)
+
old_bank_offset
+
1
,
&
high_byte
);
}
/* If the word is 0x13, then make sure the signature bits
* (15:14) are 11b until the commit has completed.
* This will allow us to write 10b which indicates the
* signature is valid. We want to do this after the write
* has completed so that we don't mark the segment valid
* while the write is still in progress */
if
(
i
==
E1000_ICH8_NVM_SIG_WORD
)
high_byte
=
E1000_ICH8_NVM_SIG_MASK
|
high_byte
;
error
=
e1000_verify_write_ich8_byte
(
hw
,
(
i
<<
1
)
+
new_bank_offset
+
1
,
high_byte
);
if
(
error
!=
E1000_SUCCESS
)
sector_write_failed
=
TRUE
;
if
(
sector_write_failed
==
FALSE
)
{
/* Clear the now not used entry in the cache */
hw
->
eeprom_shadow_ram
[
i
].
modified
=
FALSE
;
hw
->
eeprom_shadow_ram
[
i
].
eeprom_word
=
0xFFFF
;
}
}
/* Don't bother writing the segment valid bits if sector
* programming failed. */
if
(
sector_write_failed
==
FALSE
)
{
/* Finally validate the new segment by setting bit 15:14
* to 10b in word 0x13 , this can be done without an
* erase as well since these bits are 11 to start with
* and we need to change bit 14 to 0b */
e1000_read_ich8_byte
(
hw
,
E1000_ICH8_NVM_SIG_WORD
*
2
+
1
+
new_bank_offset
,
&
high_byte
);
high_byte
&=
0xBF
;
error
=
e1000_verify_write_ich8_byte
(
hw
,
E1000_ICH8_NVM_SIG_WORD
*
2
+
1
+
new_bank_offset
,
high_byte
);
if
(
error
!=
E1000_SUCCESS
)
sector_write_failed
=
TRUE
;
/* And invalidate the previously valid segment by setting
* its signature word (0x13) high_byte to 0b. This can be
* done without an erase because flash erase sets all bits
* to 1's. We can write 1's to 0's without an erase */
error
=
e1000_verify_write_ich8_byte
(
hw
,
E1000_ICH8_NVM_SIG_WORD
*
2
+
1
+
old_bank_offset
,
0
);
if
(
error
!=
E1000_SUCCESS
)
sector_write_failed
=
TRUE
;
}
}
while
(
++
sector_retries
<
10
&&
sector_write_failed
==
TRUE
);
}
return
error
;
}
...
...
@@ -5102,15 +5616,19 @@ e1000_init_rx_addrs(struct e1000_hw *hw)
* the other port. */
if
((
hw
->
mac_type
==
e1000_82571
)
&&
(
hw
->
laa_is_present
==
TRUE
))
rar_num
-=
1
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
rar_num
=
E1000_RAR_ENTRIES_ICH8LAN
;
/* Zero out the other 15 receive addresses. */
DEBUGOUT
(
"Clearing RAR[1-15]
\n
"
);
for
(
i
=
1
;
i
<
rar_num
;
i
++
)
{
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
(
i
<<
1
),
0
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
((
i
<<
1
)
+
1
),
0
);
E1000_WRITE_FLUSH
(
hw
);
}
}
#if 0
/******************************************************************************
* Updates the MAC's list of multicast addresses.
*
...
...
@@ -5145,6 +5663,8 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
/* Clear RAR[1-15] */
DEBUGOUT
(
" Clearing RAR[1-15]
\n
"
);
num_rar_entry
=
E1000_RAR_ENTRIES
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
num_rar_entry
=
E1000_RAR_ENTRIES_ICH8LAN
;
/* Reserve a spot for the Locally Administered Address to work around
* an 82571 issue in which a reset on one port will reload the MAC on
* the other port. */
...
...
@@ -5153,14 +5673,19 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
for
(
i
=
rar_used_count
;
i
<
num_rar_entry
;
i
++
)
{
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
(
i
<<
1
),
0
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
((
i
<<
1
)
+
1
),
0
);
E1000_WRITE_FLUSH
(
hw
);
}
/* Clear the MTA */
DEBUGOUT
(
" Clearing MTA
\n
"
);
num_mta_entry
=
E1000_NUM_MTA_REGISTERS
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
num_mta_entry
=
E1000_NUM_MTA_REGISTERS_ICH8LAN
;
for
(
i
=
0
;
i
<
num_mta_entry
;
i
++
)
{
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
E1000_WRITE_FLUSH
(
hw
);
}
/* Add the new addresses */
...
...
@@ -5194,7 +5719,6 @@ e1000_mc_addr_list_update(struct e1000_hw *hw,
}
DEBUGOUT
(
"MC Update Complete
\n
"
);
}
#endif /* 0 */
/******************************************************************************
* Hashes an address to determine its location in the multicast table
...
...
@@ -5217,24 +5741,46 @@ e1000_hash_mc_addr(struct e1000_hw *hw,
* LSB MSB
*/
case
0
:
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* [47:38] i.e. 0x158 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
6
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
2
));
}
else
{
/* [47:36] i.e. 0x563 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
4
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
4
));
}
break
;
case
1
:
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* [46:37] i.e. 0x2B1 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
5
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
3
));
}
else
{
/* [46:35] i.e. 0xAC6 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
3
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
5
));
}
break
;
case
2
:
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/*[45:36] i.e. 0x163 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
4
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
4
));
}
else
{
/* [45:34] i.e. 0x5D8 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
2
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
6
));
}
break
;
case
3
:
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* [43:34] i.e. 0x18D for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
2
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
6
));
}
else
{
/* [43:32] i.e. 0x634 for above example address */
hash_value
=
((
mc_addr
[
4
])
|
(((
uint16_t
)
mc_addr
[
5
])
<<
8
));
}
break
;
}
hash_value
&=
0xFFF
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
hash_value
&=
0x3FF
;
return
hash_value
;
}
...
...
@@ -5262,6 +5808,8 @@ e1000_mta_set(struct e1000_hw *hw,
* register are determined by the lower 5 bits of the value.
*/
hash_reg
=
(
hash_value
>>
5
)
&
0x7F
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
hash_reg
&=
0x1F
;
hash_bit
=
hash_value
&
0x1F
;
mta
=
E1000_READ_REG_ARRAY
(
hw
,
MTA
,
hash_reg
);
...
...
@@ -5275,9 +5823,12 @@ e1000_mta_set(struct e1000_hw *hw,
if
((
hw
->
mac_type
==
e1000_82544
)
&&
((
hash_reg
&
0x1
)
==
1
))
{
temp
=
E1000_READ_REG_ARRAY
(
hw
,
MTA
,
(
hash_reg
-
1
));
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
hash_reg
,
mta
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
(
hash_reg
-
1
),
temp
);
E1000_WRITE_FLUSH
(
hw
);
}
else
{
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
hash_reg
,
mta
);
E1000_WRITE_FLUSH
(
hw
);
}
}
...
...
@@ -5334,7 +5885,9 @@ e1000_rar_set(struct e1000_hw *hw,
}
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
(
index
<<
1
),
rar_low
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
((
index
<<
1
)
+
1
),
rar_high
);
E1000_WRITE_FLUSH
(
hw
);
}
/******************************************************************************
...
...
@@ -5351,12 +5904,18 @@ e1000_write_vfta(struct e1000_hw *hw,
{
uint32_t
temp
;
if
((
hw
->
mac_type
==
e1000_82544
)
&&
((
offset
&
0x1
)
==
1
))
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
return
;
if
((
hw
->
mac_type
==
e1000_82544
)
&&
((
offset
&
0x1
)
==
1
))
{
temp
=
E1000_READ_REG_ARRAY
(
hw
,
VFTA
,
(
offset
-
1
));
E1000_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
value
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
VFTA
,
(
offset
-
1
),
temp
);
E1000_WRITE_FLUSH
(
hw
);
}
else
{
E1000_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
value
);
E1000_WRITE_FLUSH
(
hw
);
}
}
...
...
@@ -5373,6 +5932,9 @@ e1000_clear_vfta(struct e1000_hw *hw)
uint32_t
vfta_offset
=
0
;
uint32_t
vfta_bit_in_reg
=
0
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
return
;
if
(
hw
->
mac_type
==
e1000_82573
)
{
if
(
hw
->
mng_cookie
.
vlan_id
!=
0
)
{
/* The VFTA is a 4096b bit-field, each identifying a single VLAN
...
...
@@ -5392,6 +5954,7 @@ e1000_clear_vfta(struct e1000_hw *hw)
* manageability unit */
vfta_value
=
(
offset
==
vfta_offset
)
?
vfta_bit_in_reg
:
0
;
E1000_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
vfta_value
);
E1000_WRITE_FLUSH
(
hw
);
}
}
...
...
@@ -5421,9 +5984,18 @@ e1000_id_led_init(struct e1000_hw * hw)
DEBUGOUT
(
"EEPROM Read Error
\n
"
);
return
-
E1000_ERR_EEPROM
;
}
if
((
eeprom_data
==
ID_LED_RESERVED_0000
)
||
(
eeprom_data
==
ID_LED_RESERVED_FFFF
))
eeprom_data
=
ID_LED_DEFAULT
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
if
((
hw
->
mac_type
==
e1000_82573
)
&&
(
eeprom_data
==
ID_LED_RESERVED_82573
))
eeprom_data
=
ID_LED_DEFAULT_82573
;
else
if
((
eeprom_data
==
ID_LED_RESERVED_0000
)
||
(
eeprom_data
==
ID_LED_RESERVED_FFFF
))
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
eeprom_data
=
ID_LED_DEFAULT_ICH8LAN
;
else
eeprom_data
=
ID_LED_DEFAULT
;
}
for
(
i
=
0
;
i
<
4
;
i
++
)
{
temp
=
(
eeprom_data
>>
(
i
<<
2
))
&
led_mask
;
switch
(
temp
)
{
case
ID_LED_ON1_DEF2
:
...
...
@@ -5518,6 +6090,44 @@ e1000_setup_led(struct e1000_hw *hw)
return
E1000_SUCCESS
;
}
/******************************************************************************
* Used on 82571 and later Si that has LED blink bits.
* Callers must use their own timer and should have already called
* e1000_id_led_init()
* Call e1000_cleanup led() to stop blinking
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
int32_t
e1000_blink_led_start
(
struct
e1000_hw
*
hw
)
{
int16_t
i
;
uint32_t
ledctl_blink
=
0
;
DEBUGFUNC
(
"e1000_id_led_blink_on"
);
if
(
hw
->
mac_type
<
e1000_82571
)
{
/* Nothing to do */
return
E1000_SUCCESS
;
}
if
(
hw
->
media_type
==
e1000_media_type_fiber
)
{
/* always blink LED0 for PCI-E fiber */
ledctl_blink
=
E1000_LEDCTL_LED0_BLINK
|
(
E1000_LEDCTL_MODE_LED_ON
<<
E1000_LEDCTL_LED0_MODE_SHIFT
);
}
else
{
/* set the blink bit for each LED that's "on" (0x0E) in ledctl_mode2 */
ledctl_blink
=
hw
->
ledctl_mode2
;
for
(
i
=
0
;
i
<
4
;
i
++
)
if
(((
hw
->
ledctl_mode2
>>
(
i
*
8
))
&
0xFF
)
==
E1000_LEDCTL_MODE_LED_ON
)
ledctl_blink
|=
(
E1000_LEDCTL_LED0_BLINK
<<
(
i
*
8
));
}
E1000_WRITE_REG
(
hw
,
LEDCTL
,
ledctl_blink
);
return
E1000_SUCCESS
;
}
/******************************************************************************
* Restores the saved state of the SW controlable LED.
*
...
...
@@ -5548,6 +6158,10 @@ e1000_cleanup_led(struct e1000_hw *hw)
return
ret_val
;
/* Fall Through */
default:
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
e1000_write_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL_LED
,
0
);
break
;
}
/* Restore LEDCTL settings */
E1000_WRITE_REG
(
hw
,
LEDCTL
,
hw
->
ledctl_default
);
break
;
...
...
@@ -5592,7 +6206,10 @@ e1000_led_on(struct e1000_hw *hw)
/* Clear SW Defineable Pin 0 to turn on the LED */
ctrl
&=
~
E1000_CTRL_SWDPIN0
;
ctrl
|=
E1000_CTRL_SWDPIO0
;
}
else
if
(
hw
->
media_type
==
e1000_media_type_copper
)
{
}
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
e1000_write_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL_LED
,
(
IFE_PSCL_PROBE_MODE
|
IFE_PSCL_PROBE_LEDS_ON
));
}
else
if
(
hw
->
media_type
==
e1000_media_type_copper
)
{
E1000_WRITE_REG
(
hw
,
LEDCTL
,
hw
->
ledctl_mode2
);
return
E1000_SUCCESS
;
}
...
...
@@ -5640,7 +6257,10 @@ e1000_led_off(struct e1000_hw *hw)
/* Set SW Defineable Pin 0 to turn off the LED */
ctrl
|=
E1000_CTRL_SWDPIN0
;
ctrl
|=
E1000_CTRL_SWDPIO0
;
}
else
if
(
hw
->
media_type
==
e1000_media_type_copper
)
{
}
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
e1000_write_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL_LED
,
(
IFE_PSCL_PROBE_MODE
|
IFE_PSCL_PROBE_LEDS_OFF
));
}
else
if
(
hw
->
media_type
==
e1000_media_type_copper
)
{
E1000_WRITE_REG
(
hw
,
LEDCTL
,
hw
->
ledctl_mode1
);
return
E1000_SUCCESS
;
}
...
...
@@ -5678,12 +6298,16 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw)
temp
=
E1000_READ_REG
(
hw
,
XOFFRXC
);
temp
=
E1000_READ_REG
(
hw
,
XOFFTXC
);
temp
=
E1000_READ_REG
(
hw
,
FCRUC
);
if
(
hw
->
mac_type
!=
e1000_ich8lan
)
{
temp
=
E1000_READ_REG
(
hw
,
PRC64
);
temp
=
E1000_READ_REG
(
hw
,
PRC127
);
temp
=
E1000_READ_REG
(
hw
,
PRC255
);
temp
=
E1000_READ_REG
(
hw
,
PRC511
);
temp
=
E1000_READ_REG
(
hw
,
PRC1023
);
temp
=
E1000_READ_REG
(
hw
,
PRC1522
);
}
temp
=
E1000_READ_REG
(
hw
,
GPRC
);
temp
=
E1000_READ_REG
(
hw
,
BPRC
);
temp
=
E1000_READ_REG
(
hw
,
MPRC
);
...
...
@@ -5703,12 +6327,16 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw)
temp
=
E1000_READ_REG
(
hw
,
TOTH
);
temp
=
E1000_READ_REG
(
hw
,
TPR
);
temp
=
E1000_READ_REG
(
hw
,
TPT
);
if
(
hw
->
mac_type
!=
e1000_ich8lan
)
{
temp
=
E1000_READ_REG
(
hw
,
PTC64
);
temp
=
E1000_READ_REG
(
hw
,
PTC127
);
temp
=
E1000_READ_REG
(
hw
,
PTC255
);
temp
=
E1000_READ_REG
(
hw
,
PTC511
);
temp
=
E1000_READ_REG
(
hw
,
PTC1023
);
temp
=
E1000_READ_REG
(
hw
,
PTC1522
);
}
temp
=
E1000_READ_REG
(
hw
,
MPTC
);
temp
=
E1000_READ_REG
(
hw
,
BPTC
);
...
...
@@ -5731,6 +6359,9 @@ e1000_clear_hw_cntrs(struct e1000_hw *hw)
temp
=
E1000_READ_REG
(
hw
,
IAC
);
temp
=
E1000_READ_REG
(
hw
,
ICRXOC
);
if
(
hw
->
mac_type
==
e1000_ich8lan
)
return
;
temp
=
E1000_READ_REG
(
hw
,
ICRXPTC
);
temp
=
E1000_READ_REG
(
hw
,
ICRXATC
);
temp
=
E1000_READ_REG
(
hw
,
ICTXPTC
);
...
...
@@ -5911,6 +6542,7 @@ e1000_get_bus_info(struct e1000_hw *hw)
hw
->
bus_width
=
e1000_bus_width_pciex_1
;
break
;
case
e1000_82571
:
case
e1000_ich8lan
:
case
e1000_80003es2lan
:
hw
->
bus_type
=
e1000_bus_type_pci_express
;
hw
->
bus_speed
=
e1000_bus_speed_2500
;
...
...
@@ -5948,8 +6580,6 @@ e1000_get_bus_info(struct e1000_hw *hw)
break
;
}
}
#if 0
/******************************************************************************
* Reads a value from one of the devices registers using port I/O (as opposed
* memory mapped I/O). Only 82544 and newer devices support port I/O.
...
...
@@ -5967,7 +6597,6 @@ e1000_read_reg_io(struct e1000_hw *hw,
e1000_io_write
(
hw
,
io_addr
,
offset
);
return
e1000_io_read
(
hw
,
io_data
);
}
#endif /* 0 */
/******************************************************************************
* Writes a value to one of the devices registers using port I/O (as opposed to
...
...
@@ -6012,8 +6641,6 @@ e1000_get_cable_length(struct e1000_hw *hw,
{
int32_t
ret_val
;
uint16_t
agc_value
=
0
;
uint16_t
cur_agc
,
min_agc
=
IGP01E1000_AGC_LENGTH_TABLE_SIZE
;
uint16_t
max_agc
=
0
;
uint16_t
i
,
phy_data
;
uint16_t
cable_length
;
...
...
@@ -6086,6 +6713,8 @@ e1000_get_cable_length(struct e1000_hw *hw,
break
;
}
}
else
if
(
hw
->
phy_type
==
e1000_phy_igp
)
{
/* For IGP PHY */
uint16_t
cur_agc_value
;
uint16_t
min_agc_value
=
IGP01E1000_AGC_LENGTH_TABLE_SIZE
;
uint16_t
agc_reg_array
[
IGP01E1000_PHY_CHANNEL_NUM
]
=
{
IGP01E1000_PHY_AGC_A
,
IGP01E1000_PHY_AGC_B
,
...
...
@@ -6098,23 +6727,23 @@ e1000_get_cable_length(struct e1000_hw *hw,
if
(
ret_val
)
return
ret_val
;
cur_agc
=
phy_data
>>
IGP01E1000_AGC_LENGTH_SHIFT
;
cur_agc
_value
=
phy_data
>>
IGP01E1000_AGC_LENGTH_SHIFT
;
/*
Array
bound check. */
if
((
cur_agc
>=
IGP01E1000_AGC_LENGTH_TABLE_SIZE
-
1
)
||
(
cur_agc
==
0
))
/*
Value
bound check. */
if
((
cur_agc_value
>=
IGP01E1000_AGC_LENGTH_TABLE_SIZE
-
1
)
||
(
cur_agc_value
==
0
))
return
-
E1000_ERR_PHY
;
agc_value
+=
cur_agc
;
agc_value
+=
cur_agc
_value
;
/* Update minimal AGC value. */
if
(
min_agc
>
cur_agc
)
min_agc
=
cur_agc
;
if
(
min_agc_value
>
cur_agc_value
)
min_agc
_value
=
cur_agc_value
;
}
/* Remove the minimal AGC result for length < 50m */
if
(
agc_value
<
IGP01E1000_PHY_CHANNEL_NUM
*
e1000_igp_cable_length_50
)
{
agc_value
-=
min_agc
;
if
(
agc_value
<
IGP01E1000_PHY_CHANNEL_NUM
*
e1000_igp_cable_length_50
)
{
agc_value
-=
min_agc
_value
;
/* Get the average length of the remaining 3 channels */
agc_value
/=
(
IGP01E1000_PHY_CHANNEL_NUM
-
1
);
...
...
@@ -6130,7 +6759,10 @@ e1000_get_cable_length(struct e1000_hw *hw,
IGP01E1000_AGC_RANGE
)
:
0
;
*
max_length
=
e1000_igp_cable_length_table
[
agc_value
]
+
IGP01E1000_AGC_RANGE
;
}
else
if
(
hw
->
phy_type
==
e1000_phy_igp_2
)
{
}
else
if
(
hw
->
phy_type
==
e1000_phy_igp_2
||
hw
->
phy_type
==
e1000_phy_igp_3
)
{
uint16_t
cur_agc_index
,
max_agc_index
=
0
;
uint16_t
min_agc_index
=
IGP02E1000_AGC_LENGTH_TABLE_SIZE
-
1
;
uint16_t
agc_reg_array
[
IGP02E1000_PHY_CHANNEL_NUM
]
=
{
IGP02E1000_PHY_AGC_A
,
IGP02E1000_PHY_AGC_B
,
...
...
@@ -6145,19 +6777,27 @@ e1000_get_cable_length(struct e1000_hw *hw,
/* Getting bits 15:9, which represent the combination of course and
* fine gain values. The result is a number that can be put into
* the lookup table to obtain the approximate cable length. */
cur_agc
=
(
phy_data
>>
IGP02E1000_AGC_LENGTH_SHIFT
)
&
cur_agc
_index
=
(
phy_data
>>
IGP02E1000_AGC_LENGTH_SHIFT
)
&
IGP02E1000_AGC_LENGTH_MASK
;
/* Array index bound check. */
if
((
cur_agc_index
>=
IGP02E1000_AGC_LENGTH_TABLE_SIZE
)
||
(
cur_agc_index
==
0
))
return
-
E1000_ERR_PHY
;
/* Remove min & max AGC values from calculation. */
if
(
e1000_igp_2_cable_length_table
[
min_agc
]
>
e1000_igp_2_cable_length_table
[
cur_agc
])
min_agc
=
cur_agc
;
if
(
e1000_igp_2_cable_length_table
[
max_agc
]
<
e1000_igp_2_cable_length_table
[
cur_agc
])
max_agc
=
cur_agc
;
if
(
e1000_igp_2_cable_length_table
[
min_agc_index
]
>
e1000_igp_2_cable_length_table
[
cur_agc_index
])
min_agc_index
=
cur_agc_index
;
if
(
e1000_igp_2_cable_length_table
[
max_agc_index
]
<
e1000_igp_2_cable_length_table
[
cur_agc_index
])
max_agc_index
=
cur_agc_index
;
agc_value
+=
e1000_igp_2_cable_length_table
[
cur_agc
];
agc_value
+=
e1000_igp_2_cable_length_table
[
cur_agc
_index
];
}
agc_value
-=
(
e1000_igp_2_cable_length_table
[
min_agc
]
+
e1000_igp_2_cable_length_table
[
max_agc
]);
agc_value
-=
(
e1000_igp_2_cable_length_table
[
min_agc_index
]
+
e1000_igp_2_cable_length_table
[
max_agc_index
]);
agc_value
/=
(
IGP02E1000_PHY_CHANNEL_NUM
-
2
);
/* Calculate cable length with the error range of +/- 10 meters. */
...
...
@@ -6203,7 +6843,8 @@ e1000_check_polarity(struct e1000_hw *hw,
return
ret_val
;
*
polarity
=
(
phy_data
&
M88E1000_PSSR_REV_POLARITY
)
>>
M88E1000_PSSR_REV_POLARITY_SHIFT
;
}
else
if
(
hw
->
phy_type
==
e1000_phy_igp
||
}
else
if
(
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
{
/* Read the Status register to check the speed */
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP01E1000_PHY_PORT_STATUS
,
...
...
@@ -6229,6 +6870,13 @@ e1000_check_polarity(struct e1000_hw *hw,
* 100 Mbps this bit is always 0) */
*
polarity
=
phy_data
&
IGP01E1000_PSSR_POLARITY_REVERSED
;
}
}
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_EXTENDED_STATUS_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
*
polarity
=
(
phy_data
&
IFE_PESC_POLARITY_REVERSED
)
>>
IFE_PESC_POLARITY_REVERSED_SHIFT
;
}
return
E1000_SUCCESS
;
}
...
...
@@ -6256,7 +6904,8 @@ e1000_check_downshift(struct e1000_hw *hw)
DEBUGFUNC
(
"e1000_check_downshift"
);
if
(
hw
->
phy_type
==
e1000_phy_igp
||
if
(
hw
->
phy_type
==
e1000_phy_igp
||
hw
->
phy_type
==
e1000_phy_igp_3
||
hw
->
phy_type
==
e1000_phy_igp_2
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP01E1000_PHY_LINK_HEALTH
,
&
phy_data
);
...
...
@@ -6273,6 +6922,9 @@ e1000_check_downshift(struct e1000_hw *hw)
hw
->
speed_downgraded
=
(
phy_data
&
M88E1000_PSSR_DOWNSHIFT
)
>>
M88E1000_PSSR_DOWNSHIFT_SHIFT
;
}
else
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
/* e1000_phy_ife supports 10/100 speed only */
hw
->
speed_downgraded
=
FALSE
;
}
return
E1000_SUCCESS
;
...
...
@@ -6317,7 +6969,9 @@ e1000_config_dsp_after_link_change(struct e1000_hw *hw,
if
(
speed
==
SPEED_1000
)
{
e1000_get_cable_length
(
hw
,
&
min_length
,
&
max_length
);
ret_val
=
e1000_get_cable_length
(
hw
,
&
min_length
,
&
max_length
);
if
(
ret_val
)
return
ret_val
;
if
((
hw
->
dsp_config_state
==
e1000_dsp_config_enabled
)
&&
min_length
>=
e1000_igp_cable_length_50
)
{
...
...
@@ -6525,20 +7179,27 @@ static int32_t
e1000_set_d3_lplu_state
(
struct
e1000_hw
*
hw
,
boolean_t
active
)
{
uint32_t
phy_ctrl
=
0
;
int32_t
ret_val
;
uint16_t
phy_data
;
DEBUGFUNC
(
"e1000_set_d3_lplu_state"
);
if
(
hw
->
phy_type
!=
e1000_phy_igp
&&
hw
->
phy_type
!=
e1000_phy_igp_2
)
if
(
hw
->
phy_type
!=
e1000_phy_igp
&&
hw
->
phy_type
!=
e1000_phy_igp_2
&&
hw
->
phy_type
!=
e1000_phy_igp_3
)
return
E1000_SUCCESS
;
/* During driver activity LPLU should not be used or it will attain link
* from the lowest speeds starting from 10Mbps. The capability is used for
* Dx transitions and states */
if
(
hw
->
mac_type
==
e1000_82541_rev_2
||
hw
->
mac_type
==
e1000_82547_rev_2
)
{
if
(
hw
->
mac_type
==
e1000_82541_rev_2
||
hw
->
mac_type
==
e1000_82547_rev_2
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP01E1000_GMII_FIFO
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
}
else
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
/* MAC writes into PHY register based on the state transition
* and start auto-negotiation. SW driver can overwrite the settings
* in CSR PHY power control E1000_PHY_CTRL register. */
phy_ctrl
=
E1000_READ_REG
(
hw
,
PHY_CTRL
);
}
else
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
&
phy_data
);
if
(
ret_val
)
...
...
@@ -6552,6 +7213,10 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP01E1000_GMII_FIFO
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
else
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
phy_ctrl
&=
~
E1000_PHY_CTRL_NOND0A_LPLU
;
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
phy_ctrl
);
}
else
{
phy_data
&=
~
IGP02E1000_PM_D3_LPLU
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
...
...
@@ -6559,6 +7224,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
if
(
ret_val
)
return
ret_val
;
}
}
/* LPLU and SmartSpeed are mutually exclusive. LPLU is used during
* Dx states where the power conservation is most important. During
...
...
@@ -6598,6 +7264,10 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP01E1000_GMII_FIFO
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
else
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
phy_ctrl
|=
E1000_PHY_CTRL_NOND0A_LPLU
;
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
phy_ctrl
);
}
else
{
phy_data
|=
IGP02E1000_PM_D3_LPLU
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
...
...
@@ -6605,6 +7275,7 @@ e1000_set_d3_lplu_state(struct e1000_hw *hw,
if
(
ret_val
)
return
ret_val
;
}
}
/* When LPLU is enabled we should disable SmartSpeed */
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP01E1000_PHY_PORT_CONFIG
,
&
phy_data
);
...
...
@@ -6638,6 +7309,7 @@ static int32_t
e1000_set_d0_lplu_state
(
struct
e1000_hw
*
hw
,
boolean_t
active
)
{
uint32_t
phy_ctrl
=
0
;
int32_t
ret_val
;
uint16_t
phy_data
;
DEBUGFUNC
(
"e1000_set_d0_lplu_state"
);
...
...
@@ -6645,15 +7317,24 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
if
(
hw
->
mac_type
<=
e1000_82547_rev_2
)
return
E1000_SUCCESS
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
phy_ctrl
=
E1000_READ_REG
(
hw
,
PHY_CTRL
);
}
else
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
if
(
!
active
)
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
phy_ctrl
&=
~
E1000_PHY_CTRL_D0A_LPLU
;
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
phy_ctrl
);
}
else
{
phy_data
&=
~
IGP02E1000_PM_D0_LPLU
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
/* LPLU and SmartSpeed are mutually exclusive. LPLU is used during
* Dx states where the power conservation is most important. During
...
...
@@ -6686,10 +7367,15 @@ e1000_set_d0_lplu_state(struct e1000_hw *hw,
}
else
{
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
phy_ctrl
|=
E1000_PHY_CTRL_D0A_LPLU
;
E1000_WRITE_REG
(
hw
,
PHY_CTRL
,
phy_ctrl
);
}
else
{
phy_data
|=
IGP02E1000_PM_D0_LPLU
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP02E1000_PHY_POWER_MGMT
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
}
/* When LPLU is enabled we should disable SmartSpeed */
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP01E1000_PHY_PORT_CONFIG
,
&
phy_data
);
...
...
@@ -6928,8 +7614,10 @@ e1000_mng_write_cmd_header(struct e1000_hw * hw,
length
>>=
2
;
/* The device driver writes the relevant command block into the ram area. */
for
(
i
=
0
;
i
<
length
;
i
++
)
for
(
i
=
0
;
i
<
length
;
i
++
)
{
E1000_WRITE_REG_ARRAY_DWORD
(
hw
,
HOST_IF
,
i
,
*
((
uint32_t
*
)
hdr
+
i
));
E1000_WRITE_FLUSH
(
hw
);
}
return
E1000_SUCCESS
;
}
...
...
@@ -6961,14 +7649,17 @@ e1000_mng_write_commit(
* returns - TRUE when the mode is IAMT or FALSE.
****************************************************************************/
boolean_t
e1000_check_mng_mode
(
struct
e1000_hw
*
hw
)
e1000_check_mng_mode
(
struct
e1000_hw
*
hw
)
{
uint32_t
fwsm
;
fwsm
=
E1000_READ_REG
(
hw
,
FWSM
);
if
((
fwsm
&
E1000_FWSM_MODE_MASK
)
==
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
if
((
fwsm
&
E1000_FWSM_MODE_MASK
)
==
(
E1000_MNG_ICH_IAMT_MODE
<<
E1000_FWSM_MODE_SHIFT
))
return
TRUE
;
}
else
if
((
fwsm
&
E1000_FWSM_MODE_MASK
)
==
(
E1000_MNG_IAMT_MODE
<<
E1000_FWSM_MODE_SHIFT
))
return
TRUE
;
...
...
@@ -7209,7 +7900,6 @@ e1000_set_pci_express_master_disable(struct e1000_hw *hw)
E1000_WRITE_REG
(
hw
,
CTRL
,
ctrl
);
}
#if 0
/***************************************************************************
*
* Enables PCI-Express master access.
...
...
@@ -7233,7 +7923,6 @@ e1000_enable_pciex_master(struct e1000_hw *hw)
ctrl
&=
~
E1000_CTRL_GIO_MASTER_DISABLE
;
E1000_WRITE_REG
(
hw
,
CTRL
,
ctrl
);
}
#endif /* 0 */
/*******************************************************************************
*
...
...
@@ -7299,8 +7988,10 @@ e1000_get_auto_rd_done(struct e1000_hw *hw)
case
e1000_82572
:
case
e1000_82573
:
case
e1000_80003es2lan
:
while
(
timeout
)
{
if
(
E1000_READ_REG
(
hw
,
EECD
)
&
E1000_EECD_AUTO_RD
)
break
;
case
e1000_ich8lan
:
while
(
timeout
)
{
if
(
E1000_READ_REG
(
hw
,
EECD
)
&
E1000_EECD_AUTO_RD
)
break
;
else
msec_delay
(
1
);
timeout
--
;
}
...
...
@@ -7340,7 +8031,7 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)
switch
(
hw
->
mac_type
)
{
default:
msec_delay
(
10
);
msec_delay
_irq
(
10
);
break
;
case
e1000_80003es2lan
:
/* Separate *_CFG_DONE_* bit for each port */
...
...
@@ -7523,6 +8214,13 @@ int32_t
e1000_check_phy_reset_block
(
struct
e1000_hw
*
hw
)
{
uint32_t
manc
=
0
;
uint32_t
fwsm
=
0
;
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
fwsm
=
E1000_READ_REG
(
hw
,
FWSM
);
return
(
fwsm
&
E1000_FWSM_RSPCIPHY
)
?
E1000_SUCCESS
:
E1000_BLK_PHY_RESET
;
}
if
(
hw
->
mac_type
>
e1000_82547_rev_2
)
manc
=
E1000_READ_REG
(
hw
,
MANC
);
...
...
@@ -7549,6 +8247,8 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
if
((
fwsm
&
E1000_FWSM_MODE_MASK
)
!=
0
)
return
TRUE
;
break
;
case
e1000_ich8lan
:
return
TRUE
;
default:
break
;
}
...
...
@@ -7556,4 +8256,846 @@ e1000_arc_subsystem_valid(struct e1000_hw *hw)
}
/******************************************************************************
* Configure PCI-Ex no-snoop
*
* hw - Struct containing variables accessed by shared code.
* no_snoop - Bitmap of no-snoop events.
*
* returns: E1000_SUCCESS
*
*****************************************************************************/
int32_t
e1000_set_pci_ex_no_snoop
(
struct
e1000_hw
*
hw
,
uint32_t
no_snoop
)
{
uint32_t
gcr_reg
=
0
;
DEBUGFUNC
(
"e1000_set_pci_ex_no_snoop"
);
if
(
hw
->
bus_type
==
e1000_bus_type_unknown
)
e1000_get_bus_info
(
hw
);
if
(
hw
->
bus_type
!=
e1000_bus_type_pci_express
)
return
E1000_SUCCESS
;
if
(
no_snoop
)
{
gcr_reg
=
E1000_READ_REG
(
hw
,
GCR
);
gcr_reg
&=
~
(
PCI_EX_NO_SNOOP_ALL
);
gcr_reg
|=
no_snoop
;
E1000_WRITE_REG
(
hw
,
GCR
,
gcr_reg
);
}
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
uint32_t
ctrl_ext
;
E1000_WRITE_REG
(
hw
,
GCR
,
PCI_EX_82566_SNOOP_ALL
);
ctrl_ext
=
E1000_READ_REG
(
hw
,
CTRL_EXT
);
ctrl_ext
|=
E1000_CTRL_EXT_RO_DIS
;
E1000_WRITE_REG
(
hw
,
CTRL_EXT
,
ctrl_ext
);
}
return
E1000_SUCCESS
;
}
/***************************************************************************
*
* Get software semaphore FLAG bit (SWFLAG).
* SWFLAG is used to synchronize the access to all shared resource between
* SW, FW and HW.
*
* hw: Struct containing variables accessed by shared code
*
***************************************************************************/
int32_t
e1000_get_software_flag
(
struct
e1000_hw
*
hw
)
{
int32_t
timeout
=
PHY_CFG_TIMEOUT
;
uint32_t
extcnf_ctrl
;
DEBUGFUNC
(
"e1000_get_software_flag"
);
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
while
(
timeout
)
{
extcnf_ctrl
=
E1000_READ_REG
(
hw
,
EXTCNF_CTRL
);
extcnf_ctrl
|=
E1000_EXTCNF_CTRL_SWFLAG
;
E1000_WRITE_REG
(
hw
,
EXTCNF_CTRL
,
extcnf_ctrl
);
extcnf_ctrl
=
E1000_READ_REG
(
hw
,
EXTCNF_CTRL
);
if
(
extcnf_ctrl
&
E1000_EXTCNF_CTRL_SWFLAG
)
break
;
msec_delay_irq
(
1
);
timeout
--
;
}
if
(
!
timeout
)
{
DEBUGOUT
(
"FW or HW locks the resource too long.
\n
"
);
return
-
E1000_ERR_CONFIG
;
}
}
return
E1000_SUCCESS
;
}
/***************************************************************************
*
* Release software semaphore FLAG bit (SWFLAG).
* SWFLAG is used to synchronize the access to all shared resource between
* SW, FW and HW.
*
* hw: Struct containing variables accessed by shared code
*
***************************************************************************/
void
e1000_release_software_flag
(
struct
e1000_hw
*
hw
)
{
uint32_t
extcnf_ctrl
;
DEBUGFUNC
(
"e1000_release_software_flag"
);
if
(
hw
->
mac_type
==
e1000_ich8lan
)
{
extcnf_ctrl
=
E1000_READ_REG
(
hw
,
EXTCNF_CTRL
);
extcnf_ctrl
&=
~
E1000_EXTCNF_CTRL_SWFLAG
;
E1000_WRITE_REG
(
hw
,
EXTCNF_CTRL
,
extcnf_ctrl
);
}
return
;
}
/***************************************************************************
*
* Disable dynamic power down mode in ife PHY.
* It can be used to workaround band-gap problem.
*
* hw: Struct containing variables accessed by shared code
*
***************************************************************************/
int32_t
e1000_ife_disable_dynamic_power_down
(
struct
e1000_hw
*
hw
)
{
uint16_t
phy_data
;
int32_t
ret_val
=
E1000_SUCCESS
;
DEBUGFUNC
(
"e1000_ife_disable_dynamic_power_down"
);
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_data
|=
IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
phy_data
);
}
return
ret_val
;
}
/***************************************************************************
*
* Enable dynamic power down mode in ife PHY.
* It can be used to workaround band-gap problem.
*
* hw: Struct containing variables accessed by shared code
*
***************************************************************************/
int32_t
e1000_ife_enable_dynamic_power_down
(
struct
e1000_hw
*
hw
)
{
uint16_t
phy_data
;
int32_t
ret_val
=
E1000_SUCCESS
;
DEBUGFUNC
(
"e1000_ife_enable_dynamic_power_down"
);
if
(
hw
->
phy_type
==
e1000_phy_ife
)
{
ret_val
=
e1000_read_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_data
&=
~
IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
phy_data
);
}
return
ret_val
;
}
/******************************************************************************
* Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
* register.
*
* hw - Struct containing variables accessed by shared code
* offset - offset of word in the EEPROM to read
* data - word read from the EEPROM
* words - number of words to read
*****************************************************************************/
int32_t
e1000_read_eeprom_ich8
(
struct
e1000_hw
*
hw
,
uint16_t
offset
,
uint16_t
words
,
uint16_t
*
data
)
{
int32_t
error
=
E1000_SUCCESS
;
uint32_t
flash_bank
=
0
;
uint32_t
act_offset
=
0
;
uint32_t
bank_offset
=
0
;
uint16_t
word
=
0
;
uint16_t
i
=
0
;
/* We need to know which is the valid flash bank. In the event
* that we didn't allocate eeprom_shadow_ram, we may not be
* managing flash_bank. So it cannot be trusted and needs
* to be updated with each read.
*/
/* Value of bit 22 corresponds to the flash bank we're on. */
flash_bank
=
(
E1000_READ_REG
(
hw
,
EECD
)
&
E1000_EECD_SEC1VAL
)
?
1
:
0
;
/* Adjust offset appropriately if we're on bank 1 - adjust for word size */
bank_offset
=
flash_bank
*
(
hw
->
flash_bank_size
*
2
);
error
=
e1000_get_software_flag
(
hw
);
if
(
error
!=
E1000_SUCCESS
)
return
error
;
for
(
i
=
0
;
i
<
words
;
i
++
)
{
if
(
hw
->
eeprom_shadow_ram
!=
NULL
&&
hw
->
eeprom_shadow_ram
[
offset
+
i
].
modified
==
TRUE
)
{
data
[
i
]
=
hw
->
eeprom_shadow_ram
[
offset
+
i
].
eeprom_word
;
}
else
{
/* The NVM part needs a byte offset, hence * 2 */
act_offset
=
bank_offset
+
((
offset
+
i
)
*
2
);
error
=
e1000_read_ich8_word
(
hw
,
act_offset
,
&
word
);
if
(
error
!=
E1000_SUCCESS
)
break
;
data
[
i
]
=
word
;
}
}
e1000_release_software_flag
(
hw
);
return
error
;
}
/******************************************************************************
* Writes a 16 bit word or words to the EEPROM using the ICH8's flash access
* register. Actually, writes are written to the shadow ram cache in the hw
* structure hw->e1000_shadow_ram. e1000_commit_shadow_ram flushes this to
* the NVM, which occurs when the NVM checksum is updated.
*
* hw - Struct containing variables accessed by shared code
* offset - offset of word in the EEPROM to write
* words - number of words to write
* data - words to write to the EEPROM
*****************************************************************************/
int32_t
e1000_write_eeprom_ich8
(
struct
e1000_hw
*
hw
,
uint16_t
offset
,
uint16_t
words
,
uint16_t
*
data
)
{
uint32_t
i
=
0
;
int32_t
error
=
E1000_SUCCESS
;
error
=
e1000_get_software_flag
(
hw
);
if
(
error
!=
E1000_SUCCESS
)
return
error
;
/* A driver can write to the NVM only if it has eeprom_shadow_ram
* allocated. Subsequent reads to the modified words are read from
* this cached structure as well. Writes will only go into this
* cached structure unless it's followed by a call to
* e1000_update_eeprom_checksum() where it will commit the changes
* and clear the "modified" field.
*/
if
(
hw
->
eeprom_shadow_ram
!=
NULL
)
{
for
(
i
=
0
;
i
<
words
;
i
++
)
{
if
((
offset
+
i
)
<
E1000_SHADOW_RAM_WORDS
)
{
hw
->
eeprom_shadow_ram
[
offset
+
i
].
modified
=
TRUE
;
hw
->
eeprom_shadow_ram
[
offset
+
i
].
eeprom_word
=
data
[
i
];
}
else
{
error
=
-
E1000_ERR_EEPROM
;
break
;
}
}
}
else
{
/* Drivers have the option to not allocate eeprom_shadow_ram as long
* as they don't perform any NVM writes. An attempt in doing so
* will result in this error.
*/
error
=
-
E1000_ERR_EEPROM
;
}
e1000_release_software_flag
(
hw
);
return
error
;
}
/******************************************************************************
* This function does initial flash setup so that a new read/write/erase cycle
* can be started.
*
* hw - The pointer to the hw structure
****************************************************************************/
int32_t
e1000_ich8_cycle_init
(
struct
e1000_hw
*
hw
)
{
union
ich8_hws_flash_status
hsfsts
;
int32_t
error
=
E1000_ERR_EEPROM
;
int32_t
i
=
0
;
DEBUGFUNC
(
"e1000_ich8_cycle_init"
);
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
/* May be check the Flash Des Valid bit in Hw status */
if
(
hsfsts
.
hsf_status
.
fldesvalid
==
0
)
{
DEBUGOUT
(
"Flash descriptor invalid. SW Sequencing must be used."
);
return
error
;
}
/* Clear FCERR in Hw status by writing 1 */
/* Clear DAEL in Hw status by writing a 1 */
hsfsts
.
hsf_status
.
flcerr
=
1
;
hsfsts
.
hsf_status
.
dael
=
1
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
,
hsfsts
.
regval
);
/* Either we should have a hardware SPI cycle in progress bit to check
* against, in order to start a new cycle or FDONE bit should be changed
* in the hardware so that it is 1 after harware reset, which can then be
* used as an indication whether a cycle is in progress or has been
* completed .. we should also have some software semaphore mechanism to
* guard FDONE or the cycle in progress bit so that two threads access to
* those bits can be sequentiallized or a way so that 2 threads dont
* start the cycle at the same time */
if
(
hsfsts
.
hsf_status
.
flcinprog
==
0
)
{
/* There is no cycle running at present, so we can start a cycle */
/* Begin by setting Flash Cycle Done. */
hsfsts
.
hsf_status
.
flcdone
=
1
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
,
hsfsts
.
regval
);
error
=
E1000_SUCCESS
;
}
else
{
/* otherwise poll for sometime so the current cycle has a chance
* to end before giving up. */
for
(
i
=
0
;
i
<
ICH8_FLASH_COMMAND_TIMEOUT
;
i
++
)
{
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
if
(
hsfsts
.
hsf_status
.
flcinprog
==
0
)
{
error
=
E1000_SUCCESS
;
break
;
}
udelay
(
1
);
}
if
(
error
==
E1000_SUCCESS
)
{
/* Successful in waiting for previous cycle to timeout,
* now set the Flash Cycle Done. */
hsfsts
.
hsf_status
.
flcdone
=
1
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
,
hsfsts
.
regval
);
}
else
{
DEBUGOUT
(
"Flash controller busy, cannot get access"
);
}
}
return
error
;
}
/******************************************************************************
* This function starts a flash cycle and waits for its completion
*
* hw - The pointer to the hw structure
****************************************************************************/
int32_t
e1000_ich8_flash_cycle
(
struct
e1000_hw
*
hw
,
uint32_t
timeout
)
{
union
ich8_hws_flash_ctrl
hsflctl
;
union
ich8_hws_flash_status
hsfsts
;
int32_t
error
=
E1000_ERR_EEPROM
;
uint32_t
i
=
0
;
/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
hsflctl
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
);
hsflctl
.
hsf_ctrl
.
flcgo
=
1
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
,
hsflctl
.
regval
);
/* wait till FDONE bit is set to 1 */
do
{
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
if
(
hsfsts
.
hsf_status
.
flcdone
==
1
)
break
;
udelay
(
1
);
i
++
;
}
while
(
i
<
timeout
);
if
(
hsfsts
.
hsf_status
.
flcdone
==
1
&&
hsfsts
.
hsf_status
.
flcerr
==
0
)
{
error
=
E1000_SUCCESS
;
}
return
error
;
}
/******************************************************************************
* Reads a byte or word from the NVM using the ICH8 flash access registers.
*
* hw - The pointer to the hw structure
* index - The index of the byte or word to read.
* size - Size of data to read, 1=byte 2=word
* data - Pointer to the word to store the value read.
*****************************************************************************/
int32_t
e1000_read_ich8_data
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint32_t
size
,
uint16_t
*
data
)
{
union
ich8_hws_flash_status
hsfsts
;
union
ich8_hws_flash_ctrl
hsflctl
;
uint32_t
flash_linear_address
;
uint32_t
flash_data
=
0
;
int32_t
error
=
-
E1000_ERR_EEPROM
;
int32_t
count
=
0
;
DEBUGFUNC
(
"e1000_read_ich8_data"
);
if
(
size
<
1
||
size
>
2
||
data
==
0x0
||
index
>
ICH8_FLASH_LINEAR_ADDR_MASK
)
return
error
;
flash_linear_address
=
(
ICH8_FLASH_LINEAR_ADDR_MASK
&
index
)
+
hw
->
flash_base_addr
;
do
{
udelay
(
1
);
/* Steps */
error
=
e1000_ich8_cycle_init
(
hw
);
if
(
error
!=
E1000_SUCCESS
)
break
;
hsflctl
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
);
/* 0b/1b corresponds to 1 or 2 byte size, respectively. */
hsflctl
.
hsf_ctrl
.
fldbcount
=
size
-
1
;
hsflctl
.
hsf_ctrl
.
flcycle
=
ICH8_CYCLE_READ
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
,
hsflctl
.
regval
);
/* Write the last 24 bits of index into Flash Linear address field in
* Flash Address */
/* TODO: TBD maybe check the index against the size of flash */
E1000_WRITE_ICH8_REG
(
hw
,
ICH8_FLASH_FADDR
,
flash_linear_address
);
error
=
e1000_ich8_flash_cycle
(
hw
,
ICH8_FLASH_COMMAND_TIMEOUT
);
/* Check if FCERR is set to 1, if set to 1, clear it and try the whole
* sequence a few more times, else read in (shift in) the Flash Data0,
* the order is least significant byte first msb to lsb */
if
(
error
==
E1000_SUCCESS
)
{
flash_data
=
E1000_READ_ICH8_REG
(
hw
,
ICH8_FLASH_FDATA0
);
if
(
size
==
1
)
{
*
data
=
(
uint8_t
)(
flash_data
&
0x000000FF
);
}
else
if
(
size
==
2
)
{
*
data
=
(
uint16_t
)(
flash_data
&
0x0000FFFF
);
}
break
;
}
else
{
/* If we've gotten here, then things are probably completely hosed,
* but if the error condition is detected, it won't hurt to give
* it another try...ICH8_FLASH_CYCLE_REPEAT_COUNT times.
*/
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
if
(
hsfsts
.
hsf_status
.
flcerr
==
1
)
{
/* Repeat for some time before giving up. */
continue
;
}
else
if
(
hsfsts
.
hsf_status
.
flcdone
==
0
)
{
DEBUGOUT
(
"Timeout error - flash cycle did not complete."
);
break
;
}
}
}
while
(
count
++
<
ICH8_FLASH_CYCLE_REPEAT_COUNT
);
return
error
;
}
/******************************************************************************
* Writes One /two bytes to the NVM using the ICH8 flash access registers.
*
* hw - The pointer to the hw structure
* index - The index of the byte/word to read.
* size - Size of data to read, 1=byte 2=word
* data - The byte(s) to write to the NVM.
*****************************************************************************/
int32_t
e1000_write_ich8_data
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint32_t
size
,
uint16_t
data
)
{
union
ich8_hws_flash_status
hsfsts
;
union
ich8_hws_flash_ctrl
hsflctl
;
uint32_t
flash_linear_address
;
uint32_t
flash_data
=
0
;
int32_t
error
=
-
E1000_ERR_EEPROM
;
int32_t
count
=
0
;
DEBUGFUNC
(
"e1000_write_ich8_data"
);
if
(
size
<
1
||
size
>
2
||
data
>
size
*
0xff
||
index
>
ICH8_FLASH_LINEAR_ADDR_MASK
)
return
error
;
flash_linear_address
=
(
ICH8_FLASH_LINEAR_ADDR_MASK
&
index
)
+
hw
->
flash_base_addr
;
do
{
udelay
(
1
);
/* Steps */
error
=
e1000_ich8_cycle_init
(
hw
);
if
(
error
!=
E1000_SUCCESS
)
break
;
hsflctl
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
);
/* 0b/1b corresponds to 1 or 2 byte size, respectively. */
hsflctl
.
hsf_ctrl
.
fldbcount
=
size
-
1
;
hsflctl
.
hsf_ctrl
.
flcycle
=
ICH8_CYCLE_WRITE
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
,
hsflctl
.
regval
);
/* Write the last 24 bits of index into Flash Linear address field in
* Flash Address */
E1000_WRITE_ICH8_REG
(
hw
,
ICH8_FLASH_FADDR
,
flash_linear_address
);
if
(
size
==
1
)
flash_data
=
(
uint32_t
)
data
&
0x00FF
;
else
flash_data
=
(
uint32_t
)
data
;
E1000_WRITE_ICH8_REG
(
hw
,
ICH8_FLASH_FDATA0
,
flash_data
);
/* check if FCERR is set to 1 , if set to 1, clear it and try the whole
* sequence a few more times else done */
error
=
e1000_ich8_flash_cycle
(
hw
,
ICH8_FLASH_COMMAND_TIMEOUT
);
if
(
error
==
E1000_SUCCESS
)
{
break
;
}
else
{
/* If we're here, then things are most likely completely hosed,
* but if the error condition is detected, it won't hurt to give
* it another try...ICH8_FLASH_CYCLE_REPEAT_COUNT times.
*/
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
if
(
hsfsts
.
hsf_status
.
flcerr
==
1
)
{
/* Repeat for some time before giving up. */
continue
;
}
else
if
(
hsfsts
.
hsf_status
.
flcdone
==
0
)
{
DEBUGOUT
(
"Timeout error - flash cycle did not complete."
);
break
;
}
}
}
while
(
count
++
<
ICH8_FLASH_CYCLE_REPEAT_COUNT
);
return
error
;
}
/******************************************************************************
* Reads a single byte from the NVM using the ICH8 flash access registers.
*
* hw - pointer to e1000_hw structure
* index - The index of the byte to read.
* data - Pointer to a byte to store the value read.
*****************************************************************************/
int32_t
e1000_read_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
*
data
)
{
int32_t
status
=
E1000_SUCCESS
;
uint16_t
word
=
0
;
status
=
e1000_read_ich8_data
(
hw
,
index
,
1
,
&
word
);
if
(
status
==
E1000_SUCCESS
)
{
*
data
=
(
uint8_t
)
word
;
}
return
status
;
}
/******************************************************************************
* Writes a single byte to the NVM using the ICH8 flash access registers.
* Performs verification by reading back the value and then going through
* a retry algorithm before giving up.
*
* hw - pointer to e1000_hw structure
* index - The index of the byte to write.
* byte - The byte to write to the NVM.
*****************************************************************************/
int32_t
e1000_verify_write_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
byte
)
{
int32_t
error
=
E1000_SUCCESS
;
int32_t
program_retries
;
uint8_t
temp_byte
;
e1000_write_ich8_byte
(
hw
,
index
,
byte
);
udelay
(
100
);
for
(
program_retries
=
0
;
program_retries
<
100
;
program_retries
++
)
{
e1000_read_ich8_byte
(
hw
,
index
,
&
temp_byte
);
if
(
temp_byte
==
byte
)
break
;
udelay
(
10
);
e1000_write_ich8_byte
(
hw
,
index
,
byte
);
udelay
(
100
);
}
if
(
program_retries
==
100
)
error
=
E1000_ERR_EEPROM
;
return
error
;
}
/******************************************************************************
* Writes a single byte to the NVM using the ICH8 flash access registers.
*
* hw - pointer to e1000_hw structure
* index - The index of the byte to read.
* data - The byte to write to the NVM.
*****************************************************************************/
int32_t
e1000_write_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
data
)
{
int32_t
status
=
E1000_SUCCESS
;
uint16_t
word
=
(
uint16_t
)
data
;
status
=
e1000_write_ich8_data
(
hw
,
index
,
1
,
word
);
return
status
;
}
/******************************************************************************
* Reads a word from the NVM using the ICH8 flash access registers.
*
* hw - pointer to e1000_hw structure
* index - The starting byte index of the word to read.
* data - Pointer to a word to store the value read.
*****************************************************************************/
int32_t
e1000_read_ich8_word
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint16_t
*
data
)
{
int32_t
status
=
E1000_SUCCESS
;
status
=
e1000_read_ich8_data
(
hw
,
index
,
2
,
data
);
return
status
;
}
/******************************************************************************
* Writes a word to the NVM using the ICH8 flash access registers.
*
* hw - pointer to e1000_hw structure
* index - The starting byte index of the word to read.
* data - The word to write to the NVM.
*****************************************************************************/
int32_t
e1000_write_ich8_word
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint16_t
data
)
{
int32_t
status
=
E1000_SUCCESS
;
status
=
e1000_write_ich8_data
(
hw
,
index
,
2
,
data
);
return
status
;
}
/******************************************************************************
* Erases the bank specified. Each bank is a 4k block. Segments are 0 based.
* segment N is 4096 * N + flash_reg_addr.
*
* hw - pointer to e1000_hw structure
* segment - 0 for first segment, 1 for second segment, etc.
*****************************************************************************/
int32_t
e1000_erase_ich8_4k_segment
(
struct
e1000_hw
*
hw
,
uint32_t
segment
)
{
union
ich8_hws_flash_status
hsfsts
;
union
ich8_hws_flash_ctrl
hsflctl
;
uint32_t
flash_linear_address
;
int32_t
count
=
0
;
int32_t
error
=
E1000_ERR_EEPROM
;
int32_t
iteration
,
seg_size
;
int32_t
sector_size
;
int32_t
j
=
0
;
int32_t
error_flag
=
0
;
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
/* Determine HW Sector size: Read BERASE bits of Hw flash Status register */
/* 00: The Hw sector is 256 bytes, hence we need to erase 16
* consecutive sectors. The start index for the nth Hw sector can be
* calculated as = segment * 4096 + n * 256
* 01: The Hw sector is 4K bytes, hence we need to erase 1 sector.
* The start index for the nth Hw sector can be calculated
* as = segment * 4096
* 10: Error condition
* 11: The Hw sector size is much bigger than the size asked to
* erase...error condition */
if
(
hsfsts
.
hsf_status
.
berasesz
==
0x0
)
{
/* Hw sector size 256 */
sector_size
=
seg_size
=
ICH8_FLASH_SEG_SIZE_256
;
iteration
=
ICH8_FLASH_SECTOR_SIZE
/
ICH8_FLASH_SEG_SIZE_256
;
}
else
if
(
hsfsts
.
hsf_status
.
berasesz
==
0x1
)
{
sector_size
=
seg_size
=
ICH8_FLASH_SEG_SIZE_4K
;
iteration
=
1
;
}
else
if
(
hsfsts
.
hsf_status
.
berasesz
==
0x3
)
{
sector_size
=
seg_size
=
ICH8_FLASH_SEG_SIZE_64K
;
iteration
=
1
;
}
else
{
return
error
;
}
for
(
j
=
0
;
j
<
iteration
;
j
++
)
{
do
{
count
++
;
/* Steps */
error
=
e1000_ich8_cycle_init
(
hw
);
if
(
error
!=
E1000_SUCCESS
)
{
error_flag
=
1
;
break
;
}
/* Write a value 11 (block Erase) in Flash Cycle field in Hw flash
* Control */
hsflctl
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
);
hsflctl
.
hsf_ctrl
.
flcycle
=
ICH8_CYCLE_ERASE
;
E1000_WRITE_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFCTL
,
hsflctl
.
regval
);
/* Write the last 24 bits of an index within the block into Flash
* Linear address field in Flash Address. This probably needs to
* be calculated here based off the on-chip segment size and the
* software segment size assumed (4K) */
/* TBD */
flash_linear_address
=
segment
*
sector_size
+
j
*
seg_size
;
flash_linear_address
&=
ICH8_FLASH_LINEAR_ADDR_MASK
;
flash_linear_address
+=
hw
->
flash_base_addr
;
E1000_WRITE_ICH8_REG
(
hw
,
ICH8_FLASH_FADDR
,
flash_linear_address
);
error
=
e1000_ich8_flash_cycle
(
hw
,
1000000
);
/* Check if FCERR is set to 1. If 1, clear it and try the whole
* sequence a few more times else Done */
if
(
error
==
E1000_SUCCESS
)
{
break
;
}
else
{
hsfsts
.
regval
=
E1000_READ_ICH8_REG16
(
hw
,
ICH8_FLASH_HSFSTS
);
if
(
hsfsts
.
hsf_status
.
flcerr
==
1
)
{
/* repeat for some time before giving up */
continue
;
}
else
if
(
hsfsts
.
hsf_status
.
flcdone
==
0
)
{
error_flag
=
1
;
break
;
}
}
}
while
((
count
<
ICH8_FLASH_CYCLE_REPEAT_COUNT
)
&&
!
error_flag
);
if
(
error_flag
==
1
)
break
;
}
if
(
error_flag
!=
1
)
error
=
E1000_SUCCESS
;
return
error
;
}
/******************************************************************************
*
* Reverse duplex setting without breaking the link.
*
* hw: Struct containing variables accessed by shared code
*
*****************************************************************************/
int32_t
e1000_duplex_reversal
(
struct
e1000_hw
*
hw
)
{
int32_t
ret_val
;
uint16_t
phy_data
;
if
(
hw
->
phy_type
!=
e1000_phy_igp_3
)
return
E1000_SUCCESS
;
ret_val
=
e1000_read_phy_reg
(
hw
,
PHY_CTRL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_data
^=
MII_CR_FULL_DUPLEX
;
ret_val
=
e1000_write_phy_reg
(
hw
,
PHY_CTRL
,
phy_data
);
if
(
ret_val
)
return
ret_val
;
ret_val
=
e1000_read_phy_reg
(
hw
,
IGP3E1000_PHY_MISC_CTRL
,
&
phy_data
);
if
(
ret_val
)
return
ret_val
;
phy_data
|=
IGP3_PHY_MISC_DUPLEX_MANUAL_SET
;
ret_val
=
e1000_write_phy_reg
(
hw
,
IGP3E1000_PHY_MISC_CTRL
,
phy_data
);
return
ret_val
;
}
int32_t
e1000_init_lcd_from_nvm_config_region
(
struct
e1000_hw
*
hw
,
uint32_t
cnf_base_addr
,
uint32_t
cnf_size
)
{
uint32_t
ret_val
=
E1000_SUCCESS
;
uint16_t
word_addr
,
reg_data
,
reg_addr
;
uint16_t
i
;
/* cnf_base_addr is in DWORD */
word_addr
=
(
uint16_t
)(
cnf_base_addr
<<
1
);
/* cnf_size is returned in size of dwords */
for
(
i
=
0
;
i
<
cnf_size
;
i
++
)
{
ret_val
=
e1000_read_eeprom
(
hw
,
(
word_addr
+
i
*
2
),
1
,
&
reg_data
);
if
(
ret_val
)
return
ret_val
;
ret_val
=
e1000_read_eeprom
(
hw
,
(
word_addr
+
i
*
2
+
1
),
1
,
&
reg_addr
);
if
(
ret_val
)
return
ret_val
;
ret_val
=
e1000_get_software_flag
(
hw
);
if
(
ret_val
!=
E1000_SUCCESS
)
return
ret_val
;
ret_val
=
e1000_write_phy_reg_ex
(
hw
,
(
uint32_t
)
reg_addr
,
reg_data
);
e1000_release_software_flag
(
hw
);
}
return
ret_val
;
}
int32_t
e1000_init_lcd_from_nvm
(
struct
e1000_hw
*
hw
)
{
uint32_t
reg_data
,
cnf_base_addr
,
cnf_size
,
ret_val
,
loop
;
if
(
hw
->
phy_type
!=
e1000_phy_igp_3
)
return
E1000_SUCCESS
;
/* Check if SW needs configure the PHY */
reg_data
=
E1000_READ_REG
(
hw
,
FEXTNVM
);
if
(
!
(
reg_data
&
FEXTNVM_SW_CONFIG
))
return
E1000_SUCCESS
;
/* Wait for basic configuration completes before proceeding*/
loop
=
0
;
do
{
reg_data
=
E1000_READ_REG
(
hw
,
STATUS
)
&
E1000_STATUS_LAN_INIT_DONE
;
udelay
(
100
);
loop
++
;
}
while
((
!
reg_data
)
&&
(
loop
<
50
));
/* Clear the Init Done bit for the next init event */
reg_data
=
E1000_READ_REG
(
hw
,
STATUS
);
reg_data
&=
~
E1000_STATUS_LAN_INIT_DONE
;
E1000_WRITE_REG
(
hw
,
STATUS
,
reg_data
);
/* Make sure HW does not configure LCD from PHY extended configuration
before SW configuration */
reg_data
=
E1000_READ_REG
(
hw
,
EXTCNF_CTRL
);
if
((
reg_data
&
E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE
)
==
0x0000
)
{
reg_data
=
E1000_READ_REG
(
hw
,
EXTCNF_SIZE
);
cnf_size
=
reg_data
&
E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH
;
cnf_size
>>=
16
;
if
(
cnf_size
)
{
reg_data
=
E1000_READ_REG
(
hw
,
EXTCNF_CTRL
);
cnf_base_addr
=
reg_data
&
E1000_EXTCNF_CTRL_EXT_CNF_POINTER
;
/* cnf_base_addr is in DWORD */
cnf_base_addr
>>=
16
;
/* Configure LCD from extended configuration region. */
ret_val
=
e1000_init_lcd_from_nvm_config_region
(
hw
,
cnf_base_addr
,
cnf_size
);
if
(
ret_val
)
return
ret_val
;
}
}
return
E1000_SUCCESS
;
}
drivers/net/e1000/e1000_hw.h
View file @
c0bc8721
...
...
@@ -62,6 +62,7 @@ typedef enum {
e1000_82572
,
e1000_82573
,
e1000_80003es2lan
,
e1000_ich8lan
,
e1000_num_macs
}
e1000_mac_type
;
...
...
@@ -70,6 +71,7 @@ typedef enum {
e1000_eeprom_spi
,
e1000_eeprom_microwire
,
e1000_eeprom_flash
,
e1000_eeprom_ich8
,
e1000_eeprom_none
,
/* No NVM support */
e1000_num_eeprom_types
}
e1000_eeprom_type
;
...
...
@@ -98,6 +100,11 @@ typedef enum {
e1000_fc_default
=
0xFF
}
e1000_fc_type
;
struct
e1000_shadow_ram
{
uint16_t
eeprom_word
;
boolean_t
modified
;
};
/* PCI bus types */
typedef
enum
{
e1000_bus_type_unknown
=
0
,
...
...
@@ -218,6 +225,8 @@ typedef enum {
e1000_phy_igp
,
e1000_phy_igp_2
,
e1000_phy_gg82563
,
e1000_phy_igp_3
,
e1000_phy_ife
,
e1000_phy_undefined
=
0xFF
}
e1000_phy_type
;
...
...
@@ -313,6 +322,10 @@ int32_t e1000_read_phy_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *phy
int32_t
e1000_write_phy_reg
(
struct
e1000_hw
*
hw
,
uint32_t
reg_addr
,
uint16_t
data
);
int32_t
e1000_phy_hw_reset
(
struct
e1000_hw
*
hw
);
int32_t
e1000_phy_reset
(
struct
e1000_hw
*
hw
);
void
e1000_phy_powerdown_workaround
(
struct
e1000_hw
*
hw
);
int32_t
e1000_kumeran_lock_loss_workaround
(
struct
e1000_hw
*
hw
);
int32_t
e1000_init_lcd_from_nvm_config_region
(
struct
e1000_hw
*
hw
,
uint32_t
cnf_base_addr
,
uint32_t
cnf_size
);
int32_t
e1000_init_lcd_from_nvm
(
struct
e1000_hw
*
hw
);
int32_t
e1000_phy_get_info
(
struct
e1000_hw
*
hw
,
struct
e1000_phy_info
*
phy_info
);
int32_t
e1000_validate_mdi_setting
(
struct
e1000_hw
*
hw
);
int32_t
e1000_read_kmrn_reg
(
struct
e1000_hw
*
hw
,
uint32_t
reg_addr
,
uint16_t
*
data
);
...
...
@@ -331,6 +344,7 @@ uint32_t e1000_enable_mng_pass_thru(struct e1000_hw *hw);
#define E1000_MNG_DHCP_COOKIE_OFFSET 0x6F0
/* Cookie offset */
#define E1000_MNG_DHCP_COOKIE_LENGTH 0x10
/* Cookie length */
#define E1000_MNG_IAMT_MODE 0x3
#define E1000_MNG_ICH_IAMT_MODE 0x2
#define E1000_IAMT_SIGNATURE 0x544D4149
/* Intel(R) Active Management Technology signature */
#define E1000_MNG_DHCP_COOKIE_STATUS_PARSING_SUPPORT 0x1
/* DHCP parsing enabled */
...
...
@@ -388,6 +402,8 @@ int32_t e1000_read_part_num(struct e1000_hw *hw, uint32_t * part_num);
int32_t
e1000_read_mac_addr
(
struct
e1000_hw
*
hw
);
int32_t
e1000_swfw_sync_acquire
(
struct
e1000_hw
*
hw
,
uint16_t
mask
);
void
e1000_swfw_sync_release
(
struct
e1000_hw
*
hw
,
uint16_t
mask
);
void
e1000_release_software_flag
(
struct
e1000_hw
*
hw
);
int32_t
e1000_get_software_flag
(
struct
e1000_hw
*
hw
);
/* Filters (multicast, vlan, receive) */
void
e1000_mc_addr_list_update
(
struct
e1000_hw
*
hw
,
uint8_t
*
mc_addr_list
,
uint32_t
mc_addr_count
,
uint32_t
pad
,
uint32_t
rar_used_count
);
...
...
@@ -401,6 +417,7 @@ int32_t e1000_setup_led(struct e1000_hw *hw);
int32_t
e1000_cleanup_led
(
struct
e1000_hw
*
hw
);
int32_t
e1000_led_on
(
struct
e1000_hw
*
hw
);
int32_t
e1000_led_off
(
struct
e1000_hw
*
hw
);
int32_t
e1000_blink_led_start
(
struct
e1000_hw
*
hw
);
/* Adaptive IFS Functions */
...
...
@@ -422,6 +439,29 @@ int32_t e1000_disable_pciex_master(struct e1000_hw *hw);
int32_t
e1000_get_software_semaphore
(
struct
e1000_hw
*
hw
);
void
e1000_release_software_semaphore
(
struct
e1000_hw
*
hw
);
int32_t
e1000_check_phy_reset_block
(
struct
e1000_hw
*
hw
);
int32_t
e1000_set_pci_ex_no_snoop
(
struct
e1000_hw
*
hw
,
uint32_t
no_snoop
);
int32_t
e1000_read_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
*
data
);
int32_t
e1000_verify_write_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
byte
);
int32_t
e1000_write_ich8_byte
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint8_t
byte
);
int32_t
e1000_read_ich8_word
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint16_t
*
data
);
int32_t
e1000_read_ich8_data
(
struct
e1000_hw
*
hw
,
uint32_t
index
,
uint32_t
size
,
uint16_t
*
data
);
int32_t
e1000_read_eeprom_ich8
(
struct
e1000_hw
*
hw
,
uint16_t
offset
,
uint16_t
words
,
uint16_t
*
data
);
int32_t
e1000_write_eeprom_ich8
(
struct
e1000_hw
*
hw
,
uint16_t
offset
,
uint16_t
words
,
uint16_t
*
data
);
int32_t
e1000_erase_ich8_4k_segment
(
struct
e1000_hw
*
hw
,
uint32_t
segment
);
#define E1000_READ_REG_IO(a, reg) \
e1000_read_reg_io((a), E1000_##reg)
#define E1000_WRITE_REG_IO(a, reg, val) \
e1000_write_reg_io((a), E1000_##reg, val)
/* PCI Device IDs */
#define E1000_DEV_ID_82542 0x1000
...
...
@@ -446,6 +486,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
#define E1000_DEV_ID_82546EB_QUAD_COPPER 0x101D
#define E1000_DEV_ID_82541EI 0x1013
#define E1000_DEV_ID_82541EI_MOBILE 0x1018
#define E1000_DEV_ID_82541ER_LOM 0x1014
#define E1000_DEV_ID_82541ER 0x1078
#define E1000_DEV_ID_82547GI 0x1075
#define E1000_DEV_ID_82541GI 0x1076
...
...
@@ -457,18 +498,28 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
#define E1000_DEV_ID_82546GB_PCIE 0x108A
#define E1000_DEV_ID_82546GB_QUAD_COPPER 0x1099
#define E1000_DEV_ID_82547EI 0x1019
#define E1000_DEV_ID_82547EI_MOBILE 0x101A
#define E1000_DEV_ID_82571EB_COPPER 0x105E
#define E1000_DEV_ID_82571EB_FIBER 0x105F
#define E1000_DEV_ID_82571EB_SERDES 0x1060
#define E1000_DEV_ID_82572EI_COPPER 0x107D
#define E1000_DEV_ID_82572EI_FIBER 0x107E
#define E1000_DEV_ID_82572EI_SERDES 0x107F
#define E1000_DEV_ID_82572EI 0x10B9
#define E1000_DEV_ID_82573E 0x108B
#define E1000_DEV_ID_82573E_IAMT 0x108C
#define E1000_DEV_ID_82573L 0x109A
#define E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3 0x10B5
#define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096
#define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098
#define E1000_DEV_ID_80003ES2LAN_COPPER_SPT 0x10BA
#define E1000_DEV_ID_80003ES2LAN_SERDES_SPT 0x10BB
#define E1000_DEV_ID_ICH8_IGP_M_AMT 0x1049
#define E1000_DEV_ID_ICH8_IGP_AMT 0x104A
#define E1000_DEV_ID_ICH8_IGP_C 0x104B
#define E1000_DEV_ID_ICH8_IFE 0x104C
#define E1000_DEV_ID_ICH8_IGP_M 0x104D
#define NODE_ADDRESS_SIZE 6
...
...
@@ -539,6 +590,14 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
E1000_IMS_RXSEQ | \
E1000_IMS_LSC)
/* Additional interrupts need to be handled for e1000_ich8lan:
DSW = The FW changed the status of the DISSW bit in FWSM
PHYINT = The LAN connected device generates an interrupt
EPRST = Manageability reset event */
#define IMS_ICH8LAN_ENABLE_MASK (\
E1000_IMS_DSW | \
E1000_IMS_PHYINT | \
E1000_IMS_EPRST)
/* Number of high/low register pairs in the RAR. The RAR (Receive Address
* Registers) holds the directed and multicast addresses that we monitor. We
...
...
@@ -546,6 +605,7 @@ int32_t e1000_check_phy_reset_block(struct e1000_hw *hw);
* E1000_RAR_ENTRIES - 1 multicast addresses.
*/
#define E1000_RAR_ENTRIES 15
#define E1000_RAR_ENTRIES_ICH8LAN 7
#define MIN_NUMBER_OF_DESCRIPTORS 8
#define MAX_NUMBER_OF_DESCRIPTORS 0xFFF8
...
...
@@ -767,6 +827,9 @@ struct e1000_data_desc {
#define E1000_MC_TBL_SIZE 128
/* Multicast Filter Table (4096 bits) */
#define E1000_VLAN_FILTER_TBL_SIZE 128
/* VLAN Filter Table (4096 bits) */
#define E1000_NUM_UNICAST_ICH8LAN 7
#define E1000_MC_TBL_SIZE_ICH8LAN 32
/* Receive Address Register */
struct
e1000_rar
{
...
...
@@ -776,6 +839,7 @@ struct e1000_rar {
/* Number of entries in the Multicast Table Array (MTA). */
#define E1000_NUM_MTA_REGISTERS 128
#define E1000_NUM_MTA_REGISTERS_ICH8LAN 32
/* IPv4 Address Table Entry */
struct
e1000_ipv4_at_entry
{
...
...
@@ -786,6 +850,7 @@ struct e1000_ipv4_at_entry {
/* Four wakeup IP addresses are supported */
#define E1000_WAKEUP_IP_ADDRESS_COUNT_MAX 4
#define E1000_IP4AT_SIZE E1000_WAKEUP_IP_ADDRESS_COUNT_MAX
#define E1000_IP4AT_SIZE_ICH8LAN 3
#define E1000_IP6AT_SIZE 1
/* IPv6 Address Table Entry */
...
...
@@ -844,6 +909,7 @@ struct e1000_ffvt_entry {
#define E1000_FLA 0x0001C
/* Flash Access - RW */
#define E1000_MDIC 0x00020
/* MDI Control - RW */
#define E1000_SCTL 0x00024
/* SerDes Control - RW */
#define E1000_FEXTNVM 0x00028
/* Future Extended NVM register */
#define E1000_FCAL 0x00028
/* Flow Control Address Low - RW */
#define E1000_FCAH 0x0002C
/* Flow Control Address High -RW */
#define E1000_FCT 0x00030
/* Flow Control Type - RW */
...
...
@@ -872,6 +938,8 @@ struct e1000_ffvt_entry {
#define E1000_LEDCTL 0x00E00
/* LED Control - RW */
#define E1000_EXTCNF_CTRL 0x00F00
/* Extended Configuration Control */
#define E1000_EXTCNF_SIZE 0x00F08
/* Extended Configuration Size */
#define E1000_PHY_CTRL 0x00F10
/* PHY Control Register in CSR */
#define FEXTNVM_SW_CONFIG 0x0001
#define E1000_PBA 0x01000
/* Packet Buffer Allocation - RW */
#define E1000_PBS 0x01008
/* Packet Buffer Size */
#define E1000_EEMNGCTL 0x01010
/* MNG EEprom Control */
...
...
@@ -899,11 +967,13 @@ struct e1000_ffvt_entry {
#define E1000_RDH0 E1000_RDH
/* RX Desc Head (0) - RW */
#define E1000_RDT0 E1000_RDT
/* RX Desc Tail (0) - RW */
#define E1000_RDTR0 E1000_RDTR
/* RX Delay Timer (0) - RW */
#define E1000_RXDCTL 0x02828
/* RX Descriptor Control - RW */
#define E1000_RXDCTL 0x02828
/* RX Descriptor Control queue 0 - RW */
#define E1000_RXDCTL1 0x02928
/* RX Descriptor Control queue 1 - RW */
#define E1000_RADV 0x0282C
/* RX Interrupt Absolute Delay Timer - RW */
#define E1000_RSRPD 0x02C00
/* RX Small Packet Detect - RW */
#define E1000_RAID 0x02C08
/* Receive Ack Interrupt Delay - RW */
#define E1000_TXDMAC 0x03000
/* TX DMA Control - RW */
#define E1000_KABGTXD 0x03004
/* AFE Band Gap Transmit Ref Data */
#define E1000_TDFH 0x03410
/* TX Data FIFO Head - RW */
#define E1000_TDFT 0x03418
/* TX Data FIFO Tail - RW */
#define E1000_TDFHS 0x03420
/* TX Data FIFO Head Saved - RW */
...
...
@@ -1050,6 +1120,7 @@ struct e1000_ffvt_entry {
#define E1000_82542_FLA E1000_FLA
#define E1000_82542_MDIC E1000_MDIC
#define E1000_82542_SCTL E1000_SCTL
#define E1000_82542_FEXTNVM E1000_FEXTNVM
#define E1000_82542_FCAL E1000_FCAL
#define E1000_82542_FCAH E1000_FCAH
#define E1000_82542_FCT E1000_FCT
...
...
@@ -1073,6 +1144,19 @@ struct e1000_ffvt_entry {
#define E1000_82542_RDLEN0 E1000_82542_RDLEN
#define E1000_82542_RDH0 E1000_82542_RDH
#define E1000_82542_RDT0 E1000_82542_RDT
#define E1000_82542_SRRCTL(_n) (0x280C + ((_n) << 8))
/* Split and Replication
* RX Control - RW */
#define E1000_82542_DCA_RXCTRL(_n) (0x02814 + ((_n) << 8))
#define E1000_82542_RDBAH3 0x02B04
/* RX Desc Base High Queue 3 - RW */
#define E1000_82542_RDBAL3 0x02B00
/* RX Desc Low Queue 3 - RW */
#define E1000_82542_RDLEN3 0x02B08
/* RX Desc Length Queue 3 - RW */
#define E1000_82542_RDH3 0x02B10
/* RX Desc Head Queue 3 - RW */
#define E1000_82542_RDT3 0x02B18
/* RX Desc Tail Queue 3 - RW */
#define E1000_82542_RDBAL2 0x02A00
/* RX Desc Base Low Queue 2 - RW */
#define E1000_82542_RDBAH2 0x02A04
/* RX Desc Base High Queue 2 - RW */
#define E1000_82542_RDLEN2 0x02A08
/* RX Desc Length Queue 2 - RW */
#define E1000_82542_RDH2 0x02A10
/* RX Desc Head Queue 2 - RW */
#define E1000_82542_RDT2 0x02A18
/* RX Desc Tail Queue 2 - RW */
#define E1000_82542_RDTR1 0x00130
#define E1000_82542_RDBAL1 0x00138
#define E1000_82542_RDBAH1 0x0013C
...
...
@@ -1110,11 +1194,14 @@ struct e1000_ffvt_entry {
#define E1000_82542_FLOP E1000_FLOP
#define E1000_82542_EXTCNF_CTRL E1000_EXTCNF_CTRL
#define E1000_82542_EXTCNF_SIZE E1000_EXTCNF_SIZE
#define E1000_82542_PHY_CTRL E1000_PHY_CTRL
#define E1000_82542_ERT E1000_ERT
#define E1000_82542_RXDCTL E1000_RXDCTL
#define E1000_82542_RXDCTL1 E1000_RXDCTL1
#define E1000_82542_RADV E1000_RADV
#define E1000_82542_RSRPD E1000_RSRPD
#define E1000_82542_TXDMAC E1000_TXDMAC
#define E1000_82542_KABGTXD E1000_KABGTXD
#define E1000_82542_TDFHS E1000_TDFHS
#define E1000_82542_TDFTS E1000_TDFTS
#define E1000_82542_TDFPC E1000_TDFPC
...
...
@@ -1310,13 +1397,16 @@ struct e1000_hw_stats {
/* Structure containing variables used by the shared code (e1000_hw.c) */
struct
e1000_hw
{
uint8_t
__iomem
*
hw_addr
;
uint8_t
*
hw_addr
;
uint8_t
*
flash_address
;
e1000_mac_type
mac_type
;
e1000_phy_type
phy_type
;
uint32_t
phy_init_script
;
e1000_media_type
media_type
;
void
*
back
;
struct
e1000_shadow_ram
*
eeprom_shadow_ram
;
uint32_t
flash_bank_size
;
uint32_t
flash_base_addr
;
e1000_fc_type
fc
;
e1000_bus_speed
bus_speed
;
e1000_bus_width
bus_width
;
...
...
@@ -1328,6 +1418,7 @@ struct e1000_hw {
uint32_t
asf_firmware_present
;
uint32_t
eeprom_semaphore_present
;
uint32_t
swfw_sync_present
;
uint32_t
swfwhw_semaphore_present
;
unsigned
long
io_base
;
uint32_t
phy_id
;
uint32_t
phy_revision
;
...
...
@@ -1387,6 +1478,7 @@ struct e1000_hw {
boolean_t
in_ifs_mode
;
boolean_t
mng_reg_access_disabled
;
boolean_t
leave_av_bit_off
;
boolean_t
kmrn_lock_loss_workaround_disabled
;
};
...
...
@@ -1435,6 +1527,7 @@ struct e1000_hw {
#define E1000_CTRL_RTE 0x20000000
/* Routing tag enable */
#define E1000_CTRL_VME 0x40000000
/* IEEE VLAN mode enable */
#define E1000_CTRL_PHY_RST 0x80000000
/* PHY Reset */
#define E1000_CTRL_SW2FW_INT 0x02000000
/* Initiate an interrupt to manageability engine */
/* Device Status */
#define E1000_STATUS_FD 0x00000001
/* Full duplex.0=half,1=full */
...
...
@@ -1449,6 +1542,8 @@ struct e1000_hw {
#define E1000_STATUS_SPEED_10 0x00000000
/* Speed 10Mb/s */
#define E1000_STATUS_SPEED_100 0x00000040
/* Speed 100Mb/s */
#define E1000_STATUS_SPEED_1000 0x00000080
/* Speed 1000Mb/s */
#define E1000_STATUS_LAN_INIT_DONE 0x00000200
/* Lan Init Completion
by EEPROM/Flash */
#define E1000_STATUS_ASDV 0x00000300
/* Auto speed detect value */
#define E1000_STATUS_DOCK_CI 0x00000800
/* Change in Dock/Undock state. Clear on write '0'. */
#define E1000_STATUS_GIO_MASTER_ENABLE 0x00080000
/* Status of Master requests. */
...
...
@@ -1506,6 +1601,10 @@ struct e1000_hw {
#define E1000_STM_OPCODE 0xDB00
#define E1000_HICR_FW_RESET 0xC0
#define E1000_SHADOW_RAM_WORDS 2048
#define E1000_ICH8_NVM_SIG_WORD 0x13
#define E1000_ICH8_NVM_SIG_MASK 0xC0
/* EEPROM Read */
#define E1000_EERD_START 0x00000001
/* Start Read */
#define E1000_EERD_DONE 0x00000010
/* Read Done */
...
...
@@ -1551,7 +1650,6 @@ struct e1000_hw {
#define E1000_CTRL_EXT_WR_WMARK_320 0x01000000
#define E1000_CTRL_EXT_WR_WMARK_384 0x02000000
#define E1000_CTRL_EXT_WR_WMARK_448 0x03000000
#define E1000_CTRL_EXT_CANC 0x04000000
/* Interrupt delay cancellation */
#define E1000_CTRL_EXT_DRV_LOAD 0x10000000
/* Driver loaded bit for FW */
#define E1000_CTRL_EXT_IAME 0x08000000
/* Interrupt acknowledge Auto-mask */
#define E1000_CTRL_EXT_INT_TIMER_CLR 0x20000000
/* Clear Interrupt timers after IMS clear */
...
...
@@ -1591,12 +1689,31 @@ struct e1000_hw {
#define E1000_KUMCTRLSTA_FIFO_CTRL_TX_BYPASS 0x00000800
/* In-Band Control */
#define E1000_KUMCTRLSTA_INB_CTRL_LINK_STATUS_TX_TIMEOUT_DEFAULT 0x00000500
#define E1000_KUMCTRLSTA_INB_CTRL_DIS_PADDING 0x00000010
/* Half-Duplex Control */
#define E1000_KUMCTRLSTA_HD_CTRL_10_100_DEFAULT 0x00000004
#define E1000_KUMCTRLSTA_HD_CTRL_1000_DEFAULT 0x00000000
#define E1000_KUMCTRLSTA_OFFSET_K0S_CTRL 0x0000001E
#define E1000_KUMCTRLSTA_DIAG_FELPBK 0x2000
#define E1000_KUMCTRLSTA_DIAG_NELPBK 0x1000
#define E1000_KUMCTRLSTA_K0S_100_EN 0x2000
#define E1000_KUMCTRLSTA_K0S_GBE_EN 0x1000
#define E1000_KUMCTRLSTA_K0S_ENTRY_LATENCY_MASK 0x0003
#define E1000_KABGTXD_BGSQLBIAS 0x00050000
#define E1000_PHY_CTRL_SPD_EN 0x00000001
#define E1000_PHY_CTRL_D0A_LPLU 0x00000002
#define E1000_PHY_CTRL_NOND0A_LPLU 0x00000004
#define E1000_PHY_CTRL_NOND0A_GBE_DISABLE 0x00000008
#define E1000_PHY_CTRL_GBE_DISABLE 0x00000040
#define E1000_PHY_CTRL_B2B_EN 0x00000080
/* LED Control */
#define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F
#define E1000_LEDCTL_LED0_MODE_SHIFT 0
...
...
@@ -1666,6 +1783,9 @@ struct e1000_hw {
#define E1000_ICR_RXD_FIFO_PAR1 0x01000000
/* queue 1 Rx descriptor FIFO parity error */
#define E1000_ICR_TXD_FIFO_PAR1 0x02000000
/* queue 1 Tx descriptor FIFO parity error */
#define E1000_ICR_ALL_PARITY 0x03F00000
/* all parity error bits */
#define E1000_ICR_DSW 0x00000020
/* FW changed the status of DISSW bit in the FWSM */
#define E1000_ICR_PHYINT 0x00001000
/* LAN connected device generates an interrupt */
#define E1000_ICR_EPRST 0x00100000
/* ME handware reset occurs */
/* Interrupt Cause Set */
#define E1000_ICS_TXDW E1000_ICR_TXDW
/* Transmit desc written back */
...
...
@@ -1692,6 +1812,9 @@ struct e1000_hw {
#define E1000_ICS_PB_PAR E1000_ICR_PB_PAR
/* packet buffer parity error */
#define E1000_ICS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1
/* queue 1 Rx descriptor FIFO parity error */
#define E1000_ICS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1
/* queue 1 Tx descriptor FIFO parity error */
#define E1000_ICS_DSW E1000_ICR_DSW
#define E1000_ICS_PHYINT E1000_ICR_PHYINT
#define E1000_ICS_EPRST E1000_ICR_EPRST
/* Interrupt Mask Set */
#define E1000_IMS_TXDW E1000_ICR_TXDW
/* Transmit desc written back */
...
...
@@ -1718,6 +1841,9 @@ struct e1000_hw {
#define E1000_IMS_PB_PAR E1000_ICR_PB_PAR
/* packet buffer parity error */
#define E1000_IMS_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1
/* queue 1 Rx descriptor FIFO parity error */
#define E1000_IMS_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1
/* queue 1 Tx descriptor FIFO parity error */
#define E1000_IMS_DSW E1000_ICR_DSW
#define E1000_IMS_PHYINT E1000_ICR_PHYINT
#define E1000_IMS_EPRST E1000_ICR_EPRST
/* Interrupt Mask Clear */
#define E1000_IMC_TXDW E1000_ICR_TXDW
/* Transmit desc written back */
...
...
@@ -1744,6 +1870,9 @@ struct e1000_hw {
#define E1000_IMC_PB_PAR E1000_ICR_PB_PAR
/* packet buffer parity error */
#define E1000_IMC_RXD_FIFO_PAR1 E1000_ICR_RXD_FIFO_PAR1
/* queue 1 Rx descriptor FIFO parity error */
#define E1000_IMC_TXD_FIFO_PAR1 E1000_ICR_TXD_FIFO_PAR1
/* queue 1 Tx descriptor FIFO parity error */
#define E1000_IMC_DSW E1000_ICR_DSW
#define E1000_IMC_PHYINT E1000_ICR_PHYINT
#define E1000_IMC_EPRST E1000_ICR_EPRST
/* Receive Control */
#define E1000_RCTL_RST 0x00000001
/* Software reset */
...
...
@@ -1918,9 +2047,10 @@ struct e1000_hw {
#define E1000_MRQC_RSS_FIELD_MASK 0xFFFF0000
#define E1000_MRQC_RSS_FIELD_IPV4_TCP 0x00010000
#define E1000_MRQC_RSS_FIELD_IPV4 0x00020000
#define E1000_MRQC_RSS_FIELD_IPV6_TCP
0x00040000
#define E1000_MRQC_RSS_FIELD_IPV6_TCP
_EX
0x00040000
#define E1000_MRQC_RSS_FIELD_IPV6_EX 0x00080000
#define E1000_MRQC_RSS_FIELD_IPV6 0x00100000
#define E1000_MRQC_RSS_FIELD_IPV6_TCP 0x00200000
/* Definitions for power management and wakeup registers */
/* Wake Up Control */
...
...
@@ -2010,6 +2140,15 @@ struct e1000_hw {
#define E1000_FWSM_MODE_SHIFT 1
#define E1000_FWSM_FW_VALID 0x00008000
/* FW established a valid mode */
#define E1000_FWSM_RSPCIPHY 0x00000040
/* Reset PHY on PCI reset */
#define E1000_FWSM_DISSW 0x10000000
/* FW disable SW Write Access */
#define E1000_FWSM_SKUSEL_MASK 0x60000000
/* LAN SKU select */
#define E1000_FWSM_SKUEL_SHIFT 29
#define E1000_FWSM_SKUSEL_EMB 0x0
/* Embedded SKU */
#define E1000_FWSM_SKUSEL_CONS 0x1
/* Consumer SKU */
#define E1000_FWSM_SKUSEL_PERF_100 0x2
/* Perf & Corp 10/100 SKU */
#define E1000_FWSM_SKUSEL_PERF_GBE 0x3
/* Perf & Copr GbE SKU */
/* FFLT Debug Register */
#define E1000_FFLT_DBG_INVC 0x00100000
/* Invalid /C/ code handling */
...
...
@@ -2082,6 +2221,8 @@ struct e1000_host_command_info {
E1000_GCR_TXDSCW_NO_SNOOP | \
E1000_GCR_TXDSCR_NO_SNOOP)
#define PCI_EX_82566_SNOOP_ALL PCI_EX_NO_SNOOP_ALL
#define E1000_GCR_L1_ACT_WITHOUT_L0S_RX 0x08000000
/* Function Active and Power State to MNG */
#define E1000_FACTPS_FUNC0_POWER_STATE_MASK 0x00000003
...
...
@@ -2140,8 +2281,10 @@ struct e1000_host_command_info {
#define EEPROM_PHY_CLASS_WORD 0x0007
#define EEPROM_INIT_CONTROL1_REG 0x000A
#define EEPROM_INIT_CONTROL2_REG 0x000F
#define EEPROM_SWDEF_PINS_CTRL_PORT_1 0x0010
#define EEPROM_INIT_CONTROL3_PORT_B 0x0014
#define EEPROM_INIT_3GIO_3 0x001A
#define EEPROM_SWDEF_PINS_CTRL_PORT_0 0x0020
#define EEPROM_INIT_CONTROL3_PORT_A 0x0024
#define EEPROM_CFG 0x0012
#define EEPROM_FLASH_VERSION 0x0032
...
...
@@ -2153,10 +2296,16 @@ struct e1000_host_command_info {
/* Word definitions for ID LED Settings */
#define ID_LED_RESERVED_0000 0x0000
#define ID_LED_RESERVED_FFFF 0xFFFF
#define ID_LED_RESERVED_82573 0xF746
#define ID_LED_DEFAULT_82573 0x1811
#define ID_LED_DEFAULT ((ID_LED_OFF1_ON2 << 12) | \
(ID_LED_OFF1_OFF2 << 8) | \
(ID_LED_DEF1_DEF2 << 4) | \
(ID_LED_DEF1_DEF2))
#define ID_LED_DEFAULT_ICH8LAN ((ID_LED_DEF1_DEF2 << 12) | \
(ID_LED_DEF1_OFF2 << 8) | \
(ID_LED_DEF1_ON2 << 4) | \
(ID_LED_DEF1_DEF2))
#define ID_LED_DEF1_DEF2 0x1
#define ID_LED_DEF1_ON2 0x2
#define ID_LED_DEF1_OFF2 0x3
...
...
@@ -2191,6 +2340,11 @@ struct e1000_host_command_info {
#define EEPROM_WORD0F_ASM_DIR 0x2000
#define EEPROM_WORD0F_ANE 0x0800
#define EEPROM_WORD0F_SWPDIO_EXT 0x00F0
#define EEPROM_WORD0F_LPLU 0x0001
/* Mask bits for fields in Word 0x10/0x20 of the EEPROM */
#define EEPROM_WORD1020_GIGA_DISABLE 0x0010
#define EEPROM_WORD1020_GIGA_DISABLE_NON_D0A 0x0008
/* Mask bits for fields in Word 0x1a of the EEPROM */
#define EEPROM_WORD1A_ASPM_MASK 0x000C
...
...
@@ -2265,23 +2419,29 @@ struct e1000_host_command_info {
#define E1000_EXTCNF_CTRL_D_UD_OWNER 0x00000010
#define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020
#define E1000_EXTCNF_CTRL_MDIO_HW_OWNERSHIP 0x00000040
#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x
1
FFF0000
#define E1000_EXTCNF_CTRL_EXT_CNF_POINTER 0x
0
FFF0000
#define E1000_EXTCNF_SIZE_EXT_PHY_LENGTH 0x000000FF
#define E1000_EXTCNF_SIZE_EXT_DOCK_LENGTH 0x0000FF00
#define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH 0x00FF0000
#define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001
#define E1000_EXTCNF_CTRL_SWFLAG 0x00000020
/* PBA constants */
#define E1000_PBA_8K 0x0008
/* 8KB, default Rx allocation */
#define E1000_PBA_12K 0x000C
/* 12KB, default Rx allocation */
#define E1000_PBA_16K 0x0010
/* 16KB, default TX allocation */
#define E1000_PBA_22K 0x0016
#define E1000_PBA_24K 0x0018
#define E1000_PBA_30K 0x001E
#define E1000_PBA_32K 0x0020
#define E1000_PBA_34K 0x0022
#define E1000_PBA_38K 0x0026
#define E1000_PBA_40K 0x0028
#define E1000_PBA_48K 0x0030
/* 48KB, default RX allocation */
#define E1000_PBS_16K E1000_PBA_16K
/* Flow Control Constants */
#define FLOW_CONTROL_ADDRESS_LOW 0x00C28001
#define FLOW_CONTROL_ADDRESS_HIGH 0x00000100
...
...
@@ -2336,7 +2496,7 @@ struct e1000_host_command_info {
/* Number of milliseconds we wait for Eeprom auto read bit done after MAC reset */
#define AUTO_READ_DONE_TIMEOUT 10
/* Number of milliseconds we wait for PHY configuration done after MAC reset */
#define PHY_CFG_TIMEOUT
4
0
#define PHY_CFG_TIMEOUT
10
0
#define E1000_TX_BUFFER_SIZE ((uint32_t)1514)
...
...
@@ -2764,6 +2924,17 @@ struct e1000_host_command_info {
#define M88E1000_EPSCR_TX_CLK_25 0x0070
/* 25 MHz TX_CLK */
#define M88E1000_EPSCR_TX_CLK_0 0x0000
/* NO TX_CLK */
/* M88EC018 Rev 2 specific DownShift settings */
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_1X 0x0000
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_2X 0x0200
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_3X 0x0400
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_4X 0x0600
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_6X 0x0A00
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_7X 0x0C00
#define M88EC018_EPSCR_DOWNSHIFT_COUNTER_8X 0x0E00
/* IGP01E1000 Specific Port Config Register - R/W */
#define IGP01E1000_PSCFR_AUTO_MDIX_PAR_DETECT 0x0010
#define IGP01E1000_PSCFR_PRE_EN 0x0020
...
...
@@ -2990,6 +3161,221 @@ struct e1000_host_command_info {
#define L1LXT971A_PHY_ID 0x001378E0
#define GG82563_E_PHY_ID 0x01410CA0
/* Bits...
* 15-5: page
* 4-0: register offset
*/
#define PHY_PAGE_SHIFT 5
#define PHY_REG(page, reg) \
(((page) << PHY_PAGE_SHIFT) | ((reg) & MAX_PHY_REG_ADDRESS))
#define IGP3_PHY_PORT_CTRL \
PHY_REG(769, 17)
/* Port General Configuration */
#define IGP3_PHY_RATE_ADAPT_CTRL \
PHY_REG(769, 25)
/* Rate Adapter Control Register */
#define IGP3_KMRN_FIFO_CTRL_STATS \
PHY_REG(770, 16)
/* KMRN FIFO's control/status register */
#define IGP3_KMRN_POWER_MNG_CTRL \
PHY_REG(770, 17)
/* KMRN Power Management Control Register */
#define IGP3_KMRN_INBAND_CTRL \
PHY_REG(770, 18)
/* KMRN Inband Control Register */
#define IGP3_KMRN_DIAG \
PHY_REG(770, 19)
/* KMRN Diagnostic register */
#define IGP3_KMRN_DIAG_PCS_LOCK_LOSS 0x0002
/* RX PCS is not synced */
#define IGP3_KMRN_ACK_TIMEOUT \
PHY_REG(770, 20)
/* KMRN Acknowledge Timeouts register */
#define IGP3_VR_CTRL \
PHY_REG(776, 18)
/* Voltage regulator control register */
#define IGP3_VR_CTRL_MODE_SHUT 0x0200
/* Enter powerdown, shutdown VRs */
#define IGP3_CAPABILITY \
PHY_REG(776, 19)
/* IGP3 Capability Register */
/* Capabilities for SKU Control */
#define IGP3_CAP_INITIATE_TEAM 0x0001
/* Able to initiate a team */
#define IGP3_CAP_WFM 0x0002
/* Support WoL and PXE */
#define IGP3_CAP_ASF 0x0004
/* Support ASF */
#define IGP3_CAP_LPLU 0x0008
/* Support Low Power Link Up */
#define IGP3_CAP_DC_AUTO_SPEED 0x0010
/* Support AC/DC Auto Link Speed */
#define IGP3_CAP_SPD 0x0020
/* Support Smart Power Down */
#define IGP3_CAP_MULT_QUEUE 0x0040
/* Support 2 tx & 2 rx queues */
#define IGP3_CAP_RSS 0x0080
/* Support RSS */
#define IGP3_CAP_8021PQ 0x0100
/* Support 802.1Q & 802.1p */
#define IGP3_CAP_AMT_CB 0x0200
/* Support active manageability and circuit breaker */
#define IGP3_PPC_JORDAN_EN 0x0001
#define IGP3_PPC_JORDAN_GIGA_SPEED 0x0002
#define IGP3_KMRN_PMC_EE_IDLE_LINK_DIS 0x0001
#define IGP3_KMRN_PMC_K0S_ENTRY_LATENCY_MASK 0x001E
#define IGP3_KMRN_PMC_K0S_MODE1_EN_GIGA 0x0020
#define IGP3_KMRN_PMC_K0S_MODE1_EN_100 0x0040
#define IGP3E1000_PHY_MISC_CTRL 0x1B
/* Misc. Ctrl register */
#define IGP3_PHY_MISC_DUPLEX_MANUAL_SET 0x1000
/* Duplex Manual Set */
#define IGP3_KMRN_EXT_CTRL PHY_REG(770, 18)
#define IGP3_KMRN_EC_DIS_INBAND 0x0080
#define IGP03E1000_E_PHY_ID 0x02A80390
#define IFE_E_PHY_ID 0x02A80330
/* 10/100 PHY */
#define IFE_PLUS_E_PHY_ID 0x02A80320
#define IFE_C_E_PHY_ID 0x02A80310
#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10
/* 100BaseTx Extended Status, Control and Address */
#define IFE_PHY_SPECIAL_CONTROL 0x11
/* 100BaseTx PHY special control register */
#define IFE_PHY_RCV_FALSE_CARRIER 0x13
/* 100BaseTx Receive False Carrier Counter */
#define IFE_PHY_RCV_DISCONNECT 0x14
/* 100BaseTx Receive Disconnet Counter */
#define IFE_PHY_RCV_ERROT_FRAME 0x15
/* 100BaseTx Receive Error Frame Counter */
#define IFE_PHY_RCV_SYMBOL_ERR 0x16
/* Receive Symbol Error Counter */
#define IFE_PHY_PREM_EOF_ERR 0x17
/* 100BaseTx Receive Premature End Of Frame Error Counter */
#define IFE_PHY_RCV_EOF_ERR 0x18
/* 10BaseT Receive End Of Frame Error Counter */
#define IFE_PHY_TX_JABBER_DETECT 0x19
/* 10BaseT Transmit Jabber Detect Counter */
#define IFE_PHY_EQUALIZER 0x1A
/* PHY Equalizer Control and Status */
#define IFE_PHY_SPECIAL_CONTROL_LED 0x1B
/* PHY special control and LED configuration */
#define IFE_PHY_MDIX_CONTROL 0x1C
/* MDI/MDI-X Control register */
#define IFE_PHY_HWI_CONTROL 0x1D
/* Hardware Integrity Control (HWI) */
#define IFE_PESC_REDUCED_POWER_DOWN_DISABLE 0x2000
/* Defaut 1 = Disable auto reduced power down */
#define IFE_PESC_100BTX_POWER_DOWN 0x0400
/* Indicates the power state of 100BASE-TX */
#define IFE_PESC_10BTX_POWER_DOWN 0x0200
/* Indicates the power state of 10BASE-T */
#define IFE_PESC_POLARITY_REVERSED 0x0100
/* Indicates 10BASE-T polarity */
#define IFE_PESC_PHY_ADDR_MASK 0x007C
/* Bit 6:2 for sampled PHY address */
#define IFE_PESC_SPEED 0x0002
/* Auto-negotiation speed result 1=100Mbs, 0=10Mbs */
#define IFE_PESC_DUPLEX 0x0001
/* Auto-negotiation duplex result 1=Full, 0=Half */
#define IFE_PESC_POLARITY_REVERSED_SHIFT 8
#define IFE_PSC_DISABLE_DYNAMIC_POWER_DOWN 0x0100
/* 1 = Dyanmic Power Down disabled */
#define IFE_PSC_FORCE_POLARITY 0x0020
/* 1=Reversed Polarity, 0=Normal */
#define IFE_PSC_AUTO_POLARITY_DISABLE 0x0010
/* 1=Auto Polarity Disabled, 0=Enabled */
#define IFE_PSC_JABBER_FUNC_DISABLE 0x0001
/* 1=Jabber Disabled, 0=Normal Jabber Operation */
#define IFE_PSC_FORCE_POLARITY_SHIFT 5
#define IFE_PSC_AUTO_POLARITY_DISABLE_SHIFT 4
#define IFE_PMC_AUTO_MDIX 0x0080
/* 1=enable MDI/MDI-X feature, default 0=disabled */
#define IFE_PMC_FORCE_MDIX 0x0040
/* 1=force MDIX-X, 0=force MDI */
#define IFE_PMC_MDIX_STATUS 0x0020
/* 1=MDI-X, 0=MDI */
#define IFE_PMC_AUTO_MDIX_COMPLETE 0x0010
/* Resolution algorthm is completed */
#define IFE_PMC_MDIX_MODE_SHIFT 6
#define IFE_PHC_MDIX_RESET_ALL_MASK 0x0000
/* Disable auto MDI-X */
#define IFE_PHC_HWI_ENABLE 0x8000
/* Enable the HWI feature */
#define IFE_PHC_ABILITY_CHECK 0x4000
/* 1= Test Passed, 0=failed */
#define IFE_PHC_TEST_EXEC 0x2000
/* PHY launch test pulses on the wire */
#define IFE_PHC_HIGHZ 0x0200
/* 1 = Open Circuit */
#define IFE_PHC_LOWZ 0x0400
/* 1 = Short Circuit */
#define IFE_PHC_LOW_HIGH_Z_MASK 0x0600
/* Mask for indication type of problem on the line */
#define IFE_PHC_DISTANCE_MASK 0x01FF
/* Mask for distance to the cable problem, in 80cm granularity */
#define IFE_PHC_RESET_ALL_MASK 0x0000
/* Disable HWI */
#define IFE_PSCL_PROBE_MODE 0x0020
/* LED Probe mode */
#define IFE_PSCL_PROBE_LEDS_OFF 0x0006
/* Force LEDs 0 and 2 off */
#define IFE_PSCL_PROBE_LEDS_ON 0x0007
/* Force LEDs 0 and 2 on */
#define ICH8_FLASH_COMMAND_TIMEOUT 500
/* 500 ms , should be adjusted */
#define ICH8_FLASH_CYCLE_REPEAT_COUNT 10
/* 10 cycles , should be adjusted */
#define ICH8_FLASH_SEG_SIZE_256 256
#define ICH8_FLASH_SEG_SIZE_4K 4096
#define ICH8_FLASH_SEG_SIZE_64K 65536
#define ICH8_CYCLE_READ 0x0
#define ICH8_CYCLE_RESERVED 0x1
#define ICH8_CYCLE_WRITE 0x2
#define ICH8_CYCLE_ERASE 0x3
#define ICH8_FLASH_GFPREG 0x0000
#define ICH8_FLASH_HSFSTS 0x0004
#define ICH8_FLASH_HSFCTL 0x0006
#define ICH8_FLASH_FADDR 0x0008
#define ICH8_FLASH_FDATA0 0x0010
#define ICH8_FLASH_FRACC 0x0050
#define ICH8_FLASH_FREG0 0x0054
#define ICH8_FLASH_FREG1 0x0058
#define ICH8_FLASH_FREG2 0x005C
#define ICH8_FLASH_FREG3 0x0060
#define ICH8_FLASH_FPR0 0x0074
#define ICH8_FLASH_FPR1 0x0078
#define ICH8_FLASH_SSFSTS 0x0090
#define ICH8_FLASH_SSFCTL 0x0092
#define ICH8_FLASH_PREOP 0x0094
#define ICH8_FLASH_OPTYPE 0x0096
#define ICH8_FLASH_OPMENU 0x0098
#define ICH8_FLASH_REG_MAPSIZE 0x00A0
#define ICH8_FLASH_SECTOR_SIZE 4096
#define ICH8_GFPREG_BASE_MASK 0x1FFF
#define ICH8_FLASH_LINEAR_ADDR_MASK 0x00FFFFFF
/* ICH8 GbE Flash Hardware Sequencing Flash Status Register bit breakdown */
/* Offset 04h HSFSTS */
union
ich8_hws_flash_status
{
struct
ich8_hsfsts
{
#ifdef E1000_BIG_ENDIAN
uint16_t
reserved2
:
6
;
uint16_t
fldesvalid
:
1
;
uint16_t
flockdn
:
1
;
uint16_t
flcdone
:
1
;
uint16_t
flcerr
:
1
;
uint16_t
dael
:
1
;
uint16_t
berasesz
:
2
;
uint16_t
flcinprog
:
1
;
uint16_t
reserved1
:
2
;
#else
uint16_t
flcdone
:
1
;
/* bit 0 Flash Cycle Done */
uint16_t
flcerr
:
1
;
/* bit 1 Flash Cycle Error */
uint16_t
dael
:
1
;
/* bit 2 Direct Access error Log */
uint16_t
berasesz
:
2
;
/* bit 4:3 Block/Sector Erase Size */
uint16_t
flcinprog
:
1
;
/* bit 5 flash SPI cycle in Progress */
uint16_t
reserved1
:
2
;
/* bit 13:6 Reserved */
uint16_t
reserved2
:
6
;
/* bit 13:6 Reserved */
uint16_t
fldesvalid
:
1
;
/* bit 14 Flash Descriptor Valid */
uint16_t
flockdn
:
1
;
/* bit 15 Flash Configuration Lock-Down */
#endif
}
hsf_status
;
uint16_t
regval
;
};
/* ICH8 GbE Flash Hardware Sequencing Flash control Register bit breakdown */
/* Offset 06h FLCTL */
union
ich8_hws_flash_ctrl
{
struct
ich8_hsflctl
{
#ifdef E1000_BIG_ENDIAN
uint16_t
fldbcount
:
2
;
uint16_t
flockdn
:
6
;
uint16_t
flcgo
:
1
;
uint16_t
flcycle
:
2
;
uint16_t
reserved
:
5
;
#else
uint16_t
flcgo
:
1
;
/* 0 Flash Cycle Go */
uint16_t
flcycle
:
2
;
/* 2:1 Flash Cycle */
uint16_t
reserved
:
5
;
/* 7:3 Reserved */
uint16_t
fldbcount
:
2
;
/* 9:8 Flash Data Byte Count */
uint16_t
flockdn
:
6
;
/* 15:10 Reserved */
#endif
}
hsf_ctrl
;
uint16_t
regval
;
};
/* ICH8 Flash Region Access Permissions */
union
ich8_hws_flash_regacc
{
struct
ich8_flracc
{
#ifdef E1000_BIG_ENDIAN
uint32_t
gmwag
:
8
;
uint32_t
gmrag
:
8
;
uint32_t
grwa
:
8
;
uint32_t
grra
:
8
;
#else
uint32_t
grra
:
8
;
/* 0:7 GbE region Read Access */
uint32_t
grwa
:
8
;
/* 8:15 GbE region Write Access */
uint32_t
gmrag
:
8
;
/* 23:16 GbE Master Read Access Grant */
uint32_t
gmwag
:
8
;
/* 31:24 GbE Master Write Access Grant */
#endif
}
hsf_flregacc
;
uint16_t
regval
;
};
/* Miscellaneous PHY bit definitions. */
#define PHY_PREAMBLE 0xFFFFFFFF
#define PHY_SOF 0x01
...
...
drivers/net/e1000/e1000_main.c
View file @
c0bc8721
...
...
@@ -36,7 +36,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
#else
#define DRIVERNAPI "-NAPI"
#endif
#define DRV_VERSION "7.
0.38-k4
"DRIVERNAPI
#define DRV_VERSION "7.
1.9-k2
"DRIVERNAPI
char
e1000_driver_version
[]
=
DRV_VERSION
;
static
char
e1000_copyright
[]
=
"Copyright (c) 1999-2006 Intel Corporation."
;
...
...
@@ -73,6 +73,11 @@ static struct pci_device_id e1000_pci_tbl[] = {
INTEL_E1000_ETHERNET_DEVICE
(
0x1026
),
INTEL_E1000_ETHERNET_DEVICE
(
0x1027
),
INTEL_E1000_ETHERNET_DEVICE
(
0x1028
),
INTEL_E1000_ETHERNET_DEVICE
(
0x1049
),
INTEL_E1000_ETHERNET_DEVICE
(
0x104A
),
INTEL_E1000_ETHERNET_DEVICE
(
0x104B
),
INTEL_E1000_ETHERNET_DEVICE
(
0x104C
),
INTEL_E1000_ETHERNET_DEVICE
(
0x104D
),
INTEL_E1000_ETHERNET_DEVICE
(
0x105E
),
INTEL_E1000_ETHERNET_DEVICE
(
0x105F
),
INTEL_E1000_ETHERNET_DEVICE
(
0x1060
),
...
...
@@ -96,6 +101,8 @@ static struct pci_device_id e1000_pci_tbl[] = {
INTEL_E1000_ETHERNET_DEVICE
(
0x109A
),
INTEL_E1000_ETHERNET_DEVICE
(
0x10B5
),
INTEL_E1000_ETHERNET_DEVICE
(
0x10B9
),
INTEL_E1000_ETHERNET_DEVICE
(
0x10BA
),
INTEL_E1000_ETHERNET_DEVICE
(
0x10BB
),
/* required last entry */
{
0
,}
};
...
...
@@ -133,7 +140,6 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter,
static
void
e1000_set_multi
(
struct
net_device
*
netdev
);
static
void
e1000_update_phy_info
(
unsigned
long
data
);
static
void
e1000_watchdog
(
unsigned
long
data
);
static
void
e1000_watchdog_task
(
struct
e1000_adapter
*
adapter
);
static
void
e1000_82547_tx_fifo_stall
(
unsigned
long
data
);
static
int
e1000_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
);
static
struct
net_device_stats
*
e1000_get_stats
(
struct
net_device
*
netdev
);
...
...
@@ -178,8 +184,8 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid);
static
void
e1000_vlan_rx_kill_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
);
static
void
e1000_restore_vlan
(
struct
e1000_adapter
*
adapter
);
#ifdef CONFIG_PM
static
int
e1000_suspend
(
struct
pci_dev
*
pdev
,
pm_message_t
state
);
#ifdef CONFIG_PM
static
int
e1000_resume
(
struct
pci_dev
*
pdev
);
#endif
static
void
e1000_shutdown
(
struct
pci_dev
*
pdev
);
...
...
@@ -206,8 +212,8 @@ static struct pci_driver e1000_driver = {
.
probe
=
e1000_probe
,
.
remove
=
__devexit_p
(
e1000_remove
),
/* Power Managment Hooks */
#ifdef CONFIG_PM
.
suspend
=
e1000_suspend
,
#ifdef CONFIG_PM
.
resume
=
e1000_resume
,
#endif
.
shutdown
=
e1000_shutdown
,
...
...
@@ -261,6 +267,44 @@ e1000_exit_module(void)
module_exit
(
e1000_exit_module
);
static
int
e1000_request_irq
(
struct
e1000_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
int
flags
,
err
=
0
;
flags
=
IRQF_SHARED
;
#ifdef CONFIG_PCI_MSI
if
(
adapter
->
hw
.
mac_type
>
e1000_82547_rev_2
)
{
adapter
->
have_msi
=
TRUE
;
if
((
err
=
pci_enable_msi
(
adapter
->
pdev
)))
{
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate MSI interrupt Error: %d
\n
"
,
err
);
adapter
->
have_msi
=
FALSE
;
}
}
if
(
adapter
->
have_msi
)
flags
&=
~
SA_SHIRQ
;
#endif
if
((
err
=
request_irq
(
adapter
->
pdev
->
irq
,
&
e1000_intr
,
flags
,
netdev
->
name
,
netdev
)))
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate interrupt Error: %d
\n
"
,
err
);
return
err
;
}
static
void
e1000_free_irq
(
struct
e1000_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
free_irq
(
adapter
->
pdev
->
irq
,
netdev
);
#ifdef CONFIG_PCI_MSI
if
(
adapter
->
have_msi
)
pci_disable_msi
(
adapter
->
pdev
);
#endif
}
/**
* e1000_irq_disable - Mask off interrupt generation on the NIC
* @adapter: board private structure
...
...
@@ -329,6 +373,7 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
{
uint32_t
ctrl_ext
;
uint32_t
swsm
;
uint32_t
extcnf
;
/* Let firmware taken over control of h/w */
switch
(
adapter
->
hw
.
mac_type
)
{
...
...
@@ -343,6 +388,11 @@ e1000_release_hw_control(struct e1000_adapter *adapter)
swsm
=
E1000_READ_REG
(
&
adapter
->
hw
,
SWSM
);
E1000_WRITE_REG
(
&
adapter
->
hw
,
SWSM
,
swsm
&
~
E1000_SWSM_DRV_LOAD
);
case
e1000_ich8lan
:
extcnf
=
E1000_READ_REG
(
&
adapter
->
hw
,
CTRL_EXT
);
E1000_WRITE_REG
(
&
adapter
->
hw
,
CTRL_EXT
,
extcnf
&
~
E1000_CTRL_EXT_DRV_LOAD
);
break
;
default:
break
;
}
...
...
@@ -364,6 +414,7 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
{
uint32_t
ctrl_ext
;
uint32_t
swsm
;
uint32_t
extcnf
;
/* Let firmware know the driver has taken over */
switch
(
adapter
->
hw
.
mac_type
)
{
case
e1000_82571
:
...
...
@@ -378,6 +429,11 @@ e1000_get_hw_control(struct e1000_adapter *adapter)
E1000_WRITE_REG
(
&
adapter
->
hw
,
SWSM
,
swsm
|
E1000_SWSM_DRV_LOAD
);
break
;
case
e1000_ich8lan
:
extcnf
=
E1000_READ_REG
(
&
adapter
->
hw
,
EXTCNF_CTRL
);
E1000_WRITE_REG
(
&
adapter
->
hw
,
EXTCNF_CTRL
,
extcnf
|
E1000_EXTCNF_CTRL_SWFLAG
);
break
;
default:
break
;
}
...
...
@@ -387,18 +443,10 @@ int
e1000_up
(
struct
e1000_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
int
i
,
err
;
int
i
;
/* hardware has been reset, we need to reload some things */
/* Reset the PHY if it was previously powered down */
if
(
adapter
->
hw
.
media_type
==
e1000_media_type_copper
)
{
uint16_t
mii_reg
;
e1000_read_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
&
mii_reg
);
if
(
mii_reg
&
MII_CR_POWER_DOWN
)
e1000_phy_hw_reset
(
&
adapter
->
hw
);
}
e1000_set_multi
(
netdev
);
e1000_restore_vlan
(
adapter
);
...
...
@@ -415,24 +463,6 @@ e1000_up(struct e1000_adapter *adapter)
E1000_DESC_UNUSED
(
ring
));
}
#ifdef CONFIG_PCI_MSI
if
(
adapter
->
hw
.
mac_type
>
e1000_82547_rev_2
)
{
adapter
->
have_msi
=
TRUE
;
if
((
err
=
pci_enable_msi
(
adapter
->
pdev
)))
{
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate MSI interrupt Error: %d
\n
"
,
err
);
adapter
->
have_msi
=
FALSE
;
}
}
#endif
if
((
err
=
request_irq
(
adapter
->
pdev
->
irq
,
&
e1000_intr
,
IRQF_SHARED
|
IRQF_SAMPLE_RANDOM
,
netdev
->
name
,
netdev
)))
{
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate interrupt Error: %d
\n
"
,
err
);
return
err
;
}
adapter
->
tx_queue_len
=
netdev
->
tx_queue_len
;
mod_timer
(
&
adapter
->
watchdog_timer
,
jiffies
);
...
...
@@ -445,21 +475,60 @@ e1000_up(struct e1000_adapter *adapter)
return
0
;
}
/**
* e1000_power_up_phy - restore link in case the phy was powered down
* @adapter: address of board private structure
*
* The phy may be powered down to save power and turn off link when the
* driver is unloaded and wake on lan is not enabled (among others)
* *** this routine MUST be followed by a call to e1000_reset ***
*
**/
static
void
e1000_power_up_phy
(
struct
e1000_adapter
*
adapter
)
{
uint16_t
mii_reg
=
0
;
/* Just clear the power down bit to wake the phy back up */
if
(
adapter
->
hw
.
media_type
==
e1000_media_type_copper
)
{
/* according to the manual, the phy will retain its
* settings across a power-down/up cycle */
e1000_read_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
&
mii_reg
);
mii_reg
&=
~
MII_CR_POWER_DOWN
;
e1000_write_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
mii_reg
);
}
}
static
void
e1000_power_down_phy
(
struct
e1000_adapter
*
adapter
)
{
boolean_t
mng_mode_enabled
=
(
adapter
->
hw
.
mac_type
>=
e1000_82571
)
&&
e1000_check_mng_mode
(
&
adapter
->
hw
);
/* Power down the PHY so no link is implied when interface is down
* The PHY cannot be powered down if any of the following is TRUE
* (a) WoL is enabled
* (b) AMT is active
* (c) SoL/IDER session is active */
if
(
!
adapter
->
wol
&&
adapter
->
hw
.
mac_type
>=
e1000_82540
&&
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
&&
adapter
->
hw
.
media_type
==
e1000_media_type_copper
&&
!
(
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
)
&
E1000_MANC_SMBUS_EN
)
&&
!
mng_mode_enabled
&&
!
e1000_check_phy_reset_block
(
&
adapter
->
hw
))
{
uint16_t
mii_reg
=
0
;
e1000_read_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
&
mii_reg
);
mii_reg
|=
MII_CR_POWER_DOWN
;
e1000_write_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
mii_reg
);
mdelay
(
1
);
}
}
void
e1000_down
(
struct
e1000_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
boolean_t
mng_mode_enabled
=
(
adapter
->
hw
.
mac_type
>=
e1000_82571
)
&&
e1000_check_mng_mode
(
&
adapter
->
hw
);
e1000_irq_disable
(
adapter
);
free_irq
(
adapter
->
pdev
->
irq
,
netdev
);
#ifdef CONFIG_PCI_MSI
if
(
adapter
->
hw
.
mac_type
>
e1000_82547_rev_2
&&
adapter
->
have_msi
==
TRUE
)
pci_disable_msi
(
adapter
->
pdev
);
#endif
del_timer_sync
(
&
adapter
->
tx_fifo_stall_timer
);
del_timer_sync
(
&
adapter
->
watchdog_timer
);
del_timer_sync
(
&
adapter
->
phy_info_timer
);
...
...
@@ -476,23 +545,17 @@ e1000_down(struct e1000_adapter *adapter)
e1000_reset
(
adapter
);
e1000_clean_all_tx_rings
(
adapter
);
e1000_clean_all_rx_rings
(
adapter
);
}
/* Power down the PHY so no link is implied when interface is down *
* The PHY cannot be powered down if any of the following is TRUE *
* (a) WoL is enabled
* (b) AMT is active
* (c) SoL/IDER session is active */
if
(
!
adapter
->
wol
&&
adapter
->
hw
.
mac_type
>=
e1000_82540
&&
adapter
->
hw
.
media_type
==
e1000_media_type_copper
&&
!
(
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
)
&
E1000_MANC_SMBUS_EN
)
&&
!
mng_mode_enabled
&&
!
e1000_check_phy_reset_block
(
&
adapter
->
hw
))
{
uint16_t
mii_reg
;
e1000_read_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
&
mii_reg
);
mii_reg
|=
MII_CR_POWER_DOWN
;
e1000_write_phy_reg
(
&
adapter
->
hw
,
PHY_CTRL
,
mii_reg
);
mdelay
(
1
);
}
void
e1000_reinit_locked
(
struct
e1000_adapter
*
adapter
)
{
WARN_ON
(
in_interrupt
());
while
(
test_and_set_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
))
msleep
(
1
);
e1000_down
(
adapter
);
e1000_up
(
adapter
);
clear_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
);
}
void
...
...
@@ -518,6 +581,9 @@ e1000_reset(struct e1000_adapter *adapter)
case
e1000_82573
:
pba
=
E1000_PBA_12K
;
break
;
case
e1000_ich8lan
:
pba
=
E1000_PBA_8K
;
break
;
default:
pba
=
E1000_PBA_48K
;
break
;
...
...
@@ -542,6 +608,12 @@ e1000_reset(struct e1000_adapter *adapter)
/* Set the FC high water mark to 90% of the FIFO size.
* Required to clear last 3 LSB */
fc_high_water_mark
=
((
pba
*
9216
)
/
10
)
&
0xFFF8
;
/* We can't use 90% on small FIFOs because the remainder
* would be less than 1 full frame. In this case, we size
* it to allow at least a full frame above the high water
* mark. */
if
(
pba
<
E1000_PBA_16K
)
fc_high_water_mark
=
(
pba
*
1024
)
-
1600
;
adapter
->
hw
.
fc_high_water
=
fc_high_water_mark
;
adapter
->
hw
.
fc_low_water
=
fc_high_water_mark
-
8
;
...
...
@@ -564,6 +636,23 @@ e1000_reset(struct e1000_adapter *adapter)
e1000_reset_adaptive
(
&
adapter
->
hw
);
e1000_phy_get_info
(
&
adapter
->
hw
,
&
adapter
->
phy_info
);
if
(
!
adapter
->
smart_power_down
&&
(
adapter
->
hw
.
mac_type
==
e1000_82571
||
adapter
->
hw
.
mac_type
==
e1000_82572
))
{
uint16_t
phy_data
=
0
;
/* speed up time to link by disabling smart power down, ignore
* the return value of this function because there is nothing
* different we would do if it failed */
e1000_read_phy_reg
(
&
adapter
->
hw
,
IGP02E1000_PHY_POWER_MGMT
,
&
phy_data
);
phy_data
&=
~
IGP02E1000_PM_SPD
;
e1000_write_phy_reg
(
&
adapter
->
hw
,
IGP02E1000_PHY_POWER_MGMT
,
phy_data
);
}
if
(
adapter
->
hw
.
mac_type
<
e1000_ich8lan
)
/* FIXME: this code is duplicate and wrong for PCI Express */
if
(
adapter
->
en_mng_pt
)
{
manc
=
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
);
manc
|=
(
E1000_MANC_ARP_EN
|
E1000_MANC_EN_MNG2HOST
);
...
...
@@ -590,6 +679,7 @@ e1000_probe(struct pci_dev *pdev,
struct
net_device
*
netdev
;
struct
e1000_adapter
*
adapter
;
unsigned
long
mmio_start
,
mmio_len
;
unsigned
long
flash_start
,
flash_len
;
static
int
cards_found
=
0
;
static
int
e1000_ksp3_port_a
=
0
;
/* global ksp3 port a indication */
...
...
@@ -599,10 +689,12 @@ e1000_probe(struct pci_dev *pdev,
if
((
err
=
pci_enable_device
(
pdev
)))
return
err
;
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
))
&&
!
(
err
=
pci_set_consistent_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
pci_using_dac
=
1
;
}
else
{
if
((
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)))
{
if
((
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
))
&&
(
err
=
pci_set_consistent_dma_mask
(
pdev
,
DMA_32BIT_MASK
)))
{
E1000_ERR
(
"No usable DMA configuration, aborting
\n
"
);
return
err
;
}
...
...
@@ -682,6 +774,19 @@ e1000_probe(struct pci_dev *pdev,
if
((
err
=
e1000_sw_init
(
adapter
)))
goto
err_sw_init
;
/* Flash BAR mapping must happen after e1000_sw_init
* because it depends on mac_type */
if
((
adapter
->
hw
.
mac_type
==
e1000_ich8lan
)
&&
(
pci_resource_flags
(
pdev
,
1
)
&
IORESOURCE_MEM
))
{
flash_start
=
pci_resource_start
(
pdev
,
1
);
flash_len
=
pci_resource_len
(
pdev
,
1
);
adapter
->
hw
.
flash_address
=
ioremap
(
flash_start
,
flash_len
);
if
(
!
adapter
->
hw
.
flash_address
)
{
err
=
-
EIO
;
goto
err_flashmap
;
}
}
if
((
err
=
e1000_check_phy_reset_block
(
&
adapter
->
hw
)))
DPRINTK
(
PROBE
,
INFO
,
"PHY reset is blocked due to SOL/IDER session.
\n
"
);
...
...
@@ -700,6 +805,8 @@ e1000_probe(struct pci_dev *pdev,
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
|
NETIF_F_HW_VLAN_FILTER
;
if
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
)
netdev
->
features
&=
~
NETIF_F_HW_VLAN_FILTER
;
}
#ifdef NETIF_F_TSO
...
...
@@ -715,11 +822,17 @@ e1000_probe(struct pci_dev *pdev,
if
(
pci_using_dac
)
netdev
->
features
|=
NETIF_F_HIGHDMA
;
/* hard_start_xmit is safe against parallel locking */
netdev
->
features
|=
NETIF_F_LLTX
;
adapter
->
en_mng_pt
=
e1000_enable_mng_pass_thru
(
&
adapter
->
hw
);
/* initialize eeprom parameters */
if
(
e1000_init_eeprom_params
(
&
adapter
->
hw
))
{
E1000_ERR
(
"EEPROM initialization failed
\n
"
);
return
-
EIO
;
}
/* before reading the EEPROM, reset the controller to
* put the device in a known good starting state */
...
...
@@ -758,9 +871,6 @@ e1000_probe(struct pci_dev *pdev,
adapter
->
watchdog_timer
.
function
=
&
e1000_watchdog
;
adapter
->
watchdog_timer
.
data
=
(
unsigned
long
)
adapter
;
INIT_WORK
(
&
adapter
->
watchdog_task
,
(
void
(
*
)(
void
*
))
e1000_watchdog_task
,
adapter
);
init_timer
(
&
adapter
->
phy_info_timer
);
adapter
->
phy_info_timer
.
function
=
&
e1000_update_phy_info
;
adapter
->
phy_info_timer
.
data
=
(
unsigned
long
)
adapter
;
...
...
@@ -790,6 +900,11 @@ e1000_probe(struct pci_dev *pdev,
EEPROM_INIT_CONTROL2_REG
,
1
,
&
eeprom_data
);
eeprom_apme_mask
=
E1000_EEPROM_82544_APM
;
break
;
case
e1000_ich8lan
:
e1000_read_eeprom
(
&
adapter
->
hw
,
EEPROM_INIT_CONTROL1_REG
,
1
,
&
eeprom_data
);
eeprom_apme_mask
=
E1000_EEPROM_ICH8_APME
;
break
;
case
e1000_82546
:
case
e1000_82546_rev_3
:
case
e1000_82571
:
...
...
@@ -849,6 +964,9 @@ e1000_probe(struct pci_dev *pdev,
return
0
;
err_register:
if
(
adapter
->
hw
.
flash_address
)
iounmap
(
adapter
->
hw
.
flash_address
);
err_flashmap:
err_sw_init:
err_eeprom:
iounmap
(
adapter
->
hw
.
hw_addr
);
...
...
@@ -882,6 +1000,7 @@ e1000_remove(struct pci_dev *pdev)
flush_scheduled_work
();
if
(
adapter
->
hw
.
mac_type
>=
e1000_82540
&&
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
&&
adapter
->
hw
.
media_type
==
e1000_media_type_copper
)
{
manc
=
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
);
if
(
manc
&
E1000_MANC_SMBUS_EN
)
{
...
...
@@ -910,6 +1029,8 @@ e1000_remove(struct pci_dev *pdev)
#endif
iounmap
(
adapter
->
hw
.
hw_addr
);
if
(
adapter
->
hw
.
flash_address
)
iounmap
(
adapter
->
hw
.
flash_address
);
pci_release_regions
(
pdev
);
free_netdev
(
netdev
);
...
...
@@ -960,13 +1081,6 @@ e1000_sw_init(struct e1000_adapter *adapter)
return
-
EIO
;
}
/* initialize eeprom parameters */
if
(
e1000_init_eeprom_params
(
hw
))
{
E1000_ERR
(
"EEPROM initialization failed
\n
"
);
return
-
EIO
;
}
switch
(
hw
->
mac_type
)
{
default:
break
;
...
...
@@ -1078,6 +1192,10 @@ e1000_open(struct net_device *netdev)
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
int
err
;
/* disallow open during test */
if
(
test_bit
(
__E1000_DRIVER_TESTING
,
&
adapter
->
flags
))
return
-
EBUSY
;
/* allocate transmit descriptors */
if
((
err
=
e1000_setup_all_tx_resources
(
adapter
)))
...
...
@@ -1088,6 +1206,12 @@ e1000_open(struct net_device *netdev)
if
((
err
=
e1000_setup_all_rx_resources
(
adapter
)))
goto
err_setup_rx
;
err
=
e1000_request_irq
(
adapter
);
if
(
err
)
goto
err_up
;
e1000_power_up_phy
(
adapter
);
if
((
err
=
e1000_up
(
adapter
)))
goto
err_up
;
adapter
->
mng_vlan_id
=
E1000_MNG_VLAN_NONE
;
...
...
@@ -1131,7 +1255,10 @@ e1000_close(struct net_device *netdev)
{
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
WARN_ON
(
test_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
));
e1000_down
(
adapter
);
e1000_power_down_phy
(
adapter
);
e1000_free_irq
(
adapter
);
e1000_free_all_tx_resources
(
adapter
);
e1000_free_all_rx_resources
(
adapter
);
...
...
@@ -1189,8 +1316,7 @@ e1000_setup_tx_resources(struct e1000_adapter *adapter,
int
size
;
size
=
sizeof
(
struct
e1000_buffer
)
*
txdr
->
count
;
txdr
->
buffer_info
=
vmalloc_node
(
size
,
pcibus_to_node
(
pdev
->
bus
));
txdr
->
buffer_info
=
vmalloc
(
size
);
if
(
!
txdr
->
buffer_info
)
{
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate memory for the transmit descriptor ring
\n
"
);
...
...
@@ -1302,11 +1428,11 @@ e1000_configure_tx(struct e1000_adapter *adapter)
tdba
=
adapter
->
tx_ring
[
0
].
dma
;
tdlen
=
adapter
->
tx_ring
[
0
].
count
*
sizeof
(
struct
e1000_tx_desc
);
E1000_WRITE_REG
(
hw
,
TDBAL
,
(
tdba
&
0x00000000ffffffffULL
));
E1000_WRITE_REG
(
hw
,
TDBAH
,
(
tdba
>>
32
));
E1000_WRITE_REG
(
hw
,
TDLEN
,
tdlen
);
E1000_WRITE_REG
(
hw
,
TDH
,
0
);
E1000_WRITE_REG
(
hw
,
TDBAH
,
(
tdba
>>
32
));
E1000_WRITE_REG
(
hw
,
TDBAL
,
(
tdba
&
0x00000000ffffffffULL
));
E1000_WRITE_REG
(
hw
,
TDT
,
0
);
E1000_WRITE_REG
(
hw
,
TDH
,
0
);
adapter
->
tx_ring
[
0
].
tdh
=
E1000_TDH
;
adapter
->
tx_ring
[
0
].
tdt
=
E1000_TDT
;
break
;
...
...
@@ -1418,7 +1544,7 @@ e1000_setup_rx_resources(struct e1000_adapter *adapter,
int
size
,
desc_len
;
size
=
sizeof
(
struct
e1000_buffer
)
*
rxdr
->
count
;
rxdr
->
buffer_info
=
vmalloc
_node
(
size
,
pcibus_to_node
(
pdev
->
bus
)
);
rxdr
->
buffer_info
=
vmalloc
(
size
);
if
(
!
rxdr
->
buffer_info
)
{
DPRINTK
(
PROBE
,
ERR
,
"Unable to allocate memory for the receive descriptor ring
\n
"
);
...
...
@@ -1560,9 +1686,6 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
E1000_RCTL_LBM_NO
|
E1000_RCTL_RDMTS_HALF
|
(
adapter
->
hw
.
mc_filter_type
<<
E1000_RCTL_MO_SHIFT
);
if
(
adapter
->
hw
.
mac_type
>
e1000_82543
)
rctl
|=
E1000_RCTL_SECRC
;
if
(
adapter
->
hw
.
tbi_compatibility_on
==
1
)
rctl
|=
E1000_RCTL_SBP
;
else
...
...
@@ -1628,7 +1751,7 @@ e1000_setup_rctl(struct e1000_adapter *adapter)
rfctl
|=
E1000_RFCTL_IPV6_DIS
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
RFCTL
,
rfctl
);
rctl
|=
E1000_RCTL_DTYP_PS
|
E1000_RCTL_SECRC
;
rctl
|=
E1000_RCTL_DTYP_PS
;
psrctl
|=
adapter
->
rx_ps_bsize0
>>
E1000_PSRCTL_BSIZE0_SHIFT
;
...
...
@@ -1712,11 +1835,11 @@ e1000_configure_rx(struct e1000_adapter *adapter)
case
1
:
default:
rdba
=
adapter
->
rx_ring
[
0
].
dma
;
E1000_WRITE_REG
(
hw
,
RDBAL
,
(
rdba
&
0x00000000ffffffffULL
));
E1000_WRITE_REG
(
hw
,
RDBAH
,
(
rdba
>>
32
));
E1000_WRITE_REG
(
hw
,
RDLEN
,
rdlen
);
E1000_WRITE_REG
(
hw
,
RDH
,
0
);
E1000_WRITE_REG
(
hw
,
RDBAH
,
(
rdba
>>
32
));
E1000_WRITE_REG
(
hw
,
RDBAL
,
(
rdba
&
0x00000000ffffffffULL
));
E1000_WRITE_REG
(
hw
,
RDT
,
0
);
E1000_WRITE_REG
(
hw
,
RDH
,
0
);
adapter
->
rx_ring
[
0
].
rdh
=
E1000_RDH
;
adapter
->
rx_ring
[
0
].
rdt
=
E1000_RDT
;
break
;
...
...
@@ -1741,9 +1864,6 @@ e1000_configure_rx(struct e1000_adapter *adapter)
E1000_WRITE_REG
(
hw
,
RXCSUM
,
rxcsum
);
}
if
(
hw
->
mac_type
==
e1000_82573
)
E1000_WRITE_REG
(
hw
,
ERT
,
0x0100
);
/* Enable Receives */
E1000_WRITE_REG
(
hw
,
RCTL
,
rctl
);
}
...
...
@@ -2083,6 +2203,12 @@ e1000_set_multi(struct net_device *netdev)
uint32_t
rctl
;
uint32_t
hash_value
;
int
i
,
rar_entries
=
E1000_RAR_ENTRIES
;
int
mta_reg_count
=
(
hw
->
mac_type
==
e1000_ich8lan
)
?
E1000_NUM_MTA_REGISTERS_ICH8LAN
:
E1000_NUM_MTA_REGISTERS
;
if
(
adapter
->
hw
.
mac_type
==
e1000_ich8lan
)
rar_entries
=
E1000_RAR_ENTRIES_ICH8LAN
;
/* reserve RAR[14] for LAA over-write work-around */
if
(
adapter
->
hw
.
mac_type
==
e1000_82571
)
...
...
@@ -2121,14 +2247,18 @@ e1000_set_multi(struct net_device *netdev)
mc_ptr
=
mc_ptr
->
next
;
}
else
{
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
i
<<
1
,
0
);
E1000_WRITE_FLUSH
(
hw
);
E1000_WRITE_REG_ARRAY
(
hw
,
RA
,
(
i
<<
1
)
+
1
,
0
);
E1000_WRITE_FLUSH
(
hw
);
}
}
/* clear the old settings from the multicast hash table */
for
(
i
=
0
;
i
<
E1000_NUM_MTA_REGISTERS
;
i
++
)
for
(
i
=
0
;
i
<
mta_reg_count
;
i
++
)
{
E1000_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
E1000_WRITE_FLUSH
(
hw
);
}
/* load any remaining addresses into the hash table */
...
...
@@ -2201,19 +2331,19 @@ static void
e1000_watchdog
(
unsigned
long
data
)
{
struct
e1000_adapter
*
adapter
=
(
struct
e1000_adapter
*
)
data
;
/* Do the rest outside of interrupt context */
schedule_work
(
&
adapter
->
watchdog_task
);
}
static
void
e1000_watchdog_task
(
struct
e1000_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
struct
e1000_tx_ring
*
txdr
=
adapter
->
tx_ring
;
uint32_t
link
,
tctl
;
int32_t
ret_val
;
e1000_check_for_link
(
&
adapter
->
hw
);
ret_val
=
e1000_check_for_link
(
&
adapter
->
hw
);
if
((
ret_val
==
E1000_ERR_PHY
)
&&
(
adapter
->
hw
.
phy_type
==
e1000_phy_igp_3
)
&&
(
E1000_READ_REG
(
&
adapter
->
hw
,
CTRL
)
&
E1000_PHY_CTRL_GBE_DISABLE
))
{
/* See e1000_kumeran_lock_loss_workaround() */
DPRINTK
(
LINK
,
INFO
,
"Gigabit has been disabled, downgrading speed
\n
"
);
}
if
(
adapter
->
hw
.
mac_type
==
e1000_82573
)
{
e1000_enable_tx_pkt_filtering
(
&
adapter
->
hw
);
if
(
adapter
->
mng_vlan_id
!=
adapter
->
hw
.
mng_cookie
.
vlan_id
)
...
...
@@ -2779,9 +2909,10 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
case
e1000_82571
:
case
e1000_82572
:
case
e1000_82573
:
case
e1000_ich8lan
:
pull_size
=
min
((
unsigned
int
)
4
,
skb
->
data_len
);
if
(
!
__pskb_pull_tail
(
skb
,
pull_size
))
{
printk
(
KERN_ERR
DPRINTK
(
DRV
,
ERR
,
"__pskb_pull_tail failed.
\n
"
);
dev_kfree_skb_any
(
skb
);
return
NETDEV_TX_OK
;
...
...
@@ -2919,8 +3050,7 @@ e1000_reset_task(struct net_device *netdev)
{
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
e1000_down
(
adapter
);
e1000_up
(
adapter
);
e1000_reinit_locked
(
adapter
);
}
/**
...
...
@@ -2964,6 +3094,7 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
/* Adapter-specific max frame size limits. */
switch
(
adapter
->
hw
.
mac_type
)
{
case
e1000_undefined
...
e1000_82542_rev2_1
:
case
e1000_ich8lan
:
if
(
max_frame
>
MAXIMUM_ETHERNET_FRAME_SIZE
)
{
DPRINTK
(
PROBE
,
ERR
,
"Jumbo Frames not supported.
\n
"
);
return
-
EINVAL
;
...
...
@@ -3026,10 +3157,8 @@ e1000_change_mtu(struct net_device *netdev, int new_mtu)
netdev
->
mtu
=
new_mtu
;
if
(
netif_running
(
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
if
(
netif_running
(
netdev
))
e1000_reinit_locked
(
adapter
);
adapter
->
hw
.
max_frame_size
=
max_frame
;
...
...
@@ -3074,12 +3203,15 @@ e1000_update_stats(struct e1000_adapter *adapter)
adapter
->
stats
.
bprc
+=
E1000_READ_REG
(
hw
,
BPRC
);
adapter
->
stats
.
mprc
+=
E1000_READ_REG
(
hw
,
MPRC
);
adapter
->
stats
.
roc
+=
E1000_READ_REG
(
hw
,
ROC
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
adapter
->
stats
.
prc64
+=
E1000_READ_REG
(
hw
,
PRC64
);
adapter
->
stats
.
prc127
+=
E1000_READ_REG
(
hw
,
PRC127
);
adapter
->
stats
.
prc255
+=
E1000_READ_REG
(
hw
,
PRC255
);
adapter
->
stats
.
prc511
+=
E1000_READ_REG
(
hw
,
PRC511
);
adapter
->
stats
.
prc1023
+=
E1000_READ_REG
(
hw
,
PRC1023
);
adapter
->
stats
.
prc1522
+=
E1000_READ_REG
(
hw
,
PRC1522
);
}
adapter
->
stats
.
symerrs
+=
E1000_READ_REG
(
hw
,
SYMERRS
);
adapter
->
stats
.
mpc
+=
E1000_READ_REG
(
hw
,
MPC
);
...
...
@@ -3107,12 +3239,16 @@ e1000_update_stats(struct e1000_adapter *adapter)
adapter
->
stats
.
totl
+=
E1000_READ_REG
(
hw
,
TOTL
);
adapter
->
stats
.
toth
+=
E1000_READ_REG
(
hw
,
TOTH
);
adapter
->
stats
.
tpr
+=
E1000_READ_REG
(
hw
,
TPR
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
adapter
->
stats
.
ptc64
+=
E1000_READ_REG
(
hw
,
PTC64
);
adapter
->
stats
.
ptc127
+=
E1000_READ_REG
(
hw
,
PTC127
);
adapter
->
stats
.
ptc255
+=
E1000_READ_REG
(
hw
,
PTC255
);
adapter
->
stats
.
ptc511
+=
E1000_READ_REG
(
hw
,
PTC511
);
adapter
->
stats
.
ptc1023
+=
E1000_READ_REG
(
hw
,
PTC1023
);
adapter
->
stats
.
ptc1522
+=
E1000_READ_REG
(
hw
,
PTC1522
);
}
adapter
->
stats
.
mptc
+=
E1000_READ_REG
(
hw
,
MPTC
);
adapter
->
stats
.
bptc
+=
E1000_READ_REG
(
hw
,
BPTC
);
...
...
@@ -3134,6 +3270,8 @@ e1000_update_stats(struct e1000_adapter *adapter)
if
(
hw
->
mac_type
>
e1000_82547_rev_2
)
{
adapter
->
stats
.
iac
+=
E1000_READ_REG
(
hw
,
IAC
);
adapter
->
stats
.
icrxoc
+=
E1000_READ_REG
(
hw
,
ICRXOC
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
adapter
->
stats
.
icrxptc
+=
E1000_READ_REG
(
hw
,
ICRXPTC
);
adapter
->
stats
.
icrxatc
+=
E1000_READ_REG
(
hw
,
ICRXATC
);
adapter
->
stats
.
ictxptc
+=
E1000_READ_REG
(
hw
,
ICTXPTC
);
...
...
@@ -3142,6 +3280,7 @@ e1000_update_stats(struct e1000_adapter *adapter)
adapter
->
stats
.
ictxqmtc
+=
E1000_READ_REG
(
hw
,
ICTXQMTC
);
adapter
->
stats
.
icrxdmtc
+=
E1000_READ_REG
(
hw
,
ICRXDMTC
);
}
}
/* Fill out the OS statistics structure */
...
...
@@ -3547,7 +3686,8 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter,
/* All receives must fit into a single buffer */
E1000_DBG
(
"%s: Receive packet consumed multiple"
" buffers
\n
"
,
netdev
->
name
);
dev_kfree_skb_irq
(
skb
);
/* recycle */
buffer_info
->
skb
=
skb
;
goto
next_desc
;
}
...
...
@@ -3675,7 +3815,6 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
while
(
staterr
&
E1000_RXD_STAT_DD
)
{
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
ps_page
=
&
rx_ring
->
ps_page
[
i
];
ps_page_dma
=
&
rx_ring
->
ps_page_dma
[
i
];
#ifdef CONFIG_E1000_NAPI
...
...
@@ -4180,10 +4319,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
return
retval
;
}
}
if
(
netif_running
(
adapter
->
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
else
if
(
netif_running
(
adapter
->
netdev
))
e1000_reinit_locked
(
adapter
);
else
e1000_reset
(
adapter
);
break
;
case
M88E1000_PHY_SPEC_CTRL
:
...
...
@@ -4200,10 +4338,9 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
case
PHY_CTRL
:
if
(
mii_reg
&
MII_CR_POWER_DOWN
)
break
;
if
(
netif_running
(
adapter
->
netdev
))
{
e1000_down
(
adapter
);
e1000_up
(
adapter
);
}
else
if
(
netif_running
(
adapter
->
netdev
))
e1000_reinit_locked
(
adapter
);
else
e1000_reset
(
adapter
);
break
;
}
...
...
@@ -4277,18 +4414,21 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
ctrl
|=
E1000_CTRL_VME
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
CTRL
,
ctrl
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
/* enable VLAN receive filtering */
rctl
=
E1000_READ_REG
(
&
adapter
->
hw
,
RCTL
);
rctl
|=
E1000_RCTL_VFE
;
rctl
&=
~
E1000_RCTL_CFIEN
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
RCTL
,
rctl
);
e1000_update_mng_vlan
(
adapter
);
}
}
else
{
/* disable VLAN tag insert/strip */
ctrl
=
E1000_READ_REG
(
&
adapter
->
hw
,
CTRL
);
ctrl
&=
~
E1000_CTRL_VME
;
E1000_WRITE_REG
(
&
adapter
->
hw
,
CTRL
,
ctrl
);
if
(
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
)
{
/* disable VLAN filtering */
rctl
=
E1000_READ_REG
(
&
adapter
->
hw
,
RCTL
);
rctl
&=
~
E1000_RCTL_VFE
;
...
...
@@ -4298,6 +4438,7 @@ e1000_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
adapter
->
mng_vlan_id
=
E1000_MNG_VLAN_NONE
;
}
}
}
e1000_irq_enable
(
adapter
);
}
...
...
@@ -4458,12 +4599,16 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
struct
e1000_adapter
*
adapter
=
netdev_priv
(
netdev
);
uint32_t
ctrl
,
ctrl_ext
,
rctl
,
manc
,
status
;
uint32_t
wufc
=
adapter
->
wol
;
#ifdef CONFIG_PM
int
retval
=
0
;
#endif
netif_device_detach
(
netdev
);
if
(
netif_running
(
netdev
))
if
(
netif_running
(
netdev
))
{
WARN_ON
(
test_bit
(
__E1000_RESETTING
,
&
adapter
->
flags
));
e1000_down
(
adapter
);
}
#ifdef CONFIG_PM
/* Implement our own version of pci_save_state(pdev) because pci-
...
...
@@ -4521,7 +4666,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
pci_enable_wake
(
pdev
,
PCI_D3cold
,
0
);
}
/* FIXME: this code is incorrect for PCI Express */
if
(
adapter
->
hw
.
mac_type
>=
e1000_82540
&&
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
&&
adapter
->
hw
.
media_type
==
e1000_media_type_copper
)
{
manc
=
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
);
if
(
manc
&
E1000_MANC_SMBUS_EN
)
{
...
...
@@ -4532,6 +4679,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state)
}
}
if
(
adapter
->
hw
.
phy_type
==
e1000_phy_igp_3
)
e1000_phy_powerdown_workaround
(
&
adapter
->
hw
);
/* Release control of h/w to f/w. If f/w is AMT enabled, this
* would have already happened in close and is redundant. */
e1000_release_hw_control
(
adapter
);
...
...
@@ -4567,7 +4717,9 @@ e1000_resume(struct pci_dev *pdev)
netif_device_attach
(
netdev
);
/* FIXME: this code is incorrect for PCI Express */
if
(
adapter
->
hw
.
mac_type
>=
e1000_82540
&&
adapter
->
hw
.
mac_type
!=
e1000_ich8lan
&&
adapter
->
hw
.
media_type
==
e1000_media_type_copper
)
{
manc
=
E1000_READ_REG
(
&
adapter
->
hw
,
MANC
);
manc
&=
~
(
E1000_MANC_ARP_EN
);
...
...
drivers/net/e1000/e1000_osdep.h
View file @
c0bc8721
...
...
@@ -127,4 +127,17 @@ typedef enum {
#define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, STATUS)
#define E1000_WRITE_ICH8_REG(a, reg, value) ( \
writel((value), ((a)->flash_address + reg)))
#define E1000_READ_ICH8_REG(a, reg) ( \
readl((a)->flash_address + reg))
#define E1000_WRITE_ICH8_REG16(a, reg, value) ( \
writew((value), ((a)->flash_address + reg)))
#define E1000_READ_ICH8_REG16(a, reg) ( \
readw((a)->flash_address + reg))
#endif
/* _E1000_OSDEP_H_ */
drivers/net/e1000/e1000_param.c
View file @
c0bc8721
...
...
@@ -45,6 +45,16 @@
*/
#define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }
/* Module Parameters are always initialized to -1, so that the driver
* can tell the difference between no user specified value or the
* user asking for the default value.
* The true default values are loaded in when e1000_check_options is called.
*
* This is a GCC extension to ANSI C.
* See the item "Labeled Elements in Initializers" in the section
* "Extensions to the C Language Family" of the GCC documentation.
*/
#define E1000_PARAM(X, desc) \
static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \
static int num_##X = 0; \
...
...
@@ -183,6 +193,24 @@ E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");
E1000_PARAM
(
InterruptThrottleRate
,
"Interrupt Throttling Rate"
);
/* Enable Smart Power Down of the PHY
*
* Valid Range: 0, 1
*
* Default Value: 0 (disabled)
*/
E1000_PARAM
(
SmartPowerDownEnable
,
"Enable PHY smart power down"
);
/* Enable Kumeran Lock Loss workaround
*
* Valid Range: 0, 1
*
* Default Value: 1 (enabled)
*/
E1000_PARAM
(
KumeranLockLoss
,
"Enable Kumeran lock loss workaround"
);
#define AUTONEG_ADV_DEFAULT 0x2F
#define AUTONEG_ADV_MASK 0x2F
#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL
...
...
@@ -296,6 +324,7 @@ e1000_check_options(struct e1000_adapter *adapter)
DPRINTK
(
PROBE
,
NOTICE
,
"Warning: no configuration for board #%i
\n
"
,
bd
);
DPRINTK
(
PROBE
,
NOTICE
,
"Using defaults for all values
\n
"
);
bd
=
E1000_MAX_NIC
;
}
{
/* Transmit Descriptor Count */
...
...
@@ -313,14 +342,9 @@ e1000_check_options(struct e1000_adapter *adapter)
opt
.
arg
.
r
.
max
=
mac_type
<
e1000_82544
?
E1000_MAX_TXD
:
E1000_MAX_82544_TXD
;
if
(
num_TxDescriptors
>
bd
)
{
tx_ring
->
count
=
TxDescriptors
[
bd
];
e1000_validate_option
(
&
tx_ring
->
count
,
&
opt
,
adapter
);
E1000_ROUNDUP
(
tx_ring
->
count
,
REQ_TX_DESCRIPTOR_MULTIPLE
);
}
else
{
tx_ring
->
count
=
opt
.
def
;
}
E1000_ROUNDUP
(
tx_ring
->
count
,
REQ_TX_DESCRIPTOR_MULTIPLE
);
for
(
i
=
0
;
i
<
adapter
->
num_tx_queues
;
i
++
)
tx_ring
[
i
].
count
=
tx_ring
->
count
;
}
...
...
@@ -339,14 +363,9 @@ e1000_check_options(struct e1000_adapter *adapter)
opt
.
arg
.
r
.
max
=
mac_type
<
e1000_82544
?
E1000_MAX_RXD
:
E1000_MAX_82544_RXD
;
if
(
num_RxDescriptors
>
bd
)
{
rx_ring
->
count
=
RxDescriptors
[
bd
];
e1000_validate_option
(
&
rx_ring
->
count
,
&
opt
,
adapter
);
E1000_ROUNDUP
(
rx_ring
->
count
,
REQ_RX_DESCRIPTOR_MULTIPLE
);
}
else
{
rx_ring
->
count
=
opt
.
def
;
}
E1000_ROUNDUP
(
rx_ring
->
count
,
REQ_RX_DESCRIPTOR_MULTIPLE
);
for
(
i
=
0
;
i
<
adapter
->
num_rx_queues
;
i
++
)
rx_ring
[
i
].
count
=
rx_ring
->
count
;
}
...
...
@@ -358,13 +377,9 @@ e1000_check_options(struct e1000_adapter *adapter)
.
def
=
OPTION_ENABLED
};
if
(
num_XsumRX
>
bd
)
{
int
rx_csum
=
XsumRX
[
bd
];
e1000_validate_option
(
&
rx_csum
,
&
opt
,
adapter
);
adapter
->
rx_csum
=
rx_csum
;
}
else
{
adapter
->
rx_csum
=
opt
.
def
;
}
}
{
/* Flow Control */
...
...
@@ -384,13 +399,9 @@ e1000_check_options(struct e1000_adapter *adapter)
.
p
=
fc_list
}}
};
if
(
num_FlowControl
>
bd
)
{
int
fc
=
FlowControl
[
bd
];
e1000_validate_option
(
&
fc
,
&
opt
,
adapter
);
adapter
->
hw
.
fc
=
adapter
->
hw
.
original_fc
=
fc
;
}
else
{
adapter
->
hw
.
fc
=
adapter
->
hw
.
original_fc
=
opt
.
def
;
}
}
{
/* Transmit Interrupt Delay */
struct
e1000_option
opt
=
{
...
...
@@ -402,13 +413,8 @@ e1000_check_options(struct e1000_adapter *adapter)
.
max
=
MAX_TXDELAY
}}
};
if
(
num_TxIntDelay
>
bd
)
{
adapter
->
tx_int_delay
=
TxIntDelay
[
bd
];
e1000_validate_option
(
&
adapter
->
tx_int_delay
,
&
opt
,
adapter
);
}
else
{
adapter
->
tx_int_delay
=
opt
.
def
;
}
e1000_validate_option
(
&
adapter
->
tx_int_delay
,
&
opt
,
adapter
);
}
{
/* Transmit Absolute Interrupt Delay */
struct
e1000_option
opt
=
{
...
...
@@ -420,13 +426,9 @@ e1000_check_options(struct e1000_adapter *adapter)
.
max
=
MAX_TXABSDELAY
}}
};
if
(
num_TxAbsIntDelay
>
bd
)
{
adapter
->
tx_abs_int_delay
=
TxAbsIntDelay
[
bd
];
e1000_validate_option
(
&
adapter
->
tx_abs_int_delay
,
&
opt
,
adapter
);
}
else
{
adapter
->
tx_abs_int_delay
=
opt
.
def
;
}
}
{
/* Receive Interrupt Delay */
struct
e1000_option
opt
=
{
...
...
@@ -438,13 +440,8 @@ e1000_check_options(struct e1000_adapter *adapter)
.
max
=
MAX_RXDELAY
}}
};
if
(
num_RxIntDelay
>
bd
)
{
adapter
->
rx_int_delay
=
RxIntDelay
[
bd
];
e1000_validate_option
(
&
adapter
->
rx_int_delay
,
&
opt
,
adapter
);
}
else
{
adapter
->
rx_int_delay
=
opt
.
def
;
}
e1000_validate_option
(
&
adapter
->
rx_int_delay
,
&
opt
,
adapter
);
}
{
/* Receive Absolute Interrupt Delay */
struct
e1000_option
opt
=
{
...
...
@@ -456,13 +453,9 @@ e1000_check_options(struct e1000_adapter *adapter)
.
max
=
MAX_RXABSDELAY
}}
};
if
(
num_RxAbsIntDelay
>
bd
)
{
adapter
->
rx_abs_int_delay
=
RxAbsIntDelay
[
bd
];
e1000_validate_option
(
&
adapter
->
rx_abs_int_delay
,
&
opt
,
adapter
);
}
else
{
adapter
->
rx_abs_int_delay
=
opt
.
def
;
}
}
{
/* Interrupt Throttling Rate */
struct
e1000_option
opt
=
{
...
...
@@ -474,25 +467,43 @@ e1000_check_options(struct e1000_adapter *adapter)
.
max
=
MAX_ITR
}}
};
if
(
num_InterruptThrottleRate
>
bd
)
{
adapter
->
itr
=
InterruptThrottleRate
[
bd
];
switch
(
adapter
->
itr
)
{
case
0
:
DPRINTK
(
PROBE
,
INFO
,
"%s turned off
\n
"
,
opt
.
name
);
DPRINTK
(
PROBE
,
INFO
,
"%s turned off
\n
"
,
opt
.
name
);
break
;
case
1
:
DPRINTK
(
PROBE
,
INFO
,
"%s set to dynamic mode
\n
"
,
opt
.
name
);
break
;
default:
e1000_validate_option
(
&
adapter
->
itr
,
&
opt
,
adapter
);
e1000_validate_option
(
&
adapter
->
itr
,
&
opt
,
adapter
);
break
;
}
}
else
{
adapter
->
itr
=
opt
.
def
;
}
{
/* Smart Power Down */
struct
e1000_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"PHY Smart Power Down"
,
.
err
=
"defaulting to Disabled"
,
.
def
=
OPTION_DISABLED
};
int
spd
=
SmartPowerDownEnable
[
bd
];
e1000_validate_option
(
&
spd
,
&
opt
,
adapter
);
adapter
->
smart_power_down
=
spd
;
}
{
/* Kumeran Lock Loss Workaround */
struct
e1000_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"Kumeran Lock Loss Workaround"
,
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
};
int
kmrn_lock_loss
=
KumeranLockLoss
[
bd
];
e1000_validate_option
(
&
kmrn_lock_loss
,
&
opt
,
adapter
);
adapter
->
hw
.
kmrn_lock_loss_workaround_disabled
=
!
kmrn_lock_loss
;
}
switch
(
adapter
->
hw
.
media_type
)
{
...
...
@@ -519,17 +530,18 @@ static void __devinit
e1000_check_fiber_options
(
struct
e1000_adapter
*
adapter
)
{
int
bd
=
adapter
->
bd_number
;
if
(
num_Speed
>
bd
)
{
bd
=
bd
>
E1000_MAX_NIC
?
E1000_MAX_NIC
:
bd
;
if
((
Speed
[
bd
]
!=
OPTION_UNSET
))
{
DPRINTK
(
PROBE
,
INFO
,
"Speed not valid for fiber adapters, "
"parameter ignored
\n
"
);
}
if
(
num_Duplex
>
bd
)
{
if
(
(
Duplex
[
bd
]
!=
OPTION_UNSET
)
)
{
DPRINTK
(
PROBE
,
INFO
,
"Duplex not valid for fiber adapters, "
"parameter ignored
\n
"
);
}
if
((
num_AutoNeg
>
bd
)
&&
(
AutoNeg
[
bd
]
!=
0x20
))
{
if
((
AutoNeg
[
bd
]
!=
OPTION_UNSET
)
&&
(
AutoNeg
[
bd
]
!=
0x20
))
{
DPRINTK
(
PROBE
,
INFO
,
"AutoNeg other than 1000/Full is "
"not valid for fiber adapters, "
"parameter ignored
\n
"
);
...
...
@@ -548,6 +560,7 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
{
int
speed
,
dplx
,
an
;
int
bd
=
adapter
->
bd_number
;
bd
=
bd
>
E1000_MAX_NIC
?
E1000_MAX_NIC
:
bd
;
{
/* Speed */
struct
e1000_opt_list
speed_list
[]
=
{{
0
,
""
},
...
...
@@ -564,12 +577,8 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.
p
=
speed_list
}}
};
if
(
num_Speed
>
bd
)
{
speed
=
Speed
[
bd
];
e1000_validate_option
(
&
speed
,
&
opt
,
adapter
);
}
else
{
speed
=
opt
.
def
;
}
}
{
/* Duplex */
struct
e1000_opt_list
dplx_list
[]
=
{{
0
,
""
},
...
...
@@ -591,15 +600,11 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
"Speed/Duplex/AutoNeg parameter ignored.
\n
"
);
return
;
}
if
(
num_Duplex
>
bd
)
{
dplx
=
Duplex
[
bd
];
e1000_validate_option
(
&
dplx
,
&
opt
,
adapter
);
}
else
{
dplx
=
opt
.
def
;
}
}
if
(
(
num_AutoNeg
>
bd
)
&&
(
speed
!=
0
||
dplx
!=
0
))
{
if
(
AutoNeg
[
bd
]
!=
OPTION_UNSET
&&
(
speed
!=
0
||
dplx
!=
0
))
{
DPRINTK
(
PROBE
,
INFO
,
"AutoNeg specified along with Speed or Duplex, "
"parameter ignored
\n
"
);
...
...
@@ -648,19 +653,15 @@ e1000_check_copper_options(struct e1000_adapter *adapter)
.
p
=
an_list
}}
};
if
(
num_AutoNeg
>
bd
)
{
an
=
AutoNeg
[
bd
];
e1000_validate_option
(
&
an
,
&
opt
,
adapter
);
}
else
{
an
=
opt
.
def
;
}
adapter
->
hw
.
autoneg_advertised
=
an
;
}
switch
(
speed
+
dplx
)
{
case
0
:
adapter
->
hw
.
autoneg
=
adapter
->
fc_autoneg
=
1
;
if
(
(
num_Speed
>
bd
)
&&
(
speed
!=
0
||
dplx
!=
0
)
)
if
(
Speed
[
bd
]
!=
OPTION_UNSET
||
Duplex
[
bd
]
!=
OPTION_UNSET
)
DPRINTK
(
PROBE
,
INFO
,
"Speed and duplex autonegotiation enabled
\n
"
);
break
;
...
...
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