mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
Merge branch 'sfc-devlink-flash-for-x4'
Edward Cree says: ==================== sfc: devlink flash for X4 Updates to support devlink flash on X4 NICs. Patch #2 is needed for NVRAM_PARTITION_TYPE_AUTO, and patch #1 is needed because the latest MCDI headers from firmware no longer include MDIO read/write commands. v1: https://lore.kernel.org/cover.1742223233.git.ecree.xilinx@gmail.com ==================== Link: https://patch.msgid.link/cover.1742493016.git.ecree.xilinx@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
2374621058
|
|
@ -4419,6 +4419,7 @@ const struct efx_nic_type efx_x4_nic_type = {
|
|||
.can_rx_scatter = true,
|
||||
.always_rx_scatter = true,
|
||||
.option_descriptors = true,
|
||||
.flash_auto_partition = true,
|
||||
.min_interrupt_mode = EFX_INT_MODE_MSIX,
|
||||
.timer_period_max = 1 << ERF_DD_EVQ_IND_TIMER_VAL_WIDTH,
|
||||
.offload_features = EF10_OFFLOAD_FEATURES,
|
||||
|
|
|
|||
|
|
@ -452,7 +452,6 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
|
|||
NETIF_F_HIGHDMA | NETIF_F_ALL_TSO;
|
||||
netif_set_tso_max_segs(net_dev,
|
||||
ESE_EF100_DP_GZ_TSO_MAX_HDR_NUM_SEGS_DEFAULT);
|
||||
efx->mdio.dev = net_dev;
|
||||
|
||||
rc = efx_ef100_init_datapath_caps(efx);
|
||||
if (rc < 0)
|
||||
|
|
|
|||
|
|
@ -474,28 +474,6 @@ void efx_get_irq_moderation(struct efx_nic *efx, unsigned int *tx_usecs,
|
|||
}
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* ioctls
|
||||
*
|
||||
*************************************************************************/
|
||||
|
||||
/* Net device ioctl
|
||||
* Context: process, rtnl_lock() held.
|
||||
*/
|
||||
static int efx_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
struct efx_nic *efx = efx_netdev_priv(net_dev);
|
||||
struct mii_ioctl_data *data = if_mii(ifr);
|
||||
|
||||
/* Convert phy_id from older PRTAD/DEVAD format */
|
||||
if ((cmd == SIOCGMIIREG || cmd == SIOCSMIIREG) &&
|
||||
(data->phy_id & 0xfc00) == 0x0400)
|
||||
data->phy_id ^= MDIO_PHY_ID_C45 | 0x0400;
|
||||
|
||||
return mdio_mii_ioctl(&efx->mdio, data, cmd);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Kernel net device interface
|
||||
|
|
@ -593,7 +571,6 @@ static const struct net_device_ops efx_netdev_ops = {
|
|||
.ndo_tx_timeout = efx_watchdog,
|
||||
.ndo_start_xmit = efx_hard_start_xmit,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_eth_ioctl = efx_ioctl,
|
||||
.ndo_change_mtu = efx_change_mtu,
|
||||
.ndo_set_mac_address = efx_set_mac_address,
|
||||
.ndo_set_rx_mode = efx_set_rx_mode,
|
||||
|
|
@ -1201,7 +1178,6 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
|
|||
rc = efx_init_struct(efx, pci_dev);
|
||||
if (rc)
|
||||
goto fail1;
|
||||
efx->mdio.dev = net_dev;
|
||||
|
||||
pci_info(pci_dev, "Solarflare NIC detected\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -407,31 +407,40 @@ int efx_reflash_flash_firmware(struct efx_nic *efx, const struct firmware *fw,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
devlink_flash_update_status_notify(devlink, "Checking update", NULL, 0, 0);
|
||||
|
||||
rc = efx_reflash_parse_firmware_data(fw, &type, &data_subtype, &data,
|
||||
&data_size);
|
||||
if (rc) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Firmware image validation check failed");
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&efx->reflash_mutex);
|
||||
|
||||
rc = efx_mcdi_nvram_metadata(efx, type, &subtype, NULL, NULL, 0);
|
||||
if (rc) {
|
||||
NL_SET_ERR_MSG_FMT_MOD(extack,
|
||||
"Metadata query for NVRAM partition %#x failed",
|
||||
type);
|
||||
goto out_unlock;
|
||||
}
|
||||
devlink_flash_update_status_notify(devlink, "Checking update", NULL, 0, 0);
|
||||
|
||||
if (subtype != data_subtype) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Firmware image is not appropriate for this adapter");
|
||||
rc = -EINVAL;
|
||||
goto out_unlock;
|
||||
if (efx->type->flash_auto_partition) {
|
||||
/* NIC wants entire FW file including headers;
|
||||
* FW will validate 'subtype' if there is one
|
||||
*/
|
||||
type = NVRAM_PARTITION_TYPE_AUTO;
|
||||
data = fw->data;
|
||||
data_size = fw->size;
|
||||
} else {
|
||||
rc = efx_reflash_parse_firmware_data(fw, &type, &data_subtype, &data,
|
||||
&data_size);
|
||||
if (rc) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Firmware image validation check failed");
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
rc = efx_mcdi_nvram_metadata(efx, type, &subtype, NULL, NULL, 0);
|
||||
if (rc) {
|
||||
NL_SET_ERR_MSG_FMT_MOD(extack,
|
||||
"Metadata query for NVRAM partition %#x failed",
|
||||
type);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (subtype != data_subtype) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Firmware image is not appropriate for this adapter");
|
||||
rc = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
rc = efx_mcdi_nvram_info(efx, type, &size, &erase_align, &write_align,
|
||||
|
|
@ -506,7 +515,6 @@ int efx_reflash_flash_firmware(struct efx_nic *efx, const struct firmware *fw,
|
|||
rc = efx_mcdi_nvram_update_finish_polled(efx, type);
|
||||
out_unlock:
|
||||
mutex_unlock(&efx->reflash_mutex);
|
||||
out:
|
||||
devlink_flash_update_status_notify(devlink, rc ? "Update failed" :
|
||||
"Update complete",
|
||||
NULL, 0, 0);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -17,58 +17,6 @@
|
|||
#include "selftest.h"
|
||||
#include "mcdi_port_common.h"
|
||||
|
||||
static int efx_mcdi_mdio_read(struct net_device *net_dev,
|
||||
int prtad, int devad, u16 addr)
|
||||
{
|
||||
struct efx_nic *efx = efx_netdev_priv(net_dev);
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_MDIO_READ_IN_LEN);
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_MDIO_READ_OUT_LEN);
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, MDIO_READ_IN_BUS, efx->mdio_bus);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_READ_IN_PRTAD, prtad);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_READ_IN_DEVAD, devad);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_READ_IN_ADDR, addr);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_MDIO_READ, inbuf, sizeof(inbuf),
|
||||
outbuf, sizeof(outbuf), &outlen);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (MCDI_DWORD(outbuf, MDIO_READ_OUT_STATUS) !=
|
||||
MC_CMD_MDIO_STATUS_GOOD)
|
||||
return -EIO;
|
||||
|
||||
return (u16)MCDI_DWORD(outbuf, MDIO_READ_OUT_VALUE);
|
||||
}
|
||||
|
||||
static int efx_mcdi_mdio_write(struct net_device *net_dev,
|
||||
int prtad, int devad, u16 addr, u16 value)
|
||||
{
|
||||
struct efx_nic *efx = efx_netdev_priv(net_dev);
|
||||
MCDI_DECLARE_BUF(inbuf, MC_CMD_MDIO_WRITE_IN_LEN);
|
||||
MCDI_DECLARE_BUF(outbuf, MC_CMD_MDIO_WRITE_OUT_LEN);
|
||||
size_t outlen;
|
||||
int rc;
|
||||
|
||||
MCDI_SET_DWORD(inbuf, MDIO_WRITE_IN_BUS, efx->mdio_bus);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_WRITE_IN_PRTAD, prtad);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_WRITE_IN_DEVAD, devad);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_WRITE_IN_ADDR, addr);
|
||||
MCDI_SET_DWORD(inbuf, MDIO_WRITE_IN_VALUE, value);
|
||||
|
||||
rc = efx_mcdi_rpc(efx, MC_CMD_MDIO_WRITE, inbuf, sizeof(inbuf),
|
||||
outbuf, sizeof(outbuf), &outlen);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (MCDI_DWORD(outbuf, MDIO_WRITE_OUT_STATUS) !=
|
||||
MC_CMD_MDIO_STATUS_GOOD)
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 efx_mcdi_phy_get_caps(struct efx_nic *efx)
|
||||
{
|
||||
|
|
@ -97,12 +45,7 @@ int efx_mcdi_port_probe(struct efx_nic *efx)
|
|||
{
|
||||
int rc;
|
||||
|
||||
/* Set up MDIO structure for PHY */
|
||||
efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
|
||||
efx->mdio.mdio_read = efx_mcdi_mdio_read;
|
||||
efx->mdio.mdio_write = efx_mcdi_mdio_write;
|
||||
|
||||
/* Fill out MDIO structure, loopback modes, and initial link state */
|
||||
/* Fill out loopback modes and initial link state */
|
||||
rc = efx_mcdi_phy_probe(efx);
|
||||
if (rc != 0)
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -448,15 +448,6 @@ int efx_mcdi_phy_probe(struct efx_nic *efx)
|
|||
efx->phy_data = phy_data;
|
||||
efx->phy_type = phy_data->type;
|
||||
|
||||
efx->mdio_bus = phy_data->channel;
|
||||
efx->mdio.prtad = phy_data->port;
|
||||
efx->mdio.mmds = phy_data->mmd_mask & ~(1 << MC_CMD_MMD_CLAUSE22);
|
||||
efx->mdio.mode_support = 0;
|
||||
if (phy_data->mmd_mask & (1 << MC_CMD_MMD_CLAUSE22))
|
||||
efx->mdio.mode_support |= MDIO_SUPPORTS_C22;
|
||||
if (phy_data->mmd_mask & ~(1 << MC_CMD_MMD_CLAUSE22))
|
||||
efx->mdio.mode_support |= MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
|
||||
|
||||
caps = MCDI_DWORD(outbuf, GET_LINK_OUT_CAP);
|
||||
if (caps & (1 << MC_CMD_PHY_CAP_AN_LBN))
|
||||
mcdi_to_ethtool_linkset(phy_data->media, caps,
|
||||
|
|
@ -546,8 +537,6 @@ void efx_mcdi_phy_get_link_ksettings(struct efx_nic *efx, struct ethtool_link_ks
|
|||
cmd->base.port = mcdi_to_ethtool_media(phy_cfg->media);
|
||||
cmd->base.phy_address = phy_cfg->port;
|
||||
cmd->base.autoneg = !!(efx->link_advertising[0] & ADVERTISED_Autoneg);
|
||||
cmd->base.mdio_support = (efx->mdio.mode_support &
|
||||
(MDIO_SUPPORTS_C45 | MDIO_SUPPORTS_C22));
|
||||
|
||||
mcdi_to_ethtool_linkset(phy_cfg->media, phy_cfg->supported_cap,
|
||||
cmd->link_modes.supported);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
#include <linux/ethtool.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/mdio.h>
|
||||
#include <linux/mii.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/device.h>
|
||||
|
|
@ -956,8 +956,6 @@ struct efx_mae;
|
|||
* @stats_buffer: DMA buffer for statistics
|
||||
* @phy_type: PHY type
|
||||
* @phy_data: PHY private data (including PHY-specific stats)
|
||||
* @mdio: PHY MDIO interface
|
||||
* @mdio_bus: PHY MDIO bus ID (only used by Siena)
|
||||
* @phy_mode: PHY operating mode. Serialised by @mac_lock.
|
||||
* @link_advertising: Autonegotiation advertising flags
|
||||
* @fec_config: Forward Error Correction configuration flags. For bit positions
|
||||
|
|
@ -1132,8 +1130,6 @@ struct efx_nic {
|
|||
|
||||
unsigned int phy_type;
|
||||
void *phy_data;
|
||||
struct mdio_if_info mdio;
|
||||
unsigned int mdio_bus;
|
||||
enum efx_phy_mode phy_mode;
|
||||
|
||||
__ETHTOOL_DECLARE_LINK_MODE_MASK(link_advertising);
|
||||
|
|
@ -1385,6 +1381,8 @@ struct efx_udp_tunnel {
|
|||
* @can_rx_scatter: NIC is able to scatter packets to multiple buffers
|
||||
* @always_rx_scatter: NIC will always scatter packets to multiple buffers
|
||||
* @option_descriptors: NIC supports TX option descriptors
|
||||
* @flash_auto_partition: firmware flash uses AUTO partition, driver does
|
||||
* not need to perform image parsing
|
||||
* @min_interrupt_mode: Lowest capability interrupt mode supported
|
||||
* from &enum efx_int_mode.
|
||||
* @timer_period_max: Maximum period of interrupt timer (in ticks)
|
||||
|
|
@ -1561,6 +1559,7 @@ struct efx_nic_type {
|
|||
bool can_rx_scatter;
|
||||
bool always_rx_scatter;
|
||||
bool option_descriptors;
|
||||
bool flash_auto_partition;
|
||||
unsigned int min_interrupt_mode;
|
||||
unsigned int timer_period_max;
|
||||
netdev_features_t offload_features;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user