From 20501e9e687ac04e16e958b0a546ac118e90c790 Mon Sep 17 00:00:00 2001 From: Ralph Metzler Date: Mon, 10 Jan 2011 06:36:16 -0300 Subject: [PATCH] --- yaml --- r: 241803 b: refs/heads/master c: 1b7c41ef33f38c88dcf9a1b7544d9e4eaa045e6f h: refs/heads/master i: 241801: 93408076ee9220fc58ad8a606da4502c1f00f3e6 241799: bdd0e6c4d34030ab3d83ae9fd59e72fa5948a112 v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb/ngene/ngene-cards.c | 1 + trunk/drivers/media/dvb/ngene/ngene-core.c | 37 +++++++++++++++++++++ trunk/drivers/media/dvb/ngene/ngene.h | 1 + 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 9666f997ff2a..b784f1fb1a27 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0f0b270f905bbb0c8e75988ceaf10ff9a401e712 +refs/heads/master: 1b7c41ef33f38c88dcf9a1b7544d9e4eaa045e6f diff --git a/trunk/drivers/media/dvb/ngene/ngene-cards.c b/trunk/drivers/media/dvb/ngene/ngene-cards.c index 93e6f9e954ca..6d87427d214a 100644 --- a/trunk/drivers/media/dvb/ngene/ngene-cards.c +++ b/trunk/drivers/media/dvb/ngene/ngene-cards.c @@ -436,6 +436,7 @@ static struct pci_driver ngene_pci_driver = { .probe = ngene_probe, .remove = __devexit_p(ngene_remove), .err_handler = &ngene_errors, + .shutdown = ngene_shutdown, }; static __init int module_init_ngene(void) diff --git a/trunk/drivers/media/dvb/ngene/ngene-core.c b/trunk/drivers/media/dvb/ngene/ngene-core.c index deaf72aab058..422f83b9dca1 100644 --- a/trunk/drivers/media/dvb/ngene/ngene-core.c +++ b/trunk/drivers/media/dvb/ngene/ngene-core.c @@ -45,6 +45,10 @@ static int one_adapter = 1; module_param(one_adapter, int, 0444); 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; module_param(debug, int, 0444); MODULE_PARM_DESC(debug, "Print debugging information."); @@ -1574,6 +1578,39 @@ static void cxd_detach(struct ngene *dev) 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 ************************************************/ /****************************************************************************/ diff --git a/trunk/drivers/media/dvb/ngene/ngene.h b/trunk/drivers/media/dvb/ngene/ngene.h index f7834066386f..c1bb81014fb4 100644 --- a/trunk/drivers/media/dvb/ngene/ngene.h +++ b/trunk/drivers/media/dvb/ngene/ngene.h @@ -881,6 +881,7 @@ struct ngene_buffer { int __devinit ngene_probe(struct pci_dev *pci_dev, const struct pci_device_id *id); 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_gpio_set(struct ngene *dev, u8 select, u8 level); void set_transfer(struct ngene_channel *chan, int state);