Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 171773
b: refs/heads/master
c: fa9a6fe
h: refs/heads/master
i:
  171771: b1bc1cd
v: v3
  • Loading branch information
Sarveshwar Bandi authored and David S. Miller committed Nov 20, 2009
1 parent e635063 commit db58296
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eb6d02133cf5451fece3a37ccccf2ce7c09a09c1
refs/heads/master: fa9a6fed87df1b50804405e700f8d30251d3aaf1
29 changes: 29 additions & 0 deletions trunk/drivers/net/benet/be_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -1251,3 +1251,32 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
spin_unlock_bh(&adapter->mcc_lock);
return status;
}

int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc)
{
struct be_mcc_wrb *wrb;
struct be_cmd_write_flashrom *req;
int status;

spin_lock_bh(&adapter->mcc_lock);

wrb = wrb_from_mccq(adapter);
req = embedded_payload(wrb);

be_wrb_hdr_prepare(wrb, sizeof(*req)+4, true, 0);

be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
OPCODE_COMMON_READ_FLASHROM, sizeof(*req)+4);

req->params.op_type = cpu_to_le32(FLASHROM_TYPE_REDBOOT);
req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
req->params.offset = 0x3FFFC;
req->params.data_buf_size = 0x4;

status = be_mcc_notify_wait(adapter);
if (!status)
memcpy(flashed_crc, req->params.data_buf, 4);

spin_unlock_bh(&adapter->mcc_lock);
return status;
}
2 changes: 2 additions & 0 deletions trunk/drivers/net/benet/be_cmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct be_mcc_mailbox {
#define OPCODE_COMMON_NTWK_MULTICAST_SET 3
#define OPCODE_COMMON_NTWK_VLAN_CONFIG 4
#define OPCODE_COMMON_NTWK_LINK_STATUS_QUERY 5
#define OPCODE_COMMON_READ_FLASHROM 6
#define OPCODE_COMMON_WRITE_FLASHROM 7
#define OPCODE_COMMON_CQ_CREATE 12
#define OPCODE_COMMON_EQ_CREATE 13
Expand Down Expand Up @@ -846,3 +847,4 @@ extern int be_cmd_read_port_type(struct be_adapter *adapter, u32 port,
extern int be_cmd_write_flashrom(struct be_adapter *adapter,
struct be_dma_mem *cmd, u32 flash_oper,
u32 flash_opcode, u32 buf_size);
extern int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc);
5 changes: 5 additions & 0 deletions trunk/drivers/net/benet/be_hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ struct be_eth_rx_compl {
#define NUM_FLASHDIR_ENTRIES 32

#define FLASHROM_TYPE_ISCSI_ACTIVE 0
#define FLASHROM_TYPE_REDBOOT 1
#define FLASHROM_TYPE_BIOS 2
#define FLASHROM_TYPE_PXE_BIOS 3
#define FLASHROM_TYPE_FCOE_BIOS 8
Expand All @@ -234,9 +235,11 @@ struct be_eth_rx_compl {

#define FLASHROM_OPER_FLASH 1
#define FLASHROM_OPER_SAVE 2
#define FLASHROM_OPER_REPORT 4

#define FLASH_IMAGE_MAX_SIZE (1310720) /* Max firmware image size */
#define FLASH_BIOS_IMAGE_MAX_SIZE (262144) /* Max OPTION ROM image sz */
#define FLASH_REDBOOT_IMAGE_MAX_SIZE (262144) /* Max redboot image sz */

/* Offsets for components on Flash. */
#define FLASH_iSCSI_PRIMARY_IMAGE_START (1048576)
Expand All @@ -246,6 +249,8 @@ struct be_eth_rx_compl {
#define FLASH_iSCSI_BIOS_START (7340032)
#define FLASH_PXE_BIOS_START (7864320)
#define FLASH_FCoE_BIOS_START (524288)
#define FLASH_REDBOOT_START (32768)
#define FLASH_REDBOOT_ISM_START (0)

struct controller_id {
u32 vendor;
Expand Down
31 changes: 31 additions & 0 deletions trunk/drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1721,6 +1721,31 @@ static int be_close(struct net_device *netdev)
#define FW_FILE_HDR_SIGN "ServerEngines Corp. "
char flash_cookie[2][16] = {"*** SE FLAS",
"H DIRECTORY *** "};

static bool be_flash_redboot(struct be_adapter *adapter,
const u8 *p)
{
u32 crc_offset;
u8 flashed_crc[4];
int status;
crc_offset = FLASH_REDBOOT_START + FLASH_REDBOOT_IMAGE_MAX_SIZE - 4
+ sizeof(struct flash_file_hdr) - 32*1024;
p += crc_offset;
status = be_cmd_get_flash_crc(adapter, flashed_crc);
if (status) {
dev_err(&adapter->pdev->dev,
"could not get crc from flash, not flashing redboot\n");
return false;
}

/*update redboot only if crc does not match*/
if (!memcmp(flashed_crc, p, 4))
return false;
else
return true;

}

static int be_flash_image(struct be_adapter *adapter,
const struct firmware *fw,
struct be_dma_mem *flash_cmd, u32 flash_type)
Expand Down Expand Up @@ -1760,6 +1785,12 @@ static int be_flash_image(struct be_adapter *adapter,
image_offset = FLASH_PXE_BIOS_START;
image_size = FLASH_BIOS_IMAGE_MAX_SIZE;
break;
case FLASHROM_TYPE_REDBOOT:
if (!be_flash_redboot(adapter, fw->data))
return 0;
image_offset = FLASH_REDBOOT_ISM_START;
image_size = FLASH_REDBOOT_IMAGE_MAX_SIZE;
break;
default:
return 0;
}
Expand Down

0 comments on commit db58296

Please sign in to comment.