diff options
author | Nathan Williams <nathan@traverse.com.au> | 2012-12-19 06:01:20 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-19 17:53:53 -0500 |
commit | 13af816469db3449c072afbae6c4c1bd9ccecccb (patch) | |
tree | 5088fa6c519cf1c7e47ee76d59a5724d9d246da2 /drivers/atm/solos-pci.c | |
parent | 7fbdadb5e951e4f0c0fc991ff5f50295568786e6 (diff) |
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>
Diffstat (limited to 'drivers/atm/solos-pci.c')
-rw-r--r-- | drivers/atm/solos-pci.c | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c index 50e5c561b7c4..aa4f35d52a92 100644 --- a/drivers/atm/solos-pci.c +++ b/drivers/atm/solos-pci.c | |||
@@ -42,7 +42,8 @@ | |||
42 | #include <linux/swab.h> | 42 | #include <linux/swab.h> |
43 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
44 | 44 | ||
45 | #define VERSION "0.07" | 45 | #define VERSION "1.04" |
46 | #define DRIVER_VERSION 0x01 | ||
46 | #define PTAG "solos-pci" | 47 | #define PTAG "solos-pci" |
47 | 48 | ||
48 | #define CONFIG_RAM_SIZE 128 | 49 | #define CONFIG_RAM_SIZE 128 |
@@ -57,16 +58,20 @@ | |||
57 | #define FPGA_MODE 0x5C | 58 | #define FPGA_MODE 0x5C |
58 | #define FLASH_MODE 0x58 | 59 | #define FLASH_MODE 0x58 |
59 | #define GPIO_STATUS 0x54 | 60 | #define GPIO_STATUS 0x54 |
61 | #define DRIVER_VER 0x50 | ||
60 | #define TX_DMA_ADDR(port) (0x40 + (4 * (port))) | 62 | #define TX_DMA_ADDR(port) (0x40 + (4 * (port))) |
61 | #define RX_DMA_ADDR(port) (0x30 + (4 * (port))) | 63 | #define RX_DMA_ADDR(port) (0x30 + (4 * (port))) |
62 | 64 | ||
63 | #define DATA_RAM_SIZE 32768 | 65 | #define DATA_RAM_SIZE 32768 |
64 | #define BUF_SIZE 2048 | 66 | #define BUF_SIZE 2048 |
65 | #define OLD_BUF_SIZE 4096 /* For FPGA versions <= 2*/ | 67 | #define OLD_BUF_SIZE 4096 /* For FPGA versions <= 2*/ |
66 | #define FPGA_PAGE 528 /* FPGA flash page size*/ | 68 | /* Old boards use ATMEL AD45DB161D flash */ |
67 | #define SOLOS_PAGE 512 /* Solos flash page size*/ | 69 | #define ATMEL_FPGA_PAGE 528 /* FPGA flash page size*/ |
68 | #define FPGA_BLOCK (FPGA_PAGE * 8) /* FPGA flash block size*/ | 70 | #define ATMEL_SOLOS_PAGE 512 /* Solos flash page size*/ |
69 | #define SOLOS_BLOCK (SOLOS_PAGE * 8) /* Solos flash block 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) | ||
70 | 75 | ||
71 | #define RX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2) | 76 | #define RX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2) |
72 | #define TX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2 + (card->buffer_size)) | 77 | #define TX_BUF(card, nr) ((card->buffers) + (nr)*(card->buffer_size)*2 + (card->buffer_size)) |
@@ -128,6 +133,7 @@ struct solos_card { | |||
128 | int using_dma; | 133 | int using_dma; |
129 | int fpga_version; | 134 | int fpga_version; |
130 | int buffer_size; | 135 | int buffer_size; |
136 | int atmel_flash; | ||
131 | }; | 137 | }; |
132 | 138 | ||
133 | 139 | ||
@@ -630,16 +636,25 @@ static int flash_upgrade(struct solos_card *card, int chip) | |||
630 | switch (chip) { | 636 | switch (chip) { |
631 | case 0: | 637 | case 0: |
632 | fw_name = "solos-FPGA.bin"; | 638 | 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; | ||
634 | break; | 643 | break; |
635 | case 1: | 644 | case 1: |
636 | fw_name = "solos-Firmware.bin"; | 645 | 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; | ||
638 | break; | 650 | break; |
639 | case 2: | 651 | case 2: |
640 | if (card->fpga_version > LEGACY_BUFFERS){ | 652 | if (card->fpga_version > LEGACY_BUFFERS){ |
641 | fw_name = "solos-db-FPGA.bin"; | 653 | 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; | ||
643 | } else { | 658 | } else { |
644 | dev_info(&card->dev->dev, "FPGA version doesn't support" | 659 | dev_info(&card->dev->dev, "FPGA version doesn't support" |
645 | " daughter board upgrades\n"); | 660 | " daughter board upgrades\n"); |
@@ -649,7 +664,10 @@ static int flash_upgrade(struct solos_card *card, int chip) | |||
649 | case 3: | 664 | case 3: |
650 | if (card->fpga_version > LEGACY_BUFFERS){ | 665 | if (card->fpga_version > LEGACY_BUFFERS){ |
651 | fw_name = "solos-Firmware.bin"; | 666 | 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; | ||
653 | } else { | 671 | } else { |
654 | dev_info(&card->dev->dev, "FPGA version doesn't support" | 672 | dev_info(&card->dev->dev, "FPGA version doesn't support" |
655 | " daughter board upgrades\n"); | 673 | " daughter board upgrades\n"); |
@@ -665,6 +683,9 @@ static int flash_upgrade(struct solos_card *card, int chip) | |||
665 | 683 | ||
666 | dev_info(&card->dev->dev, "Flash upgrade starting\n"); | 684 | dev_info(&card->dev->dev, "Flash upgrade starting\n"); |
667 | 685 | ||
686 | /* New FPGAs require driver version before permitting flash upgrades */ | ||
687 | iowrite32(DRIVER_VERSION, card->config_regs + DRIVER_VER); | ||
688 | |||
668 | numblocks = fw->size / blocksize; | 689 | numblocks = fw->size / blocksize; |
669 | dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size); | 690 | dev_info(&card->dev->dev, "Firmware size: %zd\n", fw->size); |
670 | dev_info(&card->dev->dev, "Number of blocks: %d\n", numblocks); | 691 | 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) | |||
694 | /* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */ | 715 | /* dev_info(&card->dev->dev, "Set FPGA Flash mode to Block Write\n"); */ |
695 | iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE); | 716 | iowrite32(((chip * 2) + 1), card->config_regs + FLASH_MODE); |
696 | 717 | ||
697 | /* Copy block to buffer, swapping each 16 bits */ | 718 | /* Copy block to buffer, swapping each 16 bits for Atmel flash */ |
698 | for(i = 0; i < blocksize; i += 4) { | 719 | 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); | ||
700 | if(card->fpga_version > LEGACY_BUFFERS) | 725 | if(card->fpga_version > LEGACY_BUFFERS) |
701 | iowrite32(word, FLASH_BUF + i); | 726 | iowrite32(word, FLASH_BUF + i); |
702 | else | 727 | else |
@@ -1230,6 +1255,12 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
1230 | db_fpga_upgrade = db_firmware_upgrade = 0; | 1255 | db_fpga_upgrade = db_firmware_upgrade = 0; |
1231 | } | 1256 | } |
1232 | 1257 | ||
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 | |||
1233 | if (card->fpga_version >= DMA_SUPPORTED) { | 1264 | if (card->fpga_version >= DMA_SUPPORTED) { |
1234 | pci_set_master(dev); | 1265 | pci_set_master(dev); |
1235 | card->using_dma = 1; | 1266 | card->using_dma = 1; |