aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/benet/be_cmds.c29
-rw-r--r--drivers/net/benet/be_cmds.h2
-rw-r--r--drivers/net/benet/be_hw.h5
-rw-r--r--drivers/net/benet/be_main.c31
4 files changed, 67 insertions, 0 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index cc75dd0df0d8..808ad0dd4115 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -1251,3 +1251,32 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
1251 spin_unlock_bh(&adapter->mcc_lock); 1251 spin_unlock_bh(&adapter->mcc_lock);
1252 return status; 1252 return status;
1253} 1253}
1254
1255int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc)
1256{
1257 struct be_mcc_wrb *wrb;
1258 struct be_cmd_write_flashrom *req;
1259 int status;
1260
1261 spin_lock_bh(&adapter->mcc_lock);
1262
1263 wrb = wrb_from_mccq(adapter);
1264 req = embedded_payload(wrb);
1265
1266 be_wrb_hdr_prepare(wrb, sizeof(*req)+4, true, 0);
1267
1268 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1269 OPCODE_COMMON_READ_FLASHROM, sizeof(*req)+4);
1270
1271 req->params.op_type = cpu_to_le32(FLASHROM_TYPE_REDBOOT);
1272 req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
1273 req->params.offset = 0x3FFFC;
1274 req->params.data_buf_size = 0x4;
1275
1276 status = be_mcc_notify_wait(adapter);
1277 if (!status)
1278 memcpy(flashed_crc, req->params.data_buf, 4);
1279
1280 spin_unlock_bh(&adapter->mcc_lock);
1281 return status;
1282}
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index 69dc017c814b..6a430e4d1755 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -118,6 +118,7 @@ struct be_mcc_mailbox {
118#define OPCODE_COMMON_NTWK_MULTICAST_SET 3 118#define OPCODE_COMMON_NTWK_MULTICAST_SET 3
119#define OPCODE_COMMON_NTWK_VLAN_CONFIG 4 119#define OPCODE_COMMON_NTWK_VLAN_CONFIG 4
120#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5 120#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5
121#define OPCODE_COMMON_READ_FLASHROM 6
121#define OPCODE_COMMON_WRITE_FLASHROM 7 122#define OPCODE_COMMON_WRITE_FLASHROM 7
122#define OPCODE_COMMON_CQ_CREATE 12 123#define OPCODE_COMMON_CQ_CREATE 12
123#define OPCODE_COMMON_EQ_CREATE 13 124#define OPCODE_COMMON_EQ_CREATE 13
@@ -846,3 +847,4 @@ extern int be_cmd_read_port_type(struct be_adapter *adapter, u32 port,
846extern int be_cmd_write_flashrom(struct be_adapter *adapter, 847extern int be_cmd_write_flashrom(struct be_adapter *adapter,
847 struct be_dma_mem *cmd, u32 flash_oper, 848 struct be_dma_mem *cmd, u32 flash_oper,
848 u32 flash_opcode, u32 buf_size); 849 u32 flash_opcode, u32 buf_size);
850extern int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc);
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h
index a3394b4aa14a..f53d5ca2da9e 100644
--- a/drivers/net/benet/be_hw.h
+++ b/drivers/net/benet/be_hw.h
@@ -225,6 +225,7 @@ struct be_eth_rx_compl {
225#define NUM_FLASHDIR_ENTRIES 32 225#define NUM_FLASHDIR_ENTRIES 32
226 226
227#define FLASHROM_TYPE_ISCSI_ACTIVE 0 227#define FLASHROM_TYPE_ISCSI_ACTIVE 0
228#define FLASHROM_TYPE_REDBOOT 1
228#define FLASHROM_TYPE_BIOS 2 229#define FLASHROM_TYPE_BIOS 2
229#define FLASHROM_TYPE_PXE_BIOS 3 230#define FLASHROM_TYPE_PXE_BIOS 3
230#define FLASHROM_TYPE_FCOE_BIOS 8 231#define FLASHROM_TYPE_FCOE_BIOS 8
@@ -234,9 +235,11 @@ struct be_eth_rx_compl {
234 235
235#define FLASHROM_OPER_FLASH 1 236#define FLASHROM_OPER_FLASH 1
236#define FLASHROM_OPER_SAVE 2 237#define FLASHROM_OPER_SAVE 2
238#define FLASHROM_OPER_REPORT 4
237 239
238#define FLASH_IMAGE_MAX_SIZE (1310720) /* Max firmware image size */ 240#define FLASH_IMAGE_MAX_SIZE (1310720) /* Max firmware image size */
239#define FLASH_BIOS_IMAGE_MAX_SIZE (262144) /* Max OPTION ROM image sz */ 241#define FLASH_BIOS_IMAGE_MAX_SIZE (262144) /* Max OPTION ROM image sz */
242#define FLASH_REDBOOT_IMAGE_MAX_SIZE (262144) /* Max redboot image sz */
240 243
241/* Offsets for components on Flash. */ 244/* Offsets for components on Flash. */
242#define FLASH_iSCSI_PRIMARY_IMAGE_START (1048576) 245#define FLASH_iSCSI_PRIMARY_IMAGE_START (1048576)
@@ -246,6 +249,8 @@ struct be_eth_rx_compl {
246#define FLASH_iSCSI_BIOS_START (7340032) 249#define FLASH_iSCSI_BIOS_START (7340032)
247#define FLASH_PXE_BIOS_START (7864320) 250#define FLASH_PXE_BIOS_START (7864320)
248#define FLASH_FCoE_BIOS_START (524288) 251#define FLASH_FCoE_BIOS_START (524288)
252#define FLASH_REDBOOT_START (32768)
253#define FLASH_REDBOOT_ISM_START (0)
249 254
250struct controller_id { 255struct controller_id {
251 u32 vendor; 256 u32 vendor;
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index c0bd20356eaf..921103c40195 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -1721,6 +1721,31 @@ static int be_close(struct net_device *netdev)
1721#define FW_FILE_HDR_SIGN "ServerEngines Corp. " 1721#define FW_FILE_HDR_SIGN "ServerEngines Corp. "
1722char flash_cookie[2][16] = {"*** SE FLAS", 1722char flash_cookie[2][16] = {"*** SE FLAS",
1723 "H DIRECTORY *** "}; 1723 "H DIRECTORY *** "};
1724
1725static bool be_flash_redboot(struct be_adapter *adapter,
1726 const u8 *p)
1727{
1728 u32 crc_offset;
1729 u8 flashed_crc[4];
1730 int status;
1731 crc_offset = FLASH_REDBOOT_START + FLASH_REDBOOT_IMAGE_MAX_SIZE - 4
1732 + sizeof(struct flash_file_hdr) - 32*1024;
1733 p += crc_offset;
1734 status = be_cmd_get_flash_crc(adapter, flashed_crc);
1735 if (status) {
1736 dev_err(&adapter->pdev->dev,
1737 "could not get crc from flash, not flashing redboot\n");
1738 return false;
1739 }
1740
1741 /*update redboot only if crc does not match*/
1742 if (!memcmp(flashed_crc, p, 4))
1743 return false;
1744 else
1745 return true;
1746
1747}
1748
1724static int be_flash_image(struct be_adapter *adapter, 1749static int be_flash_image(struct be_adapter *adapter,
1725 const struct firmware *fw, 1750 const struct firmware *fw,
1726 struct be_dma_mem *flash_cmd, u32 flash_type) 1751 struct be_dma_mem *flash_cmd, u32 flash_type)
@@ -1760,6 +1785,12 @@ static int be_flash_image(struct be_adapter *adapter,
1760 image_offset = FLASH_PXE_BIOS_START; 1785 image_offset = FLASH_PXE_BIOS_START;
1761 image_size = FLASH_BIOS_IMAGE_MAX_SIZE; 1786 image_size = FLASH_BIOS_IMAGE_MAX_SIZE;
1762 break; 1787 break;
1788 case FLASHROM_TYPE_REDBOOT:
1789 if (!be_flash_redboot(adapter, fw->data))
1790 return 0;
1791 image_offset = FLASH_REDBOOT_ISM_START;
1792 image_size = FLASH_REDBOOT_IMAGE_MAX_SIZE;
1793 break;
1763 default: 1794 default:
1764 return 0; 1795 return 0;
1765 } 1796 }