e1000e: default IntMode based on kernel config & available hardware support
Based on a patch from Prabhakar Kushwaha <prabhakar@freescale.com>, set appropriate default interrupt mode dependent on whether CONFIG_PCI_MSI is enabled in the kernel configuration and if the hardware supports MSI-X. Set the module parameter log message accordingly. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Cc: Jin Qing <b24347@freescale.com> Cc: Prabhakar Kushwaha <prabhakar@freescale.com> Cc: Jin Qing <b24347@freescale.com> Cc: Kumar Gala <galak@kernel.crashing.org> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
committed by
Jeff Kirsher
parent
508da4264a
commit
b6fbca2af3
@@ -113,11 +113,20 @@ E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");
|
|||||||
#define MAX_ITR 100000
|
#define MAX_ITR 100000
|
||||||
#define MIN_ITR 100
|
#define MIN_ITR 100
|
||||||
|
|
||||||
/* IntMode (Interrupt Mode)
|
/*
|
||||||
|
* IntMode (Interrupt Mode)
|
||||||
*
|
*
|
||||||
* Valid Range: 0 - 2
|
* Valid Range: varies depending on kernel configuration & hardware support
|
||||||
*
|
*
|
||||||
* Default Value: 2 (MSI-X)
|
* legacy=0, MSI=1, MSI-X=2
|
||||||
|
*
|
||||||
|
* When MSI/MSI-X support is enabled in kernel-
|
||||||
|
* Default Value: 2 (MSI-X) when supported by hardware, 1 (MSI) otherwise
|
||||||
|
* When MSI/MSI-X support is not enabled in kernel-
|
||||||
|
* Default Value: 0 (legacy)
|
||||||
|
*
|
||||||
|
* When a mode is specified that is not allowed/supported, it will be
|
||||||
|
* demoted to the most advanced interrupt mode available.
|
||||||
*/
|
*/
|
||||||
E1000_PARAM(IntMode, "Interrupt Mode");
|
E1000_PARAM(IntMode, "Interrupt Mode");
|
||||||
#define MAX_INTMODE 2
|
#define MAX_INTMODE 2
|
||||||
@@ -388,12 +397,33 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
|
|||||||
static struct e1000_option opt = {
|
static struct e1000_option opt = {
|
||||||
.type = range_option,
|
.type = range_option,
|
||||||
.name = "Interrupt Mode",
|
.name = "Interrupt Mode",
|
||||||
.err = "defaulting to 2 (MSI-X)",
|
#ifndef CONFIG_PCI_MSI
|
||||||
.def = E1000E_INT_MODE_MSIX,
|
.err = "defaulting to 0 (legacy)",
|
||||||
.arg = { .r = { .min = MIN_INTMODE,
|
.def = E1000E_INT_MODE_LEGACY,
|
||||||
.max = MAX_INTMODE } }
|
.arg = { .r = { .min = 0,
|
||||||
|
.max = 0 } }
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_MSI
|
||||||
|
if (adapter->flags & FLAG_HAS_MSIX) {
|
||||||
|
opt.err = kstrdup("defaulting to 2 (MSI-X)",
|
||||||
|
GFP_KERNEL);
|
||||||
|
opt.def = E1000E_INT_MODE_MSIX;
|
||||||
|
opt.arg.r.max = E1000E_INT_MODE_MSIX;
|
||||||
|
} else {
|
||||||
|
opt.err = kstrdup("defaulting to 1 (MSI)", GFP_KERNEL);
|
||||||
|
opt.def = E1000E_INT_MODE_MSI;
|
||||||
|
opt.arg.r.max = E1000E_INT_MODE_MSI;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!opt.err) {
|
||||||
|
dev_err(&adapter->pdev->dev,
|
||||||
|
"Failed to allocate memory\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (num_IntMode > bd) {
|
if (num_IntMode > bd) {
|
||||||
unsigned int int_mode = IntMode[bd];
|
unsigned int int_mode = IntMode[bd];
|
||||||
e1000_validate_option(&int_mode, &opt, adapter);
|
e1000_validate_option(&int_mode, &opt, adapter);
|
||||||
@@ -401,6 +431,10 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
|
|||||||
} else {
|
} else {
|
||||||
adapter->int_mode = opt.def;
|
adapter->int_mode = opt.def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_MSI
|
||||||
|
kfree(opt.err);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
{ /* Smart Power Down */
|
{ /* Smart Power Down */
|
||||||
static const struct e1000_option opt = {
|
static const struct e1000_option opt = {
|
||||||
|
Reference in New Issue
Block a user