diff options
author | David S. Miller <davem@davemloft.net> | 2010-04-27 15:49:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-27 15:49:13 -0400 |
commit | e1703b36c358dde24ececba4fd609ecd91433ba3 (patch) | |
tree | d59c333d0ad5bf72f165264eba6048c87fdc4e0f /drivers/net/ixgbe | |
parent | 7ec75c582e639d956ce3afd499f67febe6f902a4 (diff) | |
parent | e95ef5d3f6bc60433883e1ef65dac747acd0bf1a (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/e100.c
drivers/net/e1000e/netdev.c
Diffstat (limited to 'drivers/net/ixgbe')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_82599.c | 62 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 22 | ||||
-rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 2 |
3 files changed, 62 insertions, 24 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index f894bb633040..d189ba7e8f15 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
@@ -39,6 +39,8 @@ | |||
39 | #define IXGBE_82599_MC_TBL_SIZE 128 | 39 | #define IXGBE_82599_MC_TBL_SIZE 128 |
40 | #define IXGBE_82599_VFT_TBL_SIZE 128 | 40 | #define IXGBE_82599_VFT_TBL_SIZE 128 |
41 | 41 | ||
42 | void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | ||
43 | void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | ||
42 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); | 44 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw); |
43 | s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, | 45 | s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw, |
44 | ixgbe_link_speed speed, | 46 | ixgbe_link_speed speed, |
@@ -69,8 +71,14 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw) | |||
69 | if (hw->phy.multispeed_fiber) { | 71 | if (hw->phy.multispeed_fiber) { |
70 | /* Set up dual speed SFP+ support */ | 72 | /* Set up dual speed SFP+ support */ |
71 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; | 73 | mac->ops.setup_link = &ixgbe_setup_mac_link_multispeed_fiber; |
74 | mac->ops.disable_tx_laser = | ||
75 | &ixgbe_disable_tx_laser_multispeed_fiber; | ||
76 | mac->ops.enable_tx_laser = | ||
77 | &ixgbe_enable_tx_laser_multispeed_fiber; | ||
72 | mac->ops.flap_tx_laser = &ixgbe_flap_tx_laser_multispeed_fiber; | 78 | mac->ops.flap_tx_laser = &ixgbe_flap_tx_laser_multispeed_fiber; |
73 | } else { | 79 | } else { |
80 | mac->ops.disable_tx_laser = NULL; | ||
81 | mac->ops.enable_tx_laser = NULL; | ||
74 | mac->ops.flap_tx_laser = NULL; | 82 | mac->ops.flap_tx_laser = NULL; |
75 | if ((mac->ops.get_media_type(hw) == | 83 | if ((mac->ops.get_media_type(hw) == |
76 | ixgbe_media_type_backplane) && | 84 | ixgbe_media_type_backplane) && |
@@ -415,6 +423,44 @@ s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, | |||
415 | return status; | 423 | return status; |
416 | } | 424 | } |
417 | 425 | ||
426 | /** | ||
427 | * ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser | ||
428 | * @hw: pointer to hardware structure | ||
429 | * | ||
430 | * The base drivers may require better control over SFP+ module | ||
431 | * PHY states. This includes selectively shutting down the Tx | ||
432 | * laser on the PHY, effectively halting physical link. | ||
433 | **/ | ||
434 | void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | ||
435 | { | ||
436 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
437 | |||
438 | /* Disable tx laser; allow 100us to go dark per spec */ | ||
439 | esdp_reg |= IXGBE_ESDP_SDP3; | ||
440 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
441 | IXGBE_WRITE_FLUSH(hw); | ||
442 | udelay(100); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * ixgbe_enable_tx_laser_multispeed_fiber - Enable Tx laser | ||
447 | * @hw: pointer to hardware structure | ||
448 | * | ||
449 | * The base drivers may require better control over SFP+ module | ||
450 | * PHY states. This includes selectively turning on the Tx | ||
451 | * laser on the PHY, effectively starting physical link. | ||
452 | **/ | ||
453 | void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | ||
454 | { | ||
455 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
456 | |||
457 | /* Enable tx laser; allow 100ms to light up */ | ||
458 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
459 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
460 | IXGBE_WRITE_FLUSH(hw); | ||
461 | msleep(100); | ||
462 | } | ||
463 | |||
418 | /** | 464 | /** |
419 | * ixgbe_flap_tx_laser_multispeed_fiber - Flap Tx laser | 465 | * ixgbe_flap_tx_laser_multispeed_fiber - Flap Tx laser |
420 | * @hw: pointer to hardware structure | 466 | * @hw: pointer to hardware structure |
@@ -429,23 +475,11 @@ s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw, | |||
429 | **/ | 475 | **/ |
430 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) | 476 | void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw) |
431 | { | 477 | { |
432 | u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP); | ||
433 | |||
434 | hw_dbg(hw, "ixgbe_flap_tx_laser_multispeed_fiber\n"); | 478 | hw_dbg(hw, "ixgbe_flap_tx_laser_multispeed_fiber\n"); |
435 | 479 | ||
436 | if (hw->mac.autotry_restart) { | 480 | if (hw->mac.autotry_restart) { |
437 | /* Disable tx laser; allow 100us to go dark per spec */ | 481 | ixgbe_disable_tx_laser_multispeed_fiber(hw); |
438 | esdp_reg |= IXGBE_ESDP_SDP3; | 482 | ixgbe_enable_tx_laser_multispeed_fiber(hw); |
439 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
440 | IXGBE_WRITE_FLUSH(hw); | ||
441 | udelay(100); | ||
442 | |||
443 | /* Enable tx laser; allow 100ms to light up */ | ||
444 | esdp_reg &= ~IXGBE_ESDP_SDP3; | ||
445 | IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg); | ||
446 | IXGBE_WRITE_FLUSH(hw); | ||
447 | msleep(100); | ||
448 | |||
449 | hw->mac.autotry_restart = false; | 483 | hw->mac.autotry_restart = false; |
450 | } | 484 | } |
451 | } | 485 | } |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index a98ff0e76e86..32781b3f8964 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -2991,6 +2991,10 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) | |||
2991 | else | 2991 | else |
2992 | ixgbe_configure_msi_and_legacy(adapter); | 2992 | ixgbe_configure_msi_and_legacy(adapter); |
2993 | 2993 | ||
2994 | /* enable the optics */ | ||
2995 | if (hw->phy.multispeed_fiber) | ||
2996 | hw->mac.ops.enable_tx_laser(hw); | ||
2997 | |||
2994 | clear_bit(__IXGBE_DOWN, &adapter->state); | 2998 | clear_bit(__IXGBE_DOWN, &adapter->state); |
2995 | ixgbe_napi_enable_all(adapter); | 2999 | ixgbe_napi_enable_all(adapter); |
2996 | 3000 | ||
@@ -3252,6 +3256,10 @@ void ixgbe_down(struct ixgbe_adapter *adapter) | |||
3252 | /* signal that we are down to the interrupt handler */ | 3256 | /* signal that we are down to the interrupt handler */ |
3253 | set_bit(__IXGBE_DOWN, &adapter->state); | 3257 | set_bit(__IXGBE_DOWN, &adapter->state); |
3254 | 3258 | ||
3259 | /* power down the optics */ | ||
3260 | if (hw->phy.multispeed_fiber) | ||
3261 | hw->mac.ops.disable_tx_laser(hw); | ||
3262 | |||
3255 | /* disable receive for all VFs and wait one second */ | 3263 | /* disable receive for all VFs and wait one second */ |
3256 | if (adapter->num_vfs) { | 3264 | if (adapter->num_vfs) { |
3257 | /* ping all the active vfs to let them know we are going down */ | 3265 | /* ping all the active vfs to let them know we are going down */ |
@@ -6262,6 +6270,10 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
6262 | goto err_eeprom; | 6270 | goto err_eeprom; |
6263 | } | 6271 | } |
6264 | 6272 | ||
6273 | /* power down the optics */ | ||
6274 | if (hw->phy.multispeed_fiber) | ||
6275 | hw->mac.ops.disable_tx_laser(hw); | ||
6276 | |||
6265 | init_timer(&adapter->watchdog_timer); | 6277 | init_timer(&adapter->watchdog_timer); |
6266 | adapter->watchdog_timer.function = &ixgbe_watchdog; | 6278 | adapter->watchdog_timer.function = &ixgbe_watchdog; |
6267 | adapter->watchdog_timer.data = (unsigned long)adapter; | 6279 | adapter->watchdog_timer.data = (unsigned long)adapter; |
@@ -6409,16 +6421,6 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev) | |||
6409 | del_timer_sync(&adapter->sfp_timer); | 6421 | del_timer_sync(&adapter->sfp_timer); |
6410 | cancel_work_sync(&adapter->watchdog_task); | 6422 | cancel_work_sync(&adapter->watchdog_task); |
6411 | cancel_work_sync(&adapter->sfp_task); | 6423 | cancel_work_sync(&adapter->sfp_task); |
6412 | if (adapter->hw.phy.multispeed_fiber) { | ||
6413 | struct ixgbe_hw *hw = &adapter->hw; | ||
6414 | /* | ||
6415 | * Restart clause 37 autoneg, disable and re-enable | ||
6416 | * the tx laser, to clear & alert the link partner | ||
6417 | * that it needs to restart autotry | ||
6418 | */ | ||
6419 | hw->mac.autotry_restart = true; | ||
6420 | hw->mac.ops.flap_tx_laser(hw); | ||
6421 | } | ||
6422 | cancel_work_sync(&adapter->multispeed_fiber_task); | 6424 | cancel_work_sync(&adapter->multispeed_fiber_task); |
6423 | cancel_work_sync(&adapter->sfp_config_module_task); | 6425 | cancel_work_sync(&adapter->sfp_config_module_task); |
6424 | if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || | 6426 | if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE || |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index aed4ed665648..a0f9084c81cd 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -2398,6 +2398,8 @@ struct ixgbe_mac_operations { | |||
2398 | s32 (*enable_rx_dma)(struct ixgbe_hw *, u32); | 2398 | s32 (*enable_rx_dma)(struct ixgbe_hw *, u32); |
2399 | 2399 | ||
2400 | /* Link */ | 2400 | /* Link */ |
2401 | void (*disable_tx_laser)(struct ixgbe_hw *); | ||
2402 | void (*enable_tx_laser)(struct ixgbe_hw *); | ||
2401 | void (*flap_tx_laser)(struct ixgbe_hw *); | 2403 | void (*flap_tx_laser)(struct ixgbe_hw *); |
2402 | s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool); | 2404 | s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool); |
2403 | s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool); | 2405 | s32 (*check_link)(struct ixgbe_hw *, ixgbe_link_speed *, bool *, bool); |