diff options
author | Sathya Perla <sathya.perla@emulex.com> | 2011-08-02 15:57:45 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-08-03 06:23:30 -0400 |
commit | 306f13487c9f7d6e3303a547e01e22958a04c666 (patch) | |
tree | 0fe7f2870abbc3db97501b28f1eaecb41c2c2cdd /drivers/net/benet | |
parent | 5b8821b787495273ba4fb333a3561c6da382a9a7 (diff) |
be2net: add support for flashing Teranetics PHY firmware
Support for flashing RJ45 PHY (from Teranetics) on a 10GBaseT BE3 card.
Signed-off-by: Naresh G <bgottumukkala@emulex.com>
Signed-off-by: Sathya Perla <sathya.perla@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet')
-rw-r--r-- | drivers/net/benet/be_cmds.c | 29 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 11 | ||||
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 23 | ||||
-rw-r--r-- | drivers/net/benet/be_hw.h | 21 | ||||
-rw-r--r-- | drivers/net/benet/be_main.c | 51 |
5 files changed, 91 insertions, 44 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index f138fbb2e4a8..7292be64632b 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -2186,11 +2186,13 @@ err: | |||
2186 | return status; | 2186 | return status; |
2187 | } | 2187 | } |
2188 | 2188 | ||
2189 | int be_cmd_get_phy_info(struct be_adapter *adapter, struct be_dma_mem *cmd) | 2189 | int be_cmd_get_phy_info(struct be_adapter *adapter, |
2190 | struct be_phy_info *phy_info) | ||
2190 | { | 2191 | { |
2191 | struct be_mcc_wrb *wrb; | 2192 | struct be_mcc_wrb *wrb; |
2192 | struct be_cmd_req_get_phy_info *req; | 2193 | struct be_cmd_req_get_phy_info *req; |
2193 | struct be_sge *sge; | 2194 | struct be_sge *sge; |
2195 | struct be_dma_mem cmd; | ||
2194 | int status; | 2196 | int status; |
2195 | 2197 | ||
2196 | spin_lock_bh(&adapter->mcc_lock); | 2198 | spin_lock_bh(&adapter->mcc_lock); |
@@ -2200,8 +2202,16 @@ int be_cmd_get_phy_info(struct be_adapter *adapter, struct be_dma_mem *cmd) | |||
2200 | status = -EBUSY; | 2202 | status = -EBUSY; |
2201 | goto err; | 2203 | goto err; |
2202 | } | 2204 | } |
2205 | cmd.size = sizeof(struct be_cmd_req_get_phy_info); | ||
2206 | cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size, | ||
2207 | &cmd.dma); | ||
2208 | if (!cmd.va) { | ||
2209 | dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); | ||
2210 | status = -ENOMEM; | ||
2211 | goto err; | ||
2212 | } | ||
2203 | 2213 | ||
2204 | req = cmd->va; | 2214 | req = cmd.va; |
2205 | sge = nonembedded_sgl(wrb); | 2215 | sge = nonembedded_sgl(wrb); |
2206 | 2216 | ||
2207 | be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1, | 2217 | be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1, |
@@ -2211,11 +2221,20 @@ int be_cmd_get_phy_info(struct be_adapter *adapter, struct be_dma_mem *cmd) | |||
2211 | OPCODE_COMMON_GET_PHY_DETAILS, | 2221 | OPCODE_COMMON_GET_PHY_DETAILS, |
2212 | sizeof(*req)); | 2222 | sizeof(*req)); |
2213 | 2223 | ||
2214 | sge->pa_hi = cpu_to_le32(upper_32_bits(cmd->dma)); | 2224 | sge->pa_hi = cpu_to_le32(upper_32_bits(cmd.dma)); |
2215 | sge->pa_lo = cpu_to_le32(cmd->dma & 0xFFFFFFFF); | 2225 | sge->pa_lo = cpu_to_le32(cmd.dma & 0xFFFFFFFF); |
2216 | sge->len = cpu_to_le32(cmd->size); | 2226 | sge->len = cpu_to_le32(cmd.size); |
2217 | 2227 | ||
2218 | status = be_mcc_notify_wait(adapter); | 2228 | status = be_mcc_notify_wait(adapter); |
2229 | if (!status) { | ||
2230 | struct be_phy_info *resp_phy_info = | ||
2231 | cmd.va + sizeof(struct be_cmd_req_hdr); | ||
2232 | phy_info->phy_type = le16_to_cpu(resp_phy_info->phy_type); | ||
2233 | phy_info->interface_type = | ||
2234 | le16_to_cpu(resp_phy_info->interface_type); | ||
2235 | } | ||
2236 | pci_free_consistent(adapter->pdev, cmd.size, | ||
2237 | cmd.va, cmd.dma); | ||
2219 | err: | 2238 | err: |
2220 | spin_unlock_bh(&adapter->mcc_lock); | 2239 | spin_unlock_bh(&adapter->mcc_lock); |
2221 | return status; | 2240 | return status; |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 008bfae9cd3d..b61eac7ece35 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -1244,14 +1244,19 @@ struct be_cmd_req_get_phy_info { | |||
1244 | struct be_cmd_req_hdr hdr; | 1244 | struct be_cmd_req_hdr hdr; |
1245 | u8 rsvd0[24]; | 1245 | u8 rsvd0[24]; |
1246 | }; | 1246 | }; |
1247 | struct be_cmd_resp_get_phy_info { | 1247 | |
1248 | struct be_cmd_req_hdr hdr; | 1248 | struct be_phy_info { |
1249 | u16 phy_type; | 1249 | u16 phy_type; |
1250 | u16 interface_type; | 1250 | u16 interface_type; |
1251 | u32 misc_params; | 1251 | u32 misc_params; |
1252 | u32 future_use[4]; | 1252 | u32 future_use[4]; |
1253 | }; | 1253 | }; |
1254 | 1254 | ||
1255 | struct be_cmd_resp_get_phy_info { | ||
1256 | struct be_cmd_req_hdr hdr; | ||
1257 | struct be_phy_info phy_info; | ||
1258 | }; | ||
1259 | |||
1255 | /*********************** Set QOS ***********************/ | 1260 | /*********************** Set QOS ***********************/ |
1256 | 1261 | ||
1257 | #define BE_QOS_BITS_NIC 1 | 1262 | #define BE_QOS_BITS_NIC 1 |
@@ -1486,7 +1491,7 @@ extern int be_cmd_get_seeprom_data(struct be_adapter *adapter, | |||
1486 | extern int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, | 1491 | extern int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, |
1487 | u8 loopback_type, u8 enable); | 1492 | u8 loopback_type, u8 enable); |
1488 | extern int be_cmd_get_phy_info(struct be_adapter *adapter, | 1493 | extern int be_cmd_get_phy_info(struct be_adapter *adapter, |
1489 | struct be_dma_mem *cmd); | 1494 | struct be_phy_info *phy_info); |
1490 | extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); | 1495 | extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); |
1491 | extern void be_detect_dump_ue(struct be_adapter *adapter); | 1496 | extern void be_detect_dump_ue(struct be_adapter *adapter); |
1492 | extern int be_cmd_get_die_temperature(struct be_adapter *adapter); | 1497 | extern int be_cmd_get_die_temperature(struct be_adapter *adapter); |
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 60c85f6fad51..f144a6f99862 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
@@ -349,12 +349,10 @@ static int be_get_sset_count(struct net_device *netdev, int stringset) | |||
349 | static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | 349 | static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) |
350 | { | 350 | { |
351 | struct be_adapter *adapter = netdev_priv(netdev); | 351 | struct be_adapter *adapter = netdev_priv(netdev); |
352 | struct be_dma_mem phy_cmd; | 352 | struct be_phy_info phy_info; |
353 | struct be_cmd_resp_get_phy_info *resp; | ||
354 | u8 mac_speed = 0; | 353 | u8 mac_speed = 0; |
355 | u16 link_speed = 0; | 354 | u16 link_speed = 0; |
356 | int status; | 355 | int status; |
357 | u16 intf_type; | ||
358 | 356 | ||
359 | if ((adapter->link_speed < 0) || (!(netdev->flags & IFF_UP))) { | 357 | if ((adapter->link_speed < 0) || (!(netdev->flags & IFF_UP))) { |
360 | status = be_cmd_link_status_query(adapter, &mac_speed, | 358 | status = be_cmd_link_status_query(adapter, &mac_speed, |
@@ -383,20 +381,9 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
383 | } | 381 | } |
384 | } | 382 | } |
385 | 383 | ||
386 | phy_cmd.size = sizeof(struct be_cmd_req_get_phy_info); | 384 | status = be_cmd_get_phy_info(adapter, &phy_info); |
387 | phy_cmd.va = dma_alloc_coherent(&adapter->pdev->dev, | ||
388 | phy_cmd.size, &phy_cmd.dma, | ||
389 | GFP_KERNEL); | ||
390 | if (!phy_cmd.va) { | ||
391 | dev_err(&adapter->pdev->dev, "Memory alloc failure\n"); | ||
392 | return -ENOMEM; | ||
393 | } | ||
394 | status = be_cmd_get_phy_info(adapter, &phy_cmd); | ||
395 | if (!status) { | 385 | if (!status) { |
396 | resp = phy_cmd.va; | 386 | switch (phy_info.interface_type) { |
397 | intf_type = le16_to_cpu(resp->interface_type); | ||
398 | |||
399 | switch (intf_type) { | ||
400 | case PHY_TYPE_XFP_10GB: | 387 | case PHY_TYPE_XFP_10GB: |
401 | case PHY_TYPE_SFP_1GB: | 388 | case PHY_TYPE_SFP_1GB: |
402 | case PHY_TYPE_SFP_PLUS_10GB: | 389 | case PHY_TYPE_SFP_PLUS_10GB: |
@@ -407,7 +394,7 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
407 | break; | 394 | break; |
408 | } | 395 | } |
409 | 396 | ||
410 | switch (intf_type) { | 397 | switch (phy_info.interface_type) { |
411 | case PHY_TYPE_KR_10GB: | 398 | case PHY_TYPE_KR_10GB: |
412 | case PHY_TYPE_KX4_10GB: | 399 | case PHY_TYPE_KX4_10GB: |
413 | ecmd->autoneg = AUTONEG_ENABLE; | 400 | ecmd->autoneg = AUTONEG_ENABLE; |
@@ -425,8 +412,6 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
425 | adapter->port_type = ecmd->port; | 412 | adapter->port_type = ecmd->port; |
426 | adapter->transceiver = ecmd->transceiver; | 413 | adapter->transceiver = ecmd->transceiver; |
427 | adapter->autoneg = ecmd->autoneg; | 414 | adapter->autoneg = ecmd->autoneg; |
428 | dma_free_coherent(&adapter->pdev->dev, phy_cmd.size, phy_cmd.va, | ||
429 | phy_cmd.dma); | ||
430 | } else { | 415 | } else { |
431 | ethtool_cmd_speed_set(ecmd, adapter->link_speed); | 416 | ethtool_cmd_speed_set(ecmd, adapter->link_speed); |
432 | ecmd->port = adapter->port_type; | 417 | ecmd->port = adapter->port_type; |
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h index 53d658afea2a..fbc8a915519e 100644 --- a/drivers/net/benet/be_hw.h +++ b/drivers/net/benet/be_hw.h | |||
@@ -175,18 +175,24 @@ | |||
175 | #define IMG_TYPE_FCOE_FW_ACTIVE 10 | 175 | #define IMG_TYPE_FCOE_FW_ACTIVE 10 |
176 | #define IMG_TYPE_FCOE_FW_BACKUP 11 | 176 | #define IMG_TYPE_FCOE_FW_BACKUP 11 |
177 | #define IMG_TYPE_NCSI_FW 13 | 177 | #define IMG_TYPE_NCSI_FW 13 |
178 | #define IMG_TYPE_PHY_FW 99 | ||
179 | #define TN_8022 13 | ||
178 | 180 | ||
181 | #define ILLEGAL_IOCTL_REQ 2 | ||
182 | #define FLASHROM_OPER_PHY_FLASH 9 | ||
183 | #define FLASHROM_OPER_PHY_SAVE 10 | ||
179 | #define FLASHROM_OPER_FLASH 1 | 184 | #define FLASHROM_OPER_FLASH 1 |
180 | #define FLASHROM_OPER_SAVE 2 | 185 | #define FLASHROM_OPER_SAVE 2 |
181 | #define FLASHROM_OPER_REPORT 4 | 186 | #define FLASHROM_OPER_REPORT 4 |
182 | 187 | ||
183 | #define FLASH_IMAGE_MAX_SIZE_g2 (1310720) /* Max firmware image sz */ | 188 | #define FLASH_IMAGE_MAX_SIZE_g2 (1310720) /* Max firmware image size */ |
184 | #define FLASH_BIOS_IMAGE_MAX_SIZE_g2 (262144) /* Max OPTION ROM img sz */ | 189 | #define FLASH_BIOS_IMAGE_MAX_SIZE_g2 (262144) /* Max OPTION ROM image sz */ |
185 | #define FLASH_REDBOOT_IMAGE_MAX_SIZE_g2 (262144) /* Max Redboot image sz */ | 190 | #define FLASH_REDBOOT_IMAGE_MAX_SIZE_g2 (262144) /* Max Redboot image sz */ |
186 | #define FLASH_IMAGE_MAX_SIZE_g3 (2097152) /* Max fw image size */ | 191 | #define FLASH_IMAGE_MAX_SIZE_g3 (2097152) /* Max firmware image size */ |
187 | #define FLASH_BIOS_IMAGE_MAX_SIZE_g3 (524288) /* Max OPTION ROM img sz */ | 192 | #define FLASH_BIOS_IMAGE_MAX_SIZE_g3 (524288) /* Max OPTION ROM image sz */ |
188 | #define FLASH_REDBOOT_IMAGE_MAX_SIZE_g3 (1048576) /* Max Redboot image sz */ | 193 | #define FLASH_REDBOOT_IMAGE_MAX_SIZE_g3 (1048576) /* Max Redboot image sz */ |
189 | #define FLASH_NCSI_IMAGE_MAX_SIZE_g3 (262144) /* Max NSCI image sz */ | 194 | #define FLASH_NCSI_IMAGE_MAX_SIZE_g3 (262144) |
195 | #define FLASH_PHY_FW_IMAGE_MAX_SIZE_g3 262144 | ||
190 | 196 | ||
191 | #define FLASH_NCSI_MAGIC (0x16032009) | 197 | #define FLASH_NCSI_MAGIC (0x16032009) |
192 | #define FLASH_NCSI_DISABLED (0) | 198 | #define FLASH_NCSI_DISABLED (0) |
@@ -213,6 +219,7 @@ | |||
213 | #define FLASH_PXE_BIOS_START_g3 (13107200) | 219 | #define FLASH_PXE_BIOS_START_g3 (13107200) |
214 | #define FLASH_FCoE_BIOS_START_g3 (13631488) | 220 | #define FLASH_FCoE_BIOS_START_g3 (13631488) |
215 | #define FLASH_REDBOOT_START_g3 (262144) | 221 | #define FLASH_REDBOOT_START_g3 (262144) |
222 | #define FLASH_PHY_FW_START_g3 1310720 | ||
216 | 223 | ||
217 | /************* Rx Packet Type Encoding **************/ | 224 | /************* Rx Packet Type Encoding **************/ |
218 | #define BE_UNICAST_PACKET 0 | 225 | #define BE_UNICAST_PACKET 0 |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 5890bca01c07..dba6941f868a 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -2569,6 +2569,21 @@ static bool be_flash_redboot(struct be_adapter *adapter, | |||
2569 | return true; | 2569 | return true; |
2570 | } | 2570 | } |
2571 | 2571 | ||
2572 | static bool phy_flashing_required(struct be_adapter *adapter) | ||
2573 | { | ||
2574 | int status = 0; | ||
2575 | struct be_phy_info phy_info; | ||
2576 | |||
2577 | status = be_cmd_get_phy_info(adapter, &phy_info); | ||
2578 | if (status) | ||
2579 | return false; | ||
2580 | if ((phy_info.phy_type == TN_8022) && | ||
2581 | (phy_info.interface_type == PHY_TYPE_BASET_10GB)) { | ||
2582 | return true; | ||
2583 | } | ||
2584 | return false; | ||
2585 | } | ||
2586 | |||
2572 | static int be_flash_data(struct be_adapter *adapter, | 2587 | static int be_flash_data(struct be_adapter *adapter, |
2573 | const struct firmware *fw, | 2588 | const struct firmware *fw, |
2574 | struct be_dma_mem *flash_cmd, int num_of_images) | 2589 | struct be_dma_mem *flash_cmd, int num_of_images) |
@@ -2582,7 +2597,7 @@ static int be_flash_data(struct be_adapter *adapter, | |||
2582 | const struct flash_comp *pflashcomp; | 2597 | const struct flash_comp *pflashcomp; |
2583 | int num_comp; | 2598 | int num_comp; |
2584 | 2599 | ||
2585 | static const struct flash_comp gen3_flash_types[9] = { | 2600 | static const struct flash_comp gen3_flash_types[10] = { |
2586 | { FLASH_iSCSI_PRIMARY_IMAGE_START_g3, IMG_TYPE_ISCSI_ACTIVE, | 2601 | { FLASH_iSCSI_PRIMARY_IMAGE_START_g3, IMG_TYPE_ISCSI_ACTIVE, |
2587 | FLASH_IMAGE_MAX_SIZE_g3}, | 2602 | FLASH_IMAGE_MAX_SIZE_g3}, |
2588 | { FLASH_REDBOOT_START_g3, IMG_TYPE_REDBOOT, | 2603 | { FLASH_REDBOOT_START_g3, IMG_TYPE_REDBOOT, |
@@ -2600,7 +2615,9 @@ static int be_flash_data(struct be_adapter *adapter, | |||
2600 | { FLASH_FCoE_BACKUP_IMAGE_START_g3, IMG_TYPE_FCOE_FW_BACKUP, | 2615 | { FLASH_FCoE_BACKUP_IMAGE_START_g3, IMG_TYPE_FCOE_FW_BACKUP, |
2601 | FLASH_IMAGE_MAX_SIZE_g3}, | 2616 | FLASH_IMAGE_MAX_SIZE_g3}, |
2602 | { FLASH_NCSI_START_g3, IMG_TYPE_NCSI_FW, | 2617 | { FLASH_NCSI_START_g3, IMG_TYPE_NCSI_FW, |
2603 | FLASH_NCSI_IMAGE_MAX_SIZE_g3} | 2618 | FLASH_NCSI_IMAGE_MAX_SIZE_g3}, |
2619 | { FLASH_PHY_FW_START_g3, IMG_TYPE_PHY_FW, | ||
2620 | FLASH_PHY_FW_IMAGE_MAX_SIZE_g3} | ||
2604 | }; | 2621 | }; |
2605 | static const struct flash_comp gen2_flash_types[8] = { | 2622 | static const struct flash_comp gen2_flash_types[8] = { |
2606 | { FLASH_iSCSI_PRIMARY_IMAGE_START_g2, IMG_TYPE_ISCSI_ACTIVE, | 2623 | { FLASH_iSCSI_PRIMARY_IMAGE_START_g2, IMG_TYPE_ISCSI_ACTIVE, |
@@ -2634,6 +2651,10 @@ static int be_flash_data(struct be_adapter *adapter, | |||
2634 | if ((pflashcomp[i].optype == IMG_TYPE_NCSI_FW) && | 2651 | if ((pflashcomp[i].optype == IMG_TYPE_NCSI_FW) && |
2635 | memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) | 2652 | memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0) |
2636 | continue; | 2653 | continue; |
2654 | if (pflashcomp[i].optype == IMG_TYPE_PHY_FW) { | ||
2655 | if (!phy_flashing_required(adapter)) | ||
2656 | continue; | ||
2657 | } | ||
2637 | if ((pflashcomp[i].optype == IMG_TYPE_REDBOOT) && | 2658 | if ((pflashcomp[i].optype == IMG_TYPE_REDBOOT) && |
2638 | (!be_flash_redboot(adapter, fw->data, | 2659 | (!be_flash_redboot(adapter, fw->data, |
2639 | pflashcomp[i].offset, pflashcomp[i].size, filehdr_size + | 2660 | pflashcomp[i].offset, pflashcomp[i].size, filehdr_size + |
@@ -2642,25 +2663,35 @@ static int be_flash_data(struct be_adapter *adapter, | |||
2642 | p = fw->data; | 2663 | p = fw->data; |
2643 | p += filehdr_size + pflashcomp[i].offset | 2664 | p += filehdr_size + pflashcomp[i].offset |
2644 | + (num_of_images * sizeof(struct image_hdr)); | 2665 | + (num_of_images * sizeof(struct image_hdr)); |
2645 | if (p + pflashcomp[i].size > fw->data + fw->size) | 2666 | if (p + pflashcomp[i].size > fw->data + fw->size) |
2646 | return -1; | 2667 | return -1; |
2647 | total_bytes = pflashcomp[i].size; | 2668 | total_bytes = pflashcomp[i].size; |
2648 | while (total_bytes) { | 2669 | while (total_bytes) { |
2649 | if (total_bytes > 32*1024) | 2670 | if (total_bytes > 32*1024) |
2650 | num_bytes = 32*1024; | 2671 | num_bytes = 32*1024; |
2651 | else | 2672 | else |
2652 | num_bytes = total_bytes; | 2673 | num_bytes = total_bytes; |
2653 | total_bytes -= num_bytes; | 2674 | total_bytes -= num_bytes; |
2654 | 2675 | if (!total_bytes) { | |
2655 | if (!total_bytes) | 2676 | if (pflashcomp[i].optype == IMG_TYPE_PHY_FW) |
2656 | flash_op = FLASHROM_OPER_FLASH; | 2677 | flash_op = FLASHROM_OPER_PHY_FLASH; |
2657 | else | 2678 | else |
2658 | flash_op = FLASHROM_OPER_SAVE; | 2679 | flash_op = FLASHROM_OPER_FLASH; |
2680 | } else { | ||
2681 | if (pflashcomp[i].optype == IMG_TYPE_PHY_FW) | ||
2682 | flash_op = FLASHROM_OPER_PHY_SAVE; | ||
2683 | else | ||
2684 | flash_op = FLASHROM_OPER_SAVE; | ||
2685 | } | ||
2659 | memcpy(req->params.data_buf, p, num_bytes); | 2686 | memcpy(req->params.data_buf, p, num_bytes); |
2660 | p += num_bytes; | 2687 | p += num_bytes; |
2661 | status = be_cmd_write_flashrom(adapter, flash_cmd, | 2688 | status = be_cmd_write_flashrom(adapter, flash_cmd, |
2662 | pflashcomp[i].optype, flash_op, num_bytes); | 2689 | pflashcomp[i].optype, flash_op, num_bytes); |
2663 | if (status) { | 2690 | if (status) { |
2691 | if ((status == ILLEGAL_IOCTL_REQ) && | ||
2692 | (pflashcomp[i].optype == | ||
2693 | IMG_TYPE_PHY_FW)) | ||
2694 | break; | ||
2664 | dev_err(&adapter->pdev->dev, | 2695 | dev_err(&adapter->pdev->dev, |
2665 | "cmd to write to flash rom failed.\n"); | 2696 | "cmd to write to flash rom failed.\n"); |
2666 | return -1; | 2697 | return -1; |