Skip to content

Commit 13af816

Browse files
Nathan Williamsdavem330
authored andcommitted
solos-pci: add firmware upgrade support for new models
Signed-off-by: Nathan Williams <nathan@traverse.com.au> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7fbdadb commit 13af816

File tree

1 file changed

+42
-11
lines changed

1 file changed

+42
-11
lines changed

drivers/atm/solos-pci.c

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@
4242
#include <linux/swab.h>
4343
#include <linux/slab.h>
4444

45-
#define VERSION "0.07"
45+
#define VERSION "1.04"
46+
#define DRIVER_VERSION 0x01
4647
#define PTAG "solos-pci"
4748

4849
#define CONFIG_RAM_SIZE 128
@@ -57,16 +58,20 @@
5758
#define FPGA_MODE 0x5C
5859
#define FLASH_MODE 0x58
5960
#define GPIO_STATUS 0x54
61+
#define DRIVER_VER 0x50
6062
#define TX_DMA_ADDR(port) (0x40 + (4 * (port)))
6163
#define RX_DMA_ADDR(port) (0x30 + (4 * (port)))
6264

6365
#define DATA_RAM_SIZE 32768
6466
#define BUF_SIZE 2048
6567
#define OLD_BUF_SIZE 4096 /* For FPGA versions <= 2*/
66-
#define FPGA_PAGE 528 /* FPGA flash page size*/
67-
#define SOLOS_PAGE 512 /* Solos flash page size*/
68-
#define FPGA_BLOCK (FPGA_PAGE * 8) /* FPGA flash block size*/
69-
#define SOLOS_BLOCK (SOLOS_PAGE * 8) /* Solos flash block size*/
68+
/* Old boards use ATMEL AD45DB161D flash */
69+
#define ATMEL_FPGA_PAGE 528 /* FPGA flash page size*/
70+
#define ATMEL_SOLOS_PAGE 512 /* Solos flash page size*/
71+
#define ATMEL_FPGA_BLOCK (ATMEL_FPGA_PAGE * 8) /* FPGA block size*/
72+
#define ATMEL_SOLOS_BLOCK (ATMEL_SOLOS_PAGE * 8) /* Solos block size*/
73+
/* Current boards use M25P/M25PE SPI flash */
74+
#define SPI_FLASH_BLOCK (256 * 64)
7075

7176
#define RX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2)
7277
#define TX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2 + (card->buffer_size))
@@ -128,6 +133,7 @@ struct solos_card {
128133
int using_dma;
129134
int fpga_version;
130135
int buffer_size;
136+
int atmel_flash;
131137
};
132138

133139

@@ -630,16 +636,25 @@ static int flash_upgrade(struct solos_card *card, int chip)
630636
switch (chip) {
631637
case 0:
632638
fw_name = "solos-FPGA.bin";
633-
blocksize = FPGA_BLOCK;
639+
if (card->atmel_flash)
640+
blocksize = ATMEL_FPGA_BLOCK;
641+
else
642+
blocksize = SPI_FLASH_BLOCK;
634643
break;
635644
case 1:
636645
fw_name = "solos-Firmware.bin";
637-
blocksize = SOLOS_BLOCK;
646+
if (card->atmel_flash)
647+
blocksize = ATMEL_SOLOS_BLOCK;
648+
else
649+
blocksize = SPI_FLASH_BLOCK;
638650
break;
639651
case 2:
640652
if (card->fpga_version > LEGACY_BUFFERS){
641653
fw_name = "solos-db-FPGA.bin";
642-
blocksize = FPGA_BLOCK;
654+
if (card->atmel_flash)
655+
blocksize = ATMEL_FPGA_BLOCK;
656+
else
657+
blocksize = SPI_FLASH_BLOCK;
643658
} else {
644659
dev_info(&card->dev->dev, "FPGA version doesn't support"
645660
" daughter board upgrades\n");
@@ -649,7 +664,10 @@ static int flash_upgrade(struct solos_card *card, int chip)
649664
case 3:
650665
if (card->fpga_version > LEGACY_BUFFERS){
651666
fw_name = "solos-Firmware.bin";
652-
blocksize = SOLOS_BLOCK;
667+
if (card->atmel_flash)
668+
blocksize = ATMEL_SOLOS_BLOCK;
669+
else
670+
blocksize = SPI_FLASH_BLOCK;
653671
} else {
654672
dev_info(&card->dev->dev, "FPGA version doesn't support"
655673
" daughter board upgrades\n");
@@ -665,6 +683,9 @@ static int flash_upgrade(struct solos_card *card, int chip)
665683

666684
dev_info(&card->dev->dev, "Flash upgrade starting\n");
667685

686+
/* New FPGAs require driver version before permitting flash upgrades */
687+
iowrite32(DRIVER_VERSION, card->config_regs + DRIVER_VER);
688+
668689
numblocks = fw->size / blocksize;
669690
dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size);
670691
dev_info(&card->dev->dev, "Number of blocks: %d\n", numblocks);
@@ -694,9 +715,13 @@ static int flash_upgrade(struct solos_card *card, int chip)
694715
/* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */
695716
iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE);
696717

697-
/* Copy block to buffer, swapping each 16 bits */
718+
/* Copy block to buffer, swapping each 16 bits for Atmel flash */
698719
for(i = 0; i < blocksize; i += 4) {
699-
uint32_t word = swahb32p((uint32_t *)(fw->data + offset + i));
720+
uint32_t word;
721+
if (card->atmel_flash)
722+
word = swahb32p((uint32_t *)(fw->data + offset + i));
723+
else
724+
word = *(uint32_t *)(fw->data + offset + i);
700725
if(card->fpga_version > LEGACY_BUFFERS)
701726
iowrite32(word, FLASH_BUF + i);
702727
else
@@ -1230,6 +1255,12 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
12301255
db_fpga_upgrade = db_firmware_upgrade = 0;
12311256
}
12321257

1258+
/* Stopped using Atmel flash after 0.03-38 */
1259+
if (fpga_ver < 39)
1260+
card->atmel_flash = 1;
1261+
else
1262+
card->atmel_flash = 0;
1263+
12331264
if (card->fpga_version >= DMA_SUPPORTED) {
12341265
pci_set_master(dev);
12351266
card->using_dma = 1;

0 commit comments

Comments
 (0)