diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2008-11-04 15:34:28 -0500 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-11-06 00:49:57 -0500 |
commit | f41507245ef8b079685aba8da5b5b2b5e87e70bc (patch) | |
tree | be8c8aee6a6fc3c69d946dcd3fe24306bf89775e /drivers/net/sfc/spi.h | |
parent | 0a95f56323ce93dac354c1b2d54bf959a985cf7d (diff) |
sfc: Expose flash region storing boot code as MTD
The boot code that appears as a PCI expansion ROM on the SFC4000 is
stored in flash. Expose this as a standard MTD device to allow for
in-place upgrades.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/sfc/spi.h')
-rw-r--r-- | drivers/net/sfc/spi.h | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/net/sfc/spi.h b/drivers/net/sfc/spi.h index b73f86cf5fa2..c4aca132348a 100644 --- a/drivers/net/sfc/spi.h +++ b/drivers/net/sfc/spi.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #define SPI_WRDI 0x04 /* Reset write enable latch */ | 25 | #define SPI_WRDI 0x04 /* Reset write enable latch */ |
26 | #define SPI_RDSR 0x05 /* Read status register */ | 26 | #define SPI_RDSR 0x05 /* Read status register */ |
27 | #define SPI_WREN 0x06 /* Set write enable latch */ | 27 | #define SPI_WREN 0x06 /* Set write enable latch */ |
28 | #define SPI_SST_EWSR 0x50 /* SST: Enable write to status register */ | ||
28 | 29 | ||
29 | #define SPI_STATUS_WPEN 0x80 /* Write-protect pin enabled */ | 30 | #define SPI_STATUS_WPEN 0x80 /* Write-protect pin enabled */ |
30 | #define SPI_STATUS_BP2 0x10 /* Block protection bit 2 */ | 31 | #define SPI_STATUS_BP2 0x10 /* Block protection bit 2 */ |
@@ -36,6 +37,7 @@ | |||
36 | /** | 37 | /** |
37 | * struct efx_spi_device - an Efx SPI (Serial Peripheral Interface) device | 38 | * struct efx_spi_device - an Efx SPI (Serial Peripheral Interface) device |
38 | * @efx: The Efx controller that owns this device | 39 | * @efx: The Efx controller that owns this device |
40 | * @mtd: MTD state | ||
39 | * @device_id: Controller's id for the device | 41 | * @device_id: Controller's id for the device |
40 | * @size: Size (in bytes) | 42 | * @size: Size (in bytes) |
41 | * @addr_len: Number of address bytes in read/write commands | 43 | * @addr_len: Number of address bytes in read/write commands |
@@ -44,20 +46,30 @@ | |||
44 | * use bit 3 of the command byte as address bit A8, rather | 46 | * use bit 3 of the command byte as address bit A8, rather |
45 | * than having a two-byte address. If this flag is set, then | 47 | * than having a two-byte address. If this flag is set, then |
46 | * commands should be munged in this way. | 48 | * commands should be munged in this way. |
49 | * @erase_command: Erase command (or 0 if sector erase not needed). | ||
50 | * @erase_size: Erase sector size (in bytes) | ||
51 | * Erase commands affect sectors with this size and alignment. | ||
52 | * This must be a power of two. | ||
47 | * @block_size: Write block size (in bytes). | 53 | * @block_size: Write block size (in bytes). |
48 | * Write commands are limited to blocks with this size and alignment. | 54 | * Write commands are limited to blocks with this size and alignment. |
49 | * @read: Read function for the device | ||
50 | * @write: Write function for the device | ||
51 | */ | 55 | */ |
52 | struct efx_spi_device { | 56 | struct efx_spi_device { |
53 | struct efx_nic *efx; | 57 | struct efx_nic *efx; |
58 | #ifdef CONFIG_SFC_MTD | ||
59 | void *mtd; | ||
60 | #endif | ||
54 | int device_id; | 61 | int device_id; |
55 | unsigned int size; | 62 | unsigned int size; |
56 | unsigned int addr_len; | 63 | unsigned int addr_len; |
57 | unsigned int munge_address:1; | 64 | unsigned int munge_address:1; |
65 | u8 erase_command; | ||
66 | unsigned int erase_size; | ||
58 | unsigned int block_size; | 67 | unsigned int block_size; |
59 | }; | 68 | }; |
60 | 69 | ||
70 | int falcon_spi_cmd(const struct efx_spi_device *spi, unsigned int command, | ||
71 | int address, const void* in, void *out, unsigned int len); | ||
72 | int falcon_spi_fast_wait(const struct efx_spi_device *spi); | ||
61 | int falcon_spi_read(const struct efx_spi_device *spi, loff_t start, | 73 | int falcon_spi_read(const struct efx_spi_device *spi, loff_t start, |
62 | size_t len, size_t *retlen, u8 *buffer); | 74 | size_t len, size_t *retlen, u8 *buffer); |
63 | int falcon_spi_write(const struct efx_spi_device *spi, loff_t start, | 75 | int falcon_spi_write(const struct efx_spi_device *spi, loff_t start, |
@@ -77,6 +89,7 @@ int falcon_spi_write(const struct efx_spi_device *spi, loff_t start, | |||
77 | * be absent or truncated depending on the devices used. | 89 | * be absent or truncated depending on the devices used. |
78 | */ | 90 | */ |
79 | #define FALCON_NVCONFIG_END 0x400U | 91 | #define FALCON_NVCONFIG_END 0x400U |
92 | #define FALCON_FLASH_BOOTCODE_START 0x8000U | ||
80 | #define EFX_EEPROM_BOOTCONFIG_START 0x800U | 93 | #define EFX_EEPROM_BOOTCONFIG_START 0x800U |
81 | #define EFX_EEPROM_BOOTCONFIG_END 0x1800U | 94 | #define EFX_EEPROM_BOOTCONFIG_END 0x1800U |
82 | 95 | ||