sfc: Expose Falcon BootROM config through MTD, not ethtool
The ethtool EEPROM interface is really meant for exposing chip configuration, not BootROM configuration. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
6c88b0b6dc
Коммит
6a8872c54d
|
@ -17,7 +17,6 @@
|
|||
#include "efx.h"
|
||||
#include "filter.h"
|
||||
#include "nic.h"
|
||||
#include "spi.h"
|
||||
#include "mdio_10g.h"
|
||||
|
||||
struct ethtool_string {
|
||||
|
@ -629,61 +628,6 @@ static u32 efx_ethtool_get_link(struct net_device *net_dev)
|
|||
return efx->link_state.up;
|
||||
}
|
||||
|
||||
static int efx_ethtool_get_eeprom_len(struct net_device *net_dev)
|
||||
{
|
||||
struct efx_nic *efx = netdev_priv(net_dev);
|
||||
struct efx_spi_device *spi = efx->spi_eeprom;
|
||||
|
||||
if (!spi)
|
||||
return 0;
|
||||
return min(spi->size, EFX_EEPROM_BOOTCONFIG_END) -
|
||||
min(spi->size, EFX_EEPROM_BOOTCONFIG_START);
|
||||
}
|
||||
|
||||
static int efx_ethtool_get_eeprom(struct net_device *net_dev,
|
||||
struct ethtool_eeprom *eeprom, u8 *buf)
|
||||
{
|
||||
struct efx_nic *efx = netdev_priv(net_dev);
|
||||
struct efx_spi_device *spi = efx->spi_eeprom;
|
||||
size_t len;
|
||||
int rc;
|
||||
|
||||
rc = mutex_lock_interruptible(&efx->spi_lock);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = falcon_spi_read(efx, spi,
|
||||
eeprom->offset + EFX_EEPROM_BOOTCONFIG_START,
|
||||
eeprom->len, &len, buf);
|
||||
mutex_unlock(&efx->spi_lock);
|
||||
|
||||
eeprom->magic = EFX_ETHTOOL_EEPROM_MAGIC;
|
||||
eeprom->len = len;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int efx_ethtool_set_eeprom(struct net_device *net_dev,
|
||||
struct ethtool_eeprom *eeprom, u8 *buf)
|
||||
{
|
||||
struct efx_nic *efx = netdev_priv(net_dev);
|
||||
struct efx_spi_device *spi = efx->spi_eeprom;
|
||||
size_t len;
|
||||
int rc;
|
||||
|
||||
if (eeprom->magic != EFX_ETHTOOL_EEPROM_MAGIC)
|
||||
return -EINVAL;
|
||||
|
||||
rc = mutex_lock_interruptible(&efx->spi_lock);
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = falcon_spi_write(efx, spi,
|
||||
eeprom->offset + EFX_EEPROM_BOOTCONFIG_START,
|
||||
eeprom->len, &len, buf);
|
||||
mutex_unlock(&efx->spi_lock);
|
||||
|
||||
eeprom->len = len;
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int efx_ethtool_get_coalesce(struct net_device *net_dev,
|
||||
struct ethtool_coalesce *coalesce)
|
||||
{
|
||||
|
@ -1116,9 +1060,6 @@ const struct ethtool_ops efx_ethtool_ops = {
|
|||
.set_msglevel = efx_ethtool_set_msglevel,
|
||||
.nway_reset = efx_ethtool_nway_reset,
|
||||
.get_link = efx_ethtool_get_link,
|
||||
.get_eeprom_len = efx_ethtool_get_eeprom_len,
|
||||
.get_eeprom = efx_ethtool_get_eeprom,
|
||||
.set_eeprom = efx_ethtool_set_eeprom,
|
||||
.get_coalesce = efx_ethtool_get_coalesce,
|
||||
.set_coalesce = efx_ethtool_set_coalesce,
|
||||
.get_ringparam = efx_ethtool_get_ringparam,
|
||||
|
|
|
@ -387,15 +387,14 @@ static struct efx_mtd_ops falcon_mtd_ops = {
|
|||
|
||||
static int falcon_mtd_probe(struct efx_nic *efx)
|
||||
{
|
||||
struct efx_spi_device *spi = efx->spi_flash;
|
||||
struct efx_spi_device *spi;
|
||||
struct efx_mtd *efx_mtd;
|
||||
int rc;
|
||||
int rc = -ENODEV;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!spi || spi->size <= FALCON_FLASH_BOOTCODE_START)
|
||||
return -ENODEV;
|
||||
|
||||
spi = efx->spi_flash;
|
||||
if (spi && spi->size > FALCON_FLASH_BOOTCODE_START) {
|
||||
efx_mtd = kzalloc(sizeof(*efx_mtd) + sizeof(efx_mtd->part[0]),
|
||||
GFP_KERNEL);
|
||||
if (!efx_mtd)
|
||||
|
@ -414,8 +413,40 @@ static int falcon_mtd_probe(struct efx_nic *efx)
|
|||
efx_mtd->part[0].type_name = "sfc_flash_bootrom";
|
||||
|
||||
rc = efx_mtd_probe_device(efx, efx_mtd);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
kfree(efx_mtd);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
spi = efx->spi_eeprom;
|
||||
if (spi && spi->size > EFX_EEPROM_BOOTCONFIG_START) {
|
||||
efx_mtd = kzalloc(sizeof(*efx_mtd) + sizeof(efx_mtd->part[0]),
|
||||
GFP_KERNEL);
|
||||
if (!efx_mtd)
|
||||
return -ENOMEM;
|
||||
|
||||
efx_mtd->spi = spi;
|
||||
efx_mtd->name = "EEPROM";
|
||||
efx_mtd->ops = &falcon_mtd_ops;
|
||||
|
||||
efx_mtd->n_parts = 1;
|
||||
efx_mtd->part[0].mtd.type = MTD_RAM;
|
||||
efx_mtd->part[0].mtd.flags = MTD_CAP_RAM;
|
||||
efx_mtd->part[0].mtd.size =
|
||||
min(spi->size, EFX_EEPROM_BOOTCONFIG_END) -
|
||||
EFX_EEPROM_BOOTCONFIG_START;
|
||||
efx_mtd->part[0].mtd.erasesize = spi->erase_size;
|
||||
efx_mtd->part[0].offset = EFX_EEPROM_BOOTCONFIG_START;
|
||||
efx_mtd->part[0].type_name = "sfc_bootconfig";
|
||||
|
||||
rc = efx_mtd_probe_device(efx, efx_mtd);
|
||||
if (rc) {
|
||||
kfree(efx_mtd);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче