Skip to content

Commit

Permalink
jsm: adding EEH handlers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Breno Leitao authored and Greg Kroah-Hartman committed Dec 11, 2009
1 parent f9d1dff commit e6bdf24
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
46 changes: 46 additions & 0 deletions drivers/serial/jsm/jsm_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion drivers/serial/jsm/jsm_tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit e6bdf24

Please sign in to comment.