add the MSI support to tbsci and tbsmod

This commit is contained in:
tbslucy
2022-06-01 09:42:46 +08:00
parent 5152bdcacb
commit 88f21a22bd
5 changed files with 119 additions and 14 deletions

View File

@@ -29,6 +29,10 @@
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
struct workqueue_struct *wq;
static bool enable_msi = true;
module_param(enable_msi, bool, 0444);
MODULE_PARM_DESC(enable_msi, "use an msi interrupt if available");
static int write_block_cell = 64;
module_param(write_block_cell, int, 0444);
MODULE_PARM_DESC(
@@ -1038,6 +1042,10 @@ static void tbsci_remove(struct pci_dev *pdev)
/* disable interrupts */
free_irq(dev->pdev->irq, dev);
if (dev->msi) {
pci_disable_msi(pdev);
dev->msi = false;
}
if (dev->mmio)
iounmap(dev->mmio);
@@ -1047,6 +1055,38 @@ static void tbsci_remove(struct pci_dev *pdev)
pci_set_drvdata(pdev, NULL);
}
static bool tbsci_enable_msi(struct pci_dev *pdev, struct tbs_pcie_dev *dev)
{
int err;
if (!enable_msi) {
dev_warn(&dev->pdev->dev,
"MSI disabled by module parameter 'enable_msi'\n");
return false;
}
err = pci_enable_msi(pdev);
if (err) {
dev_err(&dev->pdev->dev,
"Failed to enable MSI interrupt."
" Falling back to a shared IRQ\n");
return false;
}
/* no error - so request an msi interrupt */
err = request_irq(pdev->irq, tbsci_irq, 0,
KBUILD_MODNAME, dev);
if (err) {
/* fall back to legacy interrupt */
dev_err(&dev->pdev->dev,
"Failed to get an MSI interrupt."
" Falling back to a shared IRQ\n");
pci_disable_msi(pdev);
return false;
}
return true;
}
static int tbsci_probe(struct pci_dev *pdev,
const struct pci_device_id *pci_id)
@@ -1091,19 +1131,30 @@ static int tbsci_probe(struct pci_dev *pdev,
goto fail2;
}
ret = request_irq(dev->pdev->irq, tbsci_irq, IRQF_SHARED,
KBUILD_MODNAME, (void *)dev);
if (ret < 0) {
printk("%s ERROR: IRQ registration failed <%d>\n", __func__,
ret);
ret = -ENODEV;
goto fail3;
//interrupts
if (tbsci_enable_msi(pdev, dev)) {
printk("KBUILD_MODNAME : %s --MSI!\n",KBUILD_MODNAME);
dev->msi = true;
} else {
printk("KBUILD_MODNAME : %s --INTx\n\n",KBUILD_MODNAME);
ret = request_irq(pdev->irq, tbsci_irq,
IRQF_SHARED, KBUILD_MODNAME, dev);
if (ret < 0) {
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
ret = -ENODEV;
goto fail3;
}
dev->msi = false;
}
return 0;
fail3:
free_irq(dev->pdev->irq, dev);
if (dev->msi) {
pci_disable_msi(pdev);
dev->msi = false;
}
if (dev->mmio)
iounmap(dev->mmio);
fail2:

View File

@@ -71,6 +71,7 @@ struct tbs_pcie_dev {
void __iomem *mmio;
struct dvb_adapter adapter;
struct ca_channel channnel[CHANNELS];
bool msi;
};

View File

@@ -523,7 +523,7 @@ struct tbsecp3_board tbsecp3_boards[] = {
},
[TBSECP3_BOARD_TBS6302T] = {
.board_id = TBSECP3_BOARD_TBS6302T,
.name = "TurboSight TBS 6302T HDMI Capture ",
.name = "TurboSight TBS 6302X HDMI Capture ",
.adapters = 2,
.i2c_speed = 39,
.eeprom_i2c = 1,

View File

@@ -24,6 +24,10 @@
#define BOOL bool
#define PIKOTV_MBKB_THRESHOLD 210 /* PikoTV */
static bool enable_msi = true;
module_param(enable_msi, bool, 0444);
MODULE_PARM_DESC(enable_msi, "use an msi interrupt if available");
static void spi_ad9789Enable(struct tbs_pcie_dev *dev, int Data)
{
unsigned char tmpbuf[4];
@@ -3123,6 +3127,10 @@ static void tbsmod_remove(struct pci_dev *pdev)
/* disable interrupts */
free_irq(dev->pdev->irq, dev);
if (dev->msi) {
pci_disable_msi(pdev);
dev->msi = false;
}
if (dev->mmio)
iounmap(dev->mmio);
@@ -3132,6 +3140,38 @@ static void tbsmod_remove(struct pci_dev *pdev)
pci_set_drvdata(pdev, NULL);
}
static bool tbsmod_enable_msi(struct pci_dev *pdev, struct tbs_pcie_dev *dev)
{
int err;
if (!enable_msi) {
dev_warn(&dev->pdev->dev,
"MSI disabled by module parameter 'enable_msi'\n");
return false;
}
err = pci_enable_msi(pdev);
if (err) {
dev_err(&dev->pdev->dev,
"Failed to enable MSI interrupt."
" Falling back to a shared IRQ\n");
return false;
}
/* no error - so request an msi interrupt */
err = request_irq(pdev->irq, tbsmod_irq, 0,
KBUILD_MODNAME, dev);
if (err) {
/* fall back to legacy interrupt */
dev_err(&dev->pdev->dev,
"Failed to get an MSI interrupt."
" Falling back to a shared IRQ\n");
pci_disable_msi(pdev);
return false;
}
return true;
}
static int tbsmod_probe(struct pci_dev *pdev,
const struct pci_device_id *pci_id)
{
@@ -3168,12 +3208,20 @@ static int tbsmod_probe(struct pci_dev *pdev,
goto fail2;
}
ret = request_irq(dev->pdev->irq, tbsmod_irq, IRQF_SHARED, KBUILD_MODNAME, (void *)dev);
if (ret < 0)
{
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
ret = -ENODEV;
goto fail2;
//interrupts
if (tbsmod_enable_msi(pdev, dev)) {
printk("KBUILD_MODNAME : %s --MSI!\n",KBUILD_MODNAME);
dev->msi = true;
} else {
printk("KBUILD_MODNAME : %s --INTx\n\n",KBUILD_MODNAME);
ret = request_irq(pdev->irq, tbsmod_irq,
IRQF_SHARED, KBUILD_MODNAME, dev);
if (ret < 0) {
printk(KERN_ERR "%s ERROR: IRQ registration failed <%d>\n", __func__, ret);
ret = -ENODEV;
goto fail2;
}
dev->msi = false;
}
pci_set_drvdata(pdev, dev);
@@ -3322,6 +3370,10 @@ static int tbsmod_probe(struct pci_dev *pdev,
fail3:
free_irq(dev->pdev->irq, dev);
if (dev->msi) {
pci_disable_msi(pdev);
dev->msi = false;
}
if (dev->mmio)
iounmap(dev->mmio);
fail2:

View File

@@ -45,6 +45,7 @@ struct tbs_pcie_dev {
u8 mods_num;
u8 bw; //dvbt
bool msi;
};