aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb/igb_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c49
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