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