sfc: Extend MTD driver for use with new NICs
Subsystems (3)
PATCH 4/12 sfc: Extend MTD driver for use with new NICs
In new NICs flash is managed by firmware and we will use high-level operations on partitions rather than direct SPI commands. Add support for multiple MTD partitions per flash device and remove the direct link between MTD and SPI devices. Maintain a list of MTD partitions in struct efx_nic.
--- drivers/net/sfc/efx.c | 3 + drivers/net/sfc/ethtool.c | 6 +- drivers/net/sfc/falcon.c | 32 ++--- drivers/net/sfc/mtd.c | 312 +++++++++++++++++++++++++++++------------- drivers/net/sfc/net_driver.h | 8 +- drivers/net/sfc/spi.h | 18 +-- 6 files changed, 255 insertions(+), 124 deletions(-)
drivers/net/sfc/efx.c +3 -0
@@ -1977,6 +1977,9 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,spin_lock_init (&efx->biu_lock);mutex_init (&efx->mdio_lock);mutex_init (&efx->spi_lock); +#ifdef CONFIG_SFC_MTD +INIT_LIST_HEAD (&efx->mtd_list); +#endif INIT_WORK (&efx->reset_work, efx_reset_work);INIT_DELAYED_WORK (&efx->monitor_work, efx_monitor); efx->pci_dev = pci_dev;
drivers/net/sfc/ethtool.c +4 -2
@@ -567,7 +567,8 @@ static int efx_ethtool_get_eeprom(struct net_device *net_dev, rc =mutex_lock_interruptible (&efx->spi_lock);if (rc)return rc; - rc =falcon_spi_read (spi, eeprom->offset +EFX_EEPROM_BOOTCONFIG_START , + rc =falcon_spi_read (efx, spi, + eeprom->offset +EFX_EEPROM_BOOTCONFIG_START , eeprom->len, &len, buf);mutex_unlock (&efx->spi_lock);
@@ -590,7 +591,8 @@ static int efx_ethtool_set_eeprom(struct net_device *net_dev, rc =mutex_lock_interruptible (&efx->spi_lock);if (rc)return rc; - rc =falcon_spi_write (spi, eeprom->offset +EFX_EEPROM_BOOTCONFIG_START , + rc =falcon_spi_write (efx, spi, + eeprom->offset +EFX_EEPROM_BOOTCONFIG_START , eeprom->len, &len, buf);mutex_unlock (&efx->spi_lock);
drivers/net/sfc/falcon.c +15 -17
@@ -1640,11 +1640,10 @@ static int falcon_spi_wait(struct efx_nic *efx) } } -int falcon_spi_cmd (const struct efx_spi_device *spi, +int falcon_spi_cmd (struct efx_nic *efx,const struct efx_spi_device *spi,unsigned int command,int address,const void *in,void *out,size_t len) { -struct efx_nic *efx = spi->efx;bool addressed = (address >=0 );bool reading = (out !=NULL );efx_oword_t reg;
@@ -1713,15 +1712,15 @@ efx_spi_munge_command(const struct efx_spi_device *spi, }/* Wait up to 10 ms for buffered write completion */ -int falcon_spi_wait_write (const struct efx_spi_device *spi) +int +falcon_spi_wait_write (struct efx_nic *efx,const struct efx_spi_device *spi) { -struct efx_nic *efx = spi->efx;unsigned long timeout = jiffies +1 +DIV_ROUND_UP (HZ ,100 );u8 status;int rc;for (;;) { - rc =falcon_spi_cmd (spi,SPI_RDSR ,-1 ,NULL , + rc =falcon_spi_cmd (efx, spi,SPI_RDSR ,-1 ,NULL , &status,sizeof (status));if (rc)return rc;
@@ -1737,8 +1736,8 @@ int falcon_spi_wait_write(const struct efx_spi_device *spi) } } -int falcon_spi_read (const struct efx_spi_device *spi,loff_t start, -size_t len,size_t *retlen,u8 *buffer) +int falcon_spi_read (struct efx_nic *efx,const struct efx_spi_device *spi, +loff_t start,size_t len,size_t *retlen,u8 *buffer) {size_t block_len, pos =0 ;unsigned int command;
@@ -1748,7 +1747,7 @@ int falcon_spi_read(const struct efx_spi_device *spi, loff_t start, block_len =min (len - pos,FALCON_SPI_MAX_LEN ); command =efx_spi_munge_command (spi,SPI_READ , start + pos); - rc =falcon_spi_cmd (spi, command, start + pos,NULL , + rc =falcon_spi_cmd (efx, spi, command, start + pos,NULL , buffer + pos, block_len);if (rc)break ;
@@ -1767,8 +1766,9 @@ int falcon_spi_read(const struct efx_spi_device *spi, loff_t start,return rc; } -int falcon_spi_write (const struct efx_spi_device *spi,loff_t start, -size_t len,size_t *retlen,const u8 *buffer) +int +falcon_spi_write (struct efx_nic *efx,const struct efx_spi_device *spi, +loff_t start,size_t len,size_t *retlen,const u8 *buffer) {u8 verify_buffer[FALCON_SPI_MAX_LEN ];size_t block_len, pos =0 ;
@@ -1776,24 +1776,24 @@ int falcon_spi_write(const struct efx_spi_device *spi, loff_t start,int rc =0 ;while (pos < len) { - rc =falcon_spi_cmd (spi,SPI_WREN ,-1 ,NULL ,NULL ,0 ); + rc =falcon_spi_cmd (efx, spi,SPI_WREN ,-1 ,NULL ,NULL ,0 );if (rc)break ; block_len =min (len - pos,falcon_spi_write_limit (spi, start + pos)); command =efx_spi_munge_command (spi,SPI_WRITE , start + pos); - rc =falcon_spi_cmd (spi, command, start + pos, + rc =falcon_spi_cmd (efx, spi, command, start + pos, buffer + pos,NULL , block_len);if (rc)break ; - rc =falcon_spi_wait_write (spi); + rc =falcon_spi_wait_write (efx, spi);if (rc)break ; command =efx_spi_munge_command (spi,SPI_READ , start + pos); - rc =falcon_spi_cmd (spi, command, start + pos, + rc =falcon_spi_cmd (efx, spi, command, start + pos,NULL , verify_buffer, block_len);if (memcmp (verify_buffer, buffer + pos, block_len)) { rc = -EIO ;
@@ -2352,7 +2352,7 @@ falcon_read_nvram(struct efx_nic *efx, struct falcon_nvconfig *nvconfig_out) nvconfig = region +FALCON_NVCONFIG_OFFSET ;mutex_lock (&efx->spi_lock); - rc =falcon_spi_read (spi,0 ,FALCON_NVCONFIG_END ,NULL , region); + rc =falcon_spi_read (efx, spi,0 ,FALCON_NVCONFIG_END ,NULL , region);mutex_unlock (&efx->spi_lock);if (rc) { EFX_ERR(efx, "Failed to read %s\n",
@@ -2710,8 +2710,6 @@ static int falcon_spi_device_init(struct efx_nic *efx, spi_device->block_size =1 <<SPI_DEV_TYPE_FIELD (device_type,SPI_DEV_TYPE_BLOCK_SIZE ); - - spi_device->efx = efx; }else { spi_device =NULL ; }
drivers/net/sfc/mtd.c +219 -93
450 lines not on this page · raw message
drivers/net/sfc/net_driver.h +6 -2
@@ -674,10 +674,11 @@ union efx_multicast_hash {* interrupt is handled. It is used by falcon_test_interrupt() * to verify that an interrupt has occurred. * @spi_flash: SPI flash device -* This field will be %NULL if no flash device is present. +* This field will be %NULL if no flash device is present (or for Siena). * @spi_eeprom: SPI EEPROM device -* This field will be %NULL if no EEPROM device is present. +* This field will be %NULL if no EEPROM device is present (or for Siena). * @spi_lock: SPI bus lock +* @mtd_list: List of MTDs attached to the NIC * @n_rx_nodesc_drop_cnt: RX no descriptor drop count * @nic_data: Hardware dependant state * @mac_lock: MAC access lock. Protects @port_enabled, @phy_mode,
@@ -759,6 +760,9 @@ struct efx_nic {struct efx_spi_device *spi_flash;struct efx_spi_device *spi_eeprom;struct mutex spi_lock; +#ifdef CONFIG_SFC_MTD +struct list_head mtd_list; +#endif unsigned n_rx_nodesc_drop_cnt;
drivers/net/sfc/spi.h +8 -10
@@ -36,8 +36,6 @@/** * struct efx_spi_device - an Efx SPI (Serial Peripheral Interface) device -* @efx: The Efx controller that owns this device -* @mtd: MTD state * @device_id: Controller's id for the device * @size: Size (in bytes) * @addr_len: Number of address bytes in read/write commands
@@ -54,10 +52,6 @@* Write commands are limited to blocks with this size and alignment. */ struct efx_spi_device { -struct efx_nic *efx; -#ifdef CONFIG_SFC_MTD -void *mtd; -#endif int device_id;unsigned int size;unsigned int addr_len;
@@ -67,12 +61,16 @@ struct efx_spi_device {unsigned int block_size; }; -int falcon_spi_cmd (const struct efx_spi_device *spi,unsigned int command, +int falcon_spi_cmd (struct efx_nic *efx, +const struct efx_spi_device *spi,unsigned int command,int address,const void * in,void *out,size_t len); -int falcon_spi_wait_write (const struct efx_spi_device *spi); -int falcon_spi_read (const struct efx_spi_device *spi,loff_t start, +int falcon_spi_wait_write (struct efx_nic *efx, +const struct efx_spi_device *spi); +int falcon_spi_read (struct efx_nic *efx, +const struct efx_spi_device *spi,loff_t start,size_t len,size_t *retlen,u8 *buffer); -int falcon_spi_write (const struct efx_spi_device *spi,loff_t start, +int falcon_spi_write (struct efx_nic *efx, +const struct efx_spi_device *spi,loff_t start,size_t len,size_t *retlen,const u8 *buffer);/*
Signature · 9 lines
1.6.5.3 -- Ben Hutchings, Senior Software Engineer, Solarflare Communications Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
From: Ben Hutchings <[email protected]>
Date: Mon, 30 Nov 2009 01:10:44 +0000
Quoted 7 lines
In new NICs flash is managed by firmware and we will use high-level operations on partitions rather than direct SPI commands. Add support for multiple MTD partitions per flash device and remove the direct link between MTD and SPI devices. Maintain a list of MTD partitions in struct
efx_nic.Signed-off-by Ben Hutchings <[email protected]>
Applied.