Commit 1b7c41ef authored by Ralph Metzler's avatar Ralph Metzler Committed by Mauro Carvalho Chehab

[media] ngene: Shutdown workaround

Implement shutdown workaround for some chipsets.
Signed-off-by: default avatarRalph Metzler <rjkm@metzlerbros.de>
Signed-off-by: default avatarOliver Endriss <o.endriss@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 0f0b270f
...@@ -436,6 +436,7 @@ static struct pci_driver ngene_pci_driver = { ...@@ -436,6 +436,7 @@ static struct pci_driver ngene_pci_driver = {
.probe = ngene_probe, .probe = ngene_probe,
.remove = __devexit_p(ngene_remove), .remove = __devexit_p(ngene_remove),
.err_handler = &ngene_errors, .err_handler = &ngene_errors,
.shutdown = ngene_shutdown,
}; };
static __init int module_init_ngene(void) static __init int module_init_ngene(void)
......
...@@ -45,6 +45,10 @@ static int one_adapter = 1; ...@@ -45,6 +45,10 @@ static int one_adapter = 1;
module_param(one_adapter, int, 0444); module_param(one_adapter, int, 0444);
MODULE_PARM_DESC(one_adapter, "Use only one adapter."); MODULE_PARM_DESC(one_adapter, "Use only one adapter.");
static int shutdown_workaround;
module_param(shutdown_workaround, int, 0644);
MODULE_PARM_DESC(one_adapter, "Activate workaround for shutdown problem with some chipsets.");
static int debug; static int debug;
module_param(debug, int, 0444); module_param(debug, int, 0444);
MODULE_PARM_DESC(debug, "Print debugging information."); MODULE_PARM_DESC(debug, "Print debugging information.");
...@@ -1574,6 +1578,39 @@ static void cxd_detach(struct ngene *dev) ...@@ -1574,6 +1578,39 @@ static void cxd_detach(struct ngene *dev)
ci->en = 0; ci->en = 0;
} }
/***********************************/
/* workaround for shutdown failure */
/***********************************/
static void ngene_unlink(struct ngene *dev)
{
struct ngene_command com;
com.cmd.hdr.Opcode = CMD_MEM_WRITE;
com.cmd.hdr.Length = 3;
com.cmd.MemoryWrite.address = 0x910c;
com.cmd.MemoryWrite.data = 0xff;
com.in_len = 3;
com.out_len = 1;
down(&dev->cmd_mutex);
ngwritel(0, NGENE_INT_ENABLE);
ngene_command_mutex(dev, &com);
up(&dev->cmd_mutex);
}
void ngene_shutdown(struct pci_dev *pdev)
{
struct ngene *dev = (struct ngene *)pci_get_drvdata(pdev);
if (!dev || !shutdown_workaround)
return;
printk(KERN_INFO DEVICE_NAME ": shutdown workaround...\n");
ngene_unlink(dev);
pci_disable_device(pdev);
}
/****************************************************************************/ /****************************************************************************/
/* device probe/remove calls ************************************************/ /* device probe/remove calls ************************************************/
/****************************************************************************/ /****************************************************************************/
......
...@@ -881,6 +881,7 @@ struct ngene_buffer { ...@@ -881,6 +881,7 @@ struct ngene_buffer {
int __devinit ngene_probe(struct pci_dev *pci_dev, int __devinit ngene_probe(struct pci_dev *pci_dev,
const struct pci_device_id *id); const struct pci_device_id *id);
void __devexit ngene_remove(struct pci_dev *pdev); void __devexit ngene_remove(struct pci_dev *pdev);
void ngene_shutdown(struct pci_dev *pdev);
int ngene_command(struct ngene *dev, struct ngene_command *com); int ngene_command(struct ngene *dev, struct ngene_command *com);
int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level); int ngene_command_gpio_set(struct ngene *dev, u8 select, u8 level);
void set_transfer(struct ngene_channel *chan, int state); void set_transfer(struct ngene_channel *chan, int state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment