mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
net/ncsi: add NCSI Intel OEM command to keep PHY up
This allows to keep PHY link up and prevents any channel resets during the host load. It is KEEP_PHY_LINK_UP option(Veto bit) in i210 datasheet which block PHY reset and power state changes. Signed-off-by: Ivan Mikhaylov <i.mikhaylov@yadro.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
27fa107d3b
commit
abd2fddc94
@ -17,3 +17,9 @@ config NCSI_OEM_CMD_GET_MAC
|
||||
help
|
||||
This allows to get MAC address from NCSI firmware and set them back to
|
||||
controller.
|
||||
config NCSI_OEM_CMD_KEEP_PHY
|
||||
bool "Keep PHY Link up"
|
||||
depends on NET_NCSI
|
||||
help
|
||||
This allows to keep PHY link up and prevents any channel resets during
|
||||
the host load.
|
||||
|
@ -78,6 +78,9 @@ enum {
|
||||
/* OEM Vendor Manufacture ID */
|
||||
#define NCSI_OEM_MFR_MLX_ID 0x8119
|
||||
#define NCSI_OEM_MFR_BCM_ID 0x113d
|
||||
#define NCSI_OEM_MFR_INTEL_ID 0x157
|
||||
/* Intel specific OEM command */
|
||||
#define NCSI_OEM_INTEL_CMD_KEEP_PHY 0x20 /* CMD ID for Keep PHY up */
|
||||
/* Broadcom specific OEM Command */
|
||||
#define NCSI_OEM_BCM_CMD_GMA 0x01 /* CMD ID for Get MAC */
|
||||
/* Mellanox specific OEM Command */
|
||||
@ -86,6 +89,7 @@ enum {
|
||||
#define NCSI_OEM_MLX_CMD_SMAF 0x01 /* CMD ID for Set MC Affinity */
|
||||
#define NCSI_OEM_MLX_CMD_SMAF_PARAM 0x07 /* Parameter for SMAF */
|
||||
/* OEM Command payload lengths*/
|
||||
#define NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN 7
|
||||
#define NCSI_OEM_BCM_CMD_GMA_LEN 12
|
||||
#define NCSI_OEM_MLX_CMD_GMA_LEN 8
|
||||
#define NCSI_OEM_MLX_CMD_SMAF_LEN 60
|
||||
@ -271,6 +275,7 @@ enum {
|
||||
ncsi_dev_state_probe_mlx_gma,
|
||||
ncsi_dev_state_probe_mlx_smaf,
|
||||
ncsi_dev_state_probe_cis,
|
||||
ncsi_dev_state_probe_keep_phy,
|
||||
ncsi_dev_state_probe_gvi,
|
||||
ncsi_dev_state_probe_gc,
|
||||
ncsi_dev_state_probe_gls,
|
||||
|
@ -689,6 +689,35 @@ static int set_one_vid(struct ncsi_dev_priv *ndp, struct ncsi_channel *nc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_NCSI_OEM_CMD_KEEP_PHY)
|
||||
|
||||
static int ncsi_oem_keep_phy_intel(struct ncsi_cmd_arg *nca)
|
||||
{
|
||||
unsigned char data[NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN];
|
||||
int ret = 0;
|
||||
|
||||
nca->payload = NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN;
|
||||
|
||||
memset(data, 0, NCSI_OEM_INTEL_CMD_KEEP_PHY_LEN);
|
||||
*(unsigned int *)data = ntohl((__force __be32)NCSI_OEM_MFR_INTEL_ID);
|
||||
|
||||
data[4] = NCSI_OEM_INTEL_CMD_KEEP_PHY;
|
||||
|
||||
/* PHY Link up attribute */
|
||||
data[6] = 0x1;
|
||||
|
||||
nca->data = data;
|
||||
|
||||
ret = ncsi_xmit_cmd(nca);
|
||||
if (ret)
|
||||
netdev_err(nca->ndp->ndev.dev,
|
||||
"NCSI: Failed to transmit cmd 0x%x during configure\n",
|
||||
nca->type);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_NCSI_OEM_CMD_GET_MAC)
|
||||
|
||||
/* NCSI OEM Command APIs */
|
||||
@ -1392,7 +1421,23 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
|
||||
}
|
||||
|
||||
nd->state = ncsi_dev_state_probe_gvi;
|
||||
if (IS_ENABLED(CONFIG_NCSI_OEM_CMD_KEEP_PHY))
|
||||
nd->state = ncsi_dev_state_probe_keep_phy;
|
||||
break;
|
||||
#if IS_ENABLED(CONFIG_NCSI_OEM_CMD_KEEP_PHY)
|
||||
case ncsi_dev_state_probe_keep_phy:
|
||||
ndp->pending_req_num = 1;
|
||||
|
||||
nca.type = NCSI_PKT_CMD_OEM;
|
||||
nca.package = ndp->active_package->id;
|
||||
nca.channel = 0;
|
||||
ret = ncsi_oem_keep_phy_intel(&nca);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
nd->state = ncsi_dev_state_probe_gvi;
|
||||
break;
|
||||
#endif /* CONFIG_NCSI_OEM_CMD_KEEP_PHY */
|
||||
case ncsi_dev_state_probe_gvi:
|
||||
case ncsi_dev_state_probe_gc:
|
||||
case ncsi_dev_state_probe_gls:
|
||||
|
Loading…
Reference in New Issue
Block a user