📄 e1000_param.c
字号:
/******************************************************************************* Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. The full GNU General Public License is included in this distribution in the file called LICENSE. Contact Information: Linux NICS <linux.nics@intel.com> Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497*******************************************************************************/#include "e1000.h"/* This is the only thing that needs to be changed to adjust the * maximum number of ports that the driver can manage. */#define E1000_MAX_NIC 32#define OPTION_UNSET -1#define OPTION_DISABLED 0#define OPTION_ENABLED 1/* All parameters are treated the same, as an integer array of values. * This macro just reduces the need to repeat the same declaration code * over and over (plus this helps to avoid typo bugs). */#define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET }/* Module Parameters are always initialized to -1, so that the driver * can tell the difference between no user specified value or the * user asking for the default value. * The true default values are loaded in when e1000_check_options is called. * * This is a GCC extension to ANSI C. * See the item "Labeled Elements in Initializers" in the section * "Extensions to the C Language Family" of the GCC documentation. */#define E1000_PARAM(X, desc) \ static const int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ MODULE_PARM(X, "1-" __MODULE_STRING(E1000_MAX_NIC) "i"); \ MODULE_PARM_DESC(X, desc);/* Transmit Descriptor Count * * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers * Valid Range: 80-4096 for 82544 and newer * * Default Value: 256 */E1000_PARAM(TxDescriptors, "Number of transmit descriptors");/* Receive Descriptor Count * * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers * Valid Range: 80-4096 for 82544 and newer * * Default Value: 256 */E1000_PARAM(RxDescriptors, "Number of receive descriptors");/* User Specified Speed Override * * Valid Range: 0, 10, 100, 1000 * - 0 - auto-negotiate at all supported speeds * - 10 - only link at 10 Mbps * - 100 - only link at 100 Mbps * - 1000 - only link at 1000 Mbps * * Default Value: 0 */E1000_PARAM(Speed, "Speed setting");/* User Specified Duplex Override * * Valid Range: 0-2 * - 0 - auto-negotiate for duplex * - 1 - only link at half duplex * - 2 - only link at full duplex * * Default Value: 0 */E1000_PARAM(Duplex, "Duplex setting");/* Auto-negotiation Advertisement Override * * Valid Range: 0x01-0x0F, 0x20-0x2F (copper); 0x20 (fiber) * * The AutoNeg value is a bit mask describing which speed and duplex * combinations should be advertised during auto-negotiation. * The supported speed and duplex modes are listed below * * Bit 7 6 5 4 3 2 1 0 * Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10 * Duplex Full Full Half Full Half * * Default Value: 0x2F (copper); 0x20 (fiber) */E1000_PARAM(AutoNeg, "Advertised auto-negotiation setting");/* User Specified Flow Control Override * * Valid Range: 0-3 * - 0 - No Flow Control * - 1 - Rx only, respond to PAUSE frames but do not generate them * - 2 - Tx only, generate PAUSE frames but ignore them on receive * - 3 - Full Flow Control Support * * Default Value: Read flow control settings from the EEPROM */E1000_PARAM(FlowControl, "Flow Control setting");/* XsumRX - Receive Checksum Offload Enable/Disable * * Valid Range: 0, 1 * - 0 - disables all checksum offload * - 1 - enables receive IP/TCP/UDP checksum offload * on 82543 and newer -based NICs * * Default Value: 1 */E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload");/* Transmit Interrupt Delay in units of 1.024 microseconds * * Valid Range: 0-65535 * * Default Value: 64 */E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay");/* Transmit Absolute Interrupt Delay in units of 1.024 microseconds * * Valid Range: 0-65535 * * Default Value: 0 */E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay");/* Receive Interrupt Delay in units of 1.024 microseconds * * Valid Range: 0-65535 * * Default Value: 0 */E1000_PARAM(RxIntDelay, "Receive Interrupt Delay");/* Receive Absolute Interrupt Delay in units of 1.024 microseconds * * Valid Range: 0-65535 * * Default Value: 128 */E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay");/* Interrupt Throttle Rate (interrupts/sec) * * Valid Range: 100-100000 (0=off, 1=dynamic) * * Default Value: 1 */E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate");#define AUTONEG_ADV_DEFAULT 0x2F#define AUTONEG_ADV_MASK 0x2F#define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL#define DEFAULT_RDTR 0#define MAX_RXDELAY 0xFFFF#define MIN_RXDELAY 0#define DEFAULT_RADV 128#define MAX_RXABSDELAY 0xFFFF#define MIN_RXABSDELAY 0#define DEFAULT_TIDV 64#define MAX_TXDELAY 0xFFFF#define MIN_TXDELAY 0#define DEFAULT_TADV 64#define MAX_TXABSDELAY 0xFFFF#define MIN_TXABSDELAY 0#define DEFAULT_ITR 8000#define MAX_ITR 100000#define MIN_ITR 100struct e1000_option { enum { enable_option, range_option, list_option } type; char *name; char *err; int def; union { struct { /* range_option info */ int min; int max; } r; struct { /* list_option info */ int nr; struct e1000_opt_list { int i; char *str; } *p; } l; } arg;};static int __devinite1000_validate_option(int *value, struct e1000_option *opt, struct e1000_adapter *adapter){ if(*value == OPTION_UNSET) { *value = opt->def; return 0; } switch (opt->type) { case enable_option: switch (*value) { case OPTION_ENABLED: DPRINTK(PROBE, INFO, "%s Enabled\n", opt->name); return 0; case OPTION_DISABLED: DPRINTK(PROBE, INFO, "%s Disabled\n", opt->name); return 0; } break; case range_option: if(*value >= opt->arg.r.min && *value <= opt->arg.r.max) { DPRINTK(PROBE, INFO, "%s set to %i\n", opt->name, *value); return 0; } break; case list_option: { int i; struct e1000_opt_list *ent; for(i = 0; i < opt->arg.l.nr; i++) { ent = &opt->arg.l.p[i]; if(*value == ent->i) { if(ent->str[0] != '\0') DPRINTK(PROBE, INFO, "%s\n", ent->str); return 0; } } } break; default: BUG(); } DPRINTK(PROBE, INFO, "Invalid %s specified (%i) %s\n", opt->name, *value, opt->err); *value = opt->def; return -1;}static void e1000_check_fiber_options(struct e1000_adapter *adapter);static void e1000_check_copper_options(struct e1000_adapter *adapter);/** * e1000_check_options - Range Checking for Command Line Parameters * @adapter: board private structure * * This routine checks all command line parameters for valid user * input. If an invalid value is given, or if no user specified * value exists, a default value is used. The final value is stored * in a variable in the adapter structure. **/void __devinite1000_check_options(struct e1000_adapter *adapter){ int bd = adapter->bd_number; if(bd >= E1000_MAX_NIC) { DPRINTK(PROBE, NOTICE, "Warning: no configuration for board #%i\n", bd); DPRINTK(PROBE, NOTICE, "Using defaults for all values\n"); bd = E1000_MAX_NIC; } { /* Transmit Descriptor Count */ struct e1000_option opt = { .type = range_option, .name = "Transmit Descriptors", .err = "using default of " __MODULE_STRING(E1000_DEFAULT_TXD), .def = E1000_DEFAULT_TXD, .arg = { .r = { .min = E1000_MIN_TXD }} }; struct e1000_desc_ring *tx_ring = &adapter->tx_ring; e1000_mac_type mac_type = adapter->hw.mac_type; opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_TXD : E1000_MAX_82544_TXD; tx_ring->count = TxDescriptors[bd]; e1000_validate_option(&tx_ring->count, &opt, adapter); E1000_ROUNDUP(tx_ring->count, REQ_TX_DESCRIPTOR_MULTIPLE); } { /* Receive Descriptor Count */ struct e1000_option opt = { .type = range_option, .name = "Receive Descriptors", .err = "using default of " __MODULE_STRING(E1000_DEFAULT_RXD), .def = E1000_DEFAULT_RXD, .arg = { .r = { .min = E1000_MIN_RXD }} }; struct e1000_desc_ring *rx_ring = &adapter->rx_ring; e1000_mac_type mac_type = adapter->hw.mac_type; opt.arg.r.max = mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD; rx_ring->count = RxDescriptors[bd]; e1000_validate_option(&rx_ring->count, &opt, adapter); E1000_ROUNDUP(rx_ring->count, REQ_RX_DESCRIPTOR_MULTIPLE); } { /* Checksum Offload Enable/Disable */ struct e1000_option opt = { .type = enable_option, .name = "Checksum Offload", .err = "defaulting to Enabled", .def = OPTION_ENABLED }; int rx_csum = XsumRX[bd]; e1000_validate_option(&rx_csum, &opt, adapter);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -