diff options
Diffstat (limited to 'drivers/net/igb/igb_main.c')
-rw-r--r-- | drivers/net/igb/igb_main.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index cdfd5727105..ce7838e5582 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -6349,21 +6349,25 @@ static void igb_restore_vlan(struct igb_adapter *adapter) | |||
6349 | } | 6349 | } |
6350 | } | 6350 | } |
6351 | 6351 | ||
6352 | int igb_set_spd_dplx(struct igb_adapter *adapter, u16 spddplx) | 6352 | int igb_set_spd_dplx(struct igb_adapter *adapter, u32 spd, u8 dplx) |
6353 | { | 6353 | { |
6354 | struct pci_dev *pdev = adapter->pdev; | 6354 | struct pci_dev *pdev = adapter->pdev; |
6355 | struct e1000_mac_info *mac = &adapter->hw.mac; | 6355 | struct e1000_mac_info *mac = &adapter->hw.mac; |
6356 | 6356 | ||
6357 | mac->autoneg = 0; | 6357 | mac->autoneg = 0; |
6358 | 6358 | ||
6359 | /* Make sure dplx is at most 1 bit and lsb of speed is not set | ||
6360 | * for the switch() below to work */ | ||
6361 | if ((spd & 1) || (dplx & ~1)) | ||
6362 | goto err_inval; | ||
6363 | |||
6359 | /* Fiber NIC's only allow 1000 Gbps Full duplex */ | 6364 | /* Fiber NIC's only allow 1000 Gbps Full duplex */ |
6360 | if ((adapter->hw.phy.media_type == e1000_media_type_internal_serdes) && | 6365 | if ((adapter->hw.phy.media_type == e1000_media_type_internal_serdes) && |
6361 | spddplx != (SPEED_1000 + DUPLEX_FULL)) { | 6366 | spd != SPEED_1000 && |
6362 | dev_err(&pdev->dev, "Unsupported Speed/Duplex configuration\n"); | 6367 | dplx != DUPLEX_FULL) |
6363 | return -EINVAL; | 6368 | goto err_inval; |
6364 | } | ||
6365 | 6369 | ||
6366 | switch (spddplx) { | 6370 | switch (spd + dplx) { |
6367 | case SPEED_10 + DUPLEX_HALF: | 6371 | case SPEED_10 + DUPLEX_HALF: |
6368 | mac->forced_speed_duplex = ADVERTISE_10_HALF; | 6372 | mac->forced_speed_duplex = ADVERTISE_10_HALF; |
6369 | break; | 6373 | break; |
@@ -6382,10 +6386,13 @@ int igb_set_spd_dplx(struct igb_adapter *adapter, u16 spddplx) | |||
6382 | break; | 6386 | break; |
6383 | case SPEED_1000 + DUPLEX_HALF: /* not supported */ | 6387 | case SPEED_1000 + DUPLEX_HALF: /* not supported */ |
6384 | default: | 6388 | default: |
6385 | dev_err(&pdev->dev, "Unsupported Speed/Duplex configuration\n"); | 6389 | goto err_inval; |
6386 | return -EINVAL; | ||
6387 | } | 6390 | } |
6388 | return 0; | 6391 | return 0; |
6392 | |||
6393 | err_inval: | ||
6394 | dev_err(&pdev->dev, "Unsupported Speed/Duplex configuration\n"); | ||
6395 | return -EINVAL; | ||
6389 | } | 6396 | } |
6390 | 6397 | ||
6391 | static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake) | 6398 | static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake) |