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
16dc459c
Commit
16dc459c
authored
Feb 13, 2012
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next
parents
2132cf64
5015e53a
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
265 additions
and
373 deletions
+265
-373
drivers/net/ethernet/intel/e1000e/80003es2lan.c
drivers/net/ethernet/intel/e1000e/80003es2lan.c
+11
-25
drivers/net/ethernet/intel/e1000e/82571.c
drivers/net/ethernet/intel/e1000e/82571.c
+13
-23
drivers/net/ethernet/intel/e1000e/ich8lan.c
drivers/net/ethernet/intel/e1000e/ich8lan.c
+96
-124
drivers/net/ethernet/intel/e1000e/mac.c
drivers/net/ethernet/intel/e1000e/mac.c
+11
-14
drivers/net/ethernet/intel/e1000e/manage.c
drivers/net/ethernet/intel/e1000e/manage.c
+11
-21
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/intel/e1000e/netdev.c
+7
-9
drivers/net/ethernet/intel/e1000e/nvm.c
drivers/net/ethernet/intel/e1000e/nvm.c
+14
-18
drivers/net/ethernet/intel/e1000e/phy.c
drivers/net/ethernet/intel/e1000e/phy.c
+102
-139
No files found.
drivers/net/ethernet/intel/e1000e/80003es2lan.c
View file @
16dc459c
...
@@ -470,9 +470,8 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
...
@@ -470,9 +470,8 @@ static s32 e1000_read_phy_reg_gg82563_80003es2lan(struct e1000_hw *hw,
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
page_select
,
&
temp
);
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
page_select
,
&
temp
);
if
(((
u16
)
offset
>>
GG82563_PAGE_SHIFT
)
!=
temp
)
{
if
(((
u16
)
offset
>>
GG82563_PAGE_SHIFT
)
!=
temp
)
{
ret_val
=
-
E1000_ERR_PHY
;
e1000_release_phy_80003es2lan
(
hw
);
e1000_release_phy_80003es2lan
(
hw
);
return
ret_val
;
return
-
E1000_ERR_PHY
;
}
}
udelay
(
200
);
udelay
(
200
);
...
@@ -715,22 +714,19 @@ static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw)
...
@@ -715,22 +714,19 @@ static s32 e1000_get_cable_length_80003es2lan(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
GG82563_PHY_DSP_DISTANCE
,
&
phy_data
);
ret_val
=
e1e_rphy
(
hw
,
GG82563_PHY_DSP_DISTANCE
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
index
=
phy_data
&
GG82563_DSPD_CABLE_LENGTH
;
index
=
phy_data
&
GG82563_DSPD_CABLE_LENGTH
;
if
(
index
>=
GG82563_CABLE_LENGTH_TABLE_SIZE
-
5
)
{
if
(
index
>=
GG82563_CABLE_LENGTH_TABLE_SIZE
-
5
)
ret_val
=
-
E1000_ERR_PHY
;
return
-
E1000_ERR_PHY
;
goto
out
;
}
phy
->
min_cable_length
=
e1000_gg82563_cable_length_table
[
index
];
phy
->
min_cable_length
=
e1000_gg82563_cable_length_table
[
index
];
phy
->
max_cable_length
=
e1000_gg82563_cable_length_table
[
index
+
5
];
phy
->
max_cable_length
=
e1000_gg82563_cable_length_table
[
index
+
5
];
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -804,9 +800,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
...
@@ -804,9 +800,7 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw)
ew32
(
IMC
,
0xffffffff
);
ew32
(
IMC
,
0xffffffff
);
er32
(
ICR
);
er32
(
ICR
);
ret_val
=
e1000_check_alt_mac_addr_generic
(
hw
);
return
e1000_check_alt_mac_addr_generic
(
hw
);
return
ret_val
;
}
}
/**
/**
...
@@ -1147,9 +1141,7 @@ static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw)
...
@@ -1147,9 +1141,7 @@ static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw)
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
return
ret_val
;
ret_val
=
e1000e_setup_copper_link
(
hw
);
return
e1000e_setup_copper_link
(
hw
);
return
0
;
}
}
/**
/**
...
@@ -1225,9 +1217,7 @@ static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex)
...
@@ -1225,9 +1217,7 @@ static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw, u16 duplex)
else
else
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
ret_val
=
e1e_wphy
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
);
return
e1e_wphy
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
);
return
0
;
}
}
/**
/**
...
@@ -1269,9 +1259,8 @@ static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw)
...
@@ -1269,9 +1259,8 @@ static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw)
}
while
((
reg_data
!=
reg_data2
)
&&
(
i
<
GG82563_MAX_KMRN_RETRY
));
}
while
((
reg_data
!=
reg_data2
)
&&
(
i
<
GG82563_MAX_KMRN_RETRY
));
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
reg_data
&=
~
GG82563_KMCR_PASS_FALSE_CARRIER
;
ret_val
=
e1e_wphy
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
);
return
ret_val
;
return
e1e_wphy
(
hw
,
GG82563_PHY_KMRN_MODE_CTRL
,
reg_data
)
;
}
}
/**
/**
...
@@ -1356,12 +1345,9 @@ static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw)
...
@@ -1356,12 +1345,9 @@ static s32 e1000_read_mac_addr_80003es2lan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000_check_alt_mac_addr_generic
(
hw
);
ret_val
=
e1000_check_alt_mac_addr_generic
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
ret_val
=
e1000_read_mac_addr_generic
(
hw
);
out:
return
ret_val
;
return
ret_val
;
return
e1000_read_mac_addr_generic
(
hw
);
}
}
/**
/**
...
...
drivers/net/ethernet/intel/e1000e/82571.c
View file @
16dc459c
...
@@ -564,7 +564,6 @@ static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw)
...
@@ -564,7 +564,6 @@ static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw)
static
s32
e1000_get_hw_semaphore_82573
(
struct
e1000_hw
*
hw
)
static
s32
e1000_get_hw_semaphore_82573
(
struct
e1000_hw
*
hw
)
{
{
u32
extcnf_ctrl
;
u32
extcnf_ctrl
;
s32
ret_val
=
0
;
s32
i
=
0
;
s32
i
=
0
;
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
extcnf_ctrl
=
er32
(
EXTCNF_CTRL
);
...
@@ -586,12 +585,10 @@ static s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw)
...
@@ -586,12 +585,10 @@ static s32 e1000_get_hw_semaphore_82573(struct e1000_hw *hw)
/* Release semaphores */
/* Release semaphores */
e1000_put_hw_semaphore_82573
(
hw
);
e1000_put_hw_semaphore_82573
(
hw
);
e_dbg
(
"Driver can't access the PHY
\n
"
);
e_dbg
(
"Driver can't access the PHY
\n
"
);
ret_val
=
-
E1000_ERR_PHY
;
return
-
E1000_ERR_PHY
;
goto
out
;
}
}
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -796,7 +793,7 @@ static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw)
...
@@ -796,7 +793,7 @@ static s32 e1000_update_nvm_checksum_82571(struct e1000_hw *hw)
* otherwise, commit the checksum to the flash NVM.
* otherwise, commit the checksum to the flash NVM.
*/
*/
if
(
hw
->
nvm
.
type
!=
e1000_nvm_flash_hw
)
if
(
hw
->
nvm
.
type
!=
e1000_nvm_flash_hw
)
return
ret_val
;
return
0
;
/* Check for pending operations. */
/* Check for pending operations. */
for
(
i
=
0
;
i
<
E1000_FLASH_UPDATES
;
i
++
)
{
for
(
i
=
0
;
i
<
E1000_FLASH_UPDATES
;
i
++
)
{
...
@@ -1409,7 +1406,6 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
...
@@ -1409,7 +1406,6 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
{
{
u16
status_1kbt
=
0
;
u16
status_1kbt
=
0
;
u16
receive_errors
=
0
;
u16
receive_errors
=
0
;
bool
phy_hung
=
false
;
s32
ret_val
=
0
;
s32
ret_val
=
0
;
/*
/*
...
@@ -1417,19 +1413,18 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
...
@@ -1417,19 +1413,18 @@ bool e1000_check_phy_82574(struct e1000_hw *hw)
* read the Base1000T status register If both are max then PHY is hung.
* read the Base1000T status register If both are max then PHY is hung.
*/
*/
ret_val
=
e1e_rphy
(
hw
,
E1000_RECEIVE_ERROR_COUNTER
,
&
receive_errors
);
ret_val
=
e1e_rphy
(
hw
,
E1000_RECEIVE_ERROR_COUNTER
,
&
receive_errors
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
false
;
if
(
receive_errors
==
E1000_RECEIVE_ERROR_MAX
)
{
if
(
receive_errors
==
E1000_RECEIVE_ERROR_MAX
)
{
ret_val
=
e1e_rphy
(
hw
,
E1000_BASE1000T_STATUS
,
&
status_1kbt
);
ret_val
=
e1e_rphy
(
hw
,
E1000_BASE1000T_STATUS
,
&
status_1kbt
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
false
;
if
((
status_1kbt
&
E1000_IDLE_ERROR_COUNT_MASK
)
==
if
((
status_1kbt
&
E1000_IDLE_ERROR_COUNT_MASK
)
==
E1000_IDLE_ERROR_COUNT_MASK
)
E1000_IDLE_ERROR_COUNT_MASK
)
phy_hung
=
true
;
return
true
;
}
}
out:
return
phy_hung
;
return
false
;
}
}
/**
/**
...
@@ -1497,9 +1492,7 @@ static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw)
...
@@ -1497,9 +1492,7 @@ static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw)
if
(
ret_val
)
if
(
ret_val
)
return
ret_val
;
return
ret_val
;
ret_val
=
e1000e_setup_copper_link
(
hw
);
return
e1000e_setup_copper_link
(
hw
);
return
ret_val
;
}
}
/**
/**
...
@@ -1833,9 +1826,9 @@ static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw)
...
@@ -1833,9 +1826,9 @@ static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw)
**/
**/
static
s32
e1000_read_mac_addr_82571
(
struct
e1000_hw
*
hw
)
static
s32
e1000_read_mac_addr_82571
(
struct
e1000_hw
*
hw
)
{
{
if
(
hw
->
mac
.
type
==
e1000_82571
)
{
s32
ret_val
=
0
;
s32
ret_val
=
0
;
if
(
hw
->
mac
.
type
==
e1000_82571
)
{
/*
/*
* If there's an alternate MAC address place it in RAR0
* If there's an alternate MAC address place it in RAR0
* so that it will override the Si installed default perm
* so that it will override the Si installed default perm
...
@@ -1843,13 +1836,10 @@ static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
...
@@ -1843,13 +1836,10 @@ static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000_check_alt_mac_addr_generic
(
hw
);
ret_val
=
e1000_check_alt_mac_addr_generic
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
ret_val
=
e1000_read_mac_addr_generic
(
hw
);
return
e1000_read_mac_addr_generic
(
hw
);
out:
return
ret_val
;
}
}
/**
/**
...
...
drivers/net/ethernet/intel/e1000e/ich8lan.c
View file @
16dc459c
...
@@ -351,7 +351,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
...
@@ -351,7 +351,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000e_phy_hw_reset_generic
(
hw
);
ret_val
=
e1000e_phy_hw_reset_generic
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Ungate automatic PHY configuration on non-managed 82579 */
/* Ungate automatic PHY configuration on non-managed 82579 */
if
((
hw
->
mac
.
type
==
e1000_pch2lan
)
&&
if
((
hw
->
mac
.
type
==
e1000_pch2lan
)
&&
...
@@ -366,7 +366,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
...
@@ -366,7 +366,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
default:
default:
ret_val
=
e1000e_get_phy_id
(
hw
);
ret_val
=
e1000e_get_phy_id
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
((
phy
->
id
!=
0
)
&&
(
phy
->
id
!=
PHY_REVISION_MASK
))
if
((
phy
->
id
!=
0
)
&&
(
phy
->
id
!=
PHY_REVISION_MASK
))
break
;
break
;
/* fall-through */
/* fall-through */
...
@@ -377,10 +377,10 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
...
@@ -377,10 +377,10 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000e_get_phy_id
(
hw
);
ret_val
=
e1000e_get_phy_id
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
break
;
break
;
}
}
phy
->
type
=
e1000e_get_phy_type_from_id
(
phy
->
id
);
phy
->
type
=
e1000e_get_phy_type_from_id
(
phy
->
id
);
...
@@ -406,7 +406,6 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
...
@@ -406,7 +406,6 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
break
;
break
;
}
}
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -635,20 +634,18 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
...
@@ -635,20 +634,18 @@ static s32 e1000_set_eee_pchlan(struct e1000_hw *hw)
u16
phy_reg
;
u16
phy_reg
;
if
(
hw
->
phy
.
type
!=
e1000_phy_82579
)
if
(
hw
->
phy
.
type
!=
e1000_phy_82579
)
goto
out
;
return
0
;
ret_val
=
e1e_rphy
(
hw
,
I82579_LPI_CTRL
,
&
phy_reg
);
ret_val
=
e1e_rphy
(
hw
,
I82579_LPI_CTRL
,
&
phy_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
hw
->
dev_spec
.
ich8lan
.
eee_disable
)
if
(
hw
->
dev_spec
.
ich8lan
.
eee_disable
)
phy_reg
&=
~
I82579_LPI_CTRL_ENABLE_MASK
;
phy_reg
&=
~
I82579_LPI_CTRL_ENABLE_MASK
;
else
else
phy_reg
|=
I82579_LPI_CTRL_ENABLE_MASK
;
phy_reg
|=
I82579_LPI_CTRL_ENABLE_MASK
;
ret_val
=
e1e_wphy
(
hw
,
I82579_LPI_CTRL
,
phy_reg
);
return
e1e_wphy
(
hw
,
I82579_LPI_CTRL
,
phy_reg
);
out:
return
ret_val
;
}
}
/**
/**
...
@@ -672,10 +669,8 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -672,10 +669,8 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
* get_link_status flag is set upon receiving a Link Status
* get_link_status flag is set upon receiving a Link Status
* Change or Rx Sequence Error interrupt.
* Change or Rx Sequence Error interrupt.
*/
*/
if
(
!
mac
->
get_link_status
)
{
if
(
!
mac
->
get_link_status
)
ret_val
=
0
;
return
0
;
goto
out
;
}
/*
/*
* First we want to see if the MII Status Register reports
* First we want to see if the MII Status Register reports
...
@@ -684,16 +679,16 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -684,16 +679,16 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
hw
->
mac
.
type
==
e1000_pchlan
)
{
if
(
hw
->
mac
.
type
==
e1000_pchlan
)
{
ret_val
=
e1000_k1_gig_workaround_hv
(
hw
,
link
);
ret_val
=
e1000_k1_gig_workaround_hv
(
hw
,
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
if
(
!
link
)
if
(
!
link
)
goto
out
;
/* No link detected */
return
0
;
/* No link detected */
mac
->
get_link_status
=
false
;
mac
->
get_link_status
=
false
;
...
@@ -701,13 +696,13 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -701,13 +696,13 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
case
e1000_pch2lan
:
case
e1000_pch2lan
:
ret_val
=
e1000_k1_workaround_lv
(
hw
);
ret_val
=
e1000_k1_workaround_lv
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* fall-thru */
/* fall-thru */
case
e1000_pchlan
:
case
e1000_pchlan
:
if
(
hw
->
phy
.
type
==
e1000_phy_82578
)
{
if
(
hw
->
phy
.
type
==
e1000_phy_82578
)
{
ret_val
=
e1000_link_stall_workaround_hv
(
hw
);
ret_val
=
e1000_link_stall_workaround_hv
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
/*
/*
...
@@ -737,16 +732,14 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -737,16 +732,14 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
/* Enable/Disable EEE after link up */
/* Enable/Disable EEE after link up */
ret_val
=
e1000_set_eee_pchlan
(
hw
);
ret_val
=
e1000_set_eee_pchlan
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/*
/*
* If we are forcing speed/duplex, then we simply return since
* If we are forcing speed/duplex, then we simply return since
* we have already determined whether we have link or not.
* we have already determined whether we have link or not.
*/
*/
if
(
!
mac
->
autoneg
)
{
if
(
!
mac
->
autoneg
)
ret_val
=
-
E1000_ERR_CONFIG
;
return
-
E1000_ERR_CONFIG
;
goto
out
;
}
/*
/*
* Auto-Neg is enabled. Auto Speed Detection takes care
* Auto-Neg is enabled. Auto Speed Detection takes care
...
@@ -765,7 +758,6 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -765,7 +758,6 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)
if
(
ret_val
)
if
(
ret_val
)
e_dbg
(
"Error configuring flow control
\n
"
);
e_dbg
(
"Error configuring flow control
\n
"
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1008,15 +1000,13 @@ static s32 e1000_write_smbus_addr(struct e1000_hw *hw)
...
@@ -1008,15 +1000,13 @@ static s32 e1000_write_smbus_addr(struct e1000_hw *hw)
ret_val
=
e1000_read_phy_reg_hv_locked
(
hw
,
HV_SMB_ADDR
,
&
phy_data
);
ret_val
=
e1000_read_phy_reg_hv_locked
(
hw
,
HV_SMB_ADDR
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy_data
&=
~
HV_SMB_ADDR_MASK
;
phy_data
&=
~
HV_SMB_ADDR_MASK
;
phy_data
|=
(
strap
>>
E1000_STRAP_SMBUS_ADDRESS_SHIFT
);
phy_data
|=
(
strap
>>
E1000_STRAP_SMBUS_ADDRESS_SHIFT
);
phy_data
|=
HV_SMB_ADDR_PEC_EN
|
HV_SMB_ADDR_VALID
;
phy_data
|=
HV_SMB_ADDR_PEC_EN
|
HV_SMB_ADDR_VALID
;
ret_val
=
e1000_write_phy_reg_hv_locked
(
hw
,
HV_SMB_ADDR
,
phy_data
);
out:
return
e1000_write_phy_reg_hv_locked
(
hw
,
HV_SMB_ADDR
,
phy_data
);
return
ret_val
;
}
}
/**
/**
...
@@ -1065,7 +1055,7 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
...
@@ -1065,7 +1055,7 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
data
=
er32
(
FEXTNVM
);
data
=
er32
(
FEXTNVM
);
if
(
!
(
data
&
sw_cfg_mask
))
if
(
!
(
data
&
sw_cfg_mask
))
goto
out
;
goto
release
;
/*
/*
* Make sure HW does not configure LCD from PHY
* Make sure HW does not configure LCD from PHY
...
@@ -1074,14 +1064,14 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
...
@@ -1074,14 +1064,14 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
data
=
er32
(
EXTCNF_CTRL
);
data
=
er32
(
EXTCNF_CTRL
);
if
(
!
(
hw
->
mac
.
type
==
e1000_pch2lan
))
{
if
(
!
(
hw
->
mac
.
type
==
e1000_pch2lan
))
{
if
(
data
&
E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE
)
if
(
data
&
E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE
)
goto
out
;
goto
release
;
}
}
cnf_size
=
er32
(
EXTCNF_SIZE
);
cnf_size
=
er32
(
EXTCNF_SIZE
);
cnf_size
&=
E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK
;
cnf_size
&=
E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK
;
cnf_size
>>=
E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT
;
cnf_size
>>=
E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT
;
if
(
!
cnf_size
)
if
(
!
cnf_size
)
goto
out
;
goto
release
;
cnf_base_addr
=
data
&
E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK
;
cnf_base_addr
=
data
&
E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK
;
cnf_base_addr
>>=
E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT
;
cnf_base_addr
>>=
E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT
;
...
@@ -1097,13 +1087,13 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
...
@@ -1097,13 +1087,13 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000_write_smbus_addr
(
hw
);
ret_val
=
e1000_write_smbus_addr
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
data
=
er32
(
LEDCTL
);
data
=
er32
(
LEDCTL
);
ret_val
=
e1000_write_phy_reg_hv_locked
(
hw
,
HV_LED_CONFIG
,
ret_val
=
e1000_write_phy_reg_hv_locked
(
hw
,
HV_LED_CONFIG
,
(
u16
)
data
);
(
u16
)
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
/* Configure LCD from extended configuration region. */
/* Configure LCD from extended configuration region. */
...
@@ -1115,12 +1105,12 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
...
@@ -1115,12 +1105,12 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
ret_val
=
e1000_read_nvm
(
hw
,
(
word_addr
+
i
*
2
),
1
,
ret_val
=
e1000_read_nvm
(
hw
,
(
word_addr
+
i
*
2
),
1
,
&
reg_data
);
&
reg_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
ret_val
=
e1000_read_nvm
(
hw
,
(
word_addr
+
i
*
2
+
1
),
ret_val
=
e1000_read_nvm
(
hw
,
(
word_addr
+
i
*
2
+
1
),
1
,
&
reg_addr
);
1
,
&
reg_addr
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
/* Save off the PHY page for future writes. */
/* Save off the PHY page for future writes. */
if
(
reg_addr
==
IGP01E1000_PHY_PAGE_SELECT
)
{
if
(
reg_addr
==
IGP01E1000_PHY_PAGE_SELECT
)
{
...
@@ -1134,10 +1124,10 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
...
@@ -1134,10 +1124,10 @@ static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw)
ret_val
=
phy
->
ops
.
write_reg_locked
(
hw
,
(
u32
)
reg_addr
,
ret_val
=
phy
->
ops
.
write_reg_locked
(
hw
,
(
u32
)
reg_addr
,
reg_data
);
reg_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1159,12 +1149,12 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
...
@@ -1159,12 +1149,12 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
bool
k1_enable
=
hw
->
dev_spec
.
ich8lan
.
nvm_k1_enabled
;
bool
k1_enable
=
hw
->
dev_spec
.
ich8lan
.
nvm_k1_enabled
;
if
(
hw
->
mac
.
type
!=
e1000_pchlan
)
if
(
hw
->
mac
.
type
!=
e1000_pchlan
)
goto
out
;
return
0
;
/* Wrap the whole flow with the sw flag */
/* Wrap the whole flow with the sw flag */
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Disable K1 when link is 1Gbps, otherwise use the NVM setting */
/* Disable K1 when link is 1Gbps, otherwise use the NVM setting */
if
(
link
)
{
if
(
link
)
{
...
@@ -1218,7 +1208,7 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
...
@@ -1218,7 +1208,7 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link)
release:
release:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1244,7 +1234,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
...
@@ -1244,7 +1234,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
E1000_KMRNCTRLSTA_K1_CONFIG
,
E1000_KMRNCTRLSTA_K1_CONFIG
,
&
kmrn_reg
);
&
kmrn_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
k1_enable
)
if
(
k1_enable
)
kmrn_reg
|=
E1000_KMRNCTRLSTA_K1_ENABLE
;
kmrn_reg
|=
E1000_KMRNCTRLSTA_K1_ENABLE
;
...
@@ -1255,7 +1245,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
...
@@ -1255,7 +1245,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
E1000_KMRNCTRLSTA_K1_CONFIG
,
E1000_KMRNCTRLSTA_K1_CONFIG
,
kmrn_reg
);
kmrn_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
udelay
(
20
);
udelay
(
20
);
ctrl_ext
=
er32
(
CTRL_EXT
);
ctrl_ext
=
er32
(
CTRL_EXT
);
...
@@ -1273,8 +1263,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
...
@@ -1273,8 +1263,7 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable)
e1e_flush
();
e1e_flush
();
udelay
(
20
);
udelay
(
20
);
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -1302,18 +1291,18 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
...
@@ -1302,18 +1291,18 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
if
(
!
(
hw
->
mac
.
type
==
e1000_pch2lan
))
{
if
(
!
(
hw
->
mac
.
type
==
e1000_pch2lan
))
{
mac_reg
=
er32
(
EXTCNF_CTRL
);
mac_reg
=
er32
(
EXTCNF_CTRL
);
if
(
mac_reg
&
E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE
)
if
(
mac_reg
&
E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE
)
goto
out
;
goto
release
;
}
}
mac_reg
=
er32
(
FEXTNVM
);
mac_reg
=
er32
(
FEXTNVM
);
if
(
!
(
mac_reg
&
E1000_FEXTNVM_SW_CONFIG_ICH8M
))
if
(
!
(
mac_reg
&
E1000_FEXTNVM_SW_CONFIG_ICH8M
))
goto
out
;
goto
release
;
mac_reg
=
er32
(
PHY_CTRL
);
mac_reg
=
er32
(
PHY_CTRL
);
ret_val
=
hw
->
phy
.
ops
.
read_reg_locked
(
hw
,
HV_OEM_BITS
,
&
oem_reg
);
ret_val
=
hw
->
phy
.
ops
.
read_reg_locked
(
hw
,
HV_OEM_BITS
,
&
oem_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
oem_reg
&=
~
(
HV_OEM_BITS_GBE_DIS
|
HV_OEM_BITS_LPLU
);
oem_reg
&=
~
(
HV_OEM_BITS_GBE_DIS
|
HV_OEM_BITS_LPLU
);
...
@@ -1339,7 +1328,7 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
...
@@ -1339,7 +1328,7 @@ static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state)
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
HV_OEM_BITS
,
oem_reg
);
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
HV_OEM_BITS
,
oem_reg
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
...
@@ -1376,13 +1365,13 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1376,13 +1365,13 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
u16
phy_data
;
u16
phy_data
;
if
(
hw
->
mac
.
type
!=
e1000_pchlan
)
if
(
hw
->
mac
.
type
!=
e1000_pchlan
)
return
ret_val
;
return
0
;
/* Set MDIO slow mode before any other MDIO access */
/* Set MDIO slow mode before any other MDIO access */
if
(
hw
->
phy
.
type
==
e1000_phy_82577
)
{
if
(
hw
->
phy
.
type
==
e1000_phy_82577
)
{
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
if
(((
hw
->
phy
.
type
==
e1000_phy_82577
)
&&
if
(((
hw
->
phy
.
type
==
e1000_phy_82577
)
&&
...
@@ -1419,7 +1408,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1419,7 +1408,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
0
);
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
0
);
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/*
/*
* Configure the K1 Si workaround during phy reset assuming there is
* Configure the K1 Si workaround during phy reset assuming there is
...
@@ -1427,12 +1416,12 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1427,12 +1416,12 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
*/
*/
ret_val
=
e1000_k1_gig_workaround_hv
(
hw
,
true
);
ret_val
=
e1000_k1_gig_workaround_hv
(
hw
,
true
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Workaround for link disconnects on a busy hub in half duplex */
/* Workaround for link disconnects on a busy hub in half duplex */
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
hw
->
phy
.
ops
.
read_reg_locked
(
hw
,
BM_PORT_GEN_CFG
,
&
phy_data
);
ret_val
=
hw
->
phy
.
ops
.
read_reg_locked
(
hw
,
BM_PORT_GEN_CFG
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
release
;
goto
release
;
...
@@ -1440,7 +1429,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1440,7 +1429,7 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw)
phy_data
&
0x00FF
);
phy_data
&
0x00FF
);
release:
release:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1497,13 +1486,13 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
...
@@ -1497,13 +1486,13 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
u16
i
;
u16
i
;
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
goto
out
;
return
0
;
/* disable Rx path while enabling/disabling workaround */
/* disable Rx path while enabling/disabling workaround */
e1e_rphy
(
hw
,
PHY_REG
(
769
,
20
),
&
phy_reg
);
e1e_rphy
(
hw
,
PHY_REG
(
769
,
20
),
&
phy_reg
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
20
),
phy_reg
|
(
1
<<
14
));
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
20
),
phy_reg
|
(
1
<<
14
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
enable
)
{
if
(
enable
)
{
/*
/*
...
@@ -1545,24 +1534,24 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
...
@@ -1545,24 +1534,24 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
&
data
);
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
data
|
(
1
<<
0
));
data
|
(
1
<<
0
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000e_read_kmrn_reg
(
hw
,
ret_val
=
e1000e_read_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_HD_CTRL
,
E1000_KMRNCTRLSTA_HD_CTRL
,
&
data
);
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
data
&=
~
(
0xF
<<
8
);
data
&=
~
(
0xF
<<
8
);
data
|=
(
0xB
<<
8
);
data
|=
(
0xB
<<
8
);
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_HD_CTRL
,
E1000_KMRNCTRLSTA_HD_CTRL
,
data
);
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Enable jumbo frame workaround in the PHY */
/* Enable jumbo frame workaround in the PHY */
e1e_rphy
(
hw
,
PHY_REG
(
769
,
23
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
769
,
23
),
&
data
);
...
@@ -1570,25 +1559,25 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
...
@@ -1570,25 +1559,25 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
data
|=
(
0x37
<<
5
);
data
|=
(
0x37
<<
5
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
23
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
23
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
PHY_REG
(
769
,
16
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
769
,
16
),
&
data
);
data
&=
~
(
1
<<
13
);
data
&=
~
(
1
<<
13
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
16
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
16
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
PHY_REG
(
776
,
20
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
776
,
20
),
&
data
);
data
&=
~
(
0x3FF
<<
2
);
data
&=
~
(
0x3FF
<<
2
);
data
|=
(
0x1A
<<
2
);
data
|=
(
0x1A
<<
2
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
20
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
20
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
23
),
0xF100
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
23
),
0xF100
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
HV_PM_CTRL
,
&
data
);
e1e_rphy
(
hw
,
HV_PM_CTRL
,
&
data
);
ret_val
=
e1e_wphy
(
hw
,
HV_PM_CTRL
,
data
|
(
1
<<
10
));
ret_val
=
e1e_wphy
(
hw
,
HV_PM_CTRL
,
data
|
(
1
<<
10
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
else
{
}
else
{
/* Write MAC register values back to h/w defaults */
/* Write MAC register values back to h/w defaults */
mac_reg
=
er32
(
FFLT_DBG
);
mac_reg
=
er32
(
FFLT_DBG
);
...
@@ -1603,56 +1592,53 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
...
@@ -1603,56 +1592,53 @@ s32 e1000_lv_jumbo_workaround_ich8lan(struct e1000_hw *hw, bool enable)
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
&
data
);
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
E1000_KMRNCTRLSTA_CTRL_OFFSET
,
data
&
~
(
1
<<
0
));
data
&
~
(
1
<<
0
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000e_read_kmrn_reg
(
hw
,
ret_val
=
e1000e_read_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_HD_CTRL
,
E1000_KMRNCTRLSTA_HD_CTRL
,
&
data
);
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
data
&=
~
(
0xF
<<
8
);
data
&=
~
(
0xF
<<
8
);
data
|=
(
0xB
<<
8
);
data
|=
(
0xB
<<
8
);
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
ret_val
=
e1000e_write_kmrn_reg
(
hw
,
E1000_KMRNCTRLSTA_HD_CTRL
,
E1000_KMRNCTRLSTA_HD_CTRL
,
data
);
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Write PHY register values back to h/w defaults */
/* Write PHY register values back to h/w defaults */
e1e_rphy
(
hw
,
PHY_REG
(
769
,
23
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
769
,
23
),
&
data
);
data
&=
~
(
0x7F
<<
5
);
data
&=
~
(
0x7F
<<
5
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
23
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
23
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
PHY_REG
(
769
,
16
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
769
,
16
),
&
data
);
data
|=
(
1
<<
13
);
data
|=
(
1
<<
13
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
16
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
16
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
PHY_REG
(
776
,
20
),
&
data
);
e1e_rphy
(
hw
,
PHY_REG
(
776
,
20
),
&
data
);
data
&=
~
(
0x3FF
<<
2
);
data
&=
~
(
0x3FF
<<
2
);
data
|=
(
0x8
<<
2
);
data
|=
(
0x8
<<
2
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
20
),
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
20
),
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
23
),
0x7E00
);
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
776
,
23
),
0x7E00
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1e_rphy
(
hw
,
HV_PM_CTRL
,
&
data
);
e1e_rphy
(
hw
,
HV_PM_CTRL
,
&
data
);
ret_val
=
e1e_wphy
(
hw
,
HV_PM_CTRL
,
data
&
~
(
1
<<
10
));
ret_val
=
e1e_wphy
(
hw
,
HV_PM_CTRL
,
data
&
~
(
1
<<
10
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
/* re-enable Rx path after enabling/disabling workaround */
/* re-enable Rx path after enabling/disabling workaround */
ret_val
=
e1e_wphy
(
hw
,
PHY_REG
(
769
,
20
),
phy_reg
&
~
(
1
<<
14
));
return
e1e_wphy
(
hw
,
PHY_REG
(
769
,
20
),
phy_reg
&
~
(
1
<<
14
));
out:
return
ret_val
;
}
}
/**
/**
...
@@ -1664,14 +1650,14 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1664,14 +1650,14 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
s32
ret_val
=
0
;
s32
ret_val
=
0
;
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
goto
out
;
return
0
;
/* Set MDIO slow mode before any other MDIO access */
/* Set MDIO slow mode before any other MDIO access */
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
ret_val
=
e1000_set_mdio_slow_mode_hv
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
I82579_EMI_ADDR
,
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
I82579_EMI_ADDR
,
I82579_MSE_THRESHOLD
);
I82579_MSE_THRESHOLD
);
if
(
ret_val
)
if
(
ret_val
)
...
@@ -1689,7 +1675,6 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
...
@@ -1689,7 +1675,6 @@ static s32 e1000_lv_phy_workarounds_ich8lan(struct e1000_hw *hw)
release:
release:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1707,12 +1692,12 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
...
@@ -1707,12 +1692,12 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
u16
phy_reg
;
u16
phy_reg
;
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
if
(
hw
->
mac
.
type
!=
e1000_pch2lan
)
goto
out
;
return
0
;
/* Set K1 beacon duration based on 1Gbps speed or otherwise */
/* Set K1 beacon duration based on 1Gbps speed or otherwise */
ret_val
=
e1e_rphy
(
hw
,
HV_M_STATUS
,
&
status_reg
);
ret_val
=
e1e_rphy
(
hw
,
HV_M_STATUS
,
&
status_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
((
status_reg
&
(
HV_M_STATUS_LINK_UP
|
HV_M_STATUS_AUTONEG_COMPLETE
))
if
((
status_reg
&
(
HV_M_STATUS_LINK_UP
|
HV_M_STATUS_AUTONEG_COMPLETE
))
==
(
HV_M_STATUS_LINK_UP
|
HV_M_STATUS_AUTONEG_COMPLETE
))
{
==
(
HV_M_STATUS_LINK_UP
|
HV_M_STATUS_AUTONEG_COMPLETE
))
{
...
@@ -1721,7 +1706,7 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
...
@@ -1721,7 +1706,7 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
I82579_LPI_CTRL
,
&
phy_reg
);
ret_val
=
e1e_rphy
(
hw
,
I82579_LPI_CTRL
,
&
phy_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
status_reg
&
HV_M_STATUS_SPEED_1000
)
{
if
(
status_reg
&
HV_M_STATUS_SPEED_1000
)
{
mac_reg
|=
E1000_FEXTNVM4_BEACON_DURATION_8USEC
;
mac_reg
|=
E1000_FEXTNVM4_BEACON_DURATION_8USEC
;
...
@@ -1734,7 +1719,6 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
...
@@ -1734,7 +1719,6 @@ static s32 e1000_k1_workaround_lv(struct e1000_hw *hw)
ret_val
=
e1e_wphy
(
hw
,
I82579_LPI_CTRL
,
phy_reg
);
ret_val
=
e1e_wphy
(
hw
,
I82579_LPI_CTRL
,
phy_reg
);
}
}
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1805,7 +1789,7 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
...
@@ -1805,7 +1789,7 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
u16
reg
;
u16
reg
;
if
(
e1000_check_reset_block
(
hw
))
if
(
e1000_check_reset_block
(
hw
))
goto
out
;
return
0
;
/* Allow time for h/w to get to quiescent state after reset */
/* Allow time for h/w to get to quiescent state after reset */
usleep_range
(
10000
,
20000
);
usleep_range
(
10000
,
20000
);
...
@@ -1815,12 +1799,12 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
...
@@ -1815,12 +1799,12 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
case
e1000_pchlan
:
case
e1000_pchlan
:
ret_val
=
e1000_hv_phy_workarounds_ich8lan
(
hw
);
ret_val
=
e1000_hv_phy_workarounds_ich8lan
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
break
;
break
;
case
e1000_pch2lan
:
case
e1000_pch2lan
:
ret_val
=
e1000_lv_phy_workarounds_ich8lan
(
hw
);
ret_val
=
e1000_lv_phy_workarounds_ich8lan
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
break
;
break
;
default:
default:
break
;
break
;
...
@@ -1836,7 +1820,7 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
...
@@ -1836,7 +1820,7 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
/* Configure the LCD with the extended configuration region in NVM */
/* Configure the LCD with the extended configuration region in NVM */
ret_val
=
e1000_sw_lcd_config_ich8lan
(
hw
);
ret_val
=
e1000_sw_lcd_config_ich8lan
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Configure the LCD with the OEM bits in NVM */
/* Configure the LCD with the OEM bits in NVM */
ret_val
=
e1000_oem_bits_config_ich8lan
(
hw
,
true
);
ret_val
=
e1000_oem_bits_config_ich8lan
(
hw
,
true
);
...
@@ -1851,18 +1835,16 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
...
@@ -1851,18 +1835,16 @@ static s32 e1000_post_phy_reset_ich8lan(struct e1000_hw *hw)
/* Set EEE LPI Update Timer to 200usec */
/* Set EEE LPI Update Timer to 200usec */
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
I82579_EMI_ADDR
,
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
I82579_EMI_ADDR
,
I82579_LPI_UPDATE_TIMER
);
I82579_LPI_UPDATE_TIMER
);
if
(
ret_val
)
if
(
!
ret_val
)
goto
release
;
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
ret_val
=
hw
->
phy
.
ops
.
write_reg_locked
(
hw
,
I82579_EMI_DATA
,
I82579_EMI_DATA
,
0x1387
);
0x1387
);
release:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
}
}
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -1885,12 +1867,9 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
...
@@ -1885,12 +1867,9 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw)
ret_val
=
e1000e_phy_hw_reset_generic
(
hw
);
ret_val
=
e1000e_phy_hw_reset_generic
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
ret_val
=
e1000_post_phy_reset_ich8lan
(
hw
);
out:
return
ret_val
;
return
ret_val
;
return
e1000_post_phy_reset_ich8lan
(
hw
);
}
}
/**
/**
...
@@ -1911,7 +1890,7 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
...
@@ -1911,7 +1890,7 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
ret_val
=
e1e_rphy
(
hw
,
HV_OEM_BITS
,
&
oem_reg
);
ret_val
=
e1e_rphy
(
hw
,
HV_OEM_BITS
,
&
oem_reg
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
active
)
if
(
active
)
oem_reg
|=
HV_OEM_BITS_LPLU
;
oem_reg
|=
HV_OEM_BITS_LPLU
;
...
@@ -1921,10 +1900,7 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
...
@@ -1921,10 +1900,7 @@ static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active)
if
(
!
e1000_check_reset_block
(
hw
))
if
(
!
e1000_check_reset_block
(
hw
))
oem_reg
|=
HV_OEM_BITS_RESTART_AN
;
oem_reg
|=
HV_OEM_BITS_RESTART_AN
;
ret_val
=
e1e_wphy
(
hw
,
HV_OEM_BITS
,
oem_reg
);
return
e1e_wphy
(
hw
,
HV_OEM_BITS
,
oem_reg
);
out:
return
ret_val
;
}
}
/**
/**
...
@@ -1948,7 +1924,7 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
...
@@ -1948,7 +1924,7 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
u16
data
;
u16
data
;
if
(
phy
->
type
==
e1000_phy_ife
)
if
(
phy
->
type
==
e1000_phy_ife
)
return
ret_val
;
return
0
;
phy_ctrl
=
er32
(
PHY_CTRL
);
phy_ctrl
=
er32
(
PHY_CTRL
);
...
@@ -2030,7 +2006,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
...
@@ -2030,7 +2006,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
{
{
struct
e1000_phy_info
*
phy
=
&
hw
->
phy
;
struct
e1000_phy_info
*
phy
=
&
hw
->
phy
;
u32
phy_ctrl
;
u32
phy_ctrl
;
s32
ret_val
;
s32
ret_val
=
0
;
u16
data
;
u16
data
;
phy_ctrl
=
er32
(
PHY_CTRL
);
phy_ctrl
=
er32
(
PHY_CTRL
);
...
@@ -2096,7 +2072,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
...
@@ -2096,7 +2072,7 @@ static s32 e1000_set_d3_lplu_state_ich8lan(struct e1000_hw *hw, bool active)
ret_val
=
e1e_wphy
(
hw
,
IGP01E1000_PHY_PORT_CONFIG
,
data
);
ret_val
=
e1e_wphy
(
hw
,
IGP01E1000_PHY_PORT_CONFIG
,
data
);
}
}
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -2114,7 +2090,7 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
...
@@ -2114,7 +2090,7 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
u32
bank1_offset
=
nvm
->
flash_bank_size
*
sizeof
(
u16
);
u32
bank1_offset
=
nvm
->
flash_bank_size
*
sizeof
(
u16
);
u32
act_offset
=
E1000_ICH_NVM_SIG_WORD
*
2
+
1
;
u32
act_offset
=
E1000_ICH_NVM_SIG_WORD
*
2
+
1
;
u8
sig_byte
=
0
;
u8
sig_byte
=
0
;
s32
ret_val
=
0
;
s32
ret_val
;
switch
(
hw
->
mac
.
type
)
{
switch
(
hw
->
mac
.
type
)
{
case
e1000_ich8lan
:
case
e1000_ich8lan
:
...
@@ -2161,8 +2137,6 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
...
@@ -2161,8 +2137,6 @@ static s32 e1000_valid_nvm_bank_detect_ich8lan(struct e1000_hw *hw, u32 *bank)
e_dbg
(
"ERROR: No valid NVM bank present
\n
"
);
e_dbg
(
"ERROR: No valid NVM bank present
\n
"
);
return
-
E1000_ERR_NVM
;
return
-
E1000_ERR_NVM
;
}
}
return
0
;
}
}
/**
/**
...
@@ -2270,7 +2244,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
...
@@ -2270,7 +2244,7 @@ static s32 e1000_flash_cycle_init_ich8lan(struct e1000_hw *hw)
ew16flash
(
ICH_FLASH_HSFSTS
,
hsfsts
.
regval
);
ew16flash
(
ICH_FLASH_HSFSTS
,
hsfsts
.
regval
);
ret_val
=
0
;
ret_val
=
0
;
}
else
{
}
else
{
s32
i
=
0
;
s32
i
;
/*
/*
* Otherwise poll for sometime so the current
* Otherwise poll for sometime so the current
...
@@ -2310,7 +2284,6 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
...
@@ -2310,7 +2284,6 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
{
{
union
ich8_hws_flash_ctrl
hsflctl
;
union
ich8_hws_flash_ctrl
hsflctl
;
union
ich8_hws_flash_status
hsfsts
;
union
ich8_hws_flash_status
hsfsts
;
s32
ret_val
=
-
E1000_ERR_NVM
;
u32
i
=
0
;
u32
i
=
0
;
/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
...
@@ -2329,7 +2302,7 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
...
@@ -2329,7 +2302,7 @@ static s32 e1000_flash_cycle_ich8lan(struct e1000_hw *hw, u32 timeout)
if
(
hsfsts
.
hsf_status
.
flcdone
==
1
&&
hsfsts
.
hsf_status
.
flcerr
==
0
)
if
(
hsfsts
.
hsf_status
.
flcdone
==
1
&&
hsfsts
.
hsf_status
.
flcerr
==
0
)
return
0
;
return
0
;
return
ret_val
;
return
-
E1000_ERR_NVM
;
}
}
/**
/**
...
@@ -3004,7 +2977,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
...
@@ -3004,7 +2977,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
/* Get default ID LED modes */
/* Get default ID LED modes */
ret_val
=
hw
->
nvm
.
ops
.
valid_led_default
(
hw
,
&
data
);
ret_val
=
hw
->
nvm
.
ops
.
valid_led_default
(
hw
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
mac
->
ledctl_default
=
er32
(
LEDCTL
);
mac
->
ledctl_default
=
er32
(
LEDCTL
);
mac
->
ledctl_mode1
=
mac
->
ledctl_default
;
mac
->
ledctl_mode1
=
mac
->
ledctl_default
;
...
@@ -3049,8 +3022,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
...
@@ -3049,8 +3022,7 @@ static s32 e1000_id_led_init_pchlan(struct e1000_hw *hw)
}
}
}
}
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -3165,11 +3137,11 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
...
@@ -3165,11 +3137,11 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
if
(
ctrl
&
E1000_CTRL_PHY_RST
)
{
if
(
ctrl
&
E1000_CTRL_PHY_RST
)
{
ret_val
=
hw
->
phy
.
ops
.
get_cfg_done
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
get_cfg_done
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1000_post_phy_reset_ich8lan
(
hw
);
ret_val
=
e1000_post_phy_reset_ich8lan
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
/*
/*
...
@@ -3187,8 +3159,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
...
@@ -3187,8 +3159,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
kab
|=
E1000_KABGTXD_BGSQLBIAS
;
kab
|=
E1000_KABGTXD_BGSQLBIAS
;
ew32
(
KABGTXD
,
kab
);
ew32
(
KABGTXD
,
kab
);
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -3279,7 +3250,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
...
@@ -3279,7 +3250,7 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
*/
*/
e1000_clear_hw_cntrs_ich8lan
(
hw
);
e1000_clear_hw_cntrs_ich8lan
(
hw
);
return
0
;
return
ret_val
;
}
}
/**
/**
* e1000_initialize_hw_bits_ich8lan - Initialize required hardware bits
* e1000_initialize_hw_bits_ich8lan - Initialize required hardware bits
...
@@ -3482,6 +3453,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
...
@@ -3482,6 +3453,7 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw)
default:
default:
break
;
break
;
}
}
return
e1000e_setup_copper_link
(
hw
);
return
e1000e_setup_copper_link
(
hw
);
}
}
...
...
drivers/net/ethernet/intel/e1000e/mac.c
View file @
16dc459c
...
@@ -172,23 +172,23 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
...
@@ -172,23 +172,23 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
ret_val
=
e1000_read_nvm
(
hw
,
NVM_COMPAT
,
1
,
&
nvm_data
);
ret_val
=
e1000_read_nvm
(
hw
,
NVM_COMPAT
,
1
,
&
nvm_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* not supported on 82573 */
/* not supported on 82573 */
if
(
hw
->
mac
.
type
==
e1000_82573
)
if
(
hw
->
mac
.
type
==
e1000_82573
)
goto
out
;
return
0
;
ret_val
=
e1000_read_nvm
(
hw
,
NVM_ALT_MAC_ADDR_PTR
,
1
,
ret_val
=
e1000_read_nvm
(
hw
,
NVM_ALT_MAC_ADDR_PTR
,
1
,
&
nvm_alt_mac_addr_offset
);
&
nvm_alt_mac_addr_offset
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
if
((
nvm_alt_mac_addr_offset
==
0xFFFF
)
||
if
((
nvm_alt_mac_addr_offset
==
0xFFFF
)
||
(
nvm_alt_mac_addr_offset
==
0x0000
))
(
nvm_alt_mac_addr_offset
==
0x0000
))
/* There is no Alternate MAC Address */
/* There is no Alternate MAC Address */
goto
out
;
return
0
;
if
(
hw
->
bus
.
func
==
E1000_FUNC_1
)
if
(
hw
->
bus
.
func
==
E1000_FUNC_1
)
nvm_alt_mac_addr_offset
+=
E1000_ALT_MAC_ADDRESS_OFFSET_LAN1
;
nvm_alt_mac_addr_offset
+=
E1000_ALT_MAC_ADDRESS_OFFSET_LAN1
;
...
@@ -197,7 +197,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
...
@@ -197,7 +197,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
ret_val
=
e1000_read_nvm
(
hw
,
offset
,
1
,
&
nvm_data
);
ret_val
=
e1000_read_nvm
(
hw
,
offset
,
1
,
&
nvm_data
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
alt_mac_addr
[
i
]
=
(
u8
)(
nvm_data
&
0xFF
);
alt_mac_addr
[
i
]
=
(
u8
)(
nvm_data
&
0xFF
);
...
@@ -207,7 +207,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
...
@@ -207,7 +207,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
/* if multicast bit is set, the alternate address will not be used */
/* if multicast bit is set, the alternate address will not be used */
if
(
is_multicast_ether_addr
(
alt_mac_addr
))
{
if
(
is_multicast_ether_addr
(
alt_mac_addr
))
{
e_dbg
(
"Ignoring Alternate Mac Address with MC bit set
\n
"
);
e_dbg
(
"Ignoring Alternate Mac Address with MC bit set
\n
"
);
goto
out
;
return
0
;
}
}
/*
/*
...
@@ -217,8 +217,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
...
@@ -217,8 +217,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
*/
*/
e1000e_rar_set
(
hw
,
alt_mac_addr
,
0
);
e1000e_rar_set
(
hw
,
alt_mac_addr
,
0
);
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -444,7 +443,7 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
...
@@ -444,7 +443,7 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
return
ret_val
;
return
ret_val
;
if
(
!
link
)
if
(
!
link
)
return
ret_val
;
/* No link detected */
return
0
;
/* No link detected */
mac
->
get_link_status
=
false
;
mac
->
get_link_status
=
false
;
...
@@ -458,10 +457,8 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
...
@@ -458,10 +457,8 @@ s32 e1000e_check_for_copper_link(struct e1000_hw *hw)
* If we are forcing speed/duplex, then we simply return since
* If we are forcing speed/duplex, then we simply return since
* we have already determined whether we have link or not.
* we have already determined whether we have link or not.
*/
*/
if
(
!
mac
->
autoneg
)
{
if
(
!
mac
->
autoneg
)
ret_val
=
-
E1000_ERR_CONFIG
;
return
-
E1000_ERR_CONFIG
;
return
ret_val
;
}
/*
/*
* Auto-Neg is enabled. Auto Speed Detection takes care
* Auto-Neg is enabled. Auto Speed Detection takes care
...
@@ -924,7 +921,7 @@ s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw)
...
@@ -924,7 +921,7 @@ s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw)
e_dbg
(
"No signal detected
\n
"
);
e_dbg
(
"No signal detected
\n
"
);
}
}
return
0
;
return
ret_val
;
}
}
/**
/**
...
...
drivers/net/ethernet/intel/e1000e/manage.c
View file @
16dc459c
...
@@ -140,7 +140,7 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
...
@@ -140,7 +140,7 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
/* No manageability, no filtering */
/* No manageability, no filtering */
if
(
!
e1000e_check_mng_mode
(
hw
))
{
if
(
!
e1000e_check_mng_mode
(
hw
))
{
hw
->
mac
.
tx_pkt_filtering
=
false
;
hw
->
mac
.
tx_pkt_filtering
=
false
;
goto
out
;
return
hw
->
mac
.
tx_pkt_filtering
;
}
}
/*
/*
...
@@ -150,7 +150,7 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
...
@@ -150,7 +150,7 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
ret_val
=
e1000_mng_enable_host_if
(
hw
);
ret_val
=
e1000_mng_enable_host_if
(
hw
);
if
(
ret_val
)
{
if
(
ret_val
)
{
hw
->
mac
.
tx_pkt_filtering
=
false
;
hw
->
mac
.
tx_pkt_filtering
=
false
;
goto
out
;
return
hw
->
mac
.
tx_pkt_filtering
;
}
}
/* Read in the header. Length and offset are in dwords. */
/* Read in the header. Length and offset are in dwords. */
...
@@ -170,16 +170,13 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
...
@@ -170,16 +170,13 @@ bool e1000e_enable_tx_pkt_filtering(struct e1000_hw *hw)
*/
*/
if
((
hdr_csum
!=
csum
)
||
(
hdr
->
signature
!=
E1000_IAMT_SIGNATURE
))
{
if
((
hdr_csum
!=
csum
)
||
(
hdr
->
signature
!=
E1000_IAMT_SIGNATURE
))
{
hw
->
mac
.
tx_pkt_filtering
=
true
;
hw
->
mac
.
tx_pkt_filtering
=
true
;
goto
out
;
return
hw
->
mac
.
tx_pkt_filtering
;
}
}
/* Cookie area is valid, make the final check for filtering. */
/* Cookie area is valid, make the final check for filtering. */
if
(
!
(
hdr
->
status
&
E1000_MNG_DHCP_COOKIE_STATUS_PARSING
))
{
if
(
!
(
hdr
->
status
&
E1000_MNG_DHCP_COOKIE_STATUS_PARSING
))
hw
->
mac
.
tx_pkt_filtering
=
false
;
hw
->
mac
.
tx_pkt_filtering
=
false
;
goto
out
;
}
out:
return
hw
->
mac
.
tx_pkt_filtering
;
return
hw
->
mac
.
tx_pkt_filtering
;
}
}
...
@@ -336,12 +333,11 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
...
@@ -336,12 +333,11 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
{
{
u32
manc
;
u32
manc
;
u32
fwsm
,
factps
;
u32
fwsm
,
factps
;
bool
ret_val
=
false
;
manc
=
er32
(
MANC
);
manc
=
er32
(
MANC
);
if
(
!
(
manc
&
E1000_MANC_RCV_TCO_EN
))
if
(
!
(
manc
&
E1000_MANC_RCV_TCO_EN
))
goto
out
;
return
false
;
if
(
hw
->
mac
.
has_fwsm
)
{
if
(
hw
->
mac
.
has_fwsm
)
{
fwsm
=
er32
(
FWSM
);
fwsm
=
er32
(
FWSM
);
...
@@ -349,10 +345,8 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
...
@@ -349,10 +345,8 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
if
(
!
(
factps
&
E1000_FACTPS_MNGCG
)
&&
if
(
!
(
factps
&
E1000_FACTPS_MNGCG
)
&&
((
fwsm
&
E1000_FWSM_MODE_MASK
)
==
((
fwsm
&
E1000_FWSM_MODE_MASK
)
==
(
e1000_mng_mode_pt
<<
E1000_FWSM_MODE_SHIFT
)))
{
(
e1000_mng_mode_pt
<<
E1000_FWSM_MODE_SHIFT
)))
ret_val
=
true
;
return
true
;
goto
out
;
}
}
else
if
((
hw
->
mac
.
type
==
e1000_82574
)
||
}
else
if
((
hw
->
mac
.
type
==
e1000_82574
)
||
(
hw
->
mac
.
type
==
e1000_82583
))
{
(
hw
->
mac
.
type
==
e1000_82583
))
{
u16
data
;
u16
data
;
...
@@ -362,16 +356,12 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
...
@@ -362,16 +356,12 @@ bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw)
if
(
!
(
factps
&
E1000_FACTPS_MNGCG
)
&&
if
(
!
(
factps
&
E1000_FACTPS_MNGCG
)
&&
((
data
&
E1000_NVM_INIT_CTRL2_MNGM
)
==
((
data
&
E1000_NVM_INIT_CTRL2_MNGM
)
==
(
e1000_mng_mode_pt
<<
13
)))
{
(
e1000_mng_mode_pt
<<
13
)))
ret_val
=
true
;
return
true
;
goto
out
;
}
}
else
if
((
manc
&
E1000_MANC_SMBUS_EN
)
&&
}
else
if
((
manc
&
E1000_MANC_SMBUS_EN
)
&&
!
(
manc
&
E1000_MANC_ASF_EN
))
{
!
(
manc
&
E1000_MANC_ASF_EN
))
{
ret_val
=
true
;
return
true
;
goto
out
;
}
}
out:
return
false
;
return
ret_val
;
}
}
drivers/net/ethernet/intel/e1000e/netdev.c
View file @
16dc459c
...
@@ -1985,7 +1985,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
...
@@ -1985,7 +1985,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
e1000_intr_msix_rx
,
0
,
adapter
->
rx_ring
->
name
,
e1000_intr_msix_rx
,
0
,
adapter
->
rx_ring
->
name
,
netdev
);
netdev
);
if
(
err
)
if
(
err
)
goto
out
;
return
err
;
adapter
->
rx_ring
->
itr_register
=
adapter
->
hw
.
hw_addr
+
adapter
->
rx_ring
->
itr_register
=
adapter
->
hw
.
hw_addr
+
E1000_EITR_82574
(
vector
);
E1000_EITR_82574
(
vector
);
adapter
->
rx_ring
->
itr_val
=
adapter
->
itr
;
adapter
->
rx_ring
->
itr_val
=
adapter
->
itr
;
...
@@ -2001,7 +2001,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
...
@@ -2001,7 +2001,7 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
e1000_intr_msix_tx
,
0
,
adapter
->
tx_ring
->
name
,
e1000_intr_msix_tx
,
0
,
adapter
->
tx_ring
->
name
,
netdev
);
netdev
);
if
(
err
)
if
(
err
)
goto
out
;
return
err
;
adapter
->
tx_ring
->
itr_register
=
adapter
->
hw
.
hw_addr
+
adapter
->
tx_ring
->
itr_register
=
adapter
->
hw
.
hw_addr
+
E1000_EITR_82574
(
vector
);
E1000_EITR_82574
(
vector
);
adapter
->
tx_ring
->
itr_val
=
adapter
->
itr
;
adapter
->
tx_ring
->
itr_val
=
adapter
->
itr
;
...
@@ -2010,12 +2010,11 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
...
@@ -2010,12 +2010,11 @@ static int e1000_request_msix(struct e1000_adapter *adapter)
err
=
request_irq
(
adapter
->
msix_entries
[
vector
].
vector
,
err
=
request_irq
(
adapter
->
msix_entries
[
vector
].
vector
,
e1000_msix_other
,
0
,
netdev
->
name
,
netdev
);
e1000_msix_other
,
0
,
netdev
->
name
,
netdev
);
if
(
err
)
if
(
err
)
goto
out
;
return
err
;
e1000_configure_msix
(
adapter
);
e1000_configure_msix
(
adapter
);
return
0
;
return
0
;
out:
return
err
;
}
}
/**
/**
...
@@ -2367,7 +2366,7 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
...
@@ -2367,7 +2366,7 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
unsigned
int
retval
=
itr_setting
;
unsigned
int
retval
=
itr_setting
;
if
(
packets
==
0
)
if
(
packets
==
0
)
goto
update_itr_done
;
return
itr_setting
;
switch
(
itr_setting
)
{
switch
(
itr_setting
)
{
case
lowest_latency
:
case
lowest_latency
:
...
@@ -2402,7 +2401,6 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
...
@@ -2402,7 +2401,6 @@ static unsigned int e1000_update_itr(struct e1000_adapter *adapter,
break
;
break
;
}
}
update_itr_done:
return
retval
;
return
retval
;
}
}
...
@@ -5365,7 +5363,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
...
@@ -5365,7 +5363,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
/* Enable access to wakeup registers on and set page to BM_WUC_PAGE */
/* Enable access to wakeup registers on and set page to BM_WUC_PAGE */
retval
=
e1000_enable_phy_wakeup_reg_access_bm
(
hw
,
&
wuc_enable
);
retval
=
e1000_enable_phy_wakeup_reg_access_bm
(
hw
,
&
wuc_enable
);
if
(
retval
)
if
(
retval
)
goto
out
;
goto
release
;
/* copy MAC MTA to PHY MTA - only needed for pchlan */
/* copy MAC MTA to PHY MTA - only needed for pchlan */
for
(
i
=
0
;
i
<
adapter
->
hw
.
mac
.
mta_reg_count
;
i
++
)
{
for
(
i
=
0
;
i
<
adapter
->
hw
.
mac
.
mta_reg_count
;
i
++
)
{
...
@@ -5409,7 +5407,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
...
@@ -5409,7 +5407,7 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
retval
=
e1000_disable_phy_wakeup_reg_access_bm
(
hw
,
&
wuc_enable
);
retval
=
e1000_disable_phy_wakeup_reg_access_bm
(
hw
,
&
wuc_enable
);
if
(
retval
)
if
(
retval
)
e_err
(
"Could not set PHY Host Wakeup bit
\n
"
);
e_err
(
"Could not set PHY Host Wakeup bit
\n
"
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
retval
;
return
retval
;
...
...
drivers/net/ethernet/intel/e1000e/nvm.c
View file @
16dc459c
...
@@ -382,10 +382,8 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
...
@@ -382,10 +382,8 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
u8
write_opcode
=
NVM_WRITE_OPCODE_SPI
;
u8
write_opcode
=
NVM_WRITE_OPCODE_SPI
;
ret_val
=
e1000_ready_nvm_eeprom
(
hw
);
ret_val
=
e1000_ready_nvm_eeprom
(
hw
);
if
(
ret_val
)
{
if
(
ret_val
)
nvm
->
ops
.
release
(
hw
);
goto
release
;
return
ret_val
;
}
e1000_standby_nvm
(
hw
);
e1000_standby_nvm
(
hw
);
...
@@ -422,8 +420,10 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
...
@@ -422,8 +420,10 @@ s32 e1000e_write_nvm_spi(struct e1000_hw *hw, u16 offset, u16 words, u16 *data)
}
}
usleep_range
(
10000
,
20000
);
usleep_range
(
10000
,
20000
);
release:
nvm
->
ops
.
release
(
hw
);
nvm
->
ops
.
release
(
hw
);
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -446,20 +446,19 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
...
@@ -446,20 +446,19 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
if
(
pba_num
==
NULL
)
{
if
(
pba_num
==
NULL
)
{
e_dbg
(
"PBA string buffer was null
\n
"
);
e_dbg
(
"PBA string buffer was null
\n
"
);
ret_val
=
E1000_ERR_INVALID_ARGUMENT
;
return
-
E1000_ERR_INVALID_ARGUMENT
;
goto
out
;
}
}
ret_val
=
e1000_read_nvm
(
hw
,
NVM_PBA_OFFSET_0
,
1
,
&
nvm_data
);
ret_val
=
e1000_read_nvm
(
hw
,
NVM_PBA_OFFSET_0
,
1
,
&
nvm_data
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
ret_val
=
e1000_read_nvm
(
hw
,
NVM_PBA_OFFSET_1
,
1
,
&
pba_ptr
);
ret_val
=
e1000_read_nvm
(
hw
,
NVM_PBA_OFFSET_1
,
1
,
&
pba_ptr
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
/*
/*
...
@@ -499,25 +498,23 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
...
@@ -499,25 +498,23 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
pba_num
[
offset
]
+=
'A'
-
0xA
;
pba_num
[
offset
]
+=
'A'
-
0xA
;
}
}
goto
out
;
return
0
;
}
}
ret_val
=
e1000_read_nvm
(
hw
,
pba_ptr
,
1
,
&
length
);
ret_val
=
e1000_read_nvm
(
hw
,
pba_ptr
,
1
,
&
length
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
if
(
length
==
0xFFFF
||
length
==
0
)
{
if
(
length
==
0xFFFF
||
length
==
0
)
{
e_dbg
(
"NVM PBA number section invalid length
\n
"
);
e_dbg
(
"NVM PBA number section invalid length
\n
"
);
ret_val
=
E1000_ERR_NVM_PBA_SECTION
;
return
-
E1000_ERR_NVM_PBA_SECTION
;
goto
out
;
}
}
/* check if pba_num buffer is big enough */
/* check if pba_num buffer is big enough */
if
(
pba_num_size
<
(((
u32
)
length
*
2
)
-
1
))
{
if
(
pba_num_size
<
(((
u32
)
length
*
2
)
-
1
))
{
e_dbg
(
"PBA string buffer too small
\n
"
);
e_dbg
(
"PBA string buffer too small
\n
"
);
ret_val
=
E1000_ERR_NO_SPACE
;
return
-
E1000_ERR_NO_SPACE
;
goto
out
;
}
}
/* trim pba length from start of string */
/* trim pba length from start of string */
...
@@ -528,15 +525,14 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
...
@@ -528,15 +525,14 @@ s32 e1000_read_pba_string_generic(struct e1000_hw *hw, u8 *pba_num,
ret_val
=
e1000_read_nvm
(
hw
,
pba_ptr
+
offset
,
1
,
&
nvm_data
);
ret_val
=
e1000_read_nvm
(
hw
,
pba_ptr
+
offset
,
1
,
&
nvm_data
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"NVM Read Error
\n
"
);
e_dbg
(
"NVM Read Error
\n
"
);
goto
out
;
return
ret_val
;
}
}
pba_num
[
offset
*
2
]
=
(
u8
)(
nvm_data
>>
8
);
pba_num
[
offset
*
2
]
=
(
u8
)(
nvm_data
>>
8
);
pba_num
[(
offset
*
2
)
+
1
]
=
(
u8
)(
nvm_data
&
0xFF
);
pba_num
[(
offset
*
2
)
+
1
]
=
(
u8
)(
nvm_data
&
0xFF
);
}
}
pba_num
[
offset
*
2
]
=
'\0'
;
pba_num
[
offset
*
2
]
=
'\0'
;
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
...
drivers/net/ethernet/intel/e1000e/phy.c
View file @
16dc459c
...
@@ -133,29 +133,29 @@ s32 e1000e_get_phy_id(struct e1000_hw *hw)
...
@@ -133,29 +133,29 @@ s32 e1000e_get_phy_id(struct e1000_hw *hw)
u16
retry_count
=
0
;
u16
retry_count
=
0
;
if
(
!
phy
->
ops
.
read_reg
)
if
(
!
phy
->
ops
.
read_reg
)
goto
out
;
return
0
;
while
(
retry_count
<
2
)
{
while
(
retry_count
<
2
)
{
ret_val
=
e1e_rphy
(
hw
,
PHY_ID1
,
&
phy_id
);
ret_val
=
e1e_rphy
(
hw
,
PHY_ID1
,
&
phy_id
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
id
=
(
u32
)(
phy_id
<<
16
);
phy
->
id
=
(
u32
)(
phy_id
<<
16
);
udelay
(
20
);
udelay
(
20
);
ret_val
=
e1e_rphy
(
hw
,
PHY_ID2
,
&
phy_id
);
ret_val
=
e1e_rphy
(
hw
,
PHY_ID2
,
&
phy_id
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
id
|=
(
u32
)(
phy_id
&
PHY_REVISION_MASK
);
phy
->
id
|=
(
u32
)(
phy_id
&
PHY_REVISION_MASK
);
phy
->
revision
=
(
u32
)(
phy_id
&
~
PHY_REVISION_MASK
);
phy
->
revision
=
(
u32
)(
phy_id
&
~
PHY_REVISION_MASK
);
if
(
phy
->
id
!=
0
&&
phy
->
id
!=
PHY_REVISION_MASK
)
if
(
phy
->
id
!=
0
&&
phy
->
id
!=
PHY_REVISION_MASK
)
goto
out
;
return
0
;
retry_count
++
;
retry_count
++
;
}
}
out:
return
ret_val
;
return
0
;
}
}
/**
/**
...
@@ -383,28 +383,24 @@ static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data,
...
@@ -383,28 +383,24 @@ static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data,
if
(
!
locked
)
{
if
(
!
locked
)
{
if
(
!
hw
->
phy
.
ops
.
acquire
)
if
(
!
hw
->
phy
.
ops
.
acquire
)
goto
out
;
return
0
;
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
if
(
offset
>
MAX_PHY_MULTI_PAGE_REG
)
{
if
(
offset
>
MAX_PHY_MULTI_PAGE_REG
)
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
IGP01E1000_PHY_PAGE_SELECT
,
(
u16
)
offset
);
(
u16
)
offset
);
if
(
ret_val
)
if
(
!
ret_val
)
goto
release
;
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
}
MAX_PHY_REG_ADDRESS
&
offset
,
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
release:
if
(
!
locked
)
if
(
!
locked
)
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -454,29 +450,24 @@ static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data,
...
@@ -454,29 +450,24 @@ static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data,
if
(
!
locked
)
{
if
(
!
locked
)
{
if
(
!
hw
->
phy
.
ops
.
acquire
)
if
(
!
hw
->
phy
.
ops
.
acquire
)
goto
out
;
return
0
;
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
if
(
offset
>
MAX_PHY_MULTI_PAGE_REG
)
{
if
(
offset
>
MAX_PHY_MULTI_PAGE_REG
)
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
IGP01E1000_PHY_PAGE_SELECT
,
IGP01E1000_PHY_PAGE_SELECT
,
(
u16
)
offset
);
(
u16
)
offset
);
if
(
ret_val
)
if
(
!
ret_val
)
goto
release
;
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
}
offset
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
release:
if
(
!
locked
)
if
(
!
locked
)
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -523,15 +514,16 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
...
@@ -523,15 +514,16 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
bool
locked
)
bool
locked
)
{
{
u32
kmrnctrlsta
;
u32
kmrnctrlsta
;
s32
ret_val
=
0
;
if
(
!
locked
)
{
if
(
!
locked
)
{
s32
ret_val
=
0
;
if
(
!
hw
->
phy
.
ops
.
acquire
)
if
(
!
hw
->
phy
.
ops
.
acquire
)
goto
out
;
return
0
;
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
kmrnctrlsta
=
((
offset
<<
E1000_KMRNCTRLSTA_OFFSET_SHIFT
)
&
kmrnctrlsta
=
((
offset
<<
E1000_KMRNCTRLSTA_OFFSET_SHIFT
)
&
...
@@ -547,8 +539,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
...
@@ -547,8 +539,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data,
if
(
!
locked
)
if
(
!
locked
)
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -596,15 +587,16 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
...
@@ -596,15 +587,16 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
bool
locked
)
bool
locked
)
{
{
u32
kmrnctrlsta
;
u32
kmrnctrlsta
;
s32
ret_val
=
0
;
if
(
!
locked
)
{
if
(
!
locked
)
{
s32
ret_val
=
0
;
if
(
!
hw
->
phy
.
ops
.
acquire
)
if
(
!
hw
->
phy
.
ops
.
acquire
)
goto
out
;
return
0
;
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
acquire
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
kmrnctrlsta
=
((
offset
<<
E1000_KMRNCTRLSTA_OFFSET_SHIFT
)
&
kmrnctrlsta
=
((
offset
<<
E1000_KMRNCTRLSTA_OFFSET_SHIFT
)
&
...
@@ -617,8 +609,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
...
@@ -617,8 +609,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data,
if
(
!
locked
)
if
(
!
locked
)
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -663,17 +654,14 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw)
...
@@ -663,17 +654,14 @@ s32 e1000_copper_link_setup_82577(struct e1000_hw *hw)
/* Enable CRS on Tx. This must be set for half-duplex operation. */
/* Enable CRS on Tx. This must be set for half-duplex operation. */
ret_val
=
e1e_rphy
(
hw
,
I82577_CFG_REG
,
&
phy_data
);
ret_val
=
e1e_rphy
(
hw
,
I82577_CFG_REG
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy_data
|=
I82577_CFG_ASSERT_CRS_ON_TX
;
phy_data
|=
I82577_CFG_ASSERT_CRS_ON_TX
;
/* Enable downshift */
/* Enable downshift */
phy_data
|=
I82577_CFG_ENABLE_DOWNSHIFT
;
phy_data
|=
I82577_CFG_ENABLE_DOWNSHIFT
;
ret_val
=
e1e_wphy
(
hw
,
I82577_CFG_REG
,
phy_data
);
return
e1e_wphy
(
hw
,
I82577_CFG_REG
,
phy_data
);
out:
return
ret_val
;
}
}
/**
/**
...
@@ -1064,8 +1052,7 @@ static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
...
@@ -1064,8 +1052,7 @@ static s32 e1000_phy_setup_autoneg(struct e1000_hw *hw)
break
;
break
;
default:
default:
e_dbg
(
"Flow control param set incorrectly
\n
"
);
e_dbg
(
"Flow control param set incorrectly
\n
"
);
ret_val
=
-
E1000_ERR_CONFIG
;
return
-
E1000_ERR_CONFIG
;
return
ret_val
;
}
}
ret_val
=
e1e_wphy
(
hw
,
PHY_AUTONEG_ADV
,
mii_autoneg_adv_reg
);
ret_val
=
e1e_wphy
(
hw
,
PHY_AUTONEG_ADV
,
mii_autoneg_adv_reg
);
...
@@ -1265,8 +1252,6 @@ s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
...
@@ -1265,8 +1252,6 @@ s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw)
PHY_FORCE_LIMIT
,
PHY_FORCE_LIMIT
,
100000
,
100000
,
&
link
);
&
link
);
if
(
ret_val
)
return
ret_val
;
}
}
return
ret_val
;
return
ret_val
;
...
@@ -1400,25 +1385,25 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
...
@@ -1400,25 +1385,25 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1000e_phy_force_speed_duplex_setup
(
hw
,
&
data
);
e1000e_phy_force_speed_duplex_setup
(
hw
,
&
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_CONTROL
,
data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_CONTROL
,
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
/* Disable MDI-X support for 10/100 */
/* Disable MDI-X support for 10/100 */
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
data
&=
~
IFE_PMC_AUTO_MDIX
;
data
&=
~
IFE_PMC_AUTO_MDIX
;
data
&=
~
IFE_PMC_FORCE_MDIX
;
data
&=
~
IFE_PMC_FORCE_MDIX
;
ret_val
=
e1e_wphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
data
);
ret_val
=
e1e_wphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e_dbg
(
"IFE PMC: %X
\n
"
,
data
);
e_dbg
(
"IFE PMC: %X
\n
"
,
data
);
...
@@ -1432,7 +1417,7 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
...
@@ -1432,7 +1417,7 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
100000
,
100000
,
&
link
);
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
!
link
)
if
(
!
link
)
e_dbg
(
"Link taking longer than expected.
\n
"
);
e_dbg
(
"Link taking longer than expected.
\n
"
);
...
@@ -1443,11 +1428,10 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
...
@@ -1443,11 +1428,10 @@ s32 e1000_phy_force_speed_duplex_ife(struct e1000_hw *hw)
100000
,
100000
,
&
link
);
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
}
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -1832,22 +1816,20 @@ s32 e1000e_get_cable_length_m88(struct e1000_hw *hw)
...
@@ -1832,22 +1816,20 @@ s32 e1000e_get_cable_length_m88(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
M88E1000_PHY_SPEC_STATUS
,
&
phy_data
);
ret_val
=
e1e_rphy
(
hw
,
M88E1000_PHY_SPEC_STATUS
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
index
=
(
phy_data
&
M88E1000_PSSR_CABLE_LENGTH
)
>>
index
=
(
phy_data
&
M88E1000_PSSR_CABLE_LENGTH
)
>>
M88E1000_PSSR_CABLE_LENGTH_SHIFT
;
M88E1000_PSSR_CABLE_LENGTH_SHIFT
;
if
(
index
>=
M88E1000_CABLE_LENGTH_TABLE_SIZE
-
1
)
{
ret_val
=
-
E1000_ERR_PHY
;
if
(
index
>=
M88E1000_CABLE_LENGTH_TABLE_SIZE
-
1
)
goto
out
;
return
-
E1000_ERR_PHY
;
}
phy
->
min_cable_length
=
e1000_m88_cable_length_table
[
index
];
phy
->
min_cable_length
=
e1000_m88_cable_length_table
[
index
];
phy
->
max_cable_length
=
e1000_m88_cable_length_table
[
index
+
1
];
phy
->
max_cable_length
=
e1000_m88_cable_length_table
[
index
+
1
];
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -1917,7 +1899,7 @@ s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw)
...
@@ -1917,7 +1899,7 @@ s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw)
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
phy
->
cable_length
=
(
phy
->
min_cable_length
+
phy
->
max_cable_length
)
/
2
;
return
ret_val
;
return
0
;
}
}
/**
/**
...
@@ -2072,24 +2054,23 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
...
@@ -2072,24 +2054,23 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
!
link
)
{
if
(
!
link
)
{
e_dbg
(
"Phy info is only valid if link is up
\n
"
);
e_dbg
(
"Phy info is only valid if link is up
\n
"
);
ret_val
=
-
E1000_ERR_CONFIG
;
return
-
E1000_ERR_CONFIG
;
goto
out
;
}
}
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_SPECIAL_CONTROL
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
polarity_correction
=
(
data
&
IFE_PSC_AUTO_POLARITY_DISABLE
)
phy
->
polarity_correction
=
(
data
&
IFE_PSC_AUTO_POLARITY_DISABLE
)
?
false
:
true
;
?
false
:
true
;
if
(
phy
->
polarity_correction
)
{
if
(
phy
->
polarity_correction
)
{
ret_val
=
e1000_check_polarity_ife
(
hw
);
ret_val
=
e1000_check_polarity_ife
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
}
else
{
}
else
{
/* Polarity is forced */
/* Polarity is forced */
phy
->
cable_polarity
=
(
data
&
IFE_PSC_FORCE_POLARITY
)
phy
->
cable_polarity
=
(
data
&
IFE_PSC_FORCE_POLARITY
)
...
@@ -2099,7 +2080,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
...
@@ -2099,7 +2080,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
IFE_PHY_MDIX_CONTROL
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
is_mdix
=
(
data
&
IFE_PMC_MDIX_STATUS
)
?
true
:
false
;
phy
->
is_mdix
=
(
data
&
IFE_PMC_MDIX_STATUS
)
?
true
:
false
;
...
@@ -2108,8 +2089,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
...
@@ -2108,8 +2089,7 @@ s32 e1000_get_phy_info_ife(struct e1000_hw *hw)
phy
->
local_rx
=
e1000_1000t_rx_status_undefined
;
phy
->
local_rx
=
e1000_1000t_rx_status_undefined
;
phy
->
remote_rx
=
e1000_1000t_rx_status_undefined
;
phy
->
remote_rx
=
e1000_1000t_rx_status_undefined
;
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -2368,7 +2348,6 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
...
@@ -2368,7 +2348,6 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id)
**/
**/
s32
e1000e_determine_phy_address
(
struct
e1000_hw
*
hw
)
s32
e1000e_determine_phy_address
(
struct
e1000_hw
*
hw
)
{
{
s32
ret_val
=
-
E1000_ERR_PHY_TYPE
;
u32
phy_addr
=
0
;
u32
phy_addr
=
0
;
u32
i
;
u32
i
;
enum
e1000_phy_type
phy_type
=
e1000_phy_unknown
;
enum
e1000_phy_type
phy_type
=
e1000_phy_unknown
;
...
@@ -2387,17 +2366,15 @@ s32 e1000e_determine_phy_address(struct e1000_hw *hw)
...
@@ -2387,17 +2366,15 @@ s32 e1000e_determine_phy_address(struct e1000_hw *hw)
* If phy_type is valid, break - we found our
* If phy_type is valid, break - we found our
* PHY address
* PHY address
*/
*/
if
(
phy_type
!=
e1000_phy_unknown
)
{
if
(
phy_type
!=
e1000_phy_unknown
)
ret_val
=
0
;
return
0
;
goto
out
;
}
usleep_range
(
1000
,
2000
);
usleep_range
(
1000
,
2000
);
i
++
;
i
++
;
}
while
(
i
<
10
);
}
while
(
i
<
10
);
}
}
out:
return
-
E1000_ERR_PHY_TYPE
;
return
ret_val
;
}
}
/**
/**
...
@@ -2438,7 +2415,7 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
...
@@ -2438,7 +2415,7 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
if
(
page
==
BM_WUC_PAGE
)
{
if
(
page
==
BM_WUC_PAGE
)
{
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
&
data
,
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
&
data
,
false
,
false
);
false
,
false
);
goto
out
;
goto
release
;
}
}
hw
->
phy
.
addr
=
e1000_get_phy_addr_for_bm_page
(
page
,
offset
);
hw
->
phy
.
addr
=
e1000_get_phy_addr_for_bm_page
(
page
,
offset
);
...
@@ -2463,13 +2440,13 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
...
@@ -2463,13 +2440,13 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data)
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
page_select
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
page_select
,
(
page
<<
page_shift
));
(
page
<<
page_shift
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
}
}
...
@@ -2497,7 +2474,7 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
...
@@ -2497,7 +2474,7 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
if
(
page
==
BM_WUC_PAGE
)
{
if
(
page
==
BM_WUC_PAGE
)
{
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
data
,
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
data
,
true
,
false
);
true
,
false
);
goto
out
;
goto
release
;
}
}
hw
->
phy
.
addr
=
e1000_get_phy_addr_for_bm_page
(
page
,
offset
);
hw
->
phy
.
addr
=
e1000_get_phy_addr_for_bm_page
(
page
,
offset
);
...
@@ -2522,12 +2499,12 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
...
@@ -2522,12 +2499,12 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data)
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
page_select
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
page_select
,
(
page
<<
page_shift
));
(
page
<<
page_shift
));
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
}
}
...
@@ -2555,7 +2532,7 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
...
@@ -2555,7 +2532,7 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
if
(
page
==
BM_WUC_PAGE
)
{
if
(
page
==
BM_WUC_PAGE
)
{
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
data
,
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
data
,
true
,
false
);
true
,
false
);
goto
out
;
goto
release
;
}
}
hw
->
phy
.
addr
=
1
;
hw
->
phy
.
addr
=
1
;
...
@@ -2567,12 +2544,12 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
...
@@ -2567,12 +2544,12 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data)
page
);
page
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
}
}
...
@@ -2599,7 +2576,7 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
...
@@ -2599,7 +2576,7 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
if
(
page
==
BM_WUC_PAGE
)
{
if
(
page
==
BM_WUC_PAGE
)
{
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
&
data
,
ret_val
=
e1000_access_phy_wakeup_reg_bm
(
hw
,
offset
,
&
data
,
false
,
false
);
false
,
false
);
goto
out
;
goto
release
;
}
}
hw
->
phy
.
addr
=
1
;
hw
->
phy
.
addr
=
1
;
...
@@ -2610,13 +2587,13 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
...
@@ -2610,13 +2587,13 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data)
page
);
page
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
goto
release
;
}
}
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
MAX_PHY_REG_ADDRESS
&
offset
,
data
);
data
);
out
:
release
:
hw
->
phy
.
ops
.
release
(
hw
);
hw
->
phy
.
ops
.
release
(
hw
);
return
ret_val
;
return
ret_val
;
}
}
...
@@ -2641,14 +2618,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
...
@@ -2641,14 +2618,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
ret_val
=
e1000_set_page_igp
(
hw
,
(
BM_PORT_CTRL_PAGE
<<
IGP_PAGE_SHIFT
));
ret_val
=
e1000_set_page_igp
(
hw
,
(
BM_PORT_CTRL_PAGE
<<
IGP_PAGE_SHIFT
));
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not set Port Control page
\n
"
);
e_dbg
(
"Could not set Port Control page
\n
"
);
goto
out
;
return
ret_val
;
}
}
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
BM_WUC_ENABLE_REG
,
phy_reg
);
ret_val
=
e1000e_read_phy_reg_mdic
(
hw
,
BM_WUC_ENABLE_REG
,
phy_reg
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not read PHY register %d.%d
\n
"
,
e_dbg
(
"Could not read PHY register %d.%d
\n
"
,
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
goto
out
;
return
ret_val
;
}
}
/*
/*
...
@@ -2663,15 +2640,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
...
@@ -2663,15 +2640,14 @@ s32 e1000_enable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not write PHY register %d.%d
\n
"
,
e_dbg
(
"Could not write PHY register %d.%d
\n
"
,
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
goto
out
;
return
ret_val
;
}
}
/* Select Host Wakeup Registers page */
/*
ret_val
=
e1000_set_page_igp
(
hw
,
(
BM_WUC_PAGE
<<
IGP_PAGE_SHIFT
));
* Select Host Wakeup Registers page - caller now able to write
* registers on the Wakeup registers page
/* caller now able to write registers on the Wakeup registers page */
*/
out:
return
e1000_set_page_igp
(
hw
,
(
BM_WUC_PAGE
<<
IGP_PAGE_SHIFT
));
return
ret_val
;
}
}
/**
/**
...
@@ -2693,7 +2669,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
...
@@ -2693,7 +2669,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
ret_val
=
e1000_set_page_igp
(
hw
,
(
BM_PORT_CTRL_PAGE
<<
IGP_PAGE_SHIFT
));
ret_val
=
e1000_set_page_igp
(
hw
,
(
BM_PORT_CTRL_PAGE
<<
IGP_PAGE_SHIFT
));
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not set Port Control page
\n
"
);
e_dbg
(
"Could not set Port Control page
\n
"
);
goto
out
;
return
ret_val
;
}
}
/* Restore 769.17 to its original value */
/* Restore 769.17 to its original value */
...
@@ -2701,7 +2677,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
...
@@ -2701,7 +2677,7 @@ s32 e1000_disable_phy_wakeup_reg_access_bm(struct e1000_hw *hw, u16 *phy_reg)
if
(
ret_val
)
if
(
ret_val
)
e_dbg
(
"Could not restore PHY register %d.%d
\n
"
,
e_dbg
(
"Could not restore PHY register %d.%d
\n
"
,
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
BM_PORT_CTRL_PAGE
,
BM_WUC_ENABLE_REG
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -2749,7 +2725,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
...
@@ -2749,7 +2725,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
ret_val
=
e1000_enable_phy_wakeup_reg_access_bm
(
hw
,
&
phy_reg
);
ret_val
=
e1000_enable_phy_wakeup_reg_access_bm
(
hw
,
&
phy_reg
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not enable PHY wakeup reg access
\n
"
);
e_dbg
(
"Could not enable PHY wakeup reg access
\n
"
);
goto
out
;
return
ret_val
;
}
}
}
}
...
@@ -2759,7 +2735,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
...
@@ -2759,7 +2735,7 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
BM_WUC_ADDRESS_OPCODE
,
reg
);
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
BM_WUC_ADDRESS_OPCODE
,
reg
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not write address opcode to page %d
\n
"
,
page
);
e_dbg
(
"Could not write address opcode to page %d
\n
"
,
page
);
goto
out
;
return
ret_val
;
}
}
if
(
read
)
{
if
(
read
)
{
...
@@ -2774,13 +2750,12 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
...
@@ -2774,13 +2750,12 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset,
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not access PHY reg %d.%d
\n
"
,
page
,
reg
);
e_dbg
(
"Could not access PHY reg %d.%d
\n
"
,
page
,
reg
);
goto
out
;
return
ret_val
;
}
}
if
(
!
page_set
)
if
(
!
page_set
)
ret_val
=
e1000_disable_phy_wakeup_reg_access_bm
(
hw
,
&
phy_reg
);
ret_val
=
e1000_disable_phy_wakeup_reg_access_bm
(
hw
,
&
phy_reg
);
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -3136,7 +3111,7 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
...
@@ -3136,7 +3111,7 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
addr_reg
,
(
u16
)
offset
&
0x3F
);
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
addr_reg
,
(
u16
)
offset
&
0x3F
);
if
(
ret_val
)
{
if
(
ret_val
)
{
e_dbg
(
"Could not write the Address Offset port register
\n
"
);
e_dbg
(
"Could not write the Address Offset port register
\n
"
);
goto
out
;
return
ret_val
;
}
}
/* Read or write the data value next */
/* Read or write the data value next */
...
@@ -3145,12 +3120,9 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
...
@@ -3145,12 +3120,9 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset,
else
else
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
data_reg
,
*
data
);
ret_val
=
e1000e_write_phy_reg_mdic
(
hw
,
data_reg
,
*
data
);
if
(
ret_val
)
{
if
(
ret_val
)
e_dbg
(
"Could not access the Data port register
\n
"
);
e_dbg
(
"Could not access the Data port register
\n
"
);
goto
out
;
}
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -3171,17 +3143,17 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
...
@@ -3171,17 +3143,17 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
u16
data
;
u16
data
;
if
(
hw
->
phy
.
type
!=
e1000_phy_82578
)
if
(
hw
->
phy
.
type
!=
e1000_phy_82578
)
goto
out
;
return
0
;
/* Do not apply workaround if in PHY loopback bit 14 set */
/* Do not apply workaround if in PHY loopback bit 14 set */
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
data
);
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
data
);
if
(
data
&
PHY_CONTROL_LB
)
if
(
data
&
PHY_CONTROL_LB
)
goto
out
;
return
0
;
/* check if link is up and at 1Gbps */
/* check if link is up and at 1Gbps */
ret_val
=
e1e_rphy
(
hw
,
BM_CS_STATUS
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
BM_CS_STATUS
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
data
&=
BM_CS_STATUS_LINK_UP
|
data
&=
BM_CS_STATUS_LINK_UP
|
BM_CS_STATUS_RESOLVED
|
BM_CS_STATUS_RESOLVED
|
...
@@ -3190,7 +3162,7 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
...
@@ -3190,7 +3162,7 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
if
(
data
!=
(
BM_CS_STATUS_LINK_UP
|
if
(
data
!=
(
BM_CS_STATUS_LINK_UP
|
BM_CS_STATUS_RESOLVED
|
BM_CS_STATUS_RESOLVED
|
BM_CS_STATUS_SPEED_1000
))
BM_CS_STATUS_SPEED_1000
))
goto
out
;
return
0
;
mdelay
(
200
);
mdelay
(
200
);
...
@@ -3198,12 +3170,9 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
...
@@ -3198,12 +3170,9 @@ s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw)
ret_val
=
e1e_wphy
(
hw
,
HV_MUX_DATA_CTRL
,
HV_MUX_DATA_CTRL_GEN_TO_MAC
|
ret_val
=
e1e_wphy
(
hw
,
HV_MUX_DATA_CTRL
,
HV_MUX_DATA_CTRL_GEN_TO_MAC
|
HV_MUX_DATA_CTRL_FORCE_SPEED
);
HV_MUX_DATA_CTRL_FORCE_SPEED
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
ret_val
=
e1e_wphy
(
hw
,
HV_MUX_DATA_CTRL
,
HV_MUX_DATA_CTRL_GEN_TO_MAC
);
out:
return
ret_val
;
return
ret_val
;
return
e1e_wphy
(
hw
,
HV_MUX_DATA_CTRL
,
HV_MUX_DATA_CTRL_GEN_TO_MAC
);
}
}
/**
/**
...
@@ -3245,13 +3214,13 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
...
@@ -3245,13 +3214,13 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
phy_data
);
ret_val
=
e1e_rphy
(
hw
,
PHY_CONTROL
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
e1000e_phy_force_speed_duplex_setup
(
hw
,
&
phy_data
);
e1000e_phy_force_speed_duplex_setup
(
hw
,
&
phy_data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_CONTROL
,
phy_data
);
ret_val
=
e1e_wphy
(
hw
,
PHY_CONTROL
,
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
udelay
(
1
);
udelay
(
1
);
...
@@ -3263,7 +3232,7 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
...
@@ -3263,7 +3232,7 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
100000
,
100000
,
&
link
);
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
!
link
)
if
(
!
link
)
e_dbg
(
"Link taking longer than expected.
\n
"
);
e_dbg
(
"Link taking longer than expected.
\n
"
);
...
@@ -3273,11 +3242,8 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
...
@@ -3273,11 +3242,8 @@ s32 e1000_phy_force_speed_duplex_82577(struct e1000_hw *hw)
PHY_FORCE_LIMIT
,
PHY_FORCE_LIMIT
,
100000
,
100000
,
&
link
);
&
link
);
if
(
ret_val
)
goto
out
;
}
}
out:
return
ret_val
;
return
ret_val
;
}
}
...
@@ -3299,23 +3265,22 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
...
@@ -3299,23 +3265,22 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
ret_val
=
e1000e_phy_has_link_generic
(
hw
,
1
,
0
,
&
link
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
if
(
!
link
)
{
if
(
!
link
)
{
e_dbg
(
"Phy info is only valid if link is up
\n
"
);
e_dbg
(
"Phy info is only valid if link is up
\n
"
);
ret_val
=
-
E1000_ERR_CONFIG
;
return
-
E1000_ERR_CONFIG
;
goto
out
;
}
}
phy
->
polarity_correction
=
true
;
phy
->
polarity_correction
=
true
;
ret_val
=
e1000_check_polarity_82577
(
hw
);
ret_val
=
e1000_check_polarity_82577
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1e_rphy
(
hw
,
I82577_PHY_STATUS_2
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
I82577_PHY_STATUS_2
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
is_mdix
=
(
data
&
I82577_PHY_STATUS2_MDIX
)
?
true
:
false
;
phy
->
is_mdix
=
(
data
&
I82577_PHY_STATUS2_MDIX
)
?
true
:
false
;
...
@@ -3323,11 +3288,11 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
...
@@ -3323,11 +3288,11 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
I82577_PHY_STATUS2_SPEED_1000MBPS
)
{
I82577_PHY_STATUS2_SPEED_1000MBPS
)
{
ret_val
=
hw
->
phy
.
ops
.
get_cable_length
(
hw
);
ret_val
=
hw
->
phy
.
ops
.
get_cable_length
(
hw
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
ret_val
=
e1e_rphy
(
hw
,
PHY_1000T_STATUS
,
&
data
);
ret_val
=
e1e_rphy
(
hw
,
PHY_1000T_STATUS
,
&
data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
phy
->
local_rx
=
(
data
&
SR_1000T_LOCAL_RX_STATUS
)
phy
->
local_rx
=
(
data
&
SR_1000T_LOCAL_RX_STATUS
)
?
e1000_1000t_rx_status_ok
?
e1000_1000t_rx_status_ok
...
@@ -3342,8 +3307,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
...
@@ -3342,8 +3307,7 @@ s32 e1000_get_phy_info_82577(struct e1000_hw *hw)
phy
->
remote_rx
=
e1000_1000t_rx_status_undefined
;
phy
->
remote_rx
=
e1000_1000t_rx_status_undefined
;
}
}
out:
return
0
;
return
ret_val
;
}
}
/**
/**
...
@@ -3361,7 +3325,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
...
@@ -3361,7 +3325,7 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
ret_val
=
e1e_rphy
(
hw
,
I82577_PHY_DIAG_STATUS
,
&
phy_data
);
ret_val
=
e1e_rphy
(
hw
,
I82577_PHY_DIAG_STATUS
,
&
phy_data
);
if
(
ret_val
)
if
(
ret_val
)
goto
out
;
return
ret_val
;
length
=
(
phy_data
&
I82577_DSTATUS_CABLE_LENGTH
)
>>
length
=
(
phy_data
&
I82577_DSTATUS_CABLE_LENGTH
)
>>
I82577_DSTATUS_CABLE_LENGTH_SHIFT
;
I82577_DSTATUS_CABLE_LENGTH_SHIFT
;
...
@@ -3371,6 +3335,5 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
...
@@ -3371,6 +3335,5 @@ s32 e1000_get_cable_length_82577(struct e1000_hw *hw)
phy
->
cable_length
=
length
;
phy
->
cable_length
=
length
;
out:
return
0
;
return
ret_val
;
}
}
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