Commit b6fbca2a authored by Bruce Allan's avatar Bruce Allan Committed by Jeff Kirsher

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: default avatarBruce 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: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 508da426
...@@ -113,11 +113,20 @@ E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate"); ...@@ -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: varies depending on kernel configuration & hardware support
*
* legacy=0, MSI=1, MSI-X=2
* *
* Valid Range: 0 - 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)
* *
* Default Value: 2 (MSI-X) * 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) ...@@ -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) ...@@ -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 = {
......
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