diff options
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_main.c | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c index 0173b6118424..a9cb84a76e49 100644 --- a/drivers/net/ethernet/intel/igb/igb_main.c +++ b/drivers/net/ethernet/intel/igb/igb_main.c | |||
@@ -1796,6 +1796,18 @@ void igb_reset(struct igb_adapter *adapter) | |||
1796 | igb_force_mac_fc(hw); | 1796 | igb_force_mac_fc(hw); |
1797 | 1797 | ||
1798 | igb_init_dmac(adapter, pba); | 1798 | igb_init_dmac(adapter, pba); |
1799 | #ifdef CONFIG_IGB_HWMON | ||
1800 | /* Re-initialize the thermal sensor on i350 devices. */ | ||
1801 | if (!test_bit(__IGB_DOWN, &adapter->state)) { | ||
1802 | if (mac->type == e1000_i350 && hw->bus.func == 0) { | ||
1803 | /* If present, re-initialize the external thermal sensor | ||
1804 | * interface. | ||
1805 | */ | ||
1806 | if (adapter->ets) | ||
1807 | mac->ops.init_thermal_sensor_thresh(hw); | ||
1808 | } | ||
1809 | } | ||
1810 | #endif | ||
1799 | if (!netif_running(adapter->netdev)) | 1811 | if (!netif_running(adapter->netdev)) |
1800 | igb_power_down_link(adapter); | 1812 | igb_power_down_link(adapter); |
1801 | 1813 | ||
@@ -2260,7 +2272,27 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2260 | } | 2272 | } |
2261 | 2273 | ||
2262 | #endif | 2274 | #endif |
2275 | #ifdef CONFIG_IGB_HWMON | ||
2276 | /* Initialize the thermal sensor on i350 devices. */ | ||
2277 | if (hw->mac.type == e1000_i350 && hw->bus.func == 0) { | ||
2278 | u16 ets_word; | ||
2263 | 2279 | ||
2280 | /* | ||
2281 | * Read the NVM to determine if this i350 device supports an | ||
2282 | * external thermal sensor. | ||
2283 | */ | ||
2284 | hw->nvm.ops.read(hw, NVM_ETS_CFG, 1, &ets_word); | ||
2285 | if (ets_word != 0x0000 && ets_word != 0xFFFF) | ||
2286 | adapter->ets = true; | ||
2287 | else | ||
2288 | adapter->ets = false; | ||
2289 | if (igb_sysfs_init(adapter)) | ||
2290 | dev_err(&pdev->dev, | ||
2291 | "failed to allocate sysfs resources\n"); | ||
2292 | } else { | ||
2293 | adapter->ets = false; | ||
2294 | } | ||
2295 | #endif | ||
2264 | /* do hw tstamp init after resetting */ | 2296 | /* do hw tstamp init after resetting */ |
2265 | igb_ptp_init(adapter); | 2297 | igb_ptp_init(adapter); |
2266 | 2298 | ||
@@ -2443,10 +2475,11 @@ static void igb_remove(struct pci_dev *pdev) | |||
2443 | struct e1000_hw *hw = &adapter->hw; | 2475 | struct e1000_hw *hw = &adapter->hw; |
2444 | 2476 | ||
2445 | pm_runtime_get_noresume(&pdev->dev); | 2477 | pm_runtime_get_noresume(&pdev->dev); |
2478 | #ifdef CONFIG_IGB_HWMON | ||
2479 | igb_sysfs_exit(adapter); | ||
2480 | #endif | ||
2446 | igb_remove_i2c(adapter); | 2481 | igb_remove_i2c(adapter); |
2447 | |||
2448 | igb_ptp_stop(adapter); | 2482 | igb_ptp_stop(adapter); |
2449 | |||
2450 | /* | 2483 | /* |
2451 | * The watchdog timer may be rescheduled, so explicitly | 2484 | * The watchdog timer may be rescheduled, so explicitly |
2452 | * disable watchdog from being rescheduled. | 2485 | * disable watchdog from being rescheduled. |
@@ -7594,7 +7627,12 @@ igb_get_i2c_client(struct igb_adapter *adapter, u8 dev_addr) | |||
7594 | } | 7627 | } |
7595 | } | 7628 | } |
7596 | 7629 | ||
7597 | /* no client_list found, create a new one */ | 7630 | /* no client_list found, create a new one as long as |
7631 | * irqs are not disabled | ||
7632 | */ | ||
7633 | if (unlikely(irqs_disabled())) | ||
7634 | goto exit; | ||
7635 | |||
7598 | client_list = kzalloc(sizeof(*client_list), GFP_KERNEL); | 7636 | client_list = kzalloc(sizeof(*client_list), GFP_KERNEL); |
7599 | if (client_list == NULL) | 7637 | if (client_list == NULL) |
7600 | goto exit; | 7638 | goto exit; |
@@ -7606,7 +7644,8 @@ igb_get_i2c_client(struct igb_adapter *adapter, u8 dev_addr) | |||
7606 | client_info.platform_data = adapter; | 7644 | client_info.platform_data = adapter; |
7607 | client_list->client = i2c_new_device(&adapter->i2c_adap, &client_info); | 7645 | client_list->client = i2c_new_device(&adapter->i2c_adap, &client_info); |
7608 | if (client_list->client == NULL) { | 7646 | if (client_list->client == NULL) { |
7609 | dev_info(&adapter->pdev->dev, "Failed to create new i2c device..\n"); | 7647 | dev_info(&adapter->pdev->dev, |
7648 | "Failed to create new i2c device..\n"); | ||
7610 | goto err_no_client; | 7649 | goto err_no_client; |
7611 | } | 7650 | } |
7612 | 7651 | ||
@@ -7614,8 +7653,6 @@ igb_get_i2c_client(struct igb_adapter *adapter, u8 dev_addr) | |||
7614 | client_list->next = adapter->i2c_clients; | 7653 | client_list->next = adapter->i2c_clients; |
7615 | adapter->i2c_clients = client_list; | 7654 | adapter->i2c_clients = client_list; |
7616 | 7655 | ||
7617 | spin_unlock_irqrestore(&i2c_clients_lock, flags); | ||
7618 | |||
7619 | client = client_list->client; | 7656 | client = client_list->client; |
7620 | goto exit; | 7657 | goto exit; |
7621 | 7658 | ||