diff options
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 66 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 29 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_hw.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 37 |
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 | |||
335 | struct phy_info { | 338 | struct 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 | ||
3258 | static 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 | |||
3278 | int 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 */ | ||
3292 | bool 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 | |||
3300 | int 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 */ |
3259 | int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain) | 3325 | int 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); |
1939 | extern int lancer_wait_ready(struct be_adapter *adapter); | 1939 | extern int lancer_wait_ready(struct be_adapter *adapter); |
1940 | extern int lancer_physdev_ctrl(struct be_adapter *adapter, u32 mask); | ||
1941 | extern int lancer_initiate_dump(struct be_adapter *adapter); | ||
1942 | extern bool dump_present(struct be_adapter *adapter); | ||
1940 | extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter); | 1943 | extern int lancer_test_and_set_rdy_state(struct be_adapter *adapter); |
1941 | extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name); | 1944 | extern int be_cmd_query_port_name(struct be_adapter *adapter, u8 *port_name); |
1942 | extern int be_cmd_get_func_config(struct be_adapter *adapter); | 1945 | extern 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 | ||
672 | static 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 | ||
673 | static void | 701 | static void |
674 | be_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | 702 | be_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 | ||
3554 | static 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 | |||
3574 | static 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 | |||
3588 | static int lancer_fw_download(struct be_adapter *adapter, | 3554 | static 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" |