aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/sfc
diff options
context:
space:
mode:
authorAlexandre Rames <arames@solarflare.com>2013-01-14 12:20:22 -0500
committerBen Hutchings <bhutchings@solarflare.com>2013-03-07 15:22:04 -0500
commit626950db84c065925ee10c2e833da265cbda8800 (patch)
treed4acb18c4b3554f80ff7a21bfeb63dd56420474f /drivers/net/ethernet/sfc
parent634ab72c39b3df78ac7d6ccd4a50133059bae14f (diff)
sfc: Add AER and EEH support for Siena
The Linux side of EEH is triggered by MMIO reads, but this driver's data path does not issue any MMIO reads (except in legacy interrupt mode). Therefore add a monitor function to poll EEH periodically. When preparing to reset the device based on our own error detection, also poll EEH and defer to its recovery mechanism if appropriate. [bwh: Use a separate condition for the initial link poll; fix some style errors] Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers/net/ethernet/sfc')
-rw-r--r--drivers/net/ethernet/sfc/efx.c207
-rw-r--r--drivers/net/ethernet/sfc/enum.h12
-rw-r--r--drivers/net/ethernet/sfc/net_driver.h1
-rw-r--r--drivers/net/ethernet/sfc/siena.c22
4 files changed, 216 insertions, 26 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 11a81084bec4..5e1ddc559b4f 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -21,7 +21,9 @@
21#include <linux/ethtool.h> 21#include <linux/ethtool.h>
22#include <linux/topology.h> 22#include <linux/topology.h>
23#include <linux/gfp.h> 23#include <linux/gfp.h>
24#include <linux/pci.h>
24#include <linux/cpu_rmap.h> 25#include <linux/cpu_rmap.h>
26#include <linux/aer.h>
25#include "net_driver.h" 27#include "net_driver.h"
26#include "efx.h" 28#include "efx.h"
27#include "nic.h" 29#include "nic.h"
@@ -71,17 +73,19 @@ const char *const efx_loopback_mode_names[] = {
71 73
72const unsigned int efx_reset_type_max = RESET_TYPE_MAX; 74const unsigned int efx_reset_type_max = RESET_TYPE_MAX;
73const char *const efx_reset_type_names[] = { 75const char *const efx_reset_type_names[] = {
74 [RESET_TYPE_INVISIBLE] = "INVISIBLE", 76 [RESET_TYPE_INVISIBLE] = "INVISIBLE",
75 [RESET_TYPE_ALL] = "ALL", 77 [RESET_TYPE_ALL] = "ALL",
76 [RESET_TYPE_WORLD] = "WORLD", 78 [RESET_TYPE_RECOVER_OR_ALL] = "RECOVER_OR_ALL",
77 [RESET_TYPE_DISABLE] = "DISABLE", 79 [RESET_TYPE_WORLD] = "WORLD",
78 [RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG", 80 [RESET_TYPE_RECOVER_OR_DISABLE] = "RECOVER_OR_DISABLE",
79 [RESET_TYPE_INT_ERROR] = "INT_ERROR", 81 [RESET_TYPE_DISABLE] = "DISABLE",
80 [RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY", 82 [RESET_TYPE_TX_WATCHDOG] = "TX_WATCHDOG",
81 [RESET_TYPE_RX_DESC_FETCH] = "RX_DESC_FETCH", 83 [RESET_TYPE_INT_ERROR] = "INT_ERROR",
82 [RESET_TYPE_TX_DESC_FETCH] = "TX_DESC_FETCH", 84 [RESET_TYPE_RX_RECOVERY] = "RX_RECOVERY",
83 [RESET_TYPE_TX_SKIP] = "TX_SKIP", 85 [RESET_TYPE_RX_DESC_FETCH] = "RX_DESC_FETCH",
84 [RESET_TYPE_MC_FAILURE] = "MC_FAILURE", 86 [RESET_TYPE_TX_DESC_FETCH] = "TX_DESC_FETCH",
87 [RESET_TYPE_TX_SKIP] = "TX_SKIP",
88 [RESET_TYPE_MC_FAILURE] = "MC_FAILURE",
85}; 89};
86 90
87#define EFX_MAX_MTU (9 * 1024) 91#define EFX_MAX_MTU (9 * 1024)
@@ -117,9 +121,12 @@ MODULE_PARM_DESC(separate_tx_channels,
117static int napi_weight = 64; 121static int napi_weight = 64;
118 122
119/* This is the time (in jiffies) between invocations of the hardware 123/* This is the time (in jiffies) between invocations of the hardware
120 * monitor. On Falcon-based NICs, this will: 124 * monitor.
125 * On Falcon-based NICs, this will:
121 * - Check the on-board hardware monitor; 126 * - Check the on-board hardware monitor;
122 * - Poll the link state and reconfigure the hardware as necessary. 127 * - Poll the link state and reconfigure the hardware as necessary.
128 * On Siena-based NICs for power systems with EEH support, this will give EEH a
129 * chance to start.
123 */ 130 */
124static unsigned int efx_monitor_interval = 1 * HZ; 131static unsigned int efx_monitor_interval = 1 * HZ;
125 132
@@ -203,13 +210,14 @@ static void efx_stop_all(struct efx_nic *efx);
203#define EFX_ASSERT_RESET_SERIALISED(efx) \ 210#define EFX_ASSERT_RESET_SERIALISED(efx) \
204 do { \ 211 do { \
205 if ((efx->state == STATE_READY) || \ 212 if ((efx->state == STATE_READY) || \
213 (efx->state == STATE_RECOVERY) || \
206 (efx->state == STATE_DISABLED)) \ 214 (efx->state == STATE_DISABLED)) \
207 ASSERT_RTNL(); \ 215 ASSERT_RTNL(); \
208 } while (0) 216 } while (0)
209 217
210static int efx_check_disabled(struct efx_nic *efx) 218static int efx_check_disabled(struct efx_nic *efx)
211{ 219{
212 if (efx->state == STATE_DISABLED) { 220 if (efx->state == STATE_DISABLED || efx->state == STATE_RECOVERY) {
213 netif_err(efx, drv, efx->net_dev, 221 netif_err(efx, drv, efx->net_dev,
214 "device is disabled due to earlier errors\n"); 222 "device is disabled due to earlier errors\n");
215 return -EIO; 223 return -EIO;
@@ -677,7 +685,7 @@ static void efx_stop_datapath(struct efx_nic *efx)
677 BUG_ON(efx->port_enabled); 685 BUG_ON(efx->port_enabled);
678 686
679 /* Only perform flush if dma is enabled */ 687 /* Only perform flush if dma is enabled */
680 if (dev->is_busmaster) { 688 if (dev->is_busmaster && efx->state != STATE_RECOVERY) {
681 rc = efx_nic_flush_queues(efx); 689 rc = efx_nic_flush_queues(efx);
682 690
683 if (rc && EFX_WORKAROUND_7803(efx)) { 691 if (rc && EFX_WORKAROUND_7803(efx)) {
@@ -1590,13 +1598,15 @@ static void efx_start_all(struct efx_nic *efx)
1590 efx_start_port(efx); 1598 efx_start_port(efx);
1591 efx_start_datapath(efx); 1599 efx_start_datapath(efx);
1592 1600
1593 /* Start the hardware monitor if there is one. Otherwise (we're link 1601 /* Start the hardware monitor if there is one */
1594 * event driven), we have to poll the PHY because after an event queue 1602 if (efx->type->monitor != NULL)
1595 * flush, we could have a missed a link state change */
1596 if (efx->type->monitor != NULL) {
1597 queue_delayed_work(efx->workqueue, &efx->monitor_work, 1603 queue_delayed_work(efx->workqueue, &efx->monitor_work,
1598 efx_monitor_interval); 1604 efx_monitor_interval);
1599 } else { 1605
1606 /* If link state detection is normally event-driven, we have
1607 * to poll now because we could have missed a change
1608 */
1609 if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) {
1600 mutex_lock(&efx->mac_lock); 1610 mutex_lock(&efx->mac_lock);
1601 if (efx->phy_op->poll(efx)) 1611 if (efx->phy_op->poll(efx))
1602 efx_link_status_changed(efx); 1612 efx_link_status_changed(efx);
@@ -2303,7 +2313,9 @@ int efx_reset(struct efx_nic *efx, enum reset_type method)
2303 2313
2304out: 2314out:
2305 /* Leave device stopped if necessary */ 2315 /* Leave device stopped if necessary */
2306 disabled = rc || method == RESET_TYPE_DISABLE; 2316 disabled = rc ||
2317 method == RESET_TYPE_DISABLE ||
2318 method == RESET_TYPE_RECOVER_OR_DISABLE;
2307 rc2 = efx_reset_up(efx, method, !disabled); 2319 rc2 = efx_reset_up(efx, method, !disabled);
2308 if (rc2) { 2320 if (rc2) {
2309 disabled = true; 2321 disabled = true;
@@ -2322,13 +2334,48 @@ out:
2322 return rc; 2334 return rc;
2323} 2335}
2324 2336
2337/* Try recovery mechanisms.
2338 * For now only EEH is supported.
2339 * Returns 0 if the recovery mechanisms are unsuccessful.
2340 * Returns a non-zero value otherwise.
2341 */
2342static int efx_try_recovery(struct efx_nic *efx)
2343{
2344#ifdef CONFIG_EEH
2345 /* A PCI error can occur and not be seen by EEH because nothing
2346 * happens on the PCI bus. In this case the driver may fail and
2347 * schedule a 'recover or reset', leading to this recovery handler.
2348 * Manually call the eeh failure check function.
2349 */
2350 struct eeh_dev *eehdev =
2351 of_node_to_eeh_dev(pci_device_to_OF_node(efx->pci_dev));
2352
2353 if (eeh_dev_check_failure(eehdev)) {
2354 /* The EEH mechanisms will handle the error and reset the
2355 * device if necessary.
2356 */
2357 return 1;
2358 }
2359#endif
2360 return 0;
2361}
2362
2325/* The worker thread exists so that code that cannot sleep can 2363/* The worker thread exists so that code that cannot sleep can
2326 * schedule a reset for later. 2364 * schedule a reset for later.
2327 */ 2365 */
2328static void efx_reset_work(struct work_struct *data) 2366static void efx_reset_work(struct work_struct *data)
2329{ 2367{
2330 struct efx_nic *efx = container_of(data, struct efx_nic, reset_work); 2368 struct efx_nic *efx = container_of(data, struct efx_nic, reset_work);
2331 unsigned long pending = ACCESS_ONCE(efx->reset_pending); 2369 unsigned long pending;
2370 enum reset_type method;
2371
2372 pending = ACCESS_ONCE(efx->reset_pending);
2373 method = fls(pending) - 1;
2374
2375 if ((method == RESET_TYPE_RECOVER_OR_DISABLE ||
2376 method == RESET_TYPE_RECOVER_OR_ALL) &&
2377 efx_try_recovery(efx))
2378 return;
2332 2379
2333 if (!pending) 2380 if (!pending)
2334 return; 2381 return;
@@ -2340,7 +2387,7 @@ static void efx_reset_work(struct work_struct *data)
2340 * it cannot change again. 2387 * it cannot change again.
2341 */ 2388 */
2342 if (efx->state == STATE_READY) 2389 if (efx->state == STATE_READY)
2343 (void)efx_reset(efx, fls(pending) - 1); 2390 (void)efx_reset(efx, method);
2344 2391
2345 rtnl_unlock(); 2392 rtnl_unlock();
2346} 2393}
@@ -2349,11 +2396,20 @@ void efx_schedule_reset(struct efx_nic *efx, enum reset_type type)
2349{ 2396{
2350 enum reset_type method; 2397 enum reset_type method;
2351 2398
2399 if (efx->state == STATE_RECOVERY) {
2400 netif_dbg(efx, drv, efx->net_dev,
2401 "recovering: skip scheduling %s reset\n",
2402 RESET_TYPE(type));
2403 return;
2404 }
2405
2352 switch (type) { 2406 switch (type) {
2353 case RESET_TYPE_INVISIBLE: 2407 case RESET_TYPE_INVISIBLE:
2354 case RESET_TYPE_ALL: 2408 case RESET_TYPE_ALL:
2409 case RESET_TYPE_RECOVER_OR_ALL:
2355 case RESET_TYPE_WORLD: 2410 case RESET_TYPE_WORLD:
2356 case RESET_TYPE_DISABLE: 2411 case RESET_TYPE_DISABLE:
2412 case RESET_TYPE_RECOVER_OR_DISABLE:
2357 method = type; 2413 method = type;
2358 netif_dbg(efx, drv, efx->net_dev, "scheduling %s reset\n", 2414 netif_dbg(efx, drv, efx->net_dev, "scheduling %s reset\n",
2359 RESET_TYPE(method)); 2415 RESET_TYPE(method));
@@ -2563,6 +2619,8 @@ static void efx_pci_remove(struct pci_dev *pci_dev)
2563 efx_fini_struct(efx); 2619 efx_fini_struct(efx);
2564 pci_set_drvdata(pci_dev, NULL); 2620 pci_set_drvdata(pci_dev, NULL);
2565 free_netdev(efx->net_dev); 2621 free_netdev(efx->net_dev);
2622
2623 pci_disable_pcie_error_reporting(pci_dev);
2566}; 2624};
2567 2625
2568/* NIC VPD information 2626/* NIC VPD information
@@ -2735,6 +2793,11 @@ static int efx_pci_probe(struct pci_dev *pci_dev,
2735 netif_warn(efx, probe, efx->net_dev, 2793 netif_warn(efx, probe, efx->net_dev,
2736 "failed to create MTDs (%d)\n", rc); 2794 "failed to create MTDs (%d)\n", rc);
2737 2795
2796 rc = pci_enable_pcie_error_reporting(pci_dev);
2797 if (rc && rc != -EINVAL)
2798 netif_warn(efx, probe, efx->net_dev,
2799 "pci_enable_pcie_error_reporting failed (%d)\n", rc);
2800
2738 return 0; 2801 return 0;
2739 2802
2740 fail4: 2803 fail4:
@@ -2859,12 +2922,112 @@ static const struct dev_pm_ops efx_pm_ops = {
2859 .restore = efx_pm_resume, 2922 .restore = efx_pm_resume,
2860}; 2923};
2861 2924
2925/* A PCI error affecting this device was detected.
2926 * At this point MMIO and DMA may be disabled.
2927 * Stop the software path and request a slot reset.
2928 */
2929pci_ers_result_t efx_io_error_detected(struct pci_dev *pdev,
2930 enum pci_channel_state state)
2931{
2932 pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
2933 struct efx_nic *efx = pci_get_drvdata(pdev);
2934
2935 if (state == pci_channel_io_perm_failure)
2936 return PCI_ERS_RESULT_DISCONNECT;
2937
2938 rtnl_lock();
2939
2940 if (efx->state != STATE_DISABLED) {
2941 efx->state = STATE_RECOVERY;
2942 efx->reset_pending = 0;
2943
2944 efx_device_detach_sync(efx);
2945
2946 efx_stop_all(efx);
2947 efx_stop_interrupts(efx, false);
2948
2949 status = PCI_ERS_RESULT_NEED_RESET;
2950 } else {
2951 /* If the interface is disabled we don't want to do anything
2952 * with it.
2953 */
2954 status = PCI_ERS_RESULT_RECOVERED;
2955 }
2956
2957 rtnl_unlock();
2958
2959 pci_disable_device(pdev);
2960
2961 return status;
2962}
2963
2964/* Fake a successfull reset, which will be performed later in efx_io_resume. */
2965pci_ers_result_t efx_io_slot_reset(struct pci_dev *pdev)
2966{
2967 struct efx_nic *efx = pci_get_drvdata(pdev);
2968 pci_ers_result_t status = PCI_ERS_RESULT_RECOVERED;
2969 int rc;
2970
2971 if (pci_enable_device(pdev)) {
2972 netif_err(efx, hw, efx->net_dev,
2973 "Cannot re-enable PCI device after reset.\n");
2974 status = PCI_ERS_RESULT_DISCONNECT;
2975 }
2976
2977 rc = pci_cleanup_aer_uncorrect_error_status(pdev);
2978 if (rc) {
2979 netif_err(efx, hw, efx->net_dev,
2980 "pci_cleanup_aer_uncorrect_error_status failed (%d)\n", rc);
2981 /* Non-fatal error. Continue. */
2982 }
2983
2984 return status;
2985}
2986
2987/* Perform the actual reset and resume I/O operations. */
2988static void efx_io_resume(struct pci_dev *pdev)
2989{
2990 struct efx_nic *efx = pci_get_drvdata(pdev);
2991 int rc;
2992
2993 rtnl_lock();
2994
2995 if (efx->state == STATE_DISABLED)
2996 goto out;
2997
2998 rc = efx_reset(efx, RESET_TYPE_ALL);
2999 if (rc) {
3000 netif_err(efx, hw, efx->net_dev,
3001 "efx_reset failed after PCI error (%d)\n", rc);
3002 } else {
3003 efx->state = STATE_READY;
3004 netif_dbg(efx, hw, efx->net_dev,
3005 "Done resetting and resuming IO after PCI error.\n");
3006 }
3007
3008out:
3009 rtnl_unlock();
3010}
3011
3012/* For simplicity and reliability, we always require a slot reset and try to
3013 * reset the hardware when a pci error affecting the device is detected.
3014 * We leave both the link_reset and mmio_enabled callback unimplemented:
3015 * with our request for slot reset the mmio_enabled callback will never be
3016 * called, and the link_reset callback is not used by AER or EEH mechanisms.
3017 */
3018static struct pci_error_handlers efx_err_handlers = {
3019 .error_detected = efx_io_error_detected,
3020 .slot_reset = efx_io_slot_reset,
3021 .resume = efx_io_resume,
3022};
3023
2862static struct pci_driver efx_pci_driver = { 3024static struct pci_driver efx_pci_driver = {
2863 .name = KBUILD_MODNAME, 3025 .name = KBUILD_MODNAME,
2864 .id_table = efx_pci_table, 3026 .id_table = efx_pci_table,
2865 .probe = efx_pci_probe, 3027 .probe = efx_pci_probe,
2866 .remove = efx_pci_remove, 3028 .remove = efx_pci_remove,
2867 .driver.pm = &efx_pm_ops, 3029 .driver.pm = &efx_pm_ops,
3030 .err_handler = &efx_err_handlers,
2868}; 3031};
2869 3032
2870/************************************************************************** 3033/**************************************************************************
diff --git a/drivers/net/ethernet/sfc/enum.h b/drivers/net/ethernet/sfc/enum.h
index 182dbe2cc6e4..ab8fb5889e55 100644
--- a/drivers/net/ethernet/sfc/enum.h
+++ b/drivers/net/ethernet/sfc/enum.h
@@ -137,8 +137,12 @@ enum efx_loopback_mode {
137 * Reset methods are numbered in order of increasing scope. 137 * Reset methods are numbered in order of increasing scope.
138 * 138 *
139 * @RESET_TYPE_INVISIBLE: Reset datapath and MAC (Falcon only) 139 * @RESET_TYPE_INVISIBLE: Reset datapath and MAC (Falcon only)
140 * @RESET_TYPE_RECOVER_OR_ALL: Try to recover. Apply RESET_TYPE_ALL
141 * if unsuccessful.
140 * @RESET_TYPE_ALL: Reset datapath, MAC and PHY 142 * @RESET_TYPE_ALL: Reset datapath, MAC and PHY
141 * @RESET_TYPE_WORLD: Reset as much as possible 143 * @RESET_TYPE_WORLD: Reset as much as possible
144 * @RESET_TYPE_RECOVER_OR_DISABLE: Try to recover. Apply RESET_TYPE_DISABLE if
145 * unsuccessful.
142 * @RESET_TYPE_DISABLE: Reset datapath, MAC and PHY; leave NIC disabled 146 * @RESET_TYPE_DISABLE: Reset datapath, MAC and PHY; leave NIC disabled
143 * @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog 147 * @RESET_TYPE_TX_WATCHDOG: reset due to TX watchdog
144 * @RESET_TYPE_INT_ERROR: reset due to internal error 148 * @RESET_TYPE_INT_ERROR: reset due to internal error
@@ -150,9 +154,11 @@ enum efx_loopback_mode {
150 */ 154 */
151enum reset_type { 155enum reset_type {
152 RESET_TYPE_INVISIBLE = 0, 156 RESET_TYPE_INVISIBLE = 0,
153 RESET_TYPE_ALL = 1, 157 RESET_TYPE_RECOVER_OR_ALL = 1,
154 RESET_TYPE_WORLD = 2, 158 RESET_TYPE_ALL = 2,
155 RESET_TYPE_DISABLE = 3, 159 RESET_TYPE_WORLD = 3,
160 RESET_TYPE_RECOVER_OR_DISABLE = 4,
161 RESET_TYPE_DISABLE = 5,
156 RESET_TYPE_MAX_METHOD, 162 RESET_TYPE_MAX_METHOD,
157 RESET_TYPE_TX_WATCHDOG, 163 RESET_TYPE_TX_WATCHDOG,
158 RESET_TYPE_INT_ERROR, 164 RESET_TYPE_INT_ERROR,
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
index c83fe090406d..9e900817d2ab 100644
--- a/drivers/net/ethernet/sfc/net_driver.h
+++ b/drivers/net/ethernet/sfc/net_driver.h
@@ -429,6 +429,7 @@ enum nic_state {
429 STATE_UNINIT = 0, /* device being probed/removed or is frozen */ 429 STATE_UNINIT = 0, /* device being probed/removed or is frozen */
430 STATE_READY = 1, /* hardware ready and netdev registered */ 430 STATE_READY = 1, /* hardware ready and netdev registered */
431 STATE_DISABLED = 2, /* device disabled due to hardware errors */ 431 STATE_DISABLED = 2, /* device disabled due to hardware errors */
432 STATE_RECOVERY = 3, /* device recovering from PCI error */
432}; 433};
433 434
434/* 435/*
diff --git a/drivers/net/ethernet/sfc/siena.c b/drivers/net/ethernet/sfc/siena.c
index ba40f67e4f05..e07ff0d3f26b 100644
--- a/drivers/net/ethernet/sfc/siena.c
+++ b/drivers/net/ethernet/sfc/siena.c
@@ -202,7 +202,7 @@ out:
202 202
203static enum reset_type siena_map_reset_reason(enum reset_type reason) 203static enum reset_type siena_map_reset_reason(enum reset_type reason)
204{ 204{
205 return RESET_TYPE_ALL; 205 return RESET_TYPE_RECOVER_OR_ALL;
206} 206}
207 207
208static int siena_map_reset_flags(u32 *flags) 208static int siena_map_reset_flags(u32 *flags)
@@ -245,6 +245,22 @@ static int siena_reset_hw(struct efx_nic *efx, enum reset_type method)
245 return efx_mcdi_reset_port(efx); 245 return efx_mcdi_reset_port(efx);
246} 246}
247 247
248#ifdef CONFIG_EEH
249/* When a PCI device is isolated from the bus, a subsequent MMIO read is
250 * required for the kernel EEH mechanisms to notice. As the Solarflare driver
251 * was written to minimise MMIO read (for latency) then a periodic call to check
252 * the EEH status of the device is required so that device recovery can happen
253 * in a timely fashion.
254 */
255static void siena_monitor(struct efx_nic *efx)
256{
257 struct eeh_dev *eehdev =
258 of_node_to_eeh_dev(pci_device_to_OF_node(efx->pci_dev));
259
260 eeh_dev_check_failure(eehdev);
261}
262#endif
263
248static int siena_probe_nvconfig(struct efx_nic *efx) 264static int siena_probe_nvconfig(struct efx_nic *efx)
249{ 265{
250 u32 caps = 0; 266 u32 caps = 0;
@@ -665,7 +681,11 @@ const struct efx_nic_type siena_a0_nic_type = {
665 .init = siena_init_nic, 681 .init = siena_init_nic,
666 .dimension_resources = siena_dimension_resources, 682 .dimension_resources = siena_dimension_resources,
667 .fini = efx_port_dummy_op_void, 683 .fini = efx_port_dummy_op_void,
684#ifdef CONFIG_EEH
685 .monitor = siena_monitor,
686#else
668 .monitor = NULL, 687 .monitor = NULL,
688#endif
669 .map_reset_reason = siena_map_reset_reason, 689 .map_reset_reason = siena_map_reset_reason,
670 .map_reset_flags = siena_map_reset_flags, 690 .map_reset_flags = siena_map_reset_flags,
671 .reset = siena_reset_hw, 691 .reset = siena_reset_hw,