aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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"