summaryrefslogtreecommitdiffstats
path: root/drivers/net/benet
diff options
context:
space:
mode:
authorSathya Perla <sathya.perla@emulex.com>2011-08-02 15:57:45 -0400
committerDavid S. Miller <davem@davemloft.net>2011-08-03 06:23:30 -0400
commit306f13487c9f7d6e3303a547e01e22958a04c666 (patch)
tree0fe7f2870abbc3db97501b28f1eaecb41c2c2cdd /drivers/net/benet
parent5b8821b787495273ba4fb333a3561c6da382a9a7 (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.c29
-rw-r--r--drivers/net/benet/be_cmds.h11
-rw-r--r--drivers/net/benet/be_ethtool.c23
-rw-r--r--drivers/net/benet/be_hw.h21
-rw-r--r--drivers/net/benet/be_main.c51
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
2189int be_cmd_get_phy_info(struct be_adapter *adapter, struct be_dma_mem *cmd) 2189int 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);
2219err: 2238err:
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};
1247struct be_cmd_resp_get_phy_info { 1247
1248 struct be_cmd_req_hdr hdr; 1248struct 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
1255struct 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,
1486extern int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, 1491extern int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
1487 u8 loopback_type, u8 enable); 1492 u8 loopback_type, u8 enable);
1488extern int be_cmd_get_phy_info(struct be_adapter *adapter, 1493extern int be_cmd_get_phy_info(struct be_adapter *adapter,
1489 struct be_dma_mem *cmd); 1494 struct be_phy_info *phy_info);
1490extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain); 1495extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
1491extern void be_detect_dump_ue(struct be_adapter *adapter); 1496extern void be_detect_dump_ue(struct be_adapter *adapter);
1492extern int be_cmd_get_die_temperature(struct be_adapter *adapter); 1497extern 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)
349static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) 349static 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
2572static 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
2572static int be_flash_data(struct be_adapter *adapter, 2587static 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;