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