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