1*dee1ad47SJeff Kirsher /******************************************************************************* 2*dee1ad47SJeff Kirsher 3*dee1ad47SJeff Kirsher Intel PRO/1000 Linux driver 4*dee1ad47SJeff Kirsher Copyright(c) 1999 - 2006 Intel Corporation. 5*dee1ad47SJeff Kirsher 6*dee1ad47SJeff Kirsher This program is free software; you can redistribute it and/or modify it 7*dee1ad47SJeff Kirsher under the terms and conditions of the GNU General Public License, 8*dee1ad47SJeff Kirsher version 2, as published by the Free Software Foundation. 9*dee1ad47SJeff Kirsher 10*dee1ad47SJeff Kirsher This program is distributed in the hope it will be useful, but WITHOUT 11*dee1ad47SJeff Kirsher ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*dee1ad47SJeff Kirsher FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*dee1ad47SJeff Kirsher more details. 14*dee1ad47SJeff Kirsher 15*dee1ad47SJeff Kirsher You should have received a copy of the GNU General Public License along with 16*dee1ad47SJeff Kirsher this program; if not, write to the Free Software Foundation, Inc., 17*dee1ad47SJeff Kirsher 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18*dee1ad47SJeff Kirsher 19*dee1ad47SJeff Kirsher The full GNU General Public License is included in this distribution in 20*dee1ad47SJeff Kirsher the file called "COPYING". 21*dee1ad47SJeff Kirsher 22*dee1ad47SJeff Kirsher Contact Information: 23*dee1ad47SJeff Kirsher Linux NICS <linux.nics@intel.com> 24*dee1ad47SJeff Kirsher e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 25*dee1ad47SJeff Kirsher Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 26*dee1ad47SJeff Kirsher 27*dee1ad47SJeff Kirsher *******************************************************************************/ 28*dee1ad47SJeff Kirsher 29*dee1ad47SJeff Kirsher #include "e1000.h" 30*dee1ad47SJeff Kirsher 31*dee1ad47SJeff Kirsher /* This is the only thing that needs to be changed to adjust the 32*dee1ad47SJeff Kirsher * maximum number of ports that the driver can manage. 33*dee1ad47SJeff Kirsher */ 34*dee1ad47SJeff Kirsher 35*dee1ad47SJeff Kirsher #define E1000_MAX_NIC 32 36*dee1ad47SJeff Kirsher 37*dee1ad47SJeff Kirsher #define OPTION_UNSET -1 38*dee1ad47SJeff Kirsher #define OPTION_DISABLED 0 39*dee1ad47SJeff Kirsher #define OPTION_ENABLED 1 40*dee1ad47SJeff Kirsher 41*dee1ad47SJeff Kirsher /* All parameters are treated the same, as an integer array of values. 42*dee1ad47SJeff Kirsher * This macro just reduces the need to repeat the same declaration code 43*dee1ad47SJeff Kirsher * over and over (plus this helps to avoid typo bugs). 44*dee1ad47SJeff Kirsher */ 45*dee1ad47SJeff Kirsher 46*dee1ad47SJeff Kirsher #define E1000_PARAM_INIT { [0 ... E1000_MAX_NIC] = OPTION_UNSET } 47*dee1ad47SJeff Kirsher #define E1000_PARAM(X, desc) \ 48*dee1ad47SJeff Kirsher static int __devinitdata X[E1000_MAX_NIC+1] = E1000_PARAM_INIT; \ 49*dee1ad47SJeff Kirsher static unsigned int num_##X; \ 50*dee1ad47SJeff Kirsher module_param_array_named(X, X, int, &num_##X, 0); \ 51*dee1ad47SJeff Kirsher MODULE_PARM_DESC(X, desc); 52*dee1ad47SJeff Kirsher 53*dee1ad47SJeff Kirsher /* Transmit Descriptor Count 54*dee1ad47SJeff Kirsher * 55*dee1ad47SJeff Kirsher * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers 56*dee1ad47SJeff Kirsher * Valid Range: 80-4096 for 82544 and newer 57*dee1ad47SJeff Kirsher * 58*dee1ad47SJeff Kirsher * Default Value: 256 59*dee1ad47SJeff Kirsher */ 60*dee1ad47SJeff Kirsher E1000_PARAM(TxDescriptors, "Number of transmit descriptors"); 61*dee1ad47SJeff Kirsher 62*dee1ad47SJeff Kirsher /* Receive Descriptor Count 63*dee1ad47SJeff Kirsher * 64*dee1ad47SJeff Kirsher * Valid Range: 80-256 for 82542 and 82543 gigabit ethernet controllers 65*dee1ad47SJeff Kirsher * Valid Range: 80-4096 for 82544 and newer 66*dee1ad47SJeff Kirsher * 67*dee1ad47SJeff Kirsher * Default Value: 256 68*dee1ad47SJeff Kirsher */ 69*dee1ad47SJeff Kirsher E1000_PARAM(RxDescriptors, "Number of receive descriptors"); 70*dee1ad47SJeff Kirsher 71*dee1ad47SJeff Kirsher /* User Specified Speed Override 72*dee1ad47SJeff Kirsher * 73*dee1ad47SJeff Kirsher * Valid Range: 0, 10, 100, 1000 74*dee1ad47SJeff Kirsher * - 0 - auto-negotiate at all supported speeds 75*dee1ad47SJeff Kirsher * - 10 - only link at 10 Mbps 76*dee1ad47SJeff Kirsher * - 100 - only link at 100 Mbps 77*dee1ad47SJeff Kirsher * - 1000 - only link at 1000 Mbps 78*dee1ad47SJeff Kirsher * 79*dee1ad47SJeff Kirsher * Default Value: 0 80*dee1ad47SJeff Kirsher */ 81*dee1ad47SJeff Kirsher E1000_PARAM(Speed, "Speed setting"); 82*dee1ad47SJeff Kirsher 83*dee1ad47SJeff Kirsher /* User Specified Duplex Override 84*dee1ad47SJeff Kirsher * 85*dee1ad47SJeff Kirsher * Valid Range: 0-2 86*dee1ad47SJeff Kirsher * - 0 - auto-negotiate for duplex 87*dee1ad47SJeff Kirsher * - 1 - only link at half duplex 88*dee1ad47SJeff Kirsher * - 2 - only link at full duplex 89*dee1ad47SJeff Kirsher * 90*dee1ad47SJeff Kirsher * Default Value: 0 91*dee1ad47SJeff Kirsher */ 92*dee1ad47SJeff Kirsher E1000_PARAM(Duplex, "Duplex setting"); 93*dee1ad47SJeff Kirsher 94*dee1ad47SJeff Kirsher /* Auto-negotiation Advertisement Override 95*dee1ad47SJeff Kirsher * 96*dee1ad47SJeff Kirsher * Valid Range: 0x01-0x0F, 0x20-0x2F (copper); 0x20 (fiber) 97*dee1ad47SJeff Kirsher * 98*dee1ad47SJeff Kirsher * The AutoNeg value is a bit mask describing which speed and duplex 99*dee1ad47SJeff Kirsher * combinations should be advertised during auto-negotiation. 100*dee1ad47SJeff Kirsher * The supported speed and duplex modes are listed below 101*dee1ad47SJeff Kirsher * 102*dee1ad47SJeff Kirsher * Bit 7 6 5 4 3 2 1 0 103*dee1ad47SJeff Kirsher * Speed (Mbps) N/A N/A 1000 N/A 100 100 10 10 104*dee1ad47SJeff Kirsher * Duplex Full Full Half Full Half 105*dee1ad47SJeff Kirsher * 106*dee1ad47SJeff Kirsher * Default Value: 0x2F (copper); 0x20 (fiber) 107*dee1ad47SJeff Kirsher */ 108*dee1ad47SJeff Kirsher E1000_PARAM(AutoNeg, "Advertised auto-negotiation setting"); 109*dee1ad47SJeff Kirsher #define AUTONEG_ADV_DEFAULT 0x2F 110*dee1ad47SJeff Kirsher #define AUTONEG_ADV_MASK 0x2F 111*dee1ad47SJeff Kirsher 112*dee1ad47SJeff Kirsher /* User Specified Flow Control Override 113*dee1ad47SJeff Kirsher * 114*dee1ad47SJeff Kirsher * Valid Range: 0-3 115*dee1ad47SJeff Kirsher * - 0 - No Flow Control 116*dee1ad47SJeff Kirsher * - 1 - Rx only, respond to PAUSE frames but do not generate them 117*dee1ad47SJeff Kirsher * - 2 - Tx only, generate PAUSE frames but ignore them on receive 118*dee1ad47SJeff Kirsher * - 3 - Full Flow Control Support 119*dee1ad47SJeff Kirsher * 120*dee1ad47SJeff Kirsher * Default Value: Read flow control settings from the EEPROM 121*dee1ad47SJeff Kirsher */ 122*dee1ad47SJeff Kirsher E1000_PARAM(FlowControl, "Flow Control setting"); 123*dee1ad47SJeff Kirsher #define FLOW_CONTROL_DEFAULT FLOW_CONTROL_FULL 124*dee1ad47SJeff Kirsher 125*dee1ad47SJeff Kirsher /* XsumRX - Receive Checksum Offload Enable/Disable 126*dee1ad47SJeff Kirsher * 127*dee1ad47SJeff Kirsher * Valid Range: 0, 1 128*dee1ad47SJeff Kirsher * - 0 - disables all checksum offload 129*dee1ad47SJeff Kirsher * - 1 - enables receive IP/TCP/UDP checksum offload 130*dee1ad47SJeff Kirsher * on 82543 and newer -based NICs 131*dee1ad47SJeff Kirsher * 132*dee1ad47SJeff Kirsher * Default Value: 1 133*dee1ad47SJeff Kirsher */ 134*dee1ad47SJeff Kirsher E1000_PARAM(XsumRX, "Disable or enable Receive Checksum offload"); 135*dee1ad47SJeff Kirsher 136*dee1ad47SJeff Kirsher /* Transmit Interrupt Delay in units of 1.024 microseconds 137*dee1ad47SJeff Kirsher * Tx interrupt delay needs to typically be set to something non zero 138*dee1ad47SJeff Kirsher * 139*dee1ad47SJeff Kirsher * Valid Range: 0-65535 140*dee1ad47SJeff Kirsher */ 141*dee1ad47SJeff Kirsher E1000_PARAM(TxIntDelay, "Transmit Interrupt Delay"); 142*dee1ad47SJeff Kirsher #define DEFAULT_TIDV 8 143*dee1ad47SJeff Kirsher #define MAX_TXDELAY 0xFFFF 144*dee1ad47SJeff Kirsher #define MIN_TXDELAY 0 145*dee1ad47SJeff Kirsher 146*dee1ad47SJeff Kirsher /* Transmit Absolute Interrupt Delay in units of 1.024 microseconds 147*dee1ad47SJeff Kirsher * 148*dee1ad47SJeff Kirsher * Valid Range: 0-65535 149*dee1ad47SJeff Kirsher */ 150*dee1ad47SJeff Kirsher E1000_PARAM(TxAbsIntDelay, "Transmit Absolute Interrupt Delay"); 151*dee1ad47SJeff Kirsher #define DEFAULT_TADV 32 152*dee1ad47SJeff Kirsher #define MAX_TXABSDELAY 0xFFFF 153*dee1ad47SJeff Kirsher #define MIN_TXABSDELAY 0 154*dee1ad47SJeff Kirsher 155*dee1ad47SJeff Kirsher /* Receive Interrupt Delay in units of 1.024 microseconds 156*dee1ad47SJeff Kirsher * hardware will likely hang if you set this to anything but zero. 157*dee1ad47SJeff Kirsher * 158*dee1ad47SJeff Kirsher * Valid Range: 0-65535 159*dee1ad47SJeff Kirsher */ 160*dee1ad47SJeff Kirsher E1000_PARAM(RxIntDelay, "Receive Interrupt Delay"); 161*dee1ad47SJeff Kirsher #define DEFAULT_RDTR 0 162*dee1ad47SJeff Kirsher #define MAX_RXDELAY 0xFFFF 163*dee1ad47SJeff Kirsher #define MIN_RXDELAY 0 164*dee1ad47SJeff Kirsher 165*dee1ad47SJeff Kirsher /* Receive Absolute Interrupt Delay in units of 1.024 microseconds 166*dee1ad47SJeff Kirsher * 167*dee1ad47SJeff Kirsher * Valid Range: 0-65535 168*dee1ad47SJeff Kirsher */ 169*dee1ad47SJeff Kirsher E1000_PARAM(RxAbsIntDelay, "Receive Absolute Interrupt Delay"); 170*dee1ad47SJeff Kirsher #define DEFAULT_RADV 8 171*dee1ad47SJeff Kirsher #define MAX_RXABSDELAY 0xFFFF 172*dee1ad47SJeff Kirsher #define MIN_RXABSDELAY 0 173*dee1ad47SJeff Kirsher 174*dee1ad47SJeff Kirsher /* Interrupt Throttle Rate (interrupts/sec) 175*dee1ad47SJeff Kirsher * 176*dee1ad47SJeff Kirsher * Valid Range: 100-100000 (0=off, 1=dynamic, 3=dynamic conservative) 177*dee1ad47SJeff Kirsher */ 178*dee1ad47SJeff Kirsher E1000_PARAM(InterruptThrottleRate, "Interrupt Throttling Rate"); 179*dee1ad47SJeff Kirsher #define DEFAULT_ITR 3 180*dee1ad47SJeff Kirsher #define MAX_ITR 100000 181*dee1ad47SJeff Kirsher #define MIN_ITR 100 182*dee1ad47SJeff Kirsher 183*dee1ad47SJeff Kirsher /* Enable Smart Power Down of the PHY 184*dee1ad47SJeff Kirsher * 185*dee1ad47SJeff Kirsher * Valid Range: 0, 1 186*dee1ad47SJeff Kirsher * 187*dee1ad47SJeff Kirsher * Default Value: 0 (disabled) 188*dee1ad47SJeff Kirsher */ 189*dee1ad47SJeff Kirsher E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); 190*dee1ad47SJeff Kirsher 191*dee1ad47SJeff Kirsher struct e1000_option { 192*dee1ad47SJeff Kirsher enum { enable_option, range_option, list_option } type; 193*dee1ad47SJeff Kirsher const char *name; 194*dee1ad47SJeff Kirsher const char *err; 195*dee1ad47SJeff Kirsher int def; 196*dee1ad47SJeff Kirsher union { 197*dee1ad47SJeff Kirsher struct { /* range_option info */ 198*dee1ad47SJeff Kirsher int min; 199*dee1ad47SJeff Kirsher int max; 200*dee1ad47SJeff Kirsher } r; 201*dee1ad47SJeff Kirsher struct { /* list_option info */ 202*dee1ad47SJeff Kirsher int nr; 203*dee1ad47SJeff Kirsher const struct e1000_opt_list { int i; char *str; } *p; 204*dee1ad47SJeff Kirsher } l; 205*dee1ad47SJeff Kirsher } arg; 206*dee1ad47SJeff Kirsher }; 207*dee1ad47SJeff Kirsher 208*dee1ad47SJeff Kirsher static int __devinit e1000_validate_option(unsigned int *value, 209*dee1ad47SJeff Kirsher const struct e1000_option *opt, 210*dee1ad47SJeff Kirsher struct e1000_adapter *adapter) 211*dee1ad47SJeff Kirsher { 212*dee1ad47SJeff Kirsher if (*value == OPTION_UNSET) { 213*dee1ad47SJeff Kirsher *value = opt->def; 214*dee1ad47SJeff Kirsher return 0; 215*dee1ad47SJeff Kirsher } 216*dee1ad47SJeff Kirsher 217*dee1ad47SJeff Kirsher switch (opt->type) { 218*dee1ad47SJeff Kirsher case enable_option: 219*dee1ad47SJeff Kirsher switch (*value) { 220*dee1ad47SJeff Kirsher case OPTION_ENABLED: 221*dee1ad47SJeff Kirsher e_dev_info("%s Enabled\n", opt->name); 222*dee1ad47SJeff Kirsher return 0; 223*dee1ad47SJeff Kirsher case OPTION_DISABLED: 224*dee1ad47SJeff Kirsher e_dev_info("%s Disabled\n", opt->name); 225*dee1ad47SJeff Kirsher return 0; 226*dee1ad47SJeff Kirsher } 227*dee1ad47SJeff Kirsher break; 228*dee1ad47SJeff Kirsher case range_option: 229*dee1ad47SJeff Kirsher if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) { 230*dee1ad47SJeff Kirsher e_dev_info("%s set to %i\n", opt->name, *value); 231*dee1ad47SJeff Kirsher return 0; 232*dee1ad47SJeff Kirsher } 233*dee1ad47SJeff Kirsher break; 234*dee1ad47SJeff Kirsher case list_option: { 235*dee1ad47SJeff Kirsher int i; 236*dee1ad47SJeff Kirsher const struct e1000_opt_list *ent; 237*dee1ad47SJeff Kirsher 238*dee1ad47SJeff Kirsher for (i = 0; i < opt->arg.l.nr; i++) { 239*dee1ad47SJeff Kirsher ent = &opt->arg.l.p[i]; 240*dee1ad47SJeff Kirsher if (*value == ent->i) { 241*dee1ad47SJeff Kirsher if (ent->str[0] != '\0') 242*dee1ad47SJeff Kirsher e_dev_info("%s\n", ent->str); 243*dee1ad47SJeff Kirsher return 0; 244*dee1ad47SJeff Kirsher } 245*dee1ad47SJeff Kirsher } 246*dee1ad47SJeff Kirsher } 247*dee1ad47SJeff Kirsher break; 248*dee1ad47SJeff Kirsher default: 249*dee1ad47SJeff Kirsher BUG(); 250*dee1ad47SJeff Kirsher } 251*dee1ad47SJeff Kirsher 252*dee1ad47SJeff Kirsher e_dev_info("Invalid %s value specified (%i) %s\n", 253*dee1ad47SJeff Kirsher opt->name, *value, opt->err); 254*dee1ad47SJeff Kirsher *value = opt->def; 255*dee1ad47SJeff Kirsher return -1; 256*dee1ad47SJeff Kirsher } 257*dee1ad47SJeff Kirsher 258*dee1ad47SJeff Kirsher static void e1000_check_fiber_options(struct e1000_adapter *adapter); 259*dee1ad47SJeff Kirsher static void e1000_check_copper_options(struct e1000_adapter *adapter); 260*dee1ad47SJeff Kirsher 261*dee1ad47SJeff Kirsher /** 262*dee1ad47SJeff Kirsher * e1000_check_options - Range Checking for Command Line Parameters 263*dee1ad47SJeff Kirsher * @adapter: board private structure 264*dee1ad47SJeff Kirsher * 265*dee1ad47SJeff Kirsher * This routine checks all command line parameters for valid user 266*dee1ad47SJeff Kirsher * input. If an invalid value is given, or if no user specified 267*dee1ad47SJeff Kirsher * value exists, a default value is used. The final value is stored 268*dee1ad47SJeff Kirsher * in a variable in the adapter structure. 269*dee1ad47SJeff Kirsher **/ 270*dee1ad47SJeff Kirsher 271*dee1ad47SJeff Kirsher void __devinit e1000_check_options(struct e1000_adapter *adapter) 272*dee1ad47SJeff Kirsher { 273*dee1ad47SJeff Kirsher struct e1000_option opt; 274*dee1ad47SJeff Kirsher int bd = adapter->bd_number; 275*dee1ad47SJeff Kirsher 276*dee1ad47SJeff Kirsher if (bd >= E1000_MAX_NIC) { 277*dee1ad47SJeff Kirsher e_dev_warn("Warning: no configuration for board #%i " 278*dee1ad47SJeff Kirsher "using defaults for all values\n", bd); 279*dee1ad47SJeff Kirsher } 280*dee1ad47SJeff Kirsher 281*dee1ad47SJeff Kirsher { /* Transmit Descriptor Count */ 282*dee1ad47SJeff Kirsher struct e1000_tx_ring *tx_ring = adapter->tx_ring; 283*dee1ad47SJeff Kirsher int i; 284*dee1ad47SJeff Kirsher e1000_mac_type mac_type = adapter->hw.mac_type; 285*dee1ad47SJeff Kirsher 286*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 287*dee1ad47SJeff Kirsher .type = range_option, 288*dee1ad47SJeff Kirsher .name = "Transmit Descriptors", 289*dee1ad47SJeff Kirsher .err = "using default of " 290*dee1ad47SJeff Kirsher __MODULE_STRING(E1000_DEFAULT_TXD), 291*dee1ad47SJeff Kirsher .def = E1000_DEFAULT_TXD, 292*dee1ad47SJeff Kirsher .arg = { .r = { 293*dee1ad47SJeff Kirsher .min = E1000_MIN_TXD, 294*dee1ad47SJeff Kirsher .max = mac_type < e1000_82544 ? E1000_MAX_TXD : E1000_MAX_82544_TXD 295*dee1ad47SJeff Kirsher }} 296*dee1ad47SJeff Kirsher }; 297*dee1ad47SJeff Kirsher 298*dee1ad47SJeff Kirsher if (num_TxDescriptors > bd) { 299*dee1ad47SJeff Kirsher tx_ring->count = TxDescriptors[bd]; 300*dee1ad47SJeff Kirsher e1000_validate_option(&tx_ring->count, &opt, adapter); 301*dee1ad47SJeff Kirsher tx_ring->count = ALIGN(tx_ring->count, 302*dee1ad47SJeff Kirsher REQ_TX_DESCRIPTOR_MULTIPLE); 303*dee1ad47SJeff Kirsher } else { 304*dee1ad47SJeff Kirsher tx_ring->count = opt.def; 305*dee1ad47SJeff Kirsher } 306*dee1ad47SJeff Kirsher for (i = 0; i < adapter->num_tx_queues; i++) 307*dee1ad47SJeff Kirsher tx_ring[i].count = tx_ring->count; 308*dee1ad47SJeff Kirsher } 309*dee1ad47SJeff Kirsher { /* Receive Descriptor Count */ 310*dee1ad47SJeff Kirsher struct e1000_rx_ring *rx_ring = adapter->rx_ring; 311*dee1ad47SJeff Kirsher int i; 312*dee1ad47SJeff Kirsher e1000_mac_type mac_type = adapter->hw.mac_type; 313*dee1ad47SJeff Kirsher 314*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 315*dee1ad47SJeff Kirsher .type = range_option, 316*dee1ad47SJeff Kirsher .name = "Receive Descriptors", 317*dee1ad47SJeff Kirsher .err = "using default of " 318*dee1ad47SJeff Kirsher __MODULE_STRING(E1000_DEFAULT_RXD), 319*dee1ad47SJeff Kirsher .def = E1000_DEFAULT_RXD, 320*dee1ad47SJeff Kirsher .arg = { .r = { 321*dee1ad47SJeff Kirsher .min = E1000_MIN_RXD, 322*dee1ad47SJeff Kirsher .max = mac_type < e1000_82544 ? E1000_MAX_RXD : E1000_MAX_82544_RXD 323*dee1ad47SJeff Kirsher }} 324*dee1ad47SJeff Kirsher }; 325*dee1ad47SJeff Kirsher 326*dee1ad47SJeff Kirsher if (num_RxDescriptors > bd) { 327*dee1ad47SJeff Kirsher rx_ring->count = RxDescriptors[bd]; 328*dee1ad47SJeff Kirsher e1000_validate_option(&rx_ring->count, &opt, adapter); 329*dee1ad47SJeff Kirsher rx_ring->count = ALIGN(rx_ring->count, 330*dee1ad47SJeff Kirsher REQ_RX_DESCRIPTOR_MULTIPLE); 331*dee1ad47SJeff Kirsher } else { 332*dee1ad47SJeff Kirsher rx_ring->count = opt.def; 333*dee1ad47SJeff Kirsher } 334*dee1ad47SJeff Kirsher for (i = 0; i < adapter->num_rx_queues; i++) 335*dee1ad47SJeff Kirsher rx_ring[i].count = rx_ring->count; 336*dee1ad47SJeff Kirsher } 337*dee1ad47SJeff Kirsher { /* Checksum Offload Enable/Disable */ 338*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 339*dee1ad47SJeff Kirsher .type = enable_option, 340*dee1ad47SJeff Kirsher .name = "Checksum Offload", 341*dee1ad47SJeff Kirsher .err = "defaulting to Enabled", 342*dee1ad47SJeff Kirsher .def = OPTION_ENABLED 343*dee1ad47SJeff Kirsher }; 344*dee1ad47SJeff Kirsher 345*dee1ad47SJeff Kirsher if (num_XsumRX > bd) { 346*dee1ad47SJeff Kirsher unsigned int rx_csum = XsumRX[bd]; 347*dee1ad47SJeff Kirsher e1000_validate_option(&rx_csum, &opt, adapter); 348*dee1ad47SJeff Kirsher adapter->rx_csum = rx_csum; 349*dee1ad47SJeff Kirsher } else { 350*dee1ad47SJeff Kirsher adapter->rx_csum = opt.def; 351*dee1ad47SJeff Kirsher } 352*dee1ad47SJeff Kirsher } 353*dee1ad47SJeff Kirsher { /* Flow Control */ 354*dee1ad47SJeff Kirsher 355*dee1ad47SJeff Kirsher static const struct e1000_opt_list fc_list[] = { 356*dee1ad47SJeff Kirsher { E1000_FC_NONE, "Flow Control Disabled" }, 357*dee1ad47SJeff Kirsher { E1000_FC_RX_PAUSE, "Flow Control Receive Only" }, 358*dee1ad47SJeff Kirsher { E1000_FC_TX_PAUSE, "Flow Control Transmit Only" }, 359*dee1ad47SJeff Kirsher { E1000_FC_FULL, "Flow Control Enabled" }, 360*dee1ad47SJeff Kirsher { E1000_FC_DEFAULT, "Flow Control Hardware Default" } 361*dee1ad47SJeff Kirsher }; 362*dee1ad47SJeff Kirsher 363*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 364*dee1ad47SJeff Kirsher .type = list_option, 365*dee1ad47SJeff Kirsher .name = "Flow Control", 366*dee1ad47SJeff Kirsher .err = "reading default settings from EEPROM", 367*dee1ad47SJeff Kirsher .def = E1000_FC_DEFAULT, 368*dee1ad47SJeff Kirsher .arg = { .l = { .nr = ARRAY_SIZE(fc_list), 369*dee1ad47SJeff Kirsher .p = fc_list }} 370*dee1ad47SJeff Kirsher }; 371*dee1ad47SJeff Kirsher 372*dee1ad47SJeff Kirsher if (num_FlowControl > bd) { 373*dee1ad47SJeff Kirsher unsigned int fc = FlowControl[bd]; 374*dee1ad47SJeff Kirsher e1000_validate_option(&fc, &opt, adapter); 375*dee1ad47SJeff Kirsher adapter->hw.fc = adapter->hw.original_fc = fc; 376*dee1ad47SJeff Kirsher } else { 377*dee1ad47SJeff Kirsher adapter->hw.fc = adapter->hw.original_fc = opt.def; 378*dee1ad47SJeff Kirsher } 379*dee1ad47SJeff Kirsher } 380*dee1ad47SJeff Kirsher { /* Transmit Interrupt Delay */ 381*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 382*dee1ad47SJeff Kirsher .type = range_option, 383*dee1ad47SJeff Kirsher .name = "Transmit Interrupt Delay", 384*dee1ad47SJeff Kirsher .err = "using default of " __MODULE_STRING(DEFAULT_TIDV), 385*dee1ad47SJeff Kirsher .def = DEFAULT_TIDV, 386*dee1ad47SJeff Kirsher .arg = { .r = { .min = MIN_TXDELAY, 387*dee1ad47SJeff Kirsher .max = MAX_TXDELAY }} 388*dee1ad47SJeff Kirsher }; 389*dee1ad47SJeff Kirsher 390*dee1ad47SJeff Kirsher if (num_TxIntDelay > bd) { 391*dee1ad47SJeff Kirsher adapter->tx_int_delay = TxIntDelay[bd]; 392*dee1ad47SJeff Kirsher e1000_validate_option(&adapter->tx_int_delay, &opt, 393*dee1ad47SJeff Kirsher adapter); 394*dee1ad47SJeff Kirsher } else { 395*dee1ad47SJeff Kirsher adapter->tx_int_delay = opt.def; 396*dee1ad47SJeff Kirsher } 397*dee1ad47SJeff Kirsher } 398*dee1ad47SJeff Kirsher { /* Transmit Absolute Interrupt Delay */ 399*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 400*dee1ad47SJeff Kirsher .type = range_option, 401*dee1ad47SJeff Kirsher .name = "Transmit Absolute Interrupt Delay", 402*dee1ad47SJeff Kirsher .err = "using default of " __MODULE_STRING(DEFAULT_TADV), 403*dee1ad47SJeff Kirsher .def = DEFAULT_TADV, 404*dee1ad47SJeff Kirsher .arg = { .r = { .min = MIN_TXABSDELAY, 405*dee1ad47SJeff Kirsher .max = MAX_TXABSDELAY }} 406*dee1ad47SJeff Kirsher }; 407*dee1ad47SJeff Kirsher 408*dee1ad47SJeff Kirsher if (num_TxAbsIntDelay > bd) { 409*dee1ad47SJeff Kirsher adapter->tx_abs_int_delay = TxAbsIntDelay[bd]; 410*dee1ad47SJeff Kirsher e1000_validate_option(&adapter->tx_abs_int_delay, &opt, 411*dee1ad47SJeff Kirsher adapter); 412*dee1ad47SJeff Kirsher } else { 413*dee1ad47SJeff Kirsher adapter->tx_abs_int_delay = opt.def; 414*dee1ad47SJeff Kirsher } 415*dee1ad47SJeff Kirsher } 416*dee1ad47SJeff Kirsher { /* Receive Interrupt Delay */ 417*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 418*dee1ad47SJeff Kirsher .type = range_option, 419*dee1ad47SJeff Kirsher .name = "Receive Interrupt Delay", 420*dee1ad47SJeff Kirsher .err = "using default of " __MODULE_STRING(DEFAULT_RDTR), 421*dee1ad47SJeff Kirsher .def = DEFAULT_RDTR, 422*dee1ad47SJeff Kirsher .arg = { .r = { .min = MIN_RXDELAY, 423*dee1ad47SJeff Kirsher .max = MAX_RXDELAY }} 424*dee1ad47SJeff Kirsher }; 425*dee1ad47SJeff Kirsher 426*dee1ad47SJeff Kirsher if (num_RxIntDelay > bd) { 427*dee1ad47SJeff Kirsher adapter->rx_int_delay = RxIntDelay[bd]; 428*dee1ad47SJeff Kirsher e1000_validate_option(&adapter->rx_int_delay, &opt, 429*dee1ad47SJeff Kirsher adapter); 430*dee1ad47SJeff Kirsher } else { 431*dee1ad47SJeff Kirsher adapter->rx_int_delay = opt.def; 432*dee1ad47SJeff Kirsher } 433*dee1ad47SJeff Kirsher } 434*dee1ad47SJeff Kirsher { /* Receive Absolute Interrupt Delay */ 435*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 436*dee1ad47SJeff Kirsher .type = range_option, 437*dee1ad47SJeff Kirsher .name = "Receive Absolute Interrupt Delay", 438*dee1ad47SJeff Kirsher .err = "using default of " __MODULE_STRING(DEFAULT_RADV), 439*dee1ad47SJeff Kirsher .def = DEFAULT_RADV, 440*dee1ad47SJeff Kirsher .arg = { .r = { .min = MIN_RXABSDELAY, 441*dee1ad47SJeff Kirsher .max = MAX_RXABSDELAY }} 442*dee1ad47SJeff Kirsher }; 443*dee1ad47SJeff Kirsher 444*dee1ad47SJeff Kirsher if (num_RxAbsIntDelay > bd) { 445*dee1ad47SJeff Kirsher adapter->rx_abs_int_delay = RxAbsIntDelay[bd]; 446*dee1ad47SJeff Kirsher e1000_validate_option(&adapter->rx_abs_int_delay, &opt, 447*dee1ad47SJeff Kirsher adapter); 448*dee1ad47SJeff Kirsher } else { 449*dee1ad47SJeff Kirsher adapter->rx_abs_int_delay = opt.def; 450*dee1ad47SJeff Kirsher } 451*dee1ad47SJeff Kirsher } 452*dee1ad47SJeff Kirsher { /* Interrupt Throttling Rate */ 453*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 454*dee1ad47SJeff Kirsher .type = range_option, 455*dee1ad47SJeff Kirsher .name = "Interrupt Throttling Rate (ints/sec)", 456*dee1ad47SJeff Kirsher .err = "using default of " __MODULE_STRING(DEFAULT_ITR), 457*dee1ad47SJeff Kirsher .def = DEFAULT_ITR, 458*dee1ad47SJeff Kirsher .arg = { .r = { .min = MIN_ITR, 459*dee1ad47SJeff Kirsher .max = MAX_ITR }} 460*dee1ad47SJeff Kirsher }; 461*dee1ad47SJeff Kirsher 462*dee1ad47SJeff Kirsher if (num_InterruptThrottleRate > bd) { 463*dee1ad47SJeff Kirsher adapter->itr = InterruptThrottleRate[bd]; 464*dee1ad47SJeff Kirsher switch (adapter->itr) { 465*dee1ad47SJeff Kirsher case 0: 466*dee1ad47SJeff Kirsher e_dev_info("%s turned off\n", opt.name); 467*dee1ad47SJeff Kirsher break; 468*dee1ad47SJeff Kirsher case 1: 469*dee1ad47SJeff Kirsher e_dev_info("%s set to dynamic mode\n", 470*dee1ad47SJeff Kirsher opt.name); 471*dee1ad47SJeff Kirsher adapter->itr_setting = adapter->itr; 472*dee1ad47SJeff Kirsher adapter->itr = 20000; 473*dee1ad47SJeff Kirsher break; 474*dee1ad47SJeff Kirsher case 3: 475*dee1ad47SJeff Kirsher e_dev_info("%s set to dynamic conservative " 476*dee1ad47SJeff Kirsher "mode\n", opt.name); 477*dee1ad47SJeff Kirsher adapter->itr_setting = adapter->itr; 478*dee1ad47SJeff Kirsher adapter->itr = 20000; 479*dee1ad47SJeff Kirsher break; 480*dee1ad47SJeff Kirsher case 4: 481*dee1ad47SJeff Kirsher e_dev_info("%s set to simplified " 482*dee1ad47SJeff Kirsher "(2000-8000) ints mode\n", opt.name); 483*dee1ad47SJeff Kirsher adapter->itr_setting = adapter->itr; 484*dee1ad47SJeff Kirsher break; 485*dee1ad47SJeff Kirsher default: 486*dee1ad47SJeff Kirsher e1000_validate_option(&adapter->itr, &opt, 487*dee1ad47SJeff Kirsher adapter); 488*dee1ad47SJeff Kirsher /* save the setting, because the dynamic bits 489*dee1ad47SJeff Kirsher * change itr. 490*dee1ad47SJeff Kirsher * clear the lower two bits because they are 491*dee1ad47SJeff Kirsher * used as control */ 492*dee1ad47SJeff Kirsher adapter->itr_setting = adapter->itr & ~3; 493*dee1ad47SJeff Kirsher break; 494*dee1ad47SJeff Kirsher } 495*dee1ad47SJeff Kirsher } else { 496*dee1ad47SJeff Kirsher adapter->itr_setting = opt.def; 497*dee1ad47SJeff Kirsher adapter->itr = 20000; 498*dee1ad47SJeff Kirsher } 499*dee1ad47SJeff Kirsher } 500*dee1ad47SJeff Kirsher { /* Smart Power Down */ 501*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 502*dee1ad47SJeff Kirsher .type = enable_option, 503*dee1ad47SJeff Kirsher .name = "PHY Smart Power Down", 504*dee1ad47SJeff Kirsher .err = "defaulting to Disabled", 505*dee1ad47SJeff Kirsher .def = OPTION_DISABLED 506*dee1ad47SJeff Kirsher }; 507*dee1ad47SJeff Kirsher 508*dee1ad47SJeff Kirsher if (num_SmartPowerDownEnable > bd) { 509*dee1ad47SJeff Kirsher unsigned int spd = SmartPowerDownEnable[bd]; 510*dee1ad47SJeff Kirsher e1000_validate_option(&spd, &opt, adapter); 511*dee1ad47SJeff Kirsher adapter->smart_power_down = spd; 512*dee1ad47SJeff Kirsher } else { 513*dee1ad47SJeff Kirsher adapter->smart_power_down = opt.def; 514*dee1ad47SJeff Kirsher } 515*dee1ad47SJeff Kirsher } 516*dee1ad47SJeff Kirsher 517*dee1ad47SJeff Kirsher switch (adapter->hw.media_type) { 518*dee1ad47SJeff Kirsher case e1000_media_type_fiber: 519*dee1ad47SJeff Kirsher case e1000_media_type_internal_serdes: 520*dee1ad47SJeff Kirsher e1000_check_fiber_options(adapter); 521*dee1ad47SJeff Kirsher break; 522*dee1ad47SJeff Kirsher case e1000_media_type_copper: 523*dee1ad47SJeff Kirsher e1000_check_copper_options(adapter); 524*dee1ad47SJeff Kirsher break; 525*dee1ad47SJeff Kirsher default: 526*dee1ad47SJeff Kirsher BUG(); 527*dee1ad47SJeff Kirsher } 528*dee1ad47SJeff Kirsher } 529*dee1ad47SJeff Kirsher 530*dee1ad47SJeff Kirsher /** 531*dee1ad47SJeff Kirsher * e1000_check_fiber_options - Range Checking for Link Options, Fiber Version 532*dee1ad47SJeff Kirsher * @adapter: board private structure 533*dee1ad47SJeff Kirsher * 534*dee1ad47SJeff Kirsher * Handles speed and duplex options on fiber adapters 535*dee1ad47SJeff Kirsher **/ 536*dee1ad47SJeff Kirsher 537*dee1ad47SJeff Kirsher static void __devinit e1000_check_fiber_options(struct e1000_adapter *adapter) 538*dee1ad47SJeff Kirsher { 539*dee1ad47SJeff Kirsher int bd = adapter->bd_number; 540*dee1ad47SJeff Kirsher if (num_Speed > bd) { 541*dee1ad47SJeff Kirsher e_dev_info("Speed not valid for fiber adapters, parameter " 542*dee1ad47SJeff Kirsher "ignored\n"); 543*dee1ad47SJeff Kirsher } 544*dee1ad47SJeff Kirsher 545*dee1ad47SJeff Kirsher if (num_Duplex > bd) { 546*dee1ad47SJeff Kirsher e_dev_info("Duplex not valid for fiber adapters, parameter " 547*dee1ad47SJeff Kirsher "ignored\n"); 548*dee1ad47SJeff Kirsher } 549*dee1ad47SJeff Kirsher 550*dee1ad47SJeff Kirsher if ((num_AutoNeg > bd) && (AutoNeg[bd] != 0x20)) { 551*dee1ad47SJeff Kirsher e_dev_info("AutoNeg other than 1000/Full is not valid for fiber" 552*dee1ad47SJeff Kirsher "adapters, parameter ignored\n"); 553*dee1ad47SJeff Kirsher } 554*dee1ad47SJeff Kirsher } 555*dee1ad47SJeff Kirsher 556*dee1ad47SJeff Kirsher /** 557*dee1ad47SJeff Kirsher * e1000_check_copper_options - Range Checking for Link Options, Copper Version 558*dee1ad47SJeff Kirsher * @adapter: board private structure 559*dee1ad47SJeff Kirsher * 560*dee1ad47SJeff Kirsher * Handles speed and duplex options on copper adapters 561*dee1ad47SJeff Kirsher **/ 562*dee1ad47SJeff Kirsher 563*dee1ad47SJeff Kirsher static void __devinit e1000_check_copper_options(struct e1000_adapter *adapter) 564*dee1ad47SJeff Kirsher { 565*dee1ad47SJeff Kirsher struct e1000_option opt; 566*dee1ad47SJeff Kirsher unsigned int speed, dplx, an; 567*dee1ad47SJeff Kirsher int bd = adapter->bd_number; 568*dee1ad47SJeff Kirsher 569*dee1ad47SJeff Kirsher { /* Speed */ 570*dee1ad47SJeff Kirsher static const struct e1000_opt_list speed_list[] = { 571*dee1ad47SJeff Kirsher { 0, "" }, 572*dee1ad47SJeff Kirsher { SPEED_10, "" }, 573*dee1ad47SJeff Kirsher { SPEED_100, "" }, 574*dee1ad47SJeff Kirsher { SPEED_1000, "" }}; 575*dee1ad47SJeff Kirsher 576*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 577*dee1ad47SJeff Kirsher .type = list_option, 578*dee1ad47SJeff Kirsher .name = "Speed", 579*dee1ad47SJeff Kirsher .err = "parameter ignored", 580*dee1ad47SJeff Kirsher .def = 0, 581*dee1ad47SJeff Kirsher .arg = { .l = { .nr = ARRAY_SIZE(speed_list), 582*dee1ad47SJeff Kirsher .p = speed_list }} 583*dee1ad47SJeff Kirsher }; 584*dee1ad47SJeff Kirsher 585*dee1ad47SJeff Kirsher if (num_Speed > bd) { 586*dee1ad47SJeff Kirsher speed = Speed[bd]; 587*dee1ad47SJeff Kirsher e1000_validate_option(&speed, &opt, adapter); 588*dee1ad47SJeff Kirsher } else { 589*dee1ad47SJeff Kirsher speed = opt.def; 590*dee1ad47SJeff Kirsher } 591*dee1ad47SJeff Kirsher } 592*dee1ad47SJeff Kirsher { /* Duplex */ 593*dee1ad47SJeff Kirsher static const struct e1000_opt_list dplx_list[] = { 594*dee1ad47SJeff Kirsher { 0, "" }, 595*dee1ad47SJeff Kirsher { HALF_DUPLEX, "" }, 596*dee1ad47SJeff Kirsher { FULL_DUPLEX, "" }}; 597*dee1ad47SJeff Kirsher 598*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 599*dee1ad47SJeff Kirsher .type = list_option, 600*dee1ad47SJeff Kirsher .name = "Duplex", 601*dee1ad47SJeff Kirsher .err = "parameter ignored", 602*dee1ad47SJeff Kirsher .def = 0, 603*dee1ad47SJeff Kirsher .arg = { .l = { .nr = ARRAY_SIZE(dplx_list), 604*dee1ad47SJeff Kirsher .p = dplx_list }} 605*dee1ad47SJeff Kirsher }; 606*dee1ad47SJeff Kirsher 607*dee1ad47SJeff Kirsher if (num_Duplex > bd) { 608*dee1ad47SJeff Kirsher dplx = Duplex[bd]; 609*dee1ad47SJeff Kirsher e1000_validate_option(&dplx, &opt, adapter); 610*dee1ad47SJeff Kirsher } else { 611*dee1ad47SJeff Kirsher dplx = opt.def; 612*dee1ad47SJeff Kirsher } 613*dee1ad47SJeff Kirsher } 614*dee1ad47SJeff Kirsher 615*dee1ad47SJeff Kirsher if ((num_AutoNeg > bd) && (speed != 0 || dplx != 0)) { 616*dee1ad47SJeff Kirsher e_dev_info("AutoNeg specified along with Speed or Duplex, " 617*dee1ad47SJeff Kirsher "parameter ignored\n"); 618*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = AUTONEG_ADV_DEFAULT; 619*dee1ad47SJeff Kirsher } else { /* Autoneg */ 620*dee1ad47SJeff Kirsher static const struct e1000_opt_list an_list[] = 621*dee1ad47SJeff Kirsher #define AA "AutoNeg advertising " 622*dee1ad47SJeff Kirsher {{ 0x01, AA "10/HD" }, 623*dee1ad47SJeff Kirsher { 0x02, AA "10/FD" }, 624*dee1ad47SJeff Kirsher { 0x03, AA "10/FD, 10/HD" }, 625*dee1ad47SJeff Kirsher { 0x04, AA "100/HD" }, 626*dee1ad47SJeff Kirsher { 0x05, AA "100/HD, 10/HD" }, 627*dee1ad47SJeff Kirsher { 0x06, AA "100/HD, 10/FD" }, 628*dee1ad47SJeff Kirsher { 0x07, AA "100/HD, 10/FD, 10/HD" }, 629*dee1ad47SJeff Kirsher { 0x08, AA "100/FD" }, 630*dee1ad47SJeff Kirsher { 0x09, AA "100/FD, 10/HD" }, 631*dee1ad47SJeff Kirsher { 0x0a, AA "100/FD, 10/FD" }, 632*dee1ad47SJeff Kirsher { 0x0b, AA "100/FD, 10/FD, 10/HD" }, 633*dee1ad47SJeff Kirsher { 0x0c, AA "100/FD, 100/HD" }, 634*dee1ad47SJeff Kirsher { 0x0d, AA "100/FD, 100/HD, 10/HD" }, 635*dee1ad47SJeff Kirsher { 0x0e, AA "100/FD, 100/HD, 10/FD" }, 636*dee1ad47SJeff Kirsher { 0x0f, AA "100/FD, 100/HD, 10/FD, 10/HD" }, 637*dee1ad47SJeff Kirsher { 0x20, AA "1000/FD" }, 638*dee1ad47SJeff Kirsher { 0x21, AA "1000/FD, 10/HD" }, 639*dee1ad47SJeff Kirsher { 0x22, AA "1000/FD, 10/FD" }, 640*dee1ad47SJeff Kirsher { 0x23, AA "1000/FD, 10/FD, 10/HD" }, 641*dee1ad47SJeff Kirsher { 0x24, AA "1000/FD, 100/HD" }, 642*dee1ad47SJeff Kirsher { 0x25, AA "1000/FD, 100/HD, 10/HD" }, 643*dee1ad47SJeff Kirsher { 0x26, AA "1000/FD, 100/HD, 10/FD" }, 644*dee1ad47SJeff Kirsher { 0x27, AA "1000/FD, 100/HD, 10/FD, 10/HD" }, 645*dee1ad47SJeff Kirsher { 0x28, AA "1000/FD, 100/FD" }, 646*dee1ad47SJeff Kirsher { 0x29, AA "1000/FD, 100/FD, 10/HD" }, 647*dee1ad47SJeff Kirsher { 0x2a, AA "1000/FD, 100/FD, 10/FD" }, 648*dee1ad47SJeff Kirsher { 0x2b, AA "1000/FD, 100/FD, 10/FD, 10/HD" }, 649*dee1ad47SJeff Kirsher { 0x2c, AA "1000/FD, 100/FD, 100/HD" }, 650*dee1ad47SJeff Kirsher { 0x2d, AA "1000/FD, 100/FD, 100/HD, 10/HD" }, 651*dee1ad47SJeff Kirsher { 0x2e, AA "1000/FD, 100/FD, 100/HD, 10/FD" }, 652*dee1ad47SJeff Kirsher { 0x2f, AA "1000/FD, 100/FD, 100/HD, 10/FD, 10/HD" }}; 653*dee1ad47SJeff Kirsher 654*dee1ad47SJeff Kirsher opt = (struct e1000_option) { 655*dee1ad47SJeff Kirsher .type = list_option, 656*dee1ad47SJeff Kirsher .name = "AutoNeg", 657*dee1ad47SJeff Kirsher .err = "parameter ignored", 658*dee1ad47SJeff Kirsher .def = AUTONEG_ADV_DEFAULT, 659*dee1ad47SJeff Kirsher .arg = { .l = { .nr = ARRAY_SIZE(an_list), 660*dee1ad47SJeff Kirsher .p = an_list }} 661*dee1ad47SJeff Kirsher }; 662*dee1ad47SJeff Kirsher 663*dee1ad47SJeff Kirsher if (num_AutoNeg > bd) { 664*dee1ad47SJeff Kirsher an = AutoNeg[bd]; 665*dee1ad47SJeff Kirsher e1000_validate_option(&an, &opt, adapter); 666*dee1ad47SJeff Kirsher } else { 667*dee1ad47SJeff Kirsher an = opt.def; 668*dee1ad47SJeff Kirsher } 669*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = an; 670*dee1ad47SJeff Kirsher } 671*dee1ad47SJeff Kirsher 672*dee1ad47SJeff Kirsher switch (speed + dplx) { 673*dee1ad47SJeff Kirsher case 0: 674*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 675*dee1ad47SJeff Kirsher if ((num_Speed > bd) && (speed != 0 || dplx != 0)) 676*dee1ad47SJeff Kirsher e_dev_info("Speed and duplex autonegotiation " 677*dee1ad47SJeff Kirsher "enabled\n"); 678*dee1ad47SJeff Kirsher break; 679*dee1ad47SJeff Kirsher case HALF_DUPLEX: 680*dee1ad47SJeff Kirsher e_dev_info("Half Duplex specified without Speed\n"); 681*dee1ad47SJeff Kirsher e_dev_info("Using Autonegotiation at Half Duplex only\n"); 682*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 683*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 684*dee1ad47SJeff Kirsher ADVERTISE_100_HALF; 685*dee1ad47SJeff Kirsher break; 686*dee1ad47SJeff Kirsher case FULL_DUPLEX: 687*dee1ad47SJeff Kirsher e_dev_info("Full Duplex specified without Speed\n"); 688*dee1ad47SJeff Kirsher e_dev_info("Using Autonegotiation at Full Duplex only\n"); 689*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 690*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = ADVERTISE_10_FULL | 691*dee1ad47SJeff Kirsher ADVERTISE_100_FULL | 692*dee1ad47SJeff Kirsher ADVERTISE_1000_FULL; 693*dee1ad47SJeff Kirsher break; 694*dee1ad47SJeff Kirsher case SPEED_10: 695*dee1ad47SJeff Kirsher e_dev_info("10 Mbps Speed specified without Duplex\n"); 696*dee1ad47SJeff Kirsher e_dev_info("Using Autonegotiation at 10 Mbps only\n"); 697*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 698*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = ADVERTISE_10_HALF | 699*dee1ad47SJeff Kirsher ADVERTISE_10_FULL; 700*dee1ad47SJeff Kirsher break; 701*dee1ad47SJeff Kirsher case SPEED_10 + HALF_DUPLEX: 702*dee1ad47SJeff Kirsher e_dev_info("Forcing to 10 Mbps Half Duplex\n"); 703*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 0; 704*dee1ad47SJeff Kirsher adapter->hw.forced_speed_duplex = e1000_10_half; 705*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = 0; 706*dee1ad47SJeff Kirsher break; 707*dee1ad47SJeff Kirsher case SPEED_10 + FULL_DUPLEX: 708*dee1ad47SJeff Kirsher e_dev_info("Forcing to 10 Mbps Full Duplex\n"); 709*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 0; 710*dee1ad47SJeff Kirsher adapter->hw.forced_speed_duplex = e1000_10_full; 711*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = 0; 712*dee1ad47SJeff Kirsher break; 713*dee1ad47SJeff Kirsher case SPEED_100: 714*dee1ad47SJeff Kirsher e_dev_info("100 Mbps Speed specified without Duplex\n"); 715*dee1ad47SJeff Kirsher e_dev_info("Using Autonegotiation at 100 Mbps only\n"); 716*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 717*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = ADVERTISE_100_HALF | 718*dee1ad47SJeff Kirsher ADVERTISE_100_FULL; 719*dee1ad47SJeff Kirsher break; 720*dee1ad47SJeff Kirsher case SPEED_100 + HALF_DUPLEX: 721*dee1ad47SJeff Kirsher e_dev_info("Forcing to 100 Mbps Half Duplex\n"); 722*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 0; 723*dee1ad47SJeff Kirsher adapter->hw.forced_speed_duplex = e1000_100_half; 724*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = 0; 725*dee1ad47SJeff Kirsher break; 726*dee1ad47SJeff Kirsher case SPEED_100 + FULL_DUPLEX: 727*dee1ad47SJeff Kirsher e_dev_info("Forcing to 100 Mbps Full Duplex\n"); 728*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 0; 729*dee1ad47SJeff Kirsher adapter->hw.forced_speed_duplex = e1000_100_full; 730*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = 0; 731*dee1ad47SJeff Kirsher break; 732*dee1ad47SJeff Kirsher case SPEED_1000: 733*dee1ad47SJeff Kirsher e_dev_info("1000 Mbps Speed specified without Duplex\n"); 734*dee1ad47SJeff Kirsher goto full_duplex_only; 735*dee1ad47SJeff Kirsher case SPEED_1000 + HALF_DUPLEX: 736*dee1ad47SJeff Kirsher e_dev_info("Half Duplex is not supported at 1000 Mbps\n"); 737*dee1ad47SJeff Kirsher /* fall through */ 738*dee1ad47SJeff Kirsher case SPEED_1000 + FULL_DUPLEX: 739*dee1ad47SJeff Kirsher full_duplex_only: 740*dee1ad47SJeff Kirsher e_dev_info("Using Autonegotiation at 1000 Mbps Full Duplex " 741*dee1ad47SJeff Kirsher "only\n"); 742*dee1ad47SJeff Kirsher adapter->hw.autoneg = adapter->fc_autoneg = 1; 743*dee1ad47SJeff Kirsher adapter->hw.autoneg_advertised = ADVERTISE_1000_FULL; 744*dee1ad47SJeff Kirsher break; 745*dee1ad47SJeff Kirsher default: 746*dee1ad47SJeff Kirsher BUG(); 747*dee1ad47SJeff Kirsher } 748*dee1ad47SJeff Kirsher 749*dee1ad47SJeff Kirsher /* Speed, AutoNeg and MDI/MDI-X must all play nice */ 750*dee1ad47SJeff Kirsher if (e1000_validate_mdi_setting(&(adapter->hw)) < 0) { 751*dee1ad47SJeff Kirsher e_dev_info("Speed, AutoNeg and MDI-X specs are incompatible. " 752*dee1ad47SJeff Kirsher "Setting MDI-X to a compatible value.\n"); 753*dee1ad47SJeff Kirsher } 754*dee1ad47SJeff Kirsher } 755*dee1ad47SJeff Kirsher 756