Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e6bdf24c authored by Breno Leitao's avatar Breno Leitao Committed by Greg Kroah-Hartman
Browse files

jsm: adding EEH handlers



Adding EEH handlers for the serial jsm driver. This patch adds
the PCI error handlers and also register them to be called when
a error is detected.

Signed-off-by: default avatarBreno Leitao <leitao@linux.vnet.ibm.com>
Acked-by: default avatarScott Kilau <scottk@digi.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f9d1dff2
Loading
Loading
Loading
Loading
+46 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,17 @@ struct uart_driver jsm_uart_driver = {
	.nr		= NR_PORTS,
	.nr		= NR_PORTS,
};
};


static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
                                       pci_channel_state_t state);
static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev);
static void jsm_io_resume(struct pci_dev *pdev);

static struct pci_error_handlers jsm_err_handler = {
	.error_detected = jsm_io_error_detected,
	.slot_reset = jsm_io_slot_reset,
	.resume = jsm_io_resume,
};

int jsm_debug;
int jsm_debug;
module_param(jsm_debug, int, 0);
module_param(jsm_debug, int, 0);
MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
MODULE_PARM_DESC(jsm_debug, "Driver debugging level");
@@ -164,6 +175,7 @@ static int __devinit jsm_probe_one(struct pci_dev *pdev, const struct pci_device
	}
	}


	pci_set_drvdata(pdev, brd);
	pci_set_drvdata(pdev, brd);
	pci_save_state(pdev);


	return 0;
	return 0;
 out_free_irq:
 out_free_irq:
@@ -222,8 +234,42 @@ static struct pci_driver jsm_driver = {
	.id_table	= jsm_pci_tbl,
	.id_table	= jsm_pci_tbl,
	.probe		= jsm_probe_one,
	.probe		= jsm_probe_one,
	.remove		= __devexit_p(jsm_remove_one),
	.remove		= __devexit_p(jsm_remove_one),
	.err_handler    = &jsm_err_handler,
};
};


static pci_ers_result_t jsm_io_error_detected(struct pci_dev *pdev,
					pci_channel_state_t state)
{
	struct jsm_board *brd = pci_get_drvdata(pdev);

	jsm_remove_uart_port(brd);

	return PCI_ERS_RESULT_NEED_RESET;
}

static pci_ers_result_t jsm_io_slot_reset(struct pci_dev *pdev)
{
	int rc;

	rc = pci_enable_device(pdev);

	if (rc)
		return PCI_ERS_RESULT_DISCONNECT;

	pci_set_master(pdev);

	return PCI_ERS_RESULT_RECOVERED;
}

static void jsm_io_resume(struct pci_dev *pdev)
{
	struct jsm_board *brd = pci_get_drvdata(pdev);

	pci_restore_state(pdev);

	jsm_uart_port_init(brd);
}

static int __init jsm_init_module(void)
static int __init jsm_init_module(void)
{
{
	int rc;
	int rc;
+1 −1
Original line number Original line Diff line number Diff line
@@ -430,7 +430,7 @@ int __devinit jsm_tty_init(struct jsm_board *brd)
	return 0;
	return 0;
}
}


int __devinit jsm_uart_port_init(struct jsm_board *brd)
int jsm_uart_port_init(struct jsm_board *brd)
{
{
	int i;
	int i;
	unsigned int line;
	unsigned int line;