forked from luck/tmp_suning_uos_patched
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: Breno Leitao <leitao@linux.vnet.ibm.com> Acked-by: Scott Kilau <scottk@digi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
f9d1dff276
commit
e6bdf24cf2
|
@ -48,6 +48,17 @@ struct uart_driver jsm_uart_driver = {
|
|||
.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;
|
||||
module_param(jsm_debug, int, 0);
|
||||
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_save_state(pdev);
|
||||
|
||||
return 0;
|
||||
out_free_irq:
|
||||
|
@ -222,8 +234,42 @@ static struct pci_driver jsm_driver = {
|
|||
.id_table = jsm_pci_tbl,
|
||||
.probe = jsm_probe_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)
|
||||
{
|
||||
int rc;
|
||||
|
|
|
@ -430,7 +430,7 @@ int __devinit jsm_tty_init(struct jsm_board *brd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int __devinit jsm_uart_port_init(struct jsm_board *brd)
|
||||
int jsm_uart_port_init(struct jsm_board *brd)
|
||||
{
|
||||
int i;
|
||||
unsigned int line;
|
||||
|
|
Loading…
Reference in New Issue
Block a user