aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSomnath Kotur <somnath.kotur@emulex.com>2013-05-29 22:52:23 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-31 20:25:43 -0400
commit5c510811547f88522b00623417b97d9fba85a06b (patch)
tree465b29d0e6ad0830297c582be08f4cf933597b2a
parent28a19fe60f4f31cbd349f8473f0483aa7500acf5 (diff)
be2net: Implement initiate FW dump feature for Lancer
Added code to initiate FW dump via ethtool. Driver checks if the previous dump has been cleared before initiating the dump. It doesn't initiate the dump if it is not cleared. Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com> Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c66
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_ethtool.c29
-rw-r--r--drivers/net/ethernet/emulex/benet/be_hw.h2
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c37
6 files changed, 105 insertions, 35 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index edce38bf83c9..fcc30a2d831b 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -332,6 +332,9 @@ enum vf_state {
332#define BE_VF_UC_PMAC_COUNT 2 332#define BE_VF_UC_PMAC_COUNT 2
333#define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11) 333#define BE_FLAGS_QNQ_ASYNC_EVT_RCVD (1 << 11)
334 334
335/* Ethtool set_dump flags */
336#define LANCER_INITIATE_FW_DUMP 0x1
337
335struct phy_info { 338struct phy_info {
336 u8 transceiver; 339 u8 transceiver;
337 u8 autoneg; 340 u8 autoneg;
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index a236ecd27cf3..4d0ec3649a63 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -3255,6 +3255,72 @@ err:
3255 return status; 3255 return status;
3256} 3256}
3257 3257
3258static int lancer_wait_idle(struct be_adapter *adapter)
3259{
3260#define SLIPORT_IDLE_TIMEOUT 30
3261 u32 reg_val;
3262 int status = 0, i;
3263
3264 for (i = 0; i < SLIPORT_IDLE_TIMEOUT; i++) {
3265 reg_val = ioread32(adapter->db + PHYSDEV_CONTROL_OFFSET);
3266 if ((reg_val & PHYSDEV_CONTROL_INP_MASK) == 0)
3267 break;
3268
3269 ssleep(1);
3270 }
3271
3272 if (i == SLIPORT_IDLE_TIMEOUT)
3273 status = -1;
3274
3275 return status;
3276}
3277
3278int lancer_physdev_ctrl(struct be_adapter *adapter, u32 mask)
3279{
3280 int status = 0;
3281
3282 status = lancer_wait_idle(adapter);
3283 if (status)
3284 return status;
3285
3286 iowrite32(mask, adapter->db + PHYSDEV_CONTROL_OFFSET);
3287
3288 return status;
3289}
3290
3291/* Routine to check whether dump image is present or not */
3292bool dump_present(struct be_adapter *adapter)
3293{
3294 u32 sliport_status = 0;
3295
3296 sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
3297 return !!(sliport_status & SLIPORT_STATUS_DIP_MASK);
3298}
3299
3300int lancer_initiate_dump(struct be_adapter *adapter)
3301{
3302 int status;
3303
3304 /* give firmware reset and diagnostic dump */
3305 status = lancer_physdev_ctrl(adapter, PHYSDEV_CONTROL_FW_RESET_MASK |
3306 PHYSDEV_CONTROL_DD_MASK);
3307 if (status < 0) {
3308 dev_err(&adapter->pdev->dev, "Firmware reset failed\n");
3309 return status;
3310 }
3311
3312 status = lancer_wait_idle(adapter);
3313 if (status)
3314 return status;
3315
3316 if (!dump_present(adapter)) {
3317 dev_err(&adapter->pdev->dev, "Dump image not present\n");
3318 return -1;
3319 }
3320
3321 return 0;
3322}
3323
3258/* Uses sync mcc */ 3324/* Uses sync mcc */
3259int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain) 3325int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
3260{ 3326{
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h
index 025bdb0d1764..5228d88c5a02 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.h
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.h
@@ -1937,6 +1937,9 @@ extern int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
1937 struct be_dma_mem *cmd, 1937 struct be_dma_mem *cmd,
1938 struct be_fat_conf_params *cfgs); 1938 struct be_fat_conf_params *cfgs);
1939extern int lancer_wait_ready(struct be_adapter *adapter); 1939extern int lancer_wait_ready(struct be_adapter *adapter);
1940extern int lancer_physdev_ctrl(struct be_adapter *adapter, u32 mask);
1941extern int lancer_initiate_dump(struct be_adapter *adapter);
1942extern bool dump_present(struct be_adapter *adapter);
1940extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter); 1943extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter);
1941extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name); 1944extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name);
1942extern int be_cmd_get_func_config(struct be_adapter *adapter); 1945extern int be_cmd_get_func_config(struct be_adapter *adapter);
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index f3ee07758198..4f8c941217cc 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -669,6 +669,34 @@ be_set_phys_id(struct net_device *netdev,
669 return 0; 669 return 0;
670} 670}
671 671
672static int be_set_dump(struct net_device *netdev, struct ethtool_dump *dump)
673{
674 struct be_adapter *adapter = netdev_priv(netdev);
675 struct device *dev = &adapter->pdev->dev;
676 int status;
677
678 if (!lancer_chip(adapter)) {
679 dev_err(dev, "FW dump not supported\n");
680 return -EOPNOTSUPP;
681 }
682
683 if (dump_present(adapter)) {
684 dev_err(dev, "Previous dump not cleared, not forcing dump\n");
685 return 0;
686 }
687
688 switch (dump->flag) {
689 case LANCER_INITIATE_FW_DUMP:
690 status = lancer_initiate_dump(adapter);
691 if (!status)
692 dev_info(dev, "F/w dump initiated successfully\n");
693 break;
694 default:
695 dev_err(dev, "Invalid dump level: 0x%x\n", dump->flag);
696 return -EINVAL;
697 }
698 return status;
699}
672 700
673static void 701static void
674be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) 702be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
@@ -1106,6 +1134,7 @@ const struct ethtool_ops be_ethtool_ops = {
1106 .set_pauseparam = be_set_pauseparam, 1134 .set_pauseparam = be_set_pauseparam,
1107 .get_strings = be_get_stat_strings, 1135 .get_strings = be_get_stat_strings,
1108 .set_phys_id = be_set_phys_id, 1136 .set_phys_id = be_set_phys_id,
1137 .set_dump = be_set_dump,
1109 .get_msglevel = be_get_msg_level, 1138 .get_msglevel = be_get_msg_level,
1110 .set_msglevel = be_set_msg_level, 1139 .set_msglevel = be_set_msg_level,
1111 .get_sset_count = be_get_sset_count, 1140 .get_sset_count = be_get_sset_count,
diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h
index 3c1099b47f2a..0311d9bfe858 100644
--- a/drivers/net/ethernet/emulex/benet/be_hw.h
+++ b/drivers/net/ethernet/emulex/benet/be_hw.h
@@ -53,10 +53,12 @@
53#define PHYSDEV_CONTROL_OFFSET 0x414 53#define PHYSDEV_CONTROL_OFFSET 0x414
54 54
55#define SLIPORT_STATUS_ERR_MASK 0x80000000 55#define SLIPORT_STATUS_ERR_MASK 0x80000000
56#define SLIPORT_STATUS_DIP_MASK 0x02000000
56#define SLIPORT_STATUS_RN_MASK 0x01000000 57#define SLIPORT_STATUS_RN_MASK 0x01000000
57#define SLIPORT_STATUS_RDY_MASK 0x00800000 58#define SLIPORT_STATUS_RDY_MASK 0x00800000
58#define SLI_PORT_CONTROL_IP_MASK 0x08000000 59#define SLI_PORT_CONTROL_IP_MASK 0x08000000
59#define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002 60#define PHYSDEV_CONTROL_FW_RESET_MASK 0x00000002
61#define PHYSDEV_CONTROL_DD_MASK 0x00000004
60#define PHYSDEV_CONTROL_INP_MASK 0x40000000 62#define PHYSDEV_CONTROL_INP_MASK 0x40000000
61 63
62#define SLIPORT_ERROR_NO_RESOURCE1 0x2 64#define SLIPORT_ERROR_NO_RESOURCE1 0x2
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 1140a86ff5ea..5d9044e4afe2 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -3551,40 +3551,6 @@ static int be_flash_skyhawk(struct be_adapter *adapter,
3551 return 0; 3551 return 0;
3552} 3552}
3553 3553
3554static int lancer_wait_idle(struct be_adapter *adapter)
3555{
3556#define SLIPORT_IDLE_TIMEOUT 30
3557 u32 reg_val;
3558 int status = 0, i;
3559
3560 for (i = 0; i < SLIPORT_IDLE_TIMEOUT; i++) {
3561 reg_val = ioread32(adapter->db + PHYSDEV_CONTROL_OFFSET);
3562 if ((reg_val & PHYSDEV_CONTROL_INP_MASK) == 0)
3563 break;
3564
3565 ssleep(1);
3566 }
3567
3568 if (i == SLIPORT_IDLE_TIMEOUT)
3569 status = -1;
3570
3571 return status;
3572}
3573
3574static int lancer_fw_reset(struct be_adapter *adapter)
3575{
3576 int status = 0;
3577
3578 status = lancer_wait_idle(adapter);
3579 if (status)
3580 return status;
3581
3582 iowrite32(PHYSDEV_CONTROL_FW_RESET_MASK, adapter->db +
3583 PHYSDEV_CONTROL_OFFSET);
3584
3585 return status;
3586}
3587
3588static int lancer_fw_download(struct be_adapter *adapter, 3554static int lancer_fw_download(struct be_adapter *adapter,
3589 const struct firmware *fw) 3555 const struct firmware *fw)
3590{ 3556{
@@ -3662,7 +3628,8 @@ static int lancer_fw_download(struct be_adapter *adapter,
3662 } 3628 }
3663 3629
3664 if (change_status == LANCER_FW_RESET_NEEDED) { 3630 if (change_status == LANCER_FW_RESET_NEEDED) {
3665 status = lancer_fw_reset(adapter); 3631 status = lancer_physdev_ctrl(adapter,
3632 PHYSDEV_CONTROL_FW_RESET_MASK);
3666 if (status) { 3633 if (status) {
3667 dev_err(&adapter->pdev->dev, 3634 dev_err(&adapter->pdev->dev,
3668 "Adapter busy for FW reset.\n" 3635 "Adapter busy for FW reset.\n"