Skip to contentSkip to conversation

iwlwifi: MSI support

PATCH In review Stephen Hemminger 3 participants 5 messages Jun 13, 2007 Networking drivers (wireless)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 iwlwifi: MSI support

Add Message Signal Interrupt support to iwlwifi. Tested on 3945. Enable by default, but have parameter to disable for buggy platforms.

drivers/net/wireless/mac80211/iwlwifi/base.c +12 -0
@@ -80,6 +80,8 @@ int param_antenna = 0;      /* def: 0 = 
 int param_hwcrypto = 0;     /* def: using software encryption */
 int param_qos_enable = 0;
 
+static int disable_msi;
+
 /*
  * module name, copyright, version, etc.
  * NOTE: DRV_NAME is defined in iwlwifi.h for use by iwl-debug.h and printk
@@ -8117,6 +8119,10 @@ static int iwl_pci_probe(struct pci_dev 
 	/* If power management is turned on, default to AC mode */
 	priv->power_mode = IWL_POWER_AC;
 	priv->user_txpower_limit = IWL_DEFAULT_TX_POWER;
+
+	if (!disable_msi)
+		pci_enable_msi(pdev);
+
 	err = request_irq(pdev->irq, iwl_isr, IRQF_SHARED, DRV_NAME, priv);
 	if (err) {
 		IWL_ERROR("Error allocating IRQ %d\n", pdev->irq);
@@ -8155,6 +8161,7 @@ static int iwl_pci_probe(struct pci_dev 
 	sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
 
  out_release_irq:
+	pci_disable_msi(pdev);
 	free_irq(pdev->irq, priv);
 
  out_destroy_workqueue:
@@ -8224,6 +8231,8 @@ static void iwl_pci_remove(struct pci_de
 	destroy_workqueue(priv->workqueue);
 	priv->workqueue = NULL;
 
+	pci_disable_msi(pdev);
+
 	free_irq(pdev->irq, priv);
 	iounmap(priv->hw_base);
 	pci_release_regions(pdev);
@@ -8352,6 +8361,9 @@ static void __exit iwl_exit(void)
 	pci_unregister_driver(&iwl_driver);
 }
 
+module_param(disable_msi, int, 0);
+MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
+
 module_param_named(antenna, param_antenna, int, 0444);
 MODULE_PARM_DESC(antenna, "select antenna (1=Main, 2=Aux, default 0 [both])");
 module_param_named(disable, param_disable, int, 0444);
#1 lore raw
Quoted 4 lines · Stephen Hemminger

Add Message Signal Interrupt support to iwlwifi. Tested on 3945. Enable by default, but have parameter to disable for buggy platforms.

These days we don't want to poop platform MSI disable knobs all over individual drivers...

Jeff

#2 lore raw

Add Message Signal Interrupt support to iwlwifi. Tested on 3945.

drivers/net/wireless/mac80211/iwlwifi/base.c +6 -0
@@ -8117,6 +8117,9 @@ static int iwl_pci_probe(struct pci_dev 
 	/* If power management is turned on, default to AC mode */
 	priv->power_mode = IWL_POWER_AC;
 	priv->user_txpower_limit = IWL_DEFAULT_TX_POWER;
+
+	pci_enable_msi(pdev);
+
 	err = request_irq(pdev->irq, iwl_isr, IRQF_SHARED, DRV_NAME, priv);
 	if (err) {
 		IWL_ERROR("Error allocating IRQ %d\n", pdev->irq);
@@ -8155,6 +8158,7 @@ static int iwl_pci_probe(struct pci_dev 
 	sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
 
  out_release_irq:
+	pci_disable_msi(pdev);
 	free_irq(pdev->irq, priv);
 
  out_destroy_workqueue:
@@ -8224,6 +8228,8 @@ static void iwl_pci_remove(struct pci_de
 	destroy_workqueue(priv->workqueue);
 	priv->workqueue = NULL;
 
+	pci_disable_msi(pdev);
+
 	free_irq(pdev->irq, priv);
 	iounmap(priv->hw_base);
 	pci_release_regions(pdev);
#3 lore raw
Quoted 3 lines · Stephen Hemminger

Add Message Signal Interrupt support to iwlwifi. Tested on 3945.

looks good to me, though I will let our illustrious wireless maintainer merge it and push it upstream :)

#4 lore raw
In reply to Stephen Hemminger
Quoted 2 lines · On Wed, 13 Jun 2007 11:29:39 -0700 Stephen Hemminger wrote:

Add Message Signal Interrupt support to iwlwifi. Tested on 3945. Enable by default, but have parameter to disable for buggy platforms.

We prefer to use the system-wide capability to disable/enable MSI interrupts when it is a platform problem vs. an individual device problem. I.e., in general individual drivers should not be adding such options.

Quoted 42 lines
drivers/net/wireless/mac80211/iwlwifi/base.c +9 -0
@@ -80,6 +80,8 @@ int param_antenna = 0;      /* def: 0 = 
 int param_hwcrypto = 0;     /* def: using software encryption */
 int param_qos_enable = 0;
 
+static int disable_msi;
+
 /*
  * module name, copyright, version, etc.
  * NOTE: DRV_NAME is defined in iwlwifi.h for use by iwl-debug.h and printk
@@ -8117,6 +8119,10 @@ static int iwl_pci_probe(struct pci_dev 
 	/* If power management is turned on, default to AC mode */
 	priv->power_mode = IWL_POWER_AC;
 	priv->user_txpower_limit = IWL_DEFAULT_TX_POWER;
+
+	if (!disable_msi)
+		pci_enable_msi(pdev);
+
 	err = request_irq(pdev->irq, iwl_isr, IRQF_SHARED, DRV_NAME, priv);
 	if (err) {
 		IWL_ERROR("Error allocating IRQ %d\n", pdev->irq);
@@ -8155,6 +8161,7 @@ static int iwl_pci_probe(struct pci_dev 
 	sysfs_remove_group(&pdev->dev.kobj, &iwl_attribute_group);
 
  out_release_irq:
+	pci_disable_msi(pdev);
 	free_irq(pdev->irq, priv);
 
  out_destroy_workqueue:
@@ -8224,6 +8231,8 @@ static void iwl_pci_remove(struct pci_de
 	destroy_workqueue(priv->workqueue);
 	priv->workqueue = NULL;
 
+	pci_disable_msi(pdev);
+
 	free_irq(pdev->irq, priv);
 	iounmap(priv->hw_base);
 	pci_release_regions(pdev);

drivers/net/wireless/mac80211/iwlwifi/base.c static void __exit iwl_exit(void) · line 8369

Quoted 9 lines
drivers/net/wireless/mac80211/iwlwifi/base.c +3 -0
@@ -8352,6 +8361,9 @@ static void __exit iwl_exit(void)
 	pci_unregister_driver(&iwl_driver);
 }
 
+module_param(disable_msi, int, 0);
+MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
+
 module_param_named(antenna, param_antenna, int, 0444);
 MODULE_PARM_DESC(antenna, "select antenna (1=Main, 2=Aux, default 0 [both])");
 module_param_named(disable, param_disable, int, 0444);

---
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***