Commit 8759cf76 authored by Jan-Bernd Themann's avatar Jan-Bernd Themann Committed by Jeff Garzik

ehea: propagate physical port state

Introduces a module parameter to decide whether the physical
port link state is propagated to the network stack or not.
It makes sense not to take the physical port state into account
on machines with more logical partitions that communicate
with each other. This is always possible no matter what the physical
port state is. Thus eHEA can be considered as a switch there.
Signed-off-by: default avatarJan-Bernd Themann <themann@de.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 026d7917
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "ehea" #define DRV_NAME "ehea"
#define DRV_VERSION "EHEA_0073" #define DRV_VERSION "EHEA_0074"
/* eHEA capability flags */ /* eHEA capability flags */
#define DLPAR_PORT_ADD_REM 1 #define DLPAR_PORT_ADD_REM 1
...@@ -402,6 +402,8 @@ struct ehea_mc_list { ...@@ -402,6 +402,8 @@ struct ehea_mc_list {
#define EHEA_PORT_UP 1 #define EHEA_PORT_UP 1
#define EHEA_PORT_DOWN 0 #define EHEA_PORT_DOWN 0
#define EHEA_PHY_LINK_UP 1
#define EHEA_PHY_LINK_DOWN 0
#define EHEA_MAX_PORT_RES 16 #define EHEA_MAX_PORT_RES 16
struct ehea_port { struct ehea_port {
struct ehea_adapter *adapter; /* adapter that owns this port */ struct ehea_adapter *adapter; /* adapter that owns this port */
...@@ -427,6 +429,7 @@ struct ehea_port { ...@@ -427,6 +429,7 @@ struct ehea_port {
u32 msg_enable; u32 msg_enable;
u32 sig_comp_iv; u32 sig_comp_iv;
u32 state; u32 state;
u8 phy_link;
u8 full_duplex; u8 full_duplex;
u8 autoneg; u8 autoneg;
u8 num_def_qps; u8 num_def_qps;
......
...@@ -53,17 +53,21 @@ static int rq3_entries = EHEA_DEF_ENTRIES_RQ3; ...@@ -53,17 +53,21 @@ static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
static int sq_entries = EHEA_DEF_ENTRIES_SQ; static int sq_entries = EHEA_DEF_ENTRIES_SQ;
static int use_mcs = 0; static int use_mcs = 0;
static int num_tx_qps = EHEA_NUM_TX_QP; static int num_tx_qps = EHEA_NUM_TX_QP;
static int prop_carrier_state = 0;
module_param(msg_level, int, 0); module_param(msg_level, int, 0);
module_param(rq1_entries, int, 0); module_param(rq1_entries, int, 0);
module_param(rq2_entries, int, 0); module_param(rq2_entries, int, 0);
module_param(rq3_entries, int, 0); module_param(rq3_entries, int, 0);
module_param(sq_entries, int, 0); module_param(sq_entries, int, 0);
module_param(prop_carrier_state, int, 0);
module_param(use_mcs, int, 0); module_param(use_mcs, int, 0);
module_param(num_tx_qps, int, 0); module_param(num_tx_qps, int, 0);
MODULE_PARM_DESC(num_tx_qps, "Number of TX-QPS"); MODULE_PARM_DESC(num_tx_qps, "Number of TX-QPS");
MODULE_PARM_DESC(msg_level, "msg_level"); MODULE_PARM_DESC(msg_level, "msg_level");
MODULE_PARM_DESC(prop_carrier_state, "Propagate carrier state of physical "
"port to stack. 1:yes, 0:no. Default = 0 ");
MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 " MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
"[2^x - 1], x = [6..14]. Default = " "[2^x - 1], x = [6..14]. Default = "
__MODULE_STRING(EHEA_DEF_ENTRIES_RQ3) ")"); __MODULE_STRING(EHEA_DEF_ENTRIES_RQ3) ")");
...@@ -814,7 +818,9 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed) ...@@ -814,7 +818,9 @@ int ehea_set_portspeed(struct ehea_port *port, u32 port_speed)
ehea_error("Failed setting port speed"); ehea_error("Failed setting port speed");
} }
} }
netif_carrier_on(port->netdev); if (!prop_carrier_state || (port->phy_link == EHEA_PHY_LINK_UP))
netif_carrier_on(port->netdev);
kfree(cb4); kfree(cb4);
out: out:
return ret; return ret;
...@@ -869,13 +875,19 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe) ...@@ -869,13 +875,19 @@ static void ehea_parse_eqe(struct ehea_adapter *adapter, u64 eqe)
} }
if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PORT_UP, eqe)) { if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PORT_UP, eqe)) {
port->phy_link = EHEA_PHY_LINK_UP;
if (netif_msg_link(port)) if (netif_msg_link(port))
ehea_info("%s: Physical port up", ehea_info("%s: Physical port up",
port->netdev->name); port->netdev->name);
if (prop_carrier_state)
netif_carrier_on(port->netdev);
} else { } else {
port->phy_link = EHEA_PHY_LINK_DOWN;
if (netif_msg_link(port)) if (netif_msg_link(port))
ehea_info("%s: Physical port down", ehea_info("%s: Physical port down",
port->netdev->name); port->netdev->name);
if (prop_carrier_state)
netif_carrier_off(port->netdev);
} }
if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PRIMARY, eqe)) if (EHEA_BMASK_GET(NEQE_EXTSWITCH_PRIMARY, eqe))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment