Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
3fa8f148
Commit
3fa8f148
authored
Jan 11, 2005
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge pobox.com:/garz/repo/linux-2.6
into pobox.com:/garz/repo/net-drivers-2.6
parents
04a2b7d0
adec6e14
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
1419 additions
and
1092 deletions
+1419
-1092
drivers/net/arcnet/arcnet.c
drivers/net/arcnet/arcnet.c
+1
-2
drivers/net/e1000/e1000_ethtool.c
drivers/net/e1000/e1000_ethtool.c
+1
-1
drivers/net/e1000/e1000_main.c
drivers/net/e1000/e1000_main.c
+2
-2
drivers/net/eepro.c
drivers/net/eepro.c
+111
-33
drivers/net/ibm_emac/ibm_emac.h
drivers/net/ibm_emac/ibm_emac.h
+1
-1
drivers/net/ibm_emac/ibm_emac_core.c
drivers/net/ibm_emac/ibm_emac_core.c
+15
-0
drivers/net/ibm_emac/ibm_emac_phy.c
drivers/net/ibm_emac/ibm_emac_phy.c
+10
-9
drivers/net/ixgb/ixgb.h
drivers/net/ixgb/ixgb.h
+21
-4
drivers/net/ixgb/ixgb_ee.c
drivers/net/ixgb/ixgb_ee.c
+114
-78
drivers/net/ixgb/ixgb_ethtool.c
drivers/net/ixgb/ixgb_ethtool.c
+332
-186
drivers/net/ixgb/ixgb_hw.c
drivers/net/ixgb/ixgb_hw.c
+140
-91
drivers/net/ixgb/ixgb_hw.h
drivers/net/ixgb/ixgb_hw.h
+30
-20
drivers/net/ixgb/ixgb_ids.h
drivers/net/ixgb/ixgb_ids.h
+8
-13
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgb/ixgb_main.c
+358
-349
drivers/net/ixgb/ixgb_osdep.h
drivers/net/ixgb/ixgb_osdep.h
+5
-5
drivers/net/ixgb/ixgb_param.c
drivers/net/ixgb/ixgb_param.c
+155
-161
drivers/net/s2io.c
drivers/net/s2io.c
+18
-4
drivers/net/s2io.h
drivers/net/s2io.h
+2
-2
drivers/net/smc-ultra.c
drivers/net/smc-ultra.c
+0
-2
drivers/net/smc91x.c
drivers/net/smc91x.c
+16
-0
drivers/net/wireless/orinoco.c
drivers/net/wireless/orinoco.c
+77
-126
drivers/net/wireless/wl3501_cs.c
drivers/net/wireless/wl3501_cs.c
+2
-2
include/linux/arcdevice.h
include/linux/arcdevice.h
+0
-1
No files found.
drivers/net/arcnet/arcnet.c
View file @
3fa8f148
...
...
@@ -93,7 +93,6 @@ EXPORT_SYMBOL(arc_raw_proto);
EXPORT_SYMBOL
(
arc_proto_null
);
EXPORT_SYMBOL
(
arcnet_unregister_proto
);
EXPORT_SYMBOL
(
arcnet_debug
);
EXPORT_SYMBOL
(
arcdev_setup
);
EXPORT_SYMBOL
(
alloc_arcdev
);
EXPORT_SYMBOL
(
arcnet_interrupt
);
...
...
@@ -317,7 +316,7 @@ static int choose_mtu(void)
/* Setup a struct device for ARCnet. */
void
arcdev_setup
(
struct
net_device
*
dev
)
static
void
arcdev_setup
(
struct
net_device
*
dev
)
{
dev
->
type
=
ARPHRD_ARCNET
;
dev
->
hard_header_len
=
sizeof
(
struct
archdr
);
...
...
drivers/net/e1000/e1000_ethtool.c
View file @
3fa8f148
...
...
@@ -1666,7 +1666,7 @@ struct ethtool_ops e1000_ethtool_ops = {
.
get_ethtool_stats
=
e1000_get_ethtool_stats
,
};
void
set_ethtool_ops
(
struct
net_device
*
netdev
)
void
e1000_
set_ethtool_ops
(
struct
net_device
*
netdev
)
{
SET_ETHTOOL_OPS
(
netdev
,
&
e1000_ethtool_ops
);
}
drivers/net/e1000/e1000_main.c
View file @
3fa8f148
...
...
@@ -151,7 +151,7 @@ static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter);
static
int
e1000_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
,
int
cmd
);
static
int
e1000_mii_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
,
int
cmd
);
void
set_ethtool_ops
(
struct
net_device
*
netdev
);
void
e1000_
set_ethtool_ops
(
struct
net_device
*
netdev
);
static
void
e1000_enter_82542_rst
(
struct
e1000_adapter
*
adapter
);
static
void
e1000_leave_82542_rst
(
struct
e1000_adapter
*
adapter
);
static
void
e1000_tx_timeout
(
struct
net_device
*
dev
);
...
...
@@ -475,7 +475,7 @@ e1000_probe(struct pci_dev *pdev,
netdev
->
set_mac_address
=
&
e1000_set_mac
;
netdev
->
change_mtu
=
&
e1000_change_mtu
;
netdev
->
do_ioctl
=
&
e1000_ioctl
;
set_ethtool_ops
(
netdev
);
e1000_
set_ethtool_ops
(
netdev
);
netdev
->
tx_timeout
=
&
e1000_tx_timeout
;
netdev
->
watchdog_timeo
=
5
*
HZ
;
#ifdef CONFIG_E1000_NAPI
...
...
drivers/net/eepro.c
View file @
3fa8f148
...
...
@@ -23,6 +23,7 @@
This is a compatibility hardware problem.
Versions:
0.13b basic ethtool support (aris, 09/13/2004)
0.13a in memory shortage, drop packets also in board
(Michael Westermann <mw@microdata-pos.de>, 07/30/2002)
0.13 irq sharing, rewrote probe function, fixed a nasty bug in
...
...
@@ -104,7 +105,7 @@
*/
static
const
char
version
[]
=
"eepro.c: v0.13
11/08/2001
aris@cathedrallabs.org
\n
"
;
"eepro.c: v0.13
b 09/13/2004
aris@cathedrallabs.org
\n
"
;
#include <linux/module.h>
...
...
@@ -146,19 +147,21 @@ static const char version[] =
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/bitops.h>
#include <linux/ethtool.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/dma.h>
#define DRV_NAME "eepro"
#define DRV_VERSION "0.13b"
#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) )
/* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */
#define SLOW_DOWN inb(0x80)
/* udelay(2) */
#define compat_init_data __initdata
enum
iftype
{
AUI
=
0
,
BNC
=
1
,
TPE
=
2
};
/* First, a few definitions that the brave might change. */
/* A zero-terminated list of I/O addresses to be probed. */
...
...
@@ -214,6 +217,7 @@ struct eepro_local {
short
rcv_lower_limit
;
short
rcv_upper_limit
;
unsigned
char
eeprom_reg
;
unsigned
short
word
[
8
];
};
/* The station (ethernet) address prefix, used for IDing the board. */
...
...
@@ -608,16 +612,22 @@ struct net_device * __init eepro_probe(int unit)
}
#endif
static
void
__init
printEEPROMInfo
(
s
hort
ioaddr
,
s
truct
net_device
*
dev
)
static
void
__init
printEEPROMInfo
(
struct
net_device
*
dev
)
{
struct
eepro_local
*
lp
=
(
struct
eepro_local
*
)
dev
->
priv
;
int
ioaddr
=
dev
->
base_addr
;
unsigned
short
Word
;
int
i
,
j
;
for
(
i
=
0
,
j
=
ee_Checksum
;
i
<
ee_SIZE
;
i
++
)
j
+=
read_eeprom
(
ioaddr
,
i
,
dev
);
j
=
ee_Checksum
;
for
(
i
=
0
;
i
<
8
;
i
++
)
j
+=
lp
->
word
[
i
];
for
(
;
i
<
ee_SIZE
;
i
++
)
j
+=
read_eeprom
(
ioaddr
,
i
,
dev
);
printk
(
KERN_DEBUG
"Checksum: %#x
\n
"
,
j
&
0xffff
);
Word
=
read_eeprom
(
ioaddr
,
0
,
dev
)
;
Word
=
lp
->
word
[
0
]
;
printk
(
KERN_DEBUG
"Word0:
\n
"
);
printk
(
KERN_DEBUG
" Plug 'n Pray: %d
\n
"
,
GetBit
(
Word
,
ee_PnP
));
printk
(
KERN_DEBUG
" Buswidth: %d
\n
"
,(
GetBit
(
Word
,
ee_BusWidth
)
+
1
)
*
8
);
...
...
@@ -625,7 +635,7 @@ static void __init printEEPROMInfo(short ioaddr, struct net_device *dev)
printk
(
KERN_DEBUG
" IO Address: %#x
\n
"
,
(
Word
>>
ee_IO0
)
<<
4
);
if
(
net_debug
>
4
)
{
Word
=
read_eeprom
(
ioaddr
,
1
,
dev
)
;
Word
=
lp
->
word
[
1
]
;
printk
(
KERN_DEBUG
"Word1:
\n
"
);
printk
(
KERN_DEBUG
" INT: %d
\n
"
,
Word
&
ee_IntMask
);
printk
(
KERN_DEBUG
" LI: %d
\n
"
,
GetBit
(
Word
,
ee_LI
));
...
...
@@ -636,7 +646,7 @@ static void __init printEEPROMInfo(short ioaddr, struct net_device *dev)
printk
(
KERN_DEBUG
" Duplex: %d
\n
"
,
GetBit
(
Word
,
ee_Duplex
));
}
Word
=
read_eeprom
(
ioaddr
,
5
,
dev
)
;
Word
=
lp
->
word
[
5
]
;
printk
(
KERN_DEBUG
"Word5:
\n
"
);
printk
(
KERN_DEBUG
" BNC: %d
\n
"
,
GetBit
(
Word
,
ee_BNC_TPE
));
printk
(
KERN_DEBUG
" NumConnectors: %d
\n
"
,
GetBit
(
Word
,
ee_NumConn
));
...
...
@@ -646,12 +656,12 @@ static void __init printEEPROMInfo(short ioaddr, struct net_device *dev)
if
(
GetBit
(
Word
,
ee_PortAUI
))
printk
(
KERN_DEBUG
"AUI "
);
printk
(
KERN_DEBUG
"port(s)
\n
"
);
Word
=
read_eeprom
(
ioaddr
,
6
,
dev
)
;
Word
=
lp
->
word
[
6
]
;
printk
(
KERN_DEBUG
"Word6:
\n
"
);
printk
(
KERN_DEBUG
" Stepping: %d
\n
"
,
Word
&
ee_StepMask
);
printk
(
KERN_DEBUG
" BoardID: %d
\n
"
,
Word
>>
ee_BoardID
);
Word
=
read_eeprom
(
ioaddr
,
7
,
dev
)
;
Word
=
lp
->
word
[
7
]
;
printk
(
KERN_DEBUG
"Word7:
\n
"
);
printk
(
KERN_DEBUG
" INT to IRQ:
\n
"
);
...
...
@@ -725,7 +735,7 @@ static void __init eepro_print_info (struct net_device *dev)
printk
(
", %s.
\n
"
,
ifmap
[
dev
->
if_port
]);
if
(
net_debug
>
3
)
{
i
=
read_eeprom
(
dev
->
base_addr
,
5
,
dev
)
;
i
=
lp
->
word
[
5
]
;
if
(
i
&
0x2000
)
/* bit 13 of EEPROM word 5 */
printk
(
KERN_DEBUG
"%s: Concurrent Processing is "
"enabled but not used!
\n
"
,
dev
->
name
);
...
...
@@ -733,19 +743,20 @@ static void __init eepro_print_info (struct net_device *dev)
/* Check the station address for the manufacturer's code */
if
(
net_debug
>
3
)
printEEPROMInfo
(
dev
->
base_addr
,
dev
);
printEEPROMInfo
(
dev
);
}
static
struct
ethtool_ops
eepro_ethtool_ops
;
/* This is the real probe routine. Linux has a history of friendly device
probes on the ISA bus. A good device probe avoids doing writes, and
verifies that the correct device exists and functions. */
static
int
__init
eepro_probe1
(
struct
net_device
*
dev
,
int
autoprobe
)
{
unsigned
short
station_addr
[
6
],
id
,
counter
;
unsigned
short
station_addr
[
3
],
id
,
counter
;
int
i
;
struct
eepro_local
*
lp
;
enum
iftype
{
AUI
=
0
,
BNC
=
1
,
TPE
=
2
};
int
ioaddr
=
dev
->
base_addr
;
/* Grab the region so we can find another board if autoIRQ fails. */
...
...
@@ -796,11 +807,16 @@ static int __init eepro_probe1(struct net_device *dev, int autoprobe)
lp
->
xmt_bar
=
XMT_BAR_10
;
station_addr
[
0
]
=
read_eeprom
(
ioaddr
,
2
,
dev
);
}
station_addr
[
1
]
=
read_eeprom
(
ioaddr
,
3
,
dev
);
station_addr
[
2
]
=
read_eeprom
(
ioaddr
,
4
,
dev
);
/* get all words at once. will be used here and for ethtool */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
lp
->
word
[
i
]
=
read_eeprom
(
ioaddr
,
i
,
dev
);
}
station_addr
[
1
]
=
lp
->
word
[
3
];
station_addr
[
2
]
=
lp
->
word
[
4
];
if
(
!
lp
->
eepro
)
{
if
(
read_eeprom
(
ioaddr
,
7
,
dev
)
==
ee_FX_INT2IRQ
)
if
(
lp
->
word
[
7
]
==
ee_FX_INT2IRQ
)
lp
->
eepro
=
2
;
else
if
(
station_addr
[
2
]
==
SA_ADDR1
)
lp
->
eepro
=
1
;
...
...
@@ -817,15 +833,15 @@ static int __init eepro_probe1(struct net_device *dev, int autoprobe)
/* calculate {xmt,rcv}_{lower,upper}_limit */
eepro_recalc
(
dev
);
if
(
GetBit
(
read_eeprom
(
ioaddr
,
5
,
dev
),
ee_BNC_TPE
))
if
(
GetBit
(
lp
->
word
[
5
],
ee_BNC_TPE
))
dev
->
if_port
=
BNC
;
else
dev
->
if_port
=
TPE
;
if
(
dev
->
irq
<
2
&&
lp
->
eepro
!=
0
)
{
/* Mask off INT number */
int
count
=
read_eeprom
(
ioaddr
,
1
,
dev
)
&
7
;
unsigned
irqMask
=
read_eeprom
(
ioaddr
,
7
,
dev
)
;
int
count
=
lp
->
word
[
1
]
&
7
;
unsigned
irqMask
=
lp
->
word
[
7
]
;
while
(
count
--
)
irqMask
&=
irqMask
-
1
;
...
...
@@ -850,6 +866,7 @@ static int __init eepro_probe1(struct net_device *dev, int autoprobe)
dev
->
set_multicast_list
=
&
set_multicast_list
;
dev
->
tx_timeout
=
eepro_tx_timeout
;
dev
->
watchdog_timeo
=
TX_TIMEOUT
;
dev
->
ethtool_ops
=
&
eepro_ethtool_ops
;
/* print boot time info */
eepro_print_info
(
dev
);
...
...
@@ -941,7 +958,7 @@ static int eepro_open(struct net_device *dev)
if
(
net_debug
>
3
)
printk
(
KERN_DEBUG
"%s: entering eepro_open routine.
\n
"
,
dev
->
name
);
irqMask
=
read_eeprom
(
ioaddr
,
7
,
dev
)
;
irqMask
=
lp
->
word
[
7
]
;
if
(
lp
->
eepro
==
LAN595FX_10ISA
)
{
if
(
net_debug
>
3
)
printk
(
KERN_DEBUG
"p->eepro = 3;
\n
"
);
...
...
@@ -1070,8 +1087,6 @@ static int eepro_open(struct net_device *dev)
old9
=
inb
(
ioaddr
+
9
);
if
(
irqMask
==
ee_FX_INT2IRQ
)
{
enum
iftype
{
AUI
=
0
,
BNC
=
1
,
TPE
=
2
};
if
(
net_debug
>
3
)
{
printk
(
KERN_DEBUG
"IrqMask: %#x
\n
"
,
irqMask
);
printk
(
KERN_DEBUG
"i82595FX detected!
\n
"
);
...
...
@@ -1701,12 +1716,72 @@ eepro_transmit_interrupt(struct net_device *dev)
}
}
static
int
eepro_ethtool_get_settings
(
struct
net_device
*
dev
,
struct
ethtool_cmd
*
cmd
)
{
struct
eepro_local
*
lp
=
(
struct
eepro_local
*
)
dev
->
priv
;
cmd
->
supported
=
SUPPORTED_10baseT_Half
|
SUPPORTED_10baseT_Full
|
SUPPORTED_Autoneg
;
cmd
->
advertising
=
ADVERTISED_10baseT_Half
|
ADVERTISED_10baseT_Full
|
ADVERTISED_Autoneg
;
if
(
GetBit
(
lp
->
word
[
5
],
ee_PortTPE
))
{
cmd
->
supported
|=
SUPPORTED_TP
;
cmd
->
advertising
|=
ADVERTISED_TP
;
}
if
(
GetBit
(
lp
->
word
[
5
],
ee_PortBNC
))
{
cmd
->
supported
|=
SUPPORTED_BNC
;
cmd
->
advertising
|=
ADVERTISED_BNC
;
}
if
(
GetBit
(
lp
->
word
[
5
],
ee_PortAUI
))
{
cmd
->
supported
|=
SUPPORTED_AUI
;
cmd
->
advertising
|=
ADVERTISED_AUI
;
}
cmd
->
speed
=
SPEED_10
;
if
(
dev
->
if_port
==
TPE
&&
lp
->
word
[
1
]
&
ee_Duplex
)
{
cmd
->
duplex
=
DUPLEX_FULL
;
}
else
{
cmd
->
duplex
=
DUPLEX_HALF
;
}
cmd
->
port
=
dev
->
if_port
;
cmd
->
phy_address
=
dev
->
base_addr
;
cmd
->
transceiver
=
XCVR_INTERNAL
;
if
(
lp
->
word
[
0
]
&
ee_AutoNeg
)
{
cmd
->
autoneg
=
1
;
}
return
0
;
}
static
void
eepro_ethtool_get_drvinfo
(
struct
net_device
*
dev
,
struct
ethtool_drvinfo
*
drvinfo
)
{
strcpy
(
drvinfo
->
driver
,
DRV_NAME
);
strcpy
(
drvinfo
->
version
,
DRV_VERSION
);
sprintf
(
drvinfo
->
bus_info
,
"ISA 0x%lx"
,
dev
->
base_addr
);
}
static
struct
ethtool_ops
eepro_ethtool_ops
=
{
.
get_settings
=
eepro_ethtool_get_settings
,
.
get_drvinfo
=
eepro_ethtool_get_drvinfo
,
};
#ifdef MODULE
#define MAX_EEPRO 8
static
struct
net_device
*
dev_eepro
[
MAX_EEPRO
];
static
int
io
[
MAX_EEPRO
];
static
int
io
[
MAX_EEPRO
]
=
{
[
0
...
MAX_EEPRO
-
1
]
=
-
1
};
static
int
irq
[
MAX_EEPRO
];
static
int
mem
[
MAX_EEPRO
]
=
{
/* Size of the rx buffer in KB */
[
0
...
MAX_EEPRO
-
1
]
=
RCV_DEFAULT_RAM
/
1024
...
...
@@ -1716,14 +1791,15 @@ static int autodetect;
static
int
n_eepro
;
/* For linux 2.1.xx */
MODULE_AUTHOR
(
"Pascal Dupuis
, and aris@cathedrallabs.org
"
);
MODULE_AUTHOR
(
"Pascal Dupuis
and others
"
);
MODULE_DESCRIPTION
(
"Intel i82595 ISA EtherExpressPro10/10+ driver"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_PARM
(
io
,
"1-"
__MODULE_STRING
(
MAX_EEPRO
)
"i"
);
MODULE_PARM
(
irq
,
"1-"
__MODULE_STRING
(
MAX_EEPRO
)
"i"
);
MODULE_PARM
(
mem
,
"1-"
__MODULE_STRING
(
MAX_EEPRO
)
"i"
);
MODULE_PARM
(
autodetect
,
"1-"
__MODULE_STRING
(
1
)
"i"
);
static
int
num_params
;
module_param_array
(
io
,
int
,
num_params
,
0
);
module_param_array
(
irq
,
int
,
num_params
,
0
);
module_param_array
(
mem
,
int
,
num_params
,
0
);
module_param
(
autodetect
,
int
,
0
);
MODULE_PARM_DESC
(
io
,
"EtherExpress Pro/10 I/O base addres(es)"
);
MODULE_PARM_DESC
(
irq
,
"EtherExpress Pro/10 IRQ number(s)"
);
MODULE_PARM_DESC
(
mem
,
"EtherExpress Pro/10 Rx buffer size(es) in kB (3-29)"
);
...
...
@@ -1734,19 +1810,21 @@ init_module(void)
{
struct
net_device
*
dev
;
int
i
;
if
(
io
[
0
]
==
0
&&
autodetect
==
0
)
{
if
(
io
[
0
]
==
-
1
&&
autodetect
==
0
)
{
printk
(
KERN_WARNING
"eepro_init_module: Probe is very dangerous in ISA boards!
\n
"
);
printk
(
KERN_WARNING
"eepro_init_module: Please add
\"
autodetect=1
\"
to force probe
\n
"
);
return
1
;
return
-
ENODEV
;
}
else
if
(
autodetect
)
{
/* if autodetect is set then we must force detection */
io
[
0
]
=
0
;
for
(
i
=
0
;
i
<
MAX_EEPRO
;
i
++
)
{
io
[
i
]
=
0
;
}
printk
(
KERN_INFO
"eepro_init_module: Auto-detecting boards (May God protect us...)
\n
"
);
}
for
(
i
=
0
;
i
<
MAX_EEPRO
;
i
++
)
{
for
(
i
=
0
;
i
o
[
i
]
!=
-
1
&&
i
<
MAX_EEPRO
;
i
++
)
{
dev
=
alloc_etherdev
(
sizeof
(
struct
eepro_local
));
if
(
!
dev
)
break
;
...
...
drivers/net/ibm_emac/ibm_emac.h
View file @
3fa8f148
...
...
@@ -98,7 +98,7 @@ typedef struct emac_regs {
#endif
/* CONFIG_IBM_EMAC4 */
#define EMAC_M1_BASE (EMAC_M1_TX_FIFO_2K | \
EMAC_M1_APP | \
EMAC_M1_TR)
EMAC_M1_TR
| EMAC_M1_VLE
)
/* Transmit Mode Register 0 */
#define EMAC_TMR0_GNP0 0x80000000
...
...
drivers/net/ibm_emac/ibm_emac_core.c
View file @
3fa8f148
...
...
@@ -1363,6 +1363,9 @@ static void emac_reset_configure(struct ocp_enet_private *fep)
/* set frame gap */
out_be32
(
&
emacp
->
em0ipgvr
,
CONFIG_IBM_EMAC_FGAP
);
/* set VLAN Tag Protocol Identifier */
out_be32
(
&
emacp
->
em0vtpid
,
0x8100
);
/* Init ring buffers */
emac_init_rings
(
fep
->
ndev
);
...
...
@@ -1700,6 +1703,15 @@ struct mal_commac_ops emac_commac_ops = {
.
rxde
=
&
emac_rxde_dev
,
};
#ifdef CONFIG_NET_POLL_CONTROLLER
static
int
emac_netpoll
(
struct
net_device
*
ndev
)
{
emac_rxeob_dev
((
void
*
)
ndev
,
0
);
emac_txeob_dev
((
void
*
)
ndev
,
0
);
return
0
;
}
#endif
static
int
emac_init_device
(
struct
ocp_device
*
ocpdev
,
struct
ibm_ocp_mal
*
mal
)
{
int
deferred_init
=
0
;
...
...
@@ -1882,6 +1894,9 @@ static int emac_init_device(struct ocp_device *ocpdev, struct ibm_ocp_mal *mal)
SET_ETHTOOL_OPS
(
ndev
,
&
emac_ethtool_ops
);
if
(
emacdata
->
tah_idx
>=
0
)
ndev
->
features
=
NETIF_F_IP_CSUM
|
NETIF_F_SG
;
#ifdef CONFIG_NET_POLL_CONTROLLER
ndev
->
poll_controller
=
emac_netpoll
;
#endif
SET_MODULE_OWNER
(
ndev
);
...
...
drivers/net/ibm_emac/ibm_emac_phy.c
View file @
3fa8f148
...
...
@@ -191,17 +191,18 @@ static int genmii_read_link(struct mii_phy *phy)
u16
lpa
;
if
(
phy
->
autoneg
)
{
lpa
=
phy_read
(
phy
,
MII_LPA
);
lpa
=
phy_read
(
phy
,
MII_LPA
)
&
phy_read
(
phy
,
MII_ADVERTISE
)
;
if
(
lpa
&
(
LPA_10FULL
|
LPA_100FULL
))
phy
->
duplex
=
DUPLEX_FULL
;
else
phy
->
duplex
=
DUPLEX_HALF
;
if
(
lpa
&
(
LPA_100FULL
|
LPA_100HALF
))
phy
->
speed
=
SPEED_100
;
else
phy
->
speed
=
SPEED_10
;
phy
->
speed
=
SPEED_10
;
phy
->
duplex
=
DUPLEX_HALF
;
phy
->
pause
=
0
;
if
(
lpa
&
(
LPA_100FULL
|
LPA_100HALF
))
{
phy
->
speed
=
SPEED_100
;
if
(
lpa
&
LPA_100FULL
)
phy
->
duplex
=
DUPLEX_FULL
;
}
else
if
(
lpa
&
LPA_10FULL
)
phy
->
duplex
=
DUPLEX_FULL
;
}
/* On non-aneg, we assume what we put in BMCR is the speed,
* though magic-aneg shouldn't prevent this case from occurring
...
...
drivers/net/ixgb/ixgb.h
View file @
3fa8f148
...
...
@@ -46,6 +46,7 @@
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/string.h>
#include <linux/pagemap.h>
...
...
@@ -85,6 +86,20 @@ struct ixgb_adapter;
#define IXGB_ERR(args...) printk(KERN_ERR "ixgb: " args)
/* TX/RX descriptor defines */
#define DEFAULT_TXD 256
#define MAX_TXD 4096
#define MIN_TXD 64
/* hardware cannot reliably support more than 512 descriptors owned by
* hardware descrioptor cache otherwise an unreliable ring under heavy
* recieve load may result */
/* #define DEFAULT_RXD 1024 */
/* #define MAX_RXD 4096 */
#define DEFAULT_RXD 512
#define MAX_RXD 512
#define MIN_RXD 64
/* Supported Rx Buffer Sizes */
#define IXGB_RXBUFFER_2048 2048
#define IXGB_RXBUFFER_4096 4096
...
...
@@ -105,9 +120,9 @@ struct ixgb_adapter;
struct
ixgb_buffer
{
struct
sk_buff
*
skb
;
uint64_t
dma
;
unsigned
long
length
;
unsigned
long
time_stamp
;
unsigned
int
next_to_watch
;
uint16_t
length
;
uint16_t
next_to_watch
;
};
struct
ixgb_desc_ring
{
...
...
@@ -167,7 +182,6 @@ struct ixgb_adapter {
uint64_t
hw_csum_rx_error
;
uint64_t
hw_csum_rx_good
;
uint32_t
rx_int_delay
;
boolean_t
raidc
;
boolean_t
rx_csum
;
/* OS defined structs */
...
...
@@ -178,5 +192,8 @@ struct ixgb_adapter {
/* structs defined in ixgb_hw.h */
struct
ixgb_hw
hw
;
struct
ixgb_hw_stats
stats
;
#ifdef CONFIG_PCI_MSI
boolean_t
have_msi
;
#endif
};
#endif
/* _IXGB_H_ */
#endif
/* _IXGB_H_ */
drivers/net/ixgb/ixgb_ee.c
View file @
3fa8f148
...
...
@@ -32,7 +32,8 @@
static
uint16_t
ixgb_shift_in_bits
(
struct
ixgb_hw
*
hw
);
static
void
ixgb_shift_out_bits
(
struct
ixgb_hw
*
hw
,
uint16_t
data
,
uint16_t
count
);
uint16_t
data
,
uint16_t
count
);
static
void
ixgb_standby_eeprom
(
struct
ixgb_hw
*
hw
);
static
boolean_t
ixgb_wait_eeprom_command
(
struct
ixgb_hw
*
hw
);
...
...
@@ -45,7 +46,9 @@ static void ixgb_cleanup_eeprom(struct ixgb_hw *hw);
* hw - Struct containing variables accessed by shared code
* eecd_reg - EECD's current value
*****************************************************************************/
static
void
ixgb_raise_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
static
void
ixgb_raise_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
{
/* Raise the clock input to the EEPROM (by setting the SK bit), and then
* wait 50 microseconds.
...
...
@@ -62,7 +65,9 @@ static void ixgb_raise_clock(struct ixgb_hw *hw, uint32_t * eecd_reg)
* hw - Struct containing variables accessed by shared code
* eecd_reg - EECD's current value
*****************************************************************************/
static
void
ixgb_lower_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
static
void
ixgb_lower_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
{
/* Lower the clock input to the EEPROM (by clearing the SK bit), and then
* wait 50 microseconds.
...
...
@@ -81,7 +86,9 @@ static void ixgb_lower_clock(struct ixgb_hw *hw, uint32_t * eecd_reg)
* count - number of bits to shift out
*****************************************************************************/
static
void
ixgb_shift_out_bits
(
struct
ixgb_hw
*
hw
,
uint16_t
data
,
uint16_t
count
)
ixgb_shift_out_bits
(
struct
ixgb_hw
*
hw
,
uint16_t
data
,
uint16_t
count
)
{
uint32_t
eecd_reg
;
uint32_t
mask
;
...
...
@@ -101,7 +108,7 @@ ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data, uint16_t count)
*/
eecd_reg
&=
~
IXGB_EECD_DI
;
if
(
data
&
mask
)
if
(
data
&
mask
)
eecd_reg
|=
IXGB_EECD_DI
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
...
...
@@ -113,7 +120,7 @@ ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data, uint16_t count)
mask
=
mask
>>
1
;
}
while
(
mask
);
}
while
(
mask
);
/* We leave the "DI" bit set to "0" when we leave this routine. */
eecd_reg
&=
~
IXGB_EECD_DI
;
...
...
@@ -126,7 +133,8 @@ ixgb_shift_out_bits(struct ixgb_hw *hw, uint16_t data, uint16_t count)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
static
uint16_t
ixgb_shift_in_bits
(
struct
ixgb_hw
*
hw
)
static
uint16_t
ixgb_shift_in_bits
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
i
;
...
...
@@ -144,14 +152,14 @@ static uint16_t ixgb_shift_in_bits(struct ixgb_hw *hw)
eecd_reg
&=
~
(
IXGB_EECD_DO
|
IXGB_EECD_DI
);
data
=
0
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
data
=
data
<<
1
;
ixgb_raise_clock
(
hw
,
&
eecd_reg
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_DI
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
if
(
eecd_reg
&
IXGB_EECD_DO
)
data
|=
1
;
ixgb_lower_clock
(
hw
,
&
eecd_reg
);
...
...
@@ -168,7 +176,8 @@ static uint16_t ixgb_shift_in_bits(struct ixgb_hw *hw)
* Lowers EEPROM clock. Clears input pin. Sets the chip select pin. This
* function should be called before issuing a command to the EEPROM.
*****************************************************************************/
static
void
ixgb_setup_eeprom
(
struct
ixgb_hw
*
hw
)
static
void
ixgb_setup_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
...
...
@@ -189,7 +198,8 @@ static void ixgb_setup_eeprom(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
static
void
ixgb_standby_eeprom
(
struct
ixgb_hw
*
hw
)
static
void
ixgb_standby_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
...
...
@@ -222,7 +232,8 @@ static void ixgb_standby_eeprom(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
static
void
ixgb_clock_eeprom
(
struct
ixgb_hw
*
hw
)
static
void
ixgb_clock_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
...
...
@@ -245,7 +256,8 @@ static void ixgb_clock_eeprom(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
static
void
ixgb_cleanup_eeprom
(
struct
ixgb_hw
*
hw
)
static
void
ixgb_cleanup_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
...
...
@@ -270,7 +282,8 @@ static void ixgb_cleanup_eeprom(struct ixgb_hw *hw)
* TRUE: EEPROM data pin is high before timeout.
* FALSE: Time expired.
*****************************************************************************/
static
boolean_t
ixgb_wait_eeprom_command
(
struct
ixgb_hw
*
hw
)
static
boolean_t
ixgb_wait_eeprom_command
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
i
;
...
...
@@ -284,10 +297,10 @@ static boolean_t ixgb_wait_eeprom_command(struct ixgb_hw *hw)
* signal that the command has been completed by raising the DO signal.
* If DO does not go high in 10 milliseconds, then error out.
*/
for
(
i
=
0
;
i
<
200
;
i
++
)
{
for
(
i
=
0
;
i
<
200
;
i
++
)
{
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
if
(
eecd_reg
&
IXGB_EECD_DO
)
return
(
TRUE
);
udelay
(
50
);
...
...
@@ -309,15 +322,16 @@ static boolean_t ixgb_wait_eeprom_command(struct ixgb_hw *hw)
* TRUE: Checksum is valid
* FALSE: Checksum is not valid.
*****************************************************************************/
boolean_t
ixgb_validate_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_validate_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
{
uint16_t
checksum
=
0
;
uint16_t
i
;
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
if
(
checksum
==
(
uint16_t
)
EEPROM_SUM
)
if
(
checksum
==
(
uint16_t
)
EEPROM_SUM
)
return
(
TRUE
);
else
return
(
FALSE
);
...
...
@@ -331,12 +345,13 @@ boolean_t ixgb_validate_eeprom_checksum(struct ixgb_hw * hw)
* Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA.
* Writes the difference to word offset 63 of the EEPROM.
*****************************************************************************/
void
ixgb_update_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
void
ixgb_update_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
{
uint16_t
checksum
=
0
;
uint16_t
i
;
for
(
i
=
0
;
i
<
EEPROM_CHECKSUM_REG
;
i
++
)
for
(
i
=
0
;
i
<
EEPROM_CHECKSUM_REG
;
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
checksum
=
(
uint16_t
)
EEPROM_SUM
-
checksum
;
...
...
@@ -356,7 +371,10 @@ void ixgb_update_eeprom_checksum(struct ixgb_hw *hw)
* EEPROM will most likely contain an invalid checksum.
*
*****************************************************************************/
void
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
,
uint16_t
data
)
void
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
,
uint16_t
data
)
{
/* Prepare the EEPROM for writing */
ixgb_setup_eeprom
(
hw
);
...
...
@@ -404,7 +422,9 @@ void ixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data)
* Returns:
* The 16-bit value read from the eeprom
*****************************************************************************/
uint16_t
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
)
uint16_t
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
)
{
uint16_t
data
;
...
...
@@ -437,7 +457,8 @@ uint16_t ixgb_read_eeprom(struct ixgb_hw * hw, uint16_t offset)
* TRUE: if eeprom read is successful
* FALSE: otherwise.
*****************************************************************************/
boolean_t
ixgb_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
{
uint16_t
i
;
uint16_t
checksum
=
0
;
...
...
@@ -448,7 +469,7 @@ boolean_t ixgb_get_eeprom_data(struct ixgb_hw * hw)
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
DEBUGOUT
(
"ixgb_ee: Reading eeprom data
\n
"
);
for
(
i
=
0
;
i
<
IXGB_EEPROM_SIZE
;
i
++
)
{
for
(
i
=
0
;
i
<
IXGB_EEPROM_SIZE
;
i
++
)
{
uint16_t
ee_data
;
ee_data
=
ixgb_read_eeprom
(
hw
,
i
);
checksum
+=
ee_data
;
...
...
@@ -461,12 +482,12 @@ boolean_t ixgb_get_eeprom_data(struct ixgb_hw * hw)
}
if
((
ee_map
->
init_ctrl_reg_1
&
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_MASK
))
!=
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
!=
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
DEBUGOUT
(
"ixgb_ee: Signature invalid.
\n
"
);
return
(
FALSE
);
return
(
FALSE
);
}
return
(
TRUE
);
return
(
TRUE
);
}
/******************************************************************************
...
...
@@ -479,7 +500,8 @@ boolean_t ixgb_get_eeprom_data(struct ixgb_hw * hw)
* TRUE: eeprom signature was good and the eeprom read was successful
* FALSE: otherwise.
******************************************************************************/
static
boolean_t
ixgb_check_and_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
static
boolean_t
ixgb_check_and_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
...
...
@@ -500,15 +522,16 @@ static boolean_t ixgb_check_and_get_eeprom_data(struct ixgb_hw *hw)
* Returns:
* Word at indexed offset in eeprom, if valid, 0 otherwise.
******************************************************************************/
uint16_t
ixgb_get_eeprom_word
(
struct
ixgb_hw
*
hw
,
uint16_t
index
)
uint16_t
ixgb_get_eeprom_word
(
struct
ixgb_hw
*
hw
,
uint16_t
index
)
{
if
((
index
<
IXGB_EEPROM_SIZE
)
&&
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
))
{
return
(
hw
->
eeprom
[
index
]);
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
))
{
return
(
hw
->
eeprom
[
index
]);
}
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -519,7 +542,9 @@ uint16_t ixgb_get_eeprom_word(struct ixgb_hw * hw, uint16_t index)
*
* Returns: None.
******************************************************************************/
void
ixgb_get_ee_mac_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mac_addr
)
void
ixgb_get_ee_mac_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mac_addr
)
{
int
i
;
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
...
...
@@ -542,14 +567,15 @@ void ixgb_get_ee_mac_addr(struct ixgb_hw *hw, uint8_t * mac_addr)
* Returns:
* compatibility flags if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_compatibility
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_compatibility
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
compatibility
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
compatibility
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -560,13 +586,14 @@ uint16_t ixgb_get_ee_compatibility(struct ixgb_hw *hw)
* Returns:
* PBA number if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint32_t
ixgb_get_ee_pba_number
(
struct
ixgb_hw
*
hw
)
uint32_t
ixgb_get_ee_pba_number
(
struct
ixgb_hw
*
hw
)
{
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
le16_to_cpu
(
hw
->
eeprom
[
EEPROM_PBA_1_2_REG
])
|
(
le16_to_cpu
(
hw
->
eeprom
[
EEPROM_PBA_3_4_REG
])
<<
16
));
|
(
le16_to_cpu
(
hw
->
eeprom
[
EEPROM_PBA_3_4_REG
])
<<
16
));
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -577,14 +604,15 @@ uint32_t ixgb_get_ee_pba_number(struct ixgb_hw * hw)
* Returns:
* Initialization Control Word 1 if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_init_ctrl_reg_1
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_init_ctrl_reg_1
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
init_ctrl_reg_1
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
init_ctrl_reg_1
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -595,14 +623,15 @@ uint16_t ixgb_get_ee_init_ctrl_reg_1(struct ixgb_hw * hw)
* Returns:
* Initialization Control Word 2 if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_init_ctrl_reg_2
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_init_ctrl_reg_2
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
init_ctrl_reg_2
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
init_ctrl_reg_2
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -613,14 +642,15 @@ uint16_t ixgb_get_ee_init_ctrl_reg_2(struct ixgb_hw * hw)
* Returns:
* Subsystem Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_subsystem_id
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_subsystem_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
subsystem_id
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
subsystem_id
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -631,14 +661,15 @@ uint16_t ixgb_get_ee_subsystem_id(struct ixgb_hw * hw)
* Returns:
* Sub Vendor Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_subvendor_id
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_subvendor_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
subvendor_id
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
subvendor_id
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -649,14 +680,15 @@ uint16_t ixgb_get_ee_subvendor_id(struct ixgb_hw * hw)
* Returns:
* Device Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_device_id
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_device_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
device_id
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
device_id
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -667,14 +699,15 @@ uint16_t ixgb_get_ee_device_id(struct ixgb_hw * hw)
* Returns:
* Device Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_vendor_id
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_vendor_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
vendor_id
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
vendor_id
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -685,14 +718,15 @@ uint16_t ixgb_get_ee_vendor_id(struct ixgb_hw * hw)
* Returns:
* SDP Register if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_swdpins_reg
(
struct
ixgb_hw
*
hw
)
uint16_t
ixgb_get_ee_swdpins_reg
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
swdpins_reg
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
swdpins_reg
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -703,14 +737,15 @@ uint16_t ixgb_get_ee_swdpins_reg(struct ixgb_hw * hw)
* Returns:
* D3 Power Management Bits if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint8_t
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
)
uint8_t
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
d3_power
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
d3_power
);
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -721,12 +756,13 @@ uint8_t ixgb_get_ee_d3_power(struct ixgb_hw * hw)
* Returns:
* D0 Power Management Bits if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint8_t
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
)
uint8_t
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
d0_power
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
return
(
ee_map
->
d0_power
);
return
(
0
);
return
(
0
);
}
drivers/net/ixgb/ixgb_ethtool.c
View file @
3fa8f148
...
...
@@ -37,6 +37,12 @@ extern char ixgb_driver_version[];
extern
int
ixgb_up
(
struct
ixgb_adapter
*
adapter
);
extern
void
ixgb_down
(
struct
ixgb_adapter
*
adapter
,
boolean_t
kill_watchdog
);
extern
void
ixgb_reset
(
struct
ixgb_adapter
*
adapter
);
extern
int
ixgb_setup_rx_resources
(
struct
ixgb_adapter
*
adapter
);
extern
int
ixgb_setup_tx_resources
(
struct
ixgb_adapter
*
adapter
);
extern
void
ixgb_free_rx_resources
(
struct
ixgb_adapter
*
adapter
);
extern
void
ixgb_free_tx_resources
(
struct
ixgb_adapter
*
adapter
);
extern
void
ixgb_update_stats
(
struct
ixgb_adapter
*
adapter
);
struct
ixgb_stats
{
char
stat_string
[
ETH_GSTRING_LEN
];
...
...
@@ -89,7 +95,7 @@ static struct ixgb_stats ixgb_gstrings_stats[] = {
sizeof(ixgb_gstrings_stats) / sizeof(struct ixgb_stats)
static
int
ixgb_
ethtool_gset
(
struct
net_device
*
netdev
,
struct
ethtool_cmd
*
ecmd
)
ixgb_
get_settings
(
struct
net_device
*
netdev
,
struct
ethtool_cmd
*
ecmd
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
ecmd
->
supported
=
(
SUPPORTED_10000baseT_Full
|
SUPPORTED_FIBRE
);
...
...
@@ -97,7 +103,7 @@ ixgb_ethtool_gset(struct net_device *netdev, struct ethtool_cmd *ecmd)
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
if
(
netif_carrier_ok
(
adapter
->
netdev
))
{
if
(
netif_carrier_ok
(
adapter
->
netdev
))
{
ecmd
->
speed
=
SPEED_10000
;
ecmd
->
duplex
=
DUPLEX_FULL
;
}
else
{
...
...
@@ -110,86 +116,140 @@ ixgb_ethtool_gset(struct net_device *netdev, struct ethtool_cmd *ecmd)
}
static
int
ixgb_
ethtool_sset
(
struct
net_device
*
netdev
,
struct
ethtool_cmd
*
ecmd
)
ixgb_
set_settings
(
struct
net_device
*
netdev
,
struct
ethtool_cmd
*
ecmd
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
||
ecmd
->
speed
+
ecmd
->
duplex
!=
SPEED_10000
+
DUPLEX_FULL
)
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
||
ecmd
->
speed
+
ecmd
->
duplex
!=
SPEED_10000
+
DUPLEX_FULL
)
return
-
EINVAL
;
else
{
if
(
netif_running
(
adapter
->
netdev
))
{
ixgb_down
(
adapter
,
TRUE
);
ixgb_reset
(
adapter
);
ixgb_up
(
adapter
);
}
}
else
ixgb_reset
(
adapter
);
return
0
;
}
static
void
ixgb_
ethtool_gpause
(
struct
net_device
*
dev
,
struct
ethtool_pauseparam
*
e
pause
)
ixgb_
get_pauseparam
(
struct
net_device
*
net
dev
,
struct
ethtool_pauseparam
*
pause
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
struct
ixgb_adapter
*
adapter
=
net
dev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
e
pause
->
autoneg
=
AUTONEG_DISABLE
;
if
(
hw
->
fc
.
type
==
ixgb_fc_rx_pause
)
e
pause
->
rx_pause
=
1
;
else
if
(
hw
->
fc
.
type
==
ixgb_fc_tx_pause
)
e
pause
->
tx_pause
=
1
;
else
if
(
hw
->
fc
.
type
==
ixgb_fc_full
)
{
e
pause
->
rx_pause
=
1
;
e
pause
->
tx_pause
=
1
;
pause
->
autoneg
=
AUTONEG_DISABLE
;
if
(
hw
->
fc
.
type
==
ixgb_fc_rx_pause
)
pause
->
rx_pause
=
1
;
else
if
(
hw
->
fc
.
type
==
ixgb_fc_tx_pause
)
pause
->
tx_pause
=
1
;
else
if
(
hw
->
fc
.
type
==
ixgb_fc_full
)
{
pause
->
rx_pause
=
1
;
pause
->
tx_pause
=
1
;
}
}
static
int
ixgb_
ethtool_spause
(
struct
net_device
*
dev
,
struct
ethtool_pauseparam
*
e
pause
)
ixgb_
set_pauseparam
(
struct
net_device
*
net
dev
,
struct
ethtool_pauseparam
*
pause
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
struct
ixgb_adapter
*
adapter
=
net
dev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
if
(
e
pause
->
autoneg
==
AUTONEG_ENABLE
)
if
(
pause
->
autoneg
==
AUTONEG_ENABLE
)
return
-
EINVAL
;
if
(
epause
->
rx_pause
&&
e
pause
->
tx_pause
)
if
(
pause
->
rx_pause
&&
pause
->
tx_pause
)
hw
->
fc
.
type
=
ixgb_fc_full
;
else
if
(
epause
->
rx_pause
&&
!
e
pause
->
tx_pause
)
else
if
(
pause
->
rx_pause
&&
!
pause
->
tx_pause
)
hw
->
fc
.
type
=
ixgb_fc_rx_pause
;
else
if
(
!
epause
->
rx_pause
&&
e
pause
->
tx_pause
)
else
if
(
!
pause
->
rx_pause
&&
pause
->
tx_pause
)
hw
->
fc
.
type
=
ixgb_fc_tx_pause
;
else
if
(
!
epause
->
rx_pause
&&
!
e
pause
->
tx_pause
)
else
if
(
!
pause
->
rx_pause
&&
!
pause
->
tx_pause
)
hw
->
fc
.
type
=
ixgb_fc_none
;
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
if
(
netif_running
(
adapter
->
netdev
))
{
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
}
else
ixgb_reset
(
adapter
);
return
0
;
}
static
void
ixgb_ethtool_gdrvinfo
(
struct
net_device
*
netdev
,
struct
ethtool_drvinfo
*
drvinfo
)
static
uint32_t
ixgb_get_rx_csum
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
strncpy
(
drvinfo
->
driver
,
ixgb_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
ixgb_driver_version
,
32
);
strncpy
(
drvinfo
->
fw_version
,
"N/A"
,
32
);
strncpy
(
drvinfo
->
bus_info
,
pci_name
(
adapter
->
pdev
),
32
);
return
adapter
->
rx_csum
;
}
static
int
ixgb_set_rx_csum
(
struct
net_device
*
netdev
,
uint32_t
data
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
adapter
->
rx_csum
=
data
;
if
(
netif_running
(
netdev
))
{
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
}
else
ixgb_reset
(
adapter
);
return
0
;
}
static
uint32_t
ixgb_get_tx_csum
(
struct
net_device
*
netdev
)
{
return
(
netdev
->
features
&
NETIF_F_HW_CSUM
)
!=
0
;
}
static
int
ixgb_set_tx_csum
(
struct
net_device
*
netdev
,
uint32_t
data
)
{
if
(
data
)
netdev
->
features
|=
NETIF_F_HW_CSUM
;
else
netdev
->
features
&=
~
NETIF_F_HW_CSUM
;
return
0
;
}
#ifdef NETIF_F_TSO
static
int
ixgb_set_tso
(
struct
net_device
*
netdev
,
uint32_t
data
)
{
if
(
data
)
netdev
->
features
|=
NETIF_F_TSO
;
else
netdev
->
features
&=
~
NETIF_F_TSO
;
return
0
;
}
#endif
/* NETIF_F_TSO */
#define IXGB_GET_STAT(_A_, _R_) _A_->stats._R_
static
int
ixgb_get_regs_len
(
struct
net_device
*
netdev
)
{
#define IXGB_REG_DUMP_LEN 136*sizeof(uint32_t)
return
IXGB_REG_DUMP_LEN
;
}
static
void
ixgb_ethtool_gregs
(
struct
net_device
*
dev
,
struct
ethtool_regs
*
regs
,
void
*
buf
)
ixgb_get_regs
(
struct
net_device
*
netdev
,
struct
ethtool_regs
*
regs
,
void
*
p
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
struct
ixgb_adapter
*
adapter
=
net
dev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
*
reg
=
buf
;
uint32_t
*
reg
=
p
;
uint32_t
*
reg_start
=
reg
;
uint8_t
i
;
regs
->
version
=
(
adapter
->
hw
.
device_id
<<
16
)
|
adapter
->
hw
.
subsystem_id
;
regs
->
version
=
(
adapter
->
hw
.
device_id
<<
16
)
|
adapter
->
hw
.
subsystem_id
;
/* General Registers */
*
reg
++
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* 0 */
...
...
@@ -219,8 +279,8 @@ ixgb_ethtool_gregs(struct net_device *dev, struct ethtool_regs *regs, void *buf)
*
reg
++
=
IXGB_READ_REG
(
hw
,
RXCSUM
);
/* 20 */
for
(
i
=
0
;
i
<
IXGB_RAR_ENTRIES
;
i
++
)
{
*
reg
++
=
IXGB_READ_REG_ARRAY
(
hw
,
RAL
,
(
i
<<
1
));
/*21,...,51 */
*
reg
++
=
IXGB_READ_REG_ARRAY
(
hw
,
RAH
,
(
i
<<
1
));
/*22,...,52 */
*
reg
++
=
IXGB_READ_REG_ARRAY
(
hw
,
RAL
,
(
i
<<
1
));
/*21,...,51 */
*
reg
++
=
IXGB_READ_REG_ARRAY
(
hw
,
RAH
,
(
i
<<
1
));
/*22,...,52 */
}
/* Transmit */
...
...
@@ -316,73 +376,222 @@ ixgb_ethtool_gregs(struct net_device *dev, struct ethtool_regs *regs, void *buf)
}
static
int
ixgb_ethtool_geeprom
(
struct
net_device
*
dev
,
struct
ethtool_eeprom
*
eeprom
,
u8
*
data
)
ixgb_get_eeprom_len
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
/* return size in bytes */
return
(
IXGB_EEPROM_SIZE
<<
1
);
}
static
int
ixgb_get_eeprom
(
struct
net_device
*
netdev
,
struct
ethtool_eeprom
*
eeprom
,
uint8_t
*
bytes
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint16_t
*
eeprom_buff
;
int
i
,
max_len
,
first_word
,
last_word
;
int
ret_val
=
0
;
if
(
eeprom
->
len
==
0
)
{
ret_val
=
-
EINVAL
;
goto
geeprom_error
;
}
eeprom
->
magic
=
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
);
/* use our function to read the eeprom and update our cache */
ixgb_get_eeprom_data
(
hw
);
memcpy
(
data
,
(
char
*
)
hw
->
eeprom
+
eeprom
->
offset
,
eeprom
->
len
);
return
0
;
max_len
=
ixgb_get_eeprom_len
(
netdev
);
if
(
eeprom
->
offset
>
eeprom
->
offset
+
eeprom
->
len
)
{
ret_val
=
-
EINVAL
;
goto
geeprom_error
;
}
if
((
eeprom
->
offset
+
eeprom
->
len
)
>
max_len
)
eeprom
->
len
=
(
max_len
-
eeprom
->
offset
);
first_word
=
eeprom
->
offset
>>
1
;
last_word
=
(
eeprom
->
offset
+
eeprom
->
len
-
1
)
>>
1
;
eeprom_buff
=
kmalloc
(
sizeof
(
uint16_t
)
*
(
last_word
-
first_word
+
1
),
GFP_KERNEL
);
if
(
!
eeprom_buff
)
return
-
ENOMEM
;
/* note the eeprom was good because the driver loaded */
for
(
i
=
0
;
i
<=
(
last_word
-
first_word
);
i
++
)
{
eeprom_buff
[
i
]
=
ixgb_get_eeprom_word
(
hw
,
(
first_word
+
i
));
}
memcpy
(
bytes
,
(
uint8_t
*
)
eeprom_buff
+
(
eeprom
->
offset
&
1
),
eeprom
->
len
);
kfree
(
eeprom_buff
);
geeprom_error:
return
ret_val
;
}
static
int
ixgb_
ethtool_seeprom
(
struct
net_device
*
dev
,
struct
ethtool_eeprom
*
eeprom
,
u8
*
data
)
ixgb_
set_eeprom
(
struct
net_device
*
net
dev
,
struct
ethtool_eeprom
*
eeprom
,
uint8_t
*
bytes
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
struct
ixgb_adapter
*
adapter
=
net
dev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
/* We are under rtnl, so static is OK */
static
uint16_t
eeprom_buff
[
IXGB_EEPROM_SIZE
];
int
i
,
first_word
,
last_word
;
char
*
ptr
;
uint16_t
*
eeprom_buff
;
void
*
ptr
;
int
max_len
,
first_word
,
last_word
;
uint16_t
i
;
if
(
eeprom
->
len
==
0
)
return
-
EINVAL
;
if
(
eeprom
->
magic
!=
(
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
)))
if
(
eeprom
->
magic
!=
(
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
)))
return
-
EFAULT
;
max_len
=
ixgb_get_eeprom_len
(
netdev
);
if
(
eeprom
->
offset
>
eeprom
->
offset
+
eeprom
->
len
)
return
-
EINVAL
;
if
((
eeprom
->
offset
+
eeprom
->
len
)
>
max_len
)
eeprom
->
len
=
(
max_len
-
eeprom
->
offset
);
first_word
=
eeprom
->
offset
>>
1
;
last_word
=
(
eeprom
->
offset
+
eeprom
->
len
-
1
)
>>
1
;
ptr
=
(
char
*
)
eeprom_buff
;
eeprom_buff
=
kmalloc
(
max_len
,
GFP_KERNEL
);
if
(
!
eeprom_buff
)
return
-
ENOMEM
;
if
(
eeprom
->
offset
&
1
)
{
ptr
=
(
void
*
)
eeprom_buff
;
if
(
eeprom
->
offset
&
1
)
{
/* need read/modify/write of first changed EEPROM word */
/* only the second byte of the word is being modified */
eeprom_buff
[
0
]
=
ixgb_read_eeprom
(
hw
,
first_word
);
ptr
++
;
}
if
((
eeprom
->
offset
+
eeprom
->
len
)
&
1
)
{
if
((
eeprom
->
offset
+
eeprom
->
len
)
&
1
)
{
/* need read/modify/write of last changed EEPROM word */
/* only the first byte of the word is being modified */
eeprom_buff
[
last_word
-
first_word
]
=
ixgb_read_eeprom
(
hw
,
last_word
);
eeprom_buff
[
last_word
-
first_word
]
=
ixgb_read_eeprom
(
hw
,
last_word
);
}
memcpy
(
ptr
,
data
,
eeprom
->
len
);
for
(
i
=
0
;
i
<=
(
last_word
-
first_word
);
i
++
)
memcpy
(
ptr
,
bytes
,
eeprom
->
len
);
for
(
i
=
0
;
i
<=
(
last_word
-
first_word
);
i
++
)
ixgb_write_eeprom
(
hw
,
first_word
+
i
,
eeprom_buff
[
i
]);
/* Update the checksum over the first part of the EEPROM if needed */
if
(
first_word
<=
EEPROM_CHECKSUM_REG
)
if
(
first_word
<=
EEPROM_CHECKSUM_REG
)
ixgb_update_eeprom_checksum
(
hw
);
kfree
(
eeprom_buff
);
return
0
;
}
static
void
ixgb_get_drvinfo
(
struct
net_device
*
netdev
,
struct
ethtool_drvinfo
*
drvinfo
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
strncpy
(
drvinfo
->
driver
,
ixgb_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
ixgb_driver_version
,
32
);
strncpy
(
drvinfo
->
fw_version
,
"N/A"
,
32
);
strncpy
(
drvinfo
->
bus_info
,
pci_name
(
adapter
->
pdev
),
32
);
drvinfo
->
n_stats
=
IXGB_STATS_LEN
;
drvinfo
->
regdump_len
=
ixgb_get_regs_len
(
netdev
);
drvinfo
->
eedump_len
=
ixgb_get_eeprom_len
(
netdev
);
}
static
void
ixgb_get_ringparam
(
struct
net_device
*
netdev
,
struct
ethtool_ringparam
*
ring
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
ixgb_desc_ring
*
txdr
=
&
adapter
->
tx_ring
;
struct
ixgb_desc_ring
*
rxdr
=
&
adapter
->
rx_ring
;
ring
->
rx_max_pending
=
MAX_RXD
;
ring
->
tx_max_pending
=
MAX_TXD
;
ring
->
rx_mini_max_pending
=
0
;
ring
->
rx_jumbo_max_pending
=
0
;
ring
->
rx_pending
=
rxdr
->
count
;
ring
->
tx_pending
=
txdr
->
count
;
ring
->
rx_mini_pending
=
0
;
ring
->
rx_jumbo_pending
=
0
;
}
static
int
ixgb_set_ringparam
(
struct
net_device
*
netdev
,
struct
ethtool_ringparam
*
ring
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
ixgb_desc_ring
*
txdr
=
&
adapter
->
tx_ring
;
struct
ixgb_desc_ring
*
rxdr
=
&
adapter
->
rx_ring
;
struct
ixgb_desc_ring
tx_old
,
tx_new
,
rx_old
,
rx_new
;
int
err
;
tx_old
=
adapter
->
tx_ring
;
rx_old
=
adapter
->
rx_ring
;
if
((
ring
->
rx_mini_pending
)
||
(
ring
->
rx_jumbo_pending
))
return
-
EINVAL
;
if
(
netif_running
(
adapter
->
netdev
))
ixgb_down
(
adapter
,
TRUE
);
rxdr
->
count
=
max
(
ring
->
rx_pending
,(
uint32_t
)
MIN_RXD
);
rxdr
->
count
=
min
(
rxdr
->
count
,(
uint32_t
)
MAX_RXD
);
IXGB_ROUNDUP
(
rxdr
->
count
,
IXGB_REQ_RX_DESCRIPTOR_MULTIPLE
);
txdr
->
count
=
max
(
ring
->
tx_pending
,(
uint32_t
)
MIN_TXD
);
txdr
->
count
=
min
(
txdr
->
count
,(
uint32_t
)
MAX_TXD
);
IXGB_ROUNDUP
(
txdr
->
count
,
IXGB_REQ_TX_DESCRIPTOR_MULTIPLE
);
if
(
netif_running
(
adapter
->
netdev
))
{
/* Try to get new resources before deleting old */
if
((
err
=
ixgb_setup_rx_resources
(
adapter
)))
goto
err_setup_rx
;
if
((
err
=
ixgb_setup_tx_resources
(
adapter
)))
goto
err_setup_tx
;
/* save the new, restore the old in order to free it,
* then restore the new back again */
rx_new
=
adapter
->
rx_ring
;
tx_new
=
adapter
->
tx_ring
;
adapter
->
rx_ring
=
rx_old
;
adapter
->
tx_ring
=
tx_old
;
ixgb_free_rx_resources
(
adapter
);
ixgb_free_tx_resources
(
adapter
);
adapter
->
rx_ring
=
rx_new
;
adapter
->
tx_ring
=
tx_new
;
if
((
err
=
ixgb_up
(
adapter
)))
return
err
;
}
return
0
;
err_setup_tx:
ixgb_free_rx_resources
(
adapter
);
err_setup_rx:
adapter
->
rx_ring
=
rx_old
;
adapter
->
tx_ring
=
tx_old
;
ixgb_up
(
adapter
);
return
err
;
}
/* toggle LED 4 times per second = 2 "blinks" per second */
#define IXGB_ID_INTERVAL (HZ/4)
/* bit defines for adapter->led_status */
#define IXGB_LED_ON 0
static
void
ixgb_led_blink_callback
(
unsigned
long
data
)
static
void
ixgb_led_blink_callback
(
unsigned
long
data
)
{
struct
ixgb_adapter
*
adapter
=
(
struct
ixgb_adapter
*
)
data
;
if
(
test_and_change_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
))
if
(
test_and_change_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
))
ixgb_led_off
(
&
adapter
->
hw
);
else
ixgb_led_on
(
&
adapter
->
hw
);
...
...
@@ -391,10 +600,14 @@ static void ixgb_led_blink_callback(unsigned long data)
}
static
int
ixgb_
ethtool_led_blink
(
struct
net_device
*
netdev
,
u32
data
)
ixgb_
phys_id
(
struct
net_device
*
netdev
,
uint32_t
data
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
if
(
!
adapter
->
blink_timer
.
function
)
{
if
(
!
data
||
data
>
(
uint32_t
)(
MAX_SCHEDULE_TIMEOUT
/
HZ
))
data
=
(
uint32_t
)(
MAX_SCHEDULE_TIMEOUT
/
HZ
);
if
(
!
adapter
->
blink_timer
.
function
)
{
init_timer
(
&
adapter
->
blink_timer
);
adapter
->
blink_timer
.
function
=
ixgb_led_blink_callback
;
adapter
->
blink_timer
.
data
=
(
unsigned
long
)
adapter
;
...
...
@@ -403,7 +616,7 @@ ixgb_ethtool_led_blink(struct net_device *netdev, u32 data)
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
data
)
if
(
data
)
schedule_timeout
(
data
*
HZ
);
else
schedule_timeout
(
MAX_SCHEDULE_TIMEOUT
);
...
...
@@ -415,141 +628,74 @@ ixgb_ethtool_led_blink(struct net_device *netdev, u32 data)
return
0
;
}
static
int
ixgb_nway_reset
(
struct
net_device
*
netdev
)
{
if
(
netif_running
(
netdev
))
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
}
return
0
;
}
static
int
ixgb_get_stats_count
(
struct
net_device
*
dev
)
static
int
ixgb_get_stats_count
(
struct
net_device
*
netdev
)
{
return
IXGB_STATS_LEN
;
}
static
void
ixgb_get_strings
(
struct
net_device
*
dev
,
u32
stringset
,
u8
*
data
)
static
void
ixgb_get_ethtool_stats
(
struct
net_device
*
netdev
,
struct
ethtool_stats
*
stats
,
uint64_t
*
data
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
int
i
;
for
(
i
=
0
;
i
<
IXGB_STATS_LEN
;
i
++
)
{
memcpy
(
data
+
i
*
ETH_GSTRING_LEN
,
ixgb_gstrings_stats
[
i
].
stat_string
,
ETH_GSTRING_LEN
);
}
}
static
int
ixgb_get_regs_len
(
struct
net_device
*
dev
)
{
return
136
*
sizeof
(
uint32_t
);
}
static
int
ixgb_get_eeprom_len
(
struct
net_device
*
dev
)
{
/* return size in bytes */
return
(
IXGB_EEPROM_SIZE
<<
1
);
ixgb_update_stats
(
adapter
);
for
(
i
=
0
;
i
<
IXGB_STATS_LEN
;
i
++
)
{
char
*
p
=
(
char
*
)
adapter
+
ixgb_gstrings_stats
[
i
].
stat_offset
;
data
[
i
]
=
(
ixgb_gstrings_stats
[
i
].
sizeof_stat
==
sizeof
(
uint64_t
))
?
*
(
uint64_t
*
)
p
:
*
(
uint32_t
*
)
p
;
}
}
static
void
get_ethtool_stats
(
struct
net_device
*
dev
,
struct
ethtool_stats
*
stats
,
u64
*
data
)
static
void
ixgb_get_strings
(
struct
net_device
*
netdev
,
uint32_t
stringset
,
uint8_t
*
data
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
int
i
;
for
(
i
=
0
;
i
<
IXGB_STATS_LEN
;
i
++
)
{
void
*
p
=
(
char
*
)
adapter
+
ixgb_gstrings_stats
[
i
].
stat_offset
;
stats
->
data
[
i
]
=
(
ixgb_gstrings_stats
[
i
].
sizeof_stat
==
sizeof
(
uint64_t
))
?
*
(
uint64_t
*
)
p
:
*
(
uint32_t
*
)
p
;
switch
(
stringset
)
{
case
ETH_SS_STATS
:
for
(
i
=
0
;
i
<
IXGB_STATS_LEN
;
i
++
)
{
memcpy
(
data
+
i
*
ETH_GSTRING_LEN
,
ixgb_gstrings_stats
[
i
].
stat_string
,
ETH_GSTRING_LEN
);
}
break
;
}
}
static
u32
ixgb_get_rx_csum
(
struct
net_device
*
dev
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
return
adapter
->
rx_csum
;
}
static
int
ixgb_set_rx_csum
(
struct
net_device
*
dev
,
u32
sum
)
{
struct
ixgb_adapter
*
adapter
=
dev
->
priv
;
adapter
->
rx_csum
=
sum
;
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
return
0
;
}
static
u32
ixgb_get_tx_csum
(
struct
net_device
*
dev
)
{
return
(
dev
->
features
&
NETIF_F_HW_CSUM
)
!=
0
;
}
static
int
ixgb_set_tx_csum
(
struct
net_device
*
dev
,
u32
sum
)
{
if
(
sum
)
dev
->
features
|=
NETIF_F_HW_CSUM
;
else
dev
->
features
&=
~
NETIF_F_HW_CSUM
;
return
0
;
}
static
u32
ixgb_get_sg
(
struct
net_device
*
dev
)
{
return
(
dev
->
features
&
NETIF_F_SG
)
!=
0
;
}
static
int
ixgb_set_sg
(
struct
net_device
*
dev
,
u32
sum
)
{
if
(
sum
)
dev
->
features
|=
NETIF_F_SG
;
else
dev
->
features
&=
~
NETIF_F_SG
;
return
0
;
}
#ifdef NETIF_F_TSO
static
u32
ixgb_get_tso
(
struct
net_device
*
dev
)
{
return
(
dev
->
features
&
NETIF_F_TSO
)
!=
0
;
}
static
int
ixgb_set_tso
(
struct
net_device
*
dev
,
u32
sum
)
{
if
(
sum
)
dev
->
features
|=
NETIF_F_TSO
;
else
dev
->
features
&=
~
NETIF_F_TSO
;
return
0
;
}
#endif
struct
ethtool_ops
ixgb_ethtool_ops
=
{
.
get_settings
=
ixgb_ethtool_gset
,
.
set_settings
=
ixgb_ethtool_sset
,
.
get_drvinfo
=
ixgb_ethtool_gdrvinfo
,
.
nway_reset
=
ixgb_nway_reset
,
.
get_link
=
ethtool_op_get_link
,
.
phys_id
=
ixgb_ethtool_led_blink
,
.
get_strings
=
ixgb_get_strings
,
.
get_stats_count
=
ixgb_get_stats_count
,
.
get_regs
=
ixgb_ethtool_gregs
,
.
get_settings
=
ixgb_get_settings
,
.
set_settings
=
ixgb_set_settings
,
.
get_drvinfo
=
ixgb_get_drvinfo
,
.
get_regs_len
=
ixgb_get_regs_len
,
.
get_regs
=
ixgb_get_regs
,
.
get_link
=
ethtool_op_get_link
,
.
get_eeprom_len
=
ixgb_get_eeprom_len
,
.
get_eeprom
=
ixgb_ethtool_geeprom
,
.
set_eeprom
=
ixgb_ethtool_seeprom
,
.
get_pauseparam
=
ixgb_ethtool_gpause
,
.
set_pauseparam
=
ixgb_ethtool_spause
,
.
get_ethtool_stats
=
get_ethtool_stats
,
.
get_eeprom
=
ixgb_get_eeprom
,
.
set_eeprom
=
ixgb_set_eeprom
,
.
get_ringparam
=
ixgb_get_ringparam
,
.
set_ringparam
=
ixgb_set_ringparam
,
.
get_pauseparam
=
ixgb_get_pauseparam
,
.
set_pauseparam
=
ixgb_set_pauseparam
,
.
get_rx_csum
=
ixgb_get_rx_csum
,
.
set_rx_csum
=
ixgb_set_rx_csum
,
.
get_tx_csum
=
ixgb_get_tx_csum
,
.
set_tx_csum
=
ixgb_set_tx_csum
,
.
get_sg
=
ixgb
_get_sg
,
.
set_sg
=
ixgb
_set_sg
,
.
get_sg
=
ethtool_op
_get_sg
,
.
set_sg
=
ethtool_op
_set_sg
,
#ifdef NETIF_F_TSO
.
get_tso
=
ixgb
_get_tso
,
.
get_tso
=
ethtool_op
_get_tso
,
.
set_tso
=
ixgb_set_tso
,
#endif
.
get_strings
=
ixgb_get_strings
,
.
phys_id
=
ixgb_phys_id
,
.
get_stats_count
=
ixgb_get_stats_count
,
.
get_ethtool_stats
=
ixgb_get_ethtool_stats
,
};
void
ixgb_set_ethtool_ops
(
struct
net_device
*
netdev
)
{
SET_ETHTOOL_OPS
(
netdev
,
&
ixgb_ethtool_ops
);
}
drivers/net/ixgb/ixgb_hw.c
View file @
3fa8f148
...
...
@@ -53,9 +53,14 @@ uint32_t ixgb_mac_reset(struct ixgb_hw *hw)
{
uint32_t
ctrl_reg
;
ctrl_reg
=
IXGB_CTRL0_RST
|
IXGB_CTRL0_SDP3_DIR
|
/* All pins are Output=1 */
IXGB_CTRL0_SDP2_DIR
|
IXGB_CTRL0_SDP1_DIR
|
IXGB_CTRL0_SDP0_DIR
|
IXGB_CTRL0_SDP3
|
/* Initial value 1101 */
IXGB_CTRL0_SDP2
|
IXGB_CTRL0_SDP0
;
ctrl_reg
=
IXGB_CTRL0_RST
|
IXGB_CTRL0_SDP3_DIR
|
/* All pins are Output=1 */
IXGB_CTRL0_SDP2_DIR
|
IXGB_CTRL0_SDP1_DIR
|
IXGB_CTRL0_SDP0_DIR
|
IXGB_CTRL0_SDP3
|
/* Initial value 1101 */
IXGB_CTRL0_SDP2
|
IXGB_CTRL0_SDP0
;
#ifdef HP_ZX1
/* Workaround for 82597EX reset errata */
...
...
@@ -84,7 +89,8 @@ uint32_t ixgb_mac_reset(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
boolean_t
ixgb_adapter_stop
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_adapter_stop
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl_reg
;
uint32_t
icr_reg
;
...
...
@@ -94,7 +100,7 @@ boolean_t ixgb_adapter_stop(struct ixgb_hw * hw)
/* If we are stopped or resetting exit gracefully and wait to be
* started again before accessing the hardware.
*/
if
(
hw
->
adapter_stopped
)
{
if
(
hw
->
adapter_stopped
)
{
DEBUGOUT
(
"Exiting because the adapter is already stopped!!!
\n
"
);
return
FALSE
;
}
...
...
@@ -135,6 +141,7 @@ boolean_t ixgb_adapter_stop(struct ixgb_hw * hw)
return
(
ctrl_reg
&
IXGB_CTRL0_RST
);
}
/******************************************************************************
* Identifies the vendor of the optics module on the adapter. The SR adapters
* support two different types of XPAK optics, so it is necessary to determine
...
...
@@ -144,7 +151,8 @@ boolean_t ixgb_adapter_stop(struct ixgb_hw * hw)
*
* Returns: the vendor of the XPAK optics module.
*****************************************************************************/
static
ixgb_xpak_vendor
ixgb_identify_xpak_vendor
(
struct
ixgb_hw
*
hw
)
static
ixgb_xpak_vendor
ixgb_identify_xpak_vendor
(
struct
ixgb_hw
*
hw
)
{
uint32_t
i
;
uint16_t
vendor_name
[
5
];
...
...
@@ -183,7 +191,8 @@ static ixgb_xpak_vendor ixgb_identify_xpak_vendor(struct ixgb_hw *hw)
*
* Returns: the phy type of the adapter.
*****************************************************************************/
static
ixgb_phy_type
ixgb_identify_phy
(
struct
ixgb_hw
*
hw
)
static
ixgb_phy_type
ixgb_identify_phy
(
struct
ixgb_hw
*
hw
)
{
ixgb_phy_type
phy_type
;
ixgb_xpak_vendor
xpak_vendor
;
...
...
@@ -210,6 +219,11 @@ static ixgb_phy_type ixgb_identify_phy(struct ixgb_hw *hw)
phy_type
=
ixgb_phy_type_g6005
;
}
break
;
case
IXGB_DEVICE_ID_82597EX_LR
:
DEBUGOUT
(
"Identified G6104 optics
\n
"
);
phy_type
=
ixgb_phy_type_g6104
;
break
;
default:
DEBUGOUT
(
"Unknown physical layer module
\n
"
);
...
...
@@ -237,7 +251,8 @@ static ixgb_phy_type ixgb_identify_phy(struct ixgb_hw *hw)
* TRUE if successful,
* FALSE if unrecoverable problems were encountered.
*****************************************************************************/
boolean_t
ixgb_init_hw
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_init_hw
(
struct
ixgb_hw
*
hw
)
{
uint32_t
i
;
uint32_t
ctrl_reg
;
...
...
@@ -266,7 +281,7 @@ boolean_t ixgb_init_hw(struct ixgb_hw * hw)
msec_delay
(
IXGB_DELAY_AFTER_EE_RESET
);
if
(
ixgb_get_eeprom_data
(
hw
)
==
FALSE
)
{
return
(
FALSE
);
return
(
FALSE
);
}
/* Use the device id to determine the type of phy/transceiver. */
...
...
@@ -284,7 +299,7 @@ boolean_t ixgb_init_hw(struct ixgb_hw * hw)
*/
if
(
!
mac_addr_valid
(
hw
->
curr_mac_addr
))
{
DEBUGOUT
(
"MAC address invalid after ixgb_init_rx_addrs
\n
"
);
return
(
FALSE
);
return
(
FALSE
);
}
/* tell the routines in this file they can access hardware again */
...
...
@@ -295,7 +310,7 @@ boolean_t ixgb_init_hw(struct ixgb_hw * hw)
/* Zero out the Multicast HASH table */
DEBUGOUT
(
"Zeroing the MTA
\n
"
);
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
/* Zero out the VLAN Filter Table Array */
...
...
@@ -322,7 +337,8 @@ boolean_t ixgb_init_hw(struct ixgb_hw * hw)
* of the receive addresss registers. Clears the multicast table. Assumes
* the receiver is in reset when the routine is called.
*****************************************************************************/
void
ixgb_init_rx_addrs
(
struct
ixgb_hw
*
hw
)
void
ixgb_init_rx_addrs
(
struct
ixgb_hw
*
hw
)
{
uint32_t
i
;
...
...
@@ -360,7 +376,7 @@ void ixgb_init_rx_addrs(struct ixgb_hw *hw)
/* Zero out the other 15 receive addresses. */
DEBUGOUT
(
"Clearing RAR[1-15]
\n
"
);
for
(
i
=
1
;
i
<
IXGB_RAR_ENTRIES
;
i
++
)
{
for
(
i
=
1
;
i
<
IXGB_RAR_ENTRIES
;
i
++
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
(
i
<<
1
),
0
);
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
((
i
<<
1
)
+
1
),
0
);
}
...
...
@@ -383,12 +399,13 @@ void ixgb_init_rx_addrs(struct ixgb_hw *hw)
*****************************************************************************/
void
ixgb_mc_addr_list_update
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr_list
,
uint32_t
mc_addr_count
,
uint32_t
pad
)
uint8_t
*
mc_addr_list
,
uint32_t
mc_addr_count
,
uint32_t
pad
)
{
uint32_t
hash_value
;
uint32_t
i
;
uint32_t
rar_used_count
=
1
;
/* RAR[0] is used for our MAC address */
uint32_t
rar_used_count
=
1
;
/* RAR[0] is used for our MAC address */
DEBUGFUNC
(
"ixgb_mc_addr_list_update"
);
...
...
@@ -397,19 +414,19 @@ ixgb_mc_addr_list_update(struct ixgb_hw *hw,
/* Clear RAR[1-15] */
DEBUGOUT
(
" Clearing RAR[1-15]
\n
"
);
for
(
i
=
rar_used_count
;
i
<
IXGB_RAR_ENTRIES
;
i
++
)
{
for
(
i
=
rar_used_count
;
i
<
IXGB_RAR_ENTRIES
;
i
++
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
(
i
<<
1
),
0
);
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
((
i
<<
1
)
+
1
),
0
);
}
/* Clear the MTA */
DEBUGOUT
(
" Clearing MTA
\n
"
);
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
{
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
}
/* Add the new addresses */
for
(
i
=
0
;
i
<
mc_addr_count
;
i
++
)
{
for
(
i
=
0
;
i
<
mc_addr_count
;
i
++
)
{
DEBUGOUT
(
" Adding the multicast addresses:
\n
"
);
DEBUGOUT7
(
" MC Addr #%d =%.2X %.2X %.2X %.2X %.2X %.2X
\n
"
,
i
,
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)],
...
...
@@ -427,7 +444,7 @@ ixgb_mc_addr_list_update(struct ixgb_hw *hw,
/* Place this multicast address in the RAR if there is room, *
* else put it in the MTA
*/
if
(
rar_used_count
<
IXGB_RAR_ENTRIES
)
{
if
(
rar_used_count
<
IXGB_RAR_ENTRIES
)
{
ixgb_rar_set
(
hw
,
mc_addr_list
+
(
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)),
...
...
@@ -460,7 +477,9 @@ ixgb_mc_addr_list_update(struct ixgb_hw *hw,
* Returns:
* The hash value
*****************************************************************************/
static
uint32_t
ixgb_hash_mc_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr
)
static
uint32_t
ixgb_hash_mc_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr
)
{
uint32_t
hash_value
=
0
;
...
...
@@ -506,7 +525,9 @@ static uint32_t ixgb_hash_mc_addr(struct ixgb_hw *hw, uint8_t * mc_addr)
* hw - Struct containing variables accessed by shared code
* hash_value - Multicast address hash value
*****************************************************************************/
static
void
ixgb_mta_set
(
struct
ixgb_hw
*
hw
,
uint32_t
hash_value
)
static
void
ixgb_mta_set
(
struct
ixgb_hw
*
hw
,
uint32_t
hash_value
)
{
uint32_t
hash_bit
,
hash_reg
;
uint32_t
mta_reg
;
...
...
@@ -538,7 +559,10 @@ static void ixgb_mta_set(struct ixgb_hw *hw, uint32_t hash_value)
* addr - Address to put into receive address register
* index - Receive address register to write
*****************************************************************************/
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
)
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
)
{
uint32_t
rar_low
,
rar_high
;
...
...
@@ -548,11 +572,13 @@ void ixgb_rar_set(struct ixgb_hw *hw, uint8_t * addr, uint32_t index)
* from network order (big endian) to little endian
*/
rar_low
=
((
uint32_t
)
addr
[
0
]
|
((
uint32_t
)
addr
[
1
]
<<
8
)
|
((
uint32_t
)
addr
[
2
]
<<
16
)
|
((
uint32_t
)
addr
[
3
]
<<
24
));
((
uint32_t
)
addr
[
1
]
<<
8
)
|
((
uint32_t
)
addr
[
2
]
<<
16
)
|
((
uint32_t
)
addr
[
3
]
<<
24
));
rar_high
=
((
uint32_t
)
addr
[
4
]
|
((
uint32_t
)
addr
[
5
]
<<
8
)
|
IXGB_RAH_AV
);
((
uint32_t
)
addr
[
5
]
<<
8
)
|
IXGB_RAH_AV
);
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
(
index
<<
1
),
rar_low
);
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
((
index
<<
1
)
+
1
),
rar_high
);
...
...
@@ -566,7 +592,10 @@ void ixgb_rar_set(struct ixgb_hw *hw, uint8_t * addr, uint32_t index)
* offset - Offset in VLAN filer table to write
* value - Value to write into VLAN filter table
*****************************************************************************/
void
ixgb_write_vfta
(
struct
ixgb_hw
*
hw
,
uint32_t
offset
,
uint32_t
value
)
void
ixgb_write_vfta
(
struct
ixgb_hw
*
hw
,
uint32_t
offset
,
uint32_t
value
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
value
);
return
;
...
...
@@ -577,11 +606,12 @@ void ixgb_write_vfta(struct ixgb_hw *hw, uint32_t offset, uint32_t value)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
void
ixgb_clear_vfta
(
struct
ixgb_hw
*
hw
)
void
ixgb_clear_vfta
(
struct
ixgb_hw
*
hw
)
{
uint32_t
offset
;
for
(
offset
=
0
;
offset
<
IXGB_VLAN_FILTER_TBL_SIZE
;
offset
++
)
for
(
offset
=
0
;
offset
<
IXGB_VLAN_FILTER_TBL_SIZE
;
offset
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
0
);
return
;
}
...
...
@@ -592,10 +622,11 @@ void ixgb_clear_vfta(struct ixgb_hw *hw)
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
boolean_t
ixgb_setup_fc
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_setup_fc
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl_reg
;
uint32_t
pap_reg
=
0
;
/* by default, assume no pause time */
uint32_t
pap_reg
=
0
;
/* by default, assume no pause time */
boolean_t
status
=
TRUE
;
DEBUGFUNC
(
"ixgb_setup_fc"
);
...
...
@@ -660,16 +691,16 @@ boolean_t ixgb_setup_fc(struct ixgb_hw * hw)
* ability to transmit pause frames in not enabled, then these
* registers will be set to 0.
*/
if
(
!
(
hw
->
fc
.
type
&
ixgb_fc_tx_pause
))
{
if
(
!
(
hw
->
fc
.
type
&
ixgb_fc_tx_pause
))
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
0
);
IXGB_WRITE_REG
(
hw
,
FCRTH
,
0
);
}
else
{
/* We need to set up the Receive Threshold high and low water
* marks as well as (optionally) enabling the transmission of XON frames.
*/
if
(
hw
->
fc
.
send_xon
)
{
/* We need to set up the Receive Threshold high and low water
* marks as well as (optionally) enabling the transmission of XON
* frames.
*/
if
(
hw
->
fc
.
send_xon
)
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
(
hw
->
fc
.
low_water
|
IXGB_FCRTL_XONE
));
(
hw
->
fc
.
low_water
|
IXGB_FCRTL_XONE
));
}
else
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
hw
->
fc
.
low_water
);
}
...
...
@@ -694,9 +725,10 @@ boolean_t ixgb_setup_fc(struct ixgb_hw * hw)
* read command.
*****************************************************************************/
uint16_t
ixgb_read_phy_reg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg_address
,
uint32_t
phy_address
,
uint32_t
device_type
)
ixgb_read_phy_reg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg_address
,
uint32_t
phy_address
,
uint32_t
device_type
)
{
uint32_t
i
;
uint32_t
data
;
...
...
@@ -721,7 +753,8 @@ ixgb_read_phy_reg(struct ixgb_hw * hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
udelay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
...
...
@@ -747,7 +780,8 @@ ixgb_read_phy_reg(struct ixgb_hw * hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
udelay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
...
...
@@ -763,7 +797,7 @@ ixgb_read_phy_reg(struct ixgb_hw * hw,
*/
data
=
IXGB_READ_REG
(
hw
,
MSRWD
);
data
>>=
IXGB_MSRWD_READ_DATA_SHIFT
;
return
((
uint16_t
)
data
);
return
((
uint16_t
)
data
);
}
/******************************************************************************
...
...
@@ -785,8 +819,10 @@ ixgb_read_phy_reg(struct ixgb_hw * hw,
*****************************************************************************/
void
ixgb_write_phy_reg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg_address
,
uint32_t
phy_address
,
uint32_t
device_type
,
uint16_t
data
)
uint32_t
reg_address
,
uint32_t
phy_address
,
uint32_t
device_type
,
uint16_t
data
)
{
uint32_t
i
;
uint32_t
command
=
0
;
...
...
@@ -796,24 +832,25 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
ASSERT
(
device_type
<=
IXGB_MAX_PHY_DEV_TYPE
);
/* Put the data in the MDIO Read/Write Data register */
IXGB_WRITE_REG
(
hw
,
MSRWD
,
(
uint32_t
)
data
);
IXGB_WRITE_REG
(
hw
,
MSRWD
,
(
uint32_t
)
data
);
/* Setup and write the address cycle command */
command
=
((
reg_address
<<
IXGB_MSCA_NP_ADDR_SHIFT
)
|
(
device_type
<<
IXGB_MSCA_DEV_TYPE_SHIFT
)
|
(
phy_address
<<
IXGB_MSCA_PHY_ADDR_SHIFT
)
|
(
IXGB_MSCA_ADDR_CYCLE
|
IXGB_MSCA_MDI_COMMAND
));
command
=
((
reg_address
<<
IXGB_MSCA_NP_ADDR_SHIFT
)
|
(
device_type
<<
IXGB_MSCA_DEV_TYPE_SHIFT
)
|
(
phy_address
<<
IXGB_MSCA_PHY_ADDR_SHIFT
)
|
(
IXGB_MSCA_ADDR_CYCLE
|
IXGB_MSCA_MDI_COMMAND
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the address cycle completed
** The COMMAND bit will clear when the operation is complete.
** This may take as long as 64 usecs (we'll wait 100 usecs max)
** from the CPU Write to the Ready bit assertion.
**************************************************************/
/**************************************************************
** Check every 10 usec to see if the address cycle completed
** The COMMAND bit will clear when the operation is complete.
** This may take as long as 64 usecs (we'll wait 100 usecs max)
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
udelay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
...
...
@@ -825,21 +862,22 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
/* Address cycle complete, setup and write the write command */
command
=
((
reg_address
<<
IXGB_MSCA_NP_ADDR_SHIFT
)
|
(
device_type
<<
IXGB_MSCA_DEV_TYPE_SHIFT
)
|
(
phy_address
<<
IXGB_MSCA_PHY_ADDR_SHIFT
)
|
(
IXGB_MSCA_WRITE
|
IXGB_MSCA_MDI_COMMAND
));
command
=
((
reg_address
<<
IXGB_MSCA_NP_ADDR_SHIFT
)
|
(
device_type
<<
IXGB_MSCA_DEV_TYPE_SHIFT
)
|
(
phy_address
<<
IXGB_MSCA_PHY_ADDR_SHIFT
)
|
(
IXGB_MSCA_WRITE
|
IXGB_MSCA_MDI_COMMAND
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the read command completed
** The COMMAND bit will clear when the operation is complete.
** The write may take as long as 64 usecs (we'll wait 100 usecs max)
** from the CPU Write to the Ready bit assertion.
**************************************************************/
/**************************************************************
** Check every 10 usec to see if the read command completed
** The COMMAND bit will clear when the operation is complete.
** The write may take as long as 64 usecs (we'll wait 100 usecs max)
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
udelay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
...
...
@@ -860,7 +898,8 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
*
* Called by any function that needs to check the link status of the adapter.
*****************************************************************************/
void
ixgb_check_for_link
(
struct
ixgb_hw
*
hw
)
void
ixgb_check_for_link
(
struct
ixgb_hw
*
hw
)
{
uint32_t
status_reg
;
uint32_t
xpcss_reg
;
...
...
@@ -922,14 +961,15 @@ boolean_t ixgb_check_for_bad_link(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
void
ixgb_clear_hw_cntrs
(
struct
ixgb_hw
*
hw
)
void
ixgb_clear_hw_cntrs
(
struct
ixgb_hw
*
hw
)
{
volatile
uint32_t
temp_reg
;
DEBUGFUNC
(
"ixgb_clear_hw_cntrs"
);
/* if we are stopped or resetting exit gracefully */
if
(
hw
->
adapter_stopped
)
{
if
(
hw
->
adapter_stopped
)
{
DEBUGOUT
(
"Exiting because the adapter is stopped!!!
\n
"
);
return
;
}
...
...
@@ -1002,7 +1042,8 @@ void ixgb_clear_hw_cntrs(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
void
ixgb_led_on
(
struct
ixgb_hw
*
hw
)
void
ixgb_led_on
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
...
...
@@ -1017,7 +1058,8 @@ void ixgb_led_on(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
void
ixgb_led_off
(
struct
ixgb_hw
*
hw
)
void
ixgb_led_off
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
...
...
@@ -1032,18 +1074,19 @@ void ixgb_led_off(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
static
void
ixgb_get_bus_info
(
struct
ixgb_hw
*
hw
)
static
void
ixgb_get_bus_info
(
struct
ixgb_hw
*
hw
)
{
uint32_t
status_reg
;
status_reg
=
IXGB_READ_REG
(
hw
,
STATUS
);
hw
->
bus
.
type
=
(
status_reg
&
IXGB_STATUS_PCIX_MODE
)
?
ixgb_bus_type_pcix
:
ixgb_bus_type_pci
;
ixgb_bus_type_pcix
:
ixgb_bus_type_pci
;
if
(
hw
->
bus
.
type
==
ixgb_bus_type_pci
)
{
hw
->
bus
.
speed
=
(
status_reg
&
IXGB_STATUS_PCI_SPD
)
?
ixgb_bus_speed_66
:
ixgb_bus_speed_33
;
ixgb_bus_speed_66
:
ixgb_bus_speed_33
;
}
else
{
switch
(
status_reg
&
IXGB_STATUS_PCIX_SPD_MASK
)
{
case
IXGB_STATUS_PCIX_SPD_66
:
...
...
@@ -1062,7 +1105,7 @@ static void ixgb_get_bus_info(struct ixgb_hw *hw)
}
hw
->
bus
.
width
=
(
status_reg
&
IXGB_STATUS_BUS64
)
?
ixgb_bus_width_64
:
ixgb_bus_width_32
;
ixgb_bus_width_64
:
ixgb_bus_width_32
;
return
;
}
...
...
@@ -1073,7 +1116,8 @@ static void ixgb_get_bus_info(struct ixgb_hw *hw)
* mac_addr - pointer to MAC address.
*
*****************************************************************************/
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
)
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
)
{
boolean_t
is_valid
=
TRUE
;
DEBUGFUNC
(
"mac_addr_valid"
);
...
...
@@ -1090,9 +1134,11 @@ boolean_t mac_addr_valid(uint8_t * mac_addr)
}
/* Reject the zero address */
else
if
(
mac_addr
[
0
]
==
0
&&
mac_addr
[
1
]
==
0
&&
mac_addr
[
2
]
==
0
&&
mac_addr
[
3
]
==
0
&&
mac_addr
[
4
]
==
0
&&
mac_addr
[
5
]
==
0
)
{
mac_addr
[
1
]
==
0
&&
mac_addr
[
2
]
==
0
&&
mac_addr
[
3
]
==
0
&&
mac_addr
[
4
]
==
0
&&
mac_addr
[
5
]
==
0
)
{
DEBUGOUT
(
"MAC address is all zeros
\n
"
);
is_valid
=
FALSE
;
}
...
...
@@ -1105,7 +1151,8 @@ boolean_t mac_addr_valid(uint8_t * mac_addr)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
boolean_t
ixgb_link_reset
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_link_reset
(
struct
ixgb_hw
*
hw
)
{
boolean_t
link_status
=
FALSE
;
uint8_t
wait_retries
=
MAX_RESET_ITERATIONS
;
...
...
@@ -1135,20 +1182,22 @@ boolean_t ixgb_link_reset(struct ixgb_hw * hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
void
ixgb_optics_reset
(
struct
ixgb_hw
*
hw
)
void
ixgb_optics_reset
(
struct
ixgb_hw
*
hw
)
{
if
(
hw
->
phy_type
==
ixgb_phy_type_txn17401
)
{
uint16_t
mdio_reg
;
ixgb_write_phy_reg
(
hw
,
MDIO_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
MDIO_PMA_PMD_DID
,
MDIO_PMA_PMD_CR1_RESET
);
mdio_reg
=
ixgb_read_phy_reg
(
hw
,
MDIO_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
MDIO_PMA_PMD_DID
);
MDIO_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
MDIO_PMA_PMD_DID
,
MDIO_PMA_PMD_CR1_RESET
);
mdio_reg
=
ixgb_read_phy_reg
(
hw
,
MDIO_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
MDIO_PMA_PMD_DID
);
}
return
;
...
...
drivers/net/ixgb/ixgb_hw.h
View file @
3fa8f148
...
...
@@ -616,17 +616,17 @@ struct ixgb_context_desc {
#define IXGB_CONTEXT_DESC_STATUS_DD 0x01
/* Filters */
#define IXGB_RAR_ENTRIES 16
/* Number of entries in Rx Address array */
#define IXGB_MC_TBL_SIZE 128
/* Multicast Filter Table (4096 bits) */
#define IXGB_VLAN_FILTER_TBL_SIZE 128
/* VLAN Filter Table (4096 bits) */
#define IXGB_RAR_ENTRIES 3
/* Number of entries in Rx Address array */
#define IXGB_MEMORY_REGISTER_BASE_ADDRESS 0
#define ENET_HEADER_SIZE
14
#define ENET_FCS_LENGTH
4
#define IXGB_MAX_NUM_MULTICAST_ADDRESSES
128
#define IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS
60
#define IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
1514
#define IXGB_MAX_JUMBO_FRAME_SIZE
0x3F00
#define ENET_HEADER_SIZE
14
#define ENET_FCS_LENGTH
4
#define IXGB_MAX_NUM_MULTICAST_ADDRESSES
128
#define IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS
60
#define IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
1514
#define IXGB_MAX_JUMBO_FRAME_SIZE
0x3F00
/* Phy Addresses */
#define IXGB_OPTICAL_PHY_ADDR 0x0
/* Optical Module phy address */
...
...
@@ -789,32 +789,39 @@ extern void ixgb_check_for_link(struct ixgb_hw *hw);
extern
boolean_t
ixgb_check_for_bad_link
(
struct
ixgb_hw
*
hw
);
extern
boolean_t
ixgb_setup_fc
(
struct
ixgb_hw
*
hw
);
extern
void
ixgb_clear_hw_cntrs
(
struct
ixgb_hw
*
hw
);
extern
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
);
extern
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
);
extern
uint16_t
ixgb_read_phy_reg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg_addr
,
uint32_t
phy_addr
,
uint32_t
device_type
);
uint32_t
reg_addr
,
uint32_t
phy_addr
,
uint32_t
device_type
);
extern
void
ixgb_write_phy_reg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg_addr
,
uint32_t
phy_addr
,
uint32_t
device_type
,
uint16_t
data
);
uint32_t
reg_addr
,
uint32_t
phy_addr
,
uint32_t
device_type
,
uint16_t
data
);
extern
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
);
extern
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
);
/* Filters (multicast, vlan, receive) */
extern
void
ixgb_mc_addr_list_update
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr_list
,
uint32_t
mc_addr_count
,
uint32_t
pad
);
uint8_t
*
mc_addr_list
,
uint32_t
mc_addr_count
,
uint32_t
pad
);
/* Vfta functions */
extern
void
ixgb_write_vfta
(
struct
ixgb_hw
*
hw
,
uint32_t
offset
,
uint32_t
value
);
uint32_t
offset
,
uint32_t
value
);
extern
void
ixgb_clear_vfta
(
struct
ixgb_hw
*
hw
);
/* Access functions to eeprom data */
void
ixgb_get_ee_mac_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mac_addr
);
void
ixgb_get_ee_mac_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mac_addr
);
uint16_t
ixgb_get_ee_compatibility
(
struct
ixgb_hw
*
hw
);
uint32_t
ixgb_get_ee_pba_number
(
struct
ixgb_hw
*
hw
);
uint16_t
ixgb_get_ee_init_ctrl_reg_1
(
struct
ixgb_hw
*
hw
);
...
...
@@ -832,6 +839,9 @@ uint16_t ixgb_get_eeprom_word(struct ixgb_hw *hw, uint16_t index);
/* Everything else */
void
ixgb_led_on
(
struct
ixgb_hw
*
hw
);
void
ixgb_led_off
(
struct
ixgb_hw
*
hw
);
void
ixgb_write_pci_cfg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg
,
uint16_t
*
value
);
void
ixgb_write_pci_cfg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg
,
uint16_t
*
value
);
#endif
/* _IXGB_HW_H_ */
#endif
/* _IXGB_HW_H_ */
drivers/net/ixgb/ixgb_ids.h
View file @
3fa8f148
...
...
@@ -33,21 +33,16 @@
** The Device and Vendor IDs for 10 Gigabit MACs
**********************************************************************/
#define INTEL_VENDOR_ID 0x8086
#define INTEL_SUBVENDOR_ID 0x8086
#define INTEL_VENDOR_ID
0x8086
#define INTEL_SUBVENDOR_ID
0x8086
#define IXGB_DEVICE_ID_82597EX 0x1048
#define IXGB_DEVICE_ID_82597EX_SR 0x1A48
#define IXGB_SUBDEVICE_ID_A11F 0xA11F
#define IXGB_SUBDEVICE_ID_A01F 0xA01F
#define IXGB_DEVICE_ID_82597EX 0x1048
#define IXGB_DEVICE_ID_82597EX_SR 0x1A48
#define IXGB_DEVICE_ID_82597EX_LR 0x1B48
#define IXGB_SUBDEVICE_ID_A11F 0xA11F
#define IXGB_SUBDEVICE_ID_A01F 0xA01F
#define IXGB_SUBDEVICE_ID_A15F 0xA15F
#define IXGB_SUBDEVICE_ID_A05F 0xA05F
#define IXGB_SUBDEVICE_ID_A12F 0xA12F
#define IXGB_SUBDEVICE_ID_A02F 0xA02F
#endif
/* #ifndef _IXGB_IDS_H_ */
#endif
/* #ifndef _IXGB_IDS_H_ */
/* End of File */
drivers/net/ixgb/ixgb_main.c
View file @
3fa8f148
...
...
@@ -28,10 +28,23 @@
#include "ixgb.h"
/* Change Log
* 1.0.84 10/26/04
* - reset buffer_info->dma in Tx resource cleanup logic
* 1.0.83 10/12/04
* - sparse cleanup - shemminger@osdl.org
* - fix tx resource cleanup logic
*/
char
ixgb_driver_name
[]
=
"ixgb"
;
char
ixgb_driver_string
[]
=
"Intel(R) PRO/10GbE Network Driver"
;
char
ixgb_driver_version
[]
=
"1.0.66-k2"
;
char
ixgb_copyright
[]
=
"Copyright (c) 2001-2004 Intel Corporation."
;
#ifndef CONFIG_IXGB_NAPI
#define DRIVERNAPI
#else
#define DRIVERNAPI "-NAPI"
#endif
char
ixgb_driver_version
[]
=
"1.0.87-k2"
DRIVERNAPI
;
char
ixgb_copyright
[]
=
"Copyright (c) 1999-2004 Intel Corporation."
;
/* ixgb_pci_tbl - PCI Device ID Table
*
...
...
@@ -46,6 +59,8 @@ static struct pci_device_id ixgb_pci_tbl[] = {
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
INTEL_VENDOR_ID
,
IXGB_DEVICE_ID_82597EX_SR
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
INTEL_VENDOR_ID
,
IXGB_DEVICE_ID_82597EX_LR
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
/* required last entry */
{
0
,}
...
...
@@ -55,11 +70,14 @@ MODULE_DEVICE_TABLE(pci, ixgb_pci_tbl);
/* Local Function Prototypes */
static
inline
void
ixgb_irq_disable
(
struct
ixgb_adapter
*
adapter
);
static
inline
void
ixgb_irq_enable
(
struct
ixgb_adapter
*
adapter
);
int
ixgb_up
(
struct
ixgb_adapter
*
adapter
);
void
ixgb_down
(
struct
ixgb_adapter
*
adapter
,
boolean_t
kill_watchdog
);
void
ixgb_reset
(
struct
ixgb_adapter
*
adapter
);
int
ixgb_setup_tx_resources
(
struct
ixgb_adapter
*
adapter
);
int
ixgb_setup_rx_resources
(
struct
ixgb_adapter
*
adapter
);
void
ixgb_free_tx_resources
(
struct
ixgb_adapter
*
adapter
);
void
ixgb_free_rx_resources
(
struct
ixgb_adapter
*
adapter
);
void
ixgb_update_stats
(
struct
ixgb_adapter
*
adapter
);
static
int
ixgb_init_module
(
void
);
static
void
ixgb_exit_module
(
void
);
...
...
@@ -68,27 +86,19 @@ static void __devexit ixgb_remove(struct pci_dev *pdev);
static
int
ixgb_sw_init
(
struct
ixgb_adapter
*
adapter
);
static
int
ixgb_open
(
struct
net_device
*
netdev
);
static
int
ixgb_close
(
struct
net_device
*
netdev
);
static
int
ixgb_setup_tx_resources
(
struct
ixgb_adapter
*
adapter
);
static
int
ixgb_setup_rx_resources
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_configure_tx
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_configure_rx
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_setup_rctl
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_clean_tx_ring
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_clean_rx_ring
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_free_tx_resources
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_free_rx_resources
(
struct
ixgb_adapter
*
adapter
);
static
void
ixgb_set_multi
(
struct
net_device
*
netdev
);
static
void
ixgb_watchdog
(
unsigned
long
data
);
static
int
ixgb_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
);
static
struct
net_device_stats
*
ixgb_get_stats
(
struct
net_device
*
netdev
);
static
int
ixgb_change_mtu
(
struct
net_device
*
netdev
,
int
new_mtu
);
static
int
ixgb_set_mac
(
struct
net_device
*
netdev
,
void
*
p
);
static
void
ixgb_update_stats
(
struct
ixgb_adapter
*
adapter
);
static
irqreturn_t
ixgb_intr
(
int
irq
,
void
*
data
,
struct
pt_regs
*
regs
);
static
boolean_t
ixgb_clean_tx_irq
(
struct
ixgb_adapter
*
adapter
);
static
inline
void
ixgb_rx_checksum
(
struct
ixgb_adapter
*
adapter
,
struct
ixgb_rx_desc
*
rx_desc
,
struct
sk_buff
*
skb
);
#ifdef CONFIG_IXGB_NAPI
static
int
ixgb_clean
(
struct
net_device
*
netdev
,
int
*
budget
);
static
boolean_t
ixgb_clean_rx_irq
(
struct
ixgb_adapter
*
adapter
,
...
...
@@ -97,6 +107,7 @@ static boolean_t ixgb_clean_rx_irq(struct ixgb_adapter *adapter,
static
boolean_t
ixgb_clean_rx_irq
(
struct
ixgb_adapter
*
adapter
);
#endif
static
void
ixgb_alloc_rx_buffers
(
struct
ixgb_adapter
*
adapter
);
void
ixgb_set_ethtool_ops
(
struct
net_device
*
netdev
);
static
void
ixgb_tx_timeout
(
struct
net_device
*
dev
);
static
void
ixgb_tx_timeout_task
(
struct
net_device
*
dev
);
static
void
ixgb_vlan_rx_register
(
struct
net_device
*
netdev
,
...
...
@@ -123,7 +134,6 @@ struct notifier_block ixgb_notifier_reboot = {
/* Exported from other modules */
extern
void
ixgb_check_options
(
struct
ixgb_adapter
*
adapter
);
extern
struct
ethtool_ops
ixgb_ethtool_ops
;
static
struct
pci_driver
ixgb_driver
=
{
.
name
=
ixgb_driver_name
,
...
...
@@ -152,7 +162,8 @@ MODULE_LICENSE("GPL");
* loaded. All it does is register with the PCI subsystem.
**/
static
int
__init
ixgb_init_module
(
void
)
static
int
__init
ixgb_init_module
(
void
)
{
int
ret
;
printk
(
KERN_INFO
"%s - version %s
\n
"
,
...
...
@@ -161,7 +172,7 @@ static int __init ixgb_init_module(void)
printk
(
KERN_INFO
"%s
\n
"
,
ixgb_copyright
);
ret
=
pci_module_init
(
&
ixgb_driver
);
if
(
ret
>=
0
)
{
if
(
ret
>=
0
)
{
register_reboot_notifier
(
&
ixgb_notifier_reboot
);
}
return
ret
;
...
...
@@ -176,7 +187,8 @@ module_init(ixgb_init_module);
* from memory.
**/
static
void
__exit
ixgb_exit_module
(
void
)
static
void
__exit
ixgb_exit_module
(
void
)
{
unregister_reboot_notifier
(
&
ixgb_notifier_reboot
);
pci_unregister_driver
(
&
ixgb_driver
);
...
...
@@ -189,7 +201,8 @@ module_exit(ixgb_exit_module);
* @adapter: board private structure
**/
static
inline
void
ixgb_irq_disable
(
struct
ixgb_adapter
*
adapter
)
static
inline
void
ixgb_irq_disable
(
struct
ixgb_adapter
*
adapter
)
{
atomic_inc
(
&
adapter
->
irq_sem
);
IXGB_WRITE_REG
(
&
adapter
->
hw
,
IMC
,
~
0
);
...
...
@@ -202,17 +215,19 @@ static inline void ixgb_irq_disable(struct ixgb_adapter *adapter)
* @adapter: board private structure
**/
static
inline
void
ixgb_irq_enable
(
struct
ixgb_adapter
*
adapter
)
static
inline
void
ixgb_irq_enable
(
struct
ixgb_adapter
*
adapter
)
{
if
(
atomic_dec_and_test
(
&
adapter
->
irq_sem
))
{
if
(
atomic_dec_and_test
(
&
adapter
->
irq_sem
))
{
IXGB_WRITE_REG
(
&
adapter
->
hw
,
IMS
,
IXGB_INT_RXT0
|
IXGB_INT_RXDMT0
|
IXGB_INT_TXDW
|
IXGB_INT_RXO
|
IXGB_INT_LSC
);
IXGB_INT_RXT0
|
IXGB_INT_RXDMT0
|
IXGB_INT_TXDW
|
IXGB_INT_RXO
|
IXGB_INT_LSC
);
IXGB_WRITE_FLUSH
(
&
adapter
->
hw
);
}
}
int
ixgb_up
(
struct
ixgb_adapter
*
adapter
)
int
ixgb_up
(
struct
ixgb_adapter
*
adapter
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
int
err
;
...
...
@@ -230,27 +245,44 @@ int ixgb_up(struct ixgb_adapter *adapter)
ixgb_configure_rx
(
adapter
);
ixgb_alloc_rx_buffers
(
adapter
);
if
((
err
=
request_irq
(
adapter
->
pdev
->
irq
,
&
ixgb_intr
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
netdev
->
name
,
netdev
)))
#ifdef CONFIG_PCI_MSI
{
boolean_t
pcix
=
(
IXGB_READ_REG
(
&
adapter
->
hw
,
STATUS
)
&
IXGB_STATUS_PCIX_MODE
)
?
TRUE
:
FALSE
;
adapter
->
have_msi
=
TRUE
;
if
(
!
pcix
)
adapter
->
have_msi
=
FALSE
;
else
if
((
err
=
pci_enable_msi
(
adapter
->
pdev
)))
{
printk
(
KERN_ERR
"Unable to allocate MSI interrupt Error: %d
\n
"
,
err
);
adapter
->
have_msi
=
FALSE
;
/* proceed to try to request regular interrupt */
}
}
#endif
if
((
err
=
request_irq
(
adapter
->
pdev
->
irq
,
&
ixgb_intr
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
netdev
->
name
,
netdev
)))
return
err
;
/* disable interrupts and get the hardware into a known state */
IXGB_WRITE_REG
(
&
adapter
->
hw
,
IMC
,
0xffffffff
);
if
((
hw
->
max_frame_size
!=
max_frame
)
||
(
hw
->
max_frame_size
!=
(
IXGB_READ_REG
(
hw
,
MFS
)
>>
IXGB_MFS_SHIFT
)))
{
if
((
hw
->
max_frame_size
!=
max_frame
)
||
(
hw
->
max_frame_size
!=
(
IXGB_READ_REG
(
hw
,
MFS
)
>>
IXGB_MFS_SHIFT
)))
{
hw
->
max_frame_size
=
max_frame
;
IXGB_WRITE_REG
(
hw
,
MFS
,
hw
->
max_frame_size
<<
IXGB_MFS_SHIFT
);
if
(
hw
->
max_frame_size
>
IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
{
if
(
hw
->
max_frame_size
>
IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
{
uint32_t
ctrl0
=
IXGB_READ_REG
(
hw
,
CTRL0
);
if
(
!
(
ctrl0
&
IXGB_CTRL0_JFE
))
{
if
(
!
(
ctrl0
&
IXGB_CTRL0_JFE
))
{
ctrl0
|=
IXGB_CTRL0_JFE
;
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl0
);
}
...
...
@@ -263,13 +295,19 @@ int ixgb_up(struct ixgb_adapter *adapter)
return
0
;
}
void
ixgb_down
(
struct
ixgb_adapter
*
adapter
,
boolean_t
kill_watchdog
)
void
ixgb_down
(
struct
ixgb_adapter
*
adapter
,
boolean_t
kill_watchdog
)
{
struct
net_device
*
netdev
=
adapter
->
netdev
;
ixgb_irq_disable
(
adapter
);
free_irq
(
adapter
->
pdev
->
irq
,
netdev
);
if
(
kill_watchdog
)
#ifdef CONFIG_PCI_MSI
if
(
adapter
->
have_msi
==
TRUE
)
pci_disable_msi
(
adapter
->
pdev
);
#endif
if
(
kill_watchdog
)
del_timer_sync
(
&
adapter
->
watchdog_timer
);
adapter
->
link_speed
=
0
;
adapter
->
link_duplex
=
0
;
...
...
@@ -281,11 +319,12 @@ void ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog)
ixgb_clean_rx_ring
(
adapter
);
}
void
ixgb_reset
(
struct
ixgb_adapter
*
adapter
)
void
ixgb_reset
(
struct
ixgb_adapter
*
adapter
)
{
ixgb_adapter_stop
(
&
adapter
->
hw
);
if
(
!
ixgb_init_hw
(
&
adapter
->
hw
))
if
(
!
ixgb_init_hw
(
&
adapter
->
hw
))
IXGB_DBG
(
"ixgb_init_hw failed.
\n
"
);
}
...
...
@@ -302,7 +341,8 @@ void ixgb_reset(struct ixgb_adapter *adapter)
**/
static
int
__devinit
ixgb_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
ixgb_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
ent
)
{
struct
net_device
*
netdev
=
NULL
;
struct
ixgb_adapter
*
adapter
;
...
...
@@ -313,26 +353,26 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
int
i
;
int
err
;
if
((
err
=
pci_enable_device
(
pdev
)))
if
((
err
=
pci_enable_device
(
pdev
)))
return
err
;
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
if
(
!
(
err
=
pci_set_dma_mask
(
pdev
,
DMA_64BIT_MASK
)))
{
pci_using_dac
=
1
;
}
else
{
if
((
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)))
{
if
((
err
=
pci_set_dma_mask
(
pdev
,
DMA_32BIT_MASK
)))
{
IXGB_ERR
(
"No usable DMA configuration, aborting
\n
"
);
return
err
;
}
pci_using_dac
=
0
;
}
if
((
err
=
pci_request_regions
(
pdev
,
ixgb_driver_name
)))
if
((
err
=
pci_request_regions
(
pdev
,
ixgb_driver_name
)))
return
err
;
pci_set_master
(
pdev
);
netdev
=
alloc_etherdev
(
sizeof
(
struct
ixgb_adapter
));
if
(
!
netdev
)
{
if
(
!
netdev
)
{
err
=
-
ENOMEM
;
goto
err_alloc_etherdev
;
}
...
...
@@ -350,15 +390,15 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
mmio_len
=
pci_resource_len
(
pdev
,
BAR_0
);
adapter
->
hw
.
hw_addr
=
ioremap
(
mmio_start
,
mmio_len
);
if
(
!
adapter
->
hw
.
hw_addr
)
{
if
(
!
adapter
->
hw
.
hw_addr
)
{
err
=
-
EIO
;
goto
err_ioremap
;
}
for
(
i
=
BAR_1
;
i
<=
BAR_5
;
i
++
)
{
if
(
pci_resource_len
(
pdev
,
i
)
==
0
)
for
(
i
=
BAR_1
;
i
<=
BAR_5
;
i
++
)
{
if
(
pci_resource_len
(
pdev
,
i
)
==
0
)
continue
;
if
(
pci_resource_flags
(
pdev
,
i
)
&
IORESOURCE_IO
)
{
if
(
pci_resource_flags
(
pdev
,
i
)
&
IORESOURCE_IO
)
{
adapter
->
hw
.
io_base
=
pci_resource_start
(
pdev
,
i
);
break
;
}
...
...
@@ -371,9 +411,9 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
netdev
->
set_multicast_list
=
&
ixgb_set_multi
;
netdev
->
set_mac_address
=
&
ixgb_set_mac
;
netdev
->
change_mtu
=
&
ixgb_change_mtu
;
ixgb_set_ethtool_ops
(
netdev
);
netdev
->
tx_timeout
=
&
ixgb_tx_timeout
;
netdev
->
watchdog_timeo
=
HZ
;
SET_ETHTOOL_OPS
(
netdev
,
&
ixgb_ethtool_ops
);
#ifdef CONFIG_IXGB_NAPI
netdev
->
poll
=
&
ixgb_clean
;
netdev
->
weight
=
64
;
...
...
@@ -395,22 +435,24 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/* setup the private structure */
if
((
err
=
ixgb_sw_init
(
adapter
)))
if
((
err
=
ixgb_sw_init
(
adapter
)))
goto
err_sw_init
;
netdev
->
features
=
NETIF_F_SG
|
NETIF_F_HW_CSUM
|
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
|
NETIF_F_HW_VLAN_FILTER
;
NETIF_F_HW_CSUM
|
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
|
NETIF_F_HW_VLAN_FILTER
;
#ifdef NETIF_F_TSO
netdev
->
features
|=
NETIF_F_TSO
;
#endif
if
(
pci_using_dac
)
if
(
pci_using_dac
)
netdev
->
features
|=
NETIF_F_HIGHDMA
;
/* make sure the EEPROM is good */
if
(
!
ixgb_validate_eeprom_checksum
(
&
adapter
->
hw
))
{
if
(
!
ixgb_validate_eeprom_checksum
(
&
adapter
->
hw
))
{
printk
(
KERN_ERR
"The EEPROM Checksum Is Not Valid
\n
"
);
err
=
-
EIO
;
goto
err_eeprom
;
...
...
@@ -418,7 +460,7 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ixgb_get_ee_mac_addr
(
&
adapter
->
hw
,
netdev
->
dev_addr
);
if
(
!
is_valid_ether_addr
(
netdev
->
dev_addr
))
{
if
(
!
is_valid_ether_addr
(
netdev
->
dev_addr
))
{
err
=
-
EIO
;
goto
err_eeprom
;
}
...
...
@@ -432,7 +474,7 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_WORK
(
&
adapter
->
tx_timeout_task
,
(
void
(
*
)(
void
*
))
ixgb_tx_timeout_task
,
netdev
);
if
((
err
=
register_netdev
(
netdev
)))
if
((
err
=
register_netdev
(
netdev
)))
goto
err_register
;
/* we're going to reset, so assume we have no link for now */
...
...
@@ -441,7 +483,7 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
netif_stop_queue
(
netdev
);
printk
(
KERN_INFO
"%s: Intel(R) PRO/10GbE Network Connection
\n
"
,
netdev
->
name
);
netdev
->
name
);
ixgb_check_options
(
adapter
);
/* reset the hardware with the new settings */
...
...
@@ -450,13 +492,13 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
cards_found
++
;
return
0
;
err_register:
err_sw_init:
err_eeprom:
err_register:
err_sw_init:
err_eeprom:
iounmap
(
adapter
->
hw
.
hw_addr
);
err_ioremap:
err_ioremap:
free_netdev
(
netdev
);
err_alloc_etherdev:
err_alloc_etherdev:
pci_release_regions
(
pdev
);
return
err
;
}
...
...
@@ -471,7 +513,8 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
* memory.
**/
static
void
__devexit
ixgb_remove
(
struct
pci_dev
*
pdev
)
static
void
__devexit
ixgb_remove
(
struct
pci_dev
*
pdev
)
{
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
...
...
@@ -493,7 +536,8 @@ static void __devexit ixgb_remove(struct pci_dev *pdev)
* OS network device settings (MTU size).
**/
static
int
__devinit
ixgb_sw_init
(
struct
ixgb_adapter
*
adapter
)
static
int
__devinit
ixgb_sw_init
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
struct
net_device
*
netdev
=
adapter
->
netdev
;
...
...
@@ -510,9 +554,10 @@ static int __devinit ixgb_sw_init(struct ixgb_adapter *adapter)
hw
->
max_frame_size
=
netdev
->
mtu
+
ENET_HEADER_SIZE
+
ENET_FCS_LENGTH
;
if
((
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX
)
||
(
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX_SR
))
hw
->
mac_type
=
ixgb_82597
;
if
((
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX
)
||
(
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX_LR
)
||
(
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX_SR
))
hw
->
mac_type
=
ixgb_82597
;
else
{
/* should never have loaded on this device */
printk
(
KERN_ERR
"ixgb: unsupported device id
\n
"
);
...
...
@@ -540,31 +585,32 @@ static int __devinit ixgb_sw_init(struct ixgb_adapter *adapter)
* and the stack is notified that the interface is ready.
**/
static
int
ixgb_open
(
struct
net_device
*
netdev
)
static
int
ixgb_open
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
int
err
;
/* allocate transmit descriptors */
if
((
err
=
ixgb_setup_tx_resources
(
adapter
)))
if
((
err
=
ixgb_setup_tx_resources
(
adapter
)))
goto
err_setup_tx
;
/* allocate receive descriptors */
if
((
err
=
ixgb_setup_rx_resources
(
adapter
)))
if
((
err
=
ixgb_setup_rx_resources
(
adapter
)))
goto
err_setup_rx
;
if
((
err
=
ixgb_up
(
adapter
)))
if
((
err
=
ixgb_up
(
adapter
)))
goto
err_up
;
return
0
;
err_up:
err_up:
ixgb_free_rx_resources
(
adapter
);
err_setup_rx:
err_setup_rx:
ixgb_free_tx_resources
(
adapter
);
err_setup_tx:
err_setup_tx:
ixgb_reset
(
adapter
);
return
err
;
...
...
@@ -582,7 +628,8 @@ static int ixgb_open(struct net_device *netdev)
* hardware, and all transmit and receive resources are freed.
**/
static
int
ixgb_close
(
struct
net_device
*
netdev
)
static
int
ixgb_close
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
...
...
@@ -601,15 +648,16 @@ static int ixgb_close(struct net_device *netdev)
* Return 0 on success, negative on failure
**/
static
int
ixgb_setup_tx_resources
(
struct
ixgb_adapter
*
adapter
)
int
ixgb_setup_tx_resources
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
txdr
=
&
adapter
->
tx_ring
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
int
size
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
txdr
->
count
;
txdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
!
txdr
->
buffer_info
)
{
txdr
->
buffer_info
=
vmalloc
(
size
);
if
(
!
txdr
->
buffer_info
)
{
return
-
ENOMEM
;
}
memset
(
txdr
->
buffer_info
,
0
,
size
);
...
...
@@ -620,8 +668,8 @@ static int ixgb_setup_tx_resources(struct ixgb_adapter *adapter)
IXGB_ROUNDUP
(
txdr
->
size
,
4096
);
txdr
->
desc
=
pci_alloc_consistent
(
pdev
,
txdr
->
size
,
&
txdr
->
dma
);
if
(
!
txdr
->
desc
)
{
k
free
(
txdr
->
buffer_info
);
if
(
!
txdr
->
desc
)
{
v
free
(
txdr
->
buffer_info
);
return
-
ENOMEM
;
}
memset
(
txdr
->
desc
,
0
,
txdr
->
size
);
...
...
@@ -639,7 +687,8 @@ static int ixgb_setup_tx_resources(struct ixgb_adapter *adapter)
* Configure the Tx unit of the MAC after a reset.
**/
static
void
ixgb_configure_tx
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_configure_tx
(
struct
ixgb_adapter
*
adapter
)
{
uint64_t
tdba
=
adapter
->
tx_ring
.
dma
;
uint32_t
tdlen
=
adapter
->
tx_ring
.
count
*
sizeof
(
struct
ixgb_tx_desc
);
...
...
@@ -679,8 +728,8 @@ static void ixgb_configure_tx(struct ixgb_adapter *adapter)
/* Setup Transmit Descriptor Settings for this adapter */
adapter
->
tx_cmd_type
=
IXGB_TX_DESC_TYPE
|
(
adapter
->
tx_int_delay_enable
?
IXGB_TX_DESC_CMD_IDE
:
0
);
IXGB_TX_DESC_TYPE
|
(
adapter
->
tx_int_delay_enable
?
IXGB_TX_DESC_CMD_IDE
:
0
);
}
/**
...
...
@@ -690,15 +739,16 @@ static void ixgb_configure_tx(struct ixgb_adapter *adapter)
* Returns 0 on success, negative on failure
**/
static
int
ixgb_setup_rx_resources
(
struct
ixgb_adapter
*
adapter
)
int
ixgb_setup_rx_resources
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
rxdr
=
&
adapter
->
rx_ring
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
int
size
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
rxdr
->
count
;
rxdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
!
rxdr
->
buffer_info
)
{
rxdr
->
buffer_info
=
vmalloc
(
size
);
if
(
!
rxdr
->
buffer_info
)
{
return
-
ENOMEM
;
}
memset
(
rxdr
->
buffer_info
,
0
,
size
);
...
...
@@ -710,8 +760,8 @@ static int ixgb_setup_rx_resources(struct ixgb_adapter *adapter)
rxdr
->
desc
=
pci_alloc_consistent
(
pdev
,
rxdr
->
size
,
&
rxdr
->
dma
);
if
(
!
rxdr
->
desc
)
{
k
free
(
rxdr
->
buffer_info
);
if
(
!
rxdr
->
desc
)
{
v
free
(
rxdr
->
buffer_info
);
return
-
ENOMEM
;
}
memset
(
rxdr
->
desc
,
0
,
rxdr
->
size
);
...
...
@@ -727,7 +777,8 @@ static int ixgb_setup_rx_resources(struct ixgb_adapter *adapter)
* @adapter: Board private structure
**/
static
void
ixgb_setup_rctl
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_setup_rctl
(
struct
ixgb_adapter
*
adapter
)
{
uint32_t
rctl
;
...
...
@@ -736,9 +787,9 @@ static void ixgb_setup_rctl(struct ixgb_adapter *adapter)
rctl
&=
~
(
3
<<
IXGB_RCTL_MO_SHIFT
);
rctl
|=
IXGB_RCTL_BAM
|
IXGB_RCTL_RDMTS_1_2
|
IXGB_RCTL_RXEN
|
IXGB_RCTL_CFF
|
(
adapter
->
hw
.
mc_filter_type
<<
IXGB_RCTL_MO_SHIFT
);
IXGB_RCTL_BAM
|
IXGB_RCTL_RDMTS_1_2
|
IXGB_RCTL_RXEN
|
IXGB_RCTL_CFF
|
(
adapter
->
hw
.
mc_filter_type
<<
IXGB_RCTL_MO_SHIFT
);
rctl
|=
IXGB_RCTL_SECRC
;
...
...
@@ -768,7 +819,8 @@ static void ixgb_setup_rctl(struct ixgb_adapter *adapter)
* Configure the Rx unit of the MAC after a reset.
**/
static
void
ixgb_configure_rx
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_configure_rx
(
struct
ixgb_adapter
*
adapter
)
{
uint64_t
rdba
=
adapter
->
rx_ring
.
dma
;
uint32_t
rdlen
=
adapter
->
rx_ring
.
count
*
sizeof
(
struct
ixgb_rx_desc
);
...
...
@@ -797,51 +849,14 @@ static void ixgb_configure_rx(struct ixgb_adapter *adapter)
IXGB_WRITE_REG
(
hw
,
RDH
,
0
);
IXGB_WRITE_REG
(
hw
,
RDT
,
0
);
/* burst 16 or burst when RXT0
*/
rxdctl
=
RXDCTL_WTHRESH_DEFAULT
<<
IXGB_RXDCTL_WTHRESH_SHIFT
|
RXDCTL_HTHRESH_DEFAULT
<<
IXGB_RXDCTL_HTHRESH_SHIFT
|
RXDCTL_PTHRESH_DEFAULT
<<
IXGB_RXDCTL_PTHRESH_SHIFT
;
/* burst 16 or burst when RXT0
*/
rxdctl
=
RXDCTL_WTHRESH_DEFAULT
<<
IXGB_RXDCTL_WTHRESH_SHIFT
|
RXDCTL_HTHRESH_DEFAULT
<<
IXGB_RXDCTL_HTHRESH_SHIFT
|
RXDCTL_PTHRESH_DEFAULT
<<
IXGB_RXDCTL_PTHRESH_SHIFT
;
IXGB_WRITE_REG
(
hw
,
RXDCTL
,
rxdctl
);
if
(
adapter
->
raidc
)
{
uint32_t
raidc
;
uint8_t
poll_threshold
;
/* Poll every rx_int_delay period, if RBD exists
* Receive Backlog Detection is set to <threshold>
* Rx Descriptors
* max is 0x3F == set to poll when 504 RxDesc left
* min is 0 */
/* polling times are 1 == 0.8192us
2 == 1.6384us
3 == 3.2768us etc
...
511 == 418 us
*/
#define IXGB_RAIDC_POLL_DEFAULT 122
/* set to poll every ~100 us under load
also known as 10000 interrupts / sec */
/* divide this by 2^3 (8) to get a register size count */
poll_threshold
=
((
adapter
->
rx_ring
.
count
-
1
)
>>
3
);
/* poll at half of that size */
poll_threshold
>>=
1
;
/* make sure its not bigger than our max */
poll_threshold
&=
0x3F
;
raidc
=
IXGB_RAIDC_EN
|
/* turn on raidc style moderation */
IXGB_RAIDC_RXT_GATE
|
/* don't interrupt with rxt0 while
in RBD mode (polling) */
(
IXGB_RAIDC_POLL_DEFAULT
<<
IXGB_RAIDC_POLL_SHIFT
)
|
/* this sets the regular "min interrupt delay" */
(
adapter
->
rx_int_delay
<<
IXGB_RAIDC_DELAY_SHIFT
)
|
poll_threshold
;
IXGB_WRITE_REG
(
hw
,
RAIDC
,
raidc
);
}
/* Enable Receive Checksum Offload for TCP and UDP */
if
(
adapter
->
rx_csum
==
TRUE
)
{
if
(
adapter
->
rx_csum
==
TRUE
)
{
rxcsum
=
IXGB_READ_REG
(
hw
,
RXCSUM
);
rxcsum
|=
IXGB_RXCSUM_TUOFL
;
IXGB_WRITE_REG
(
hw
,
RXCSUM
,
rxcsum
);
...
...
@@ -859,13 +874,14 @@ static void ixgb_configure_rx(struct ixgb_adapter *adapter)
* Free all transmit software resources
**/
static
void
ixgb_free_tx_resources
(
struct
ixgb_adapter
*
adapter
)
void
ixgb_free_tx_resources
(
struct
ixgb_adapter
*
adapter
)
{
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
ixgb_clean_tx_ring
(
adapter
);
k
free
(
adapter
->
tx_ring
.
buffer_info
);
v
free
(
adapter
->
tx_ring
.
buffer_info
);
adapter
->
tx_ring
.
buffer_info
=
NULL
;
pci_free_consistent
(
pdev
,
adapter
->
tx_ring
.
size
,
...
...
@@ -874,33 +890,42 @@ static void ixgb_free_tx_resources(struct ixgb_adapter *adapter)
adapter
->
tx_ring
.
desc
=
NULL
;
}
static
inline
void
ixgb_unmap_and_free_tx_resource
(
struct
ixgb_adapter
*
adapter
,
struct
ixgb_buffer
*
buffer_info
)
{
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
if
(
buffer_info
->
dma
)
{
pci_unmap_page
(
pdev
,
buffer_info
->
dma
,
buffer_info
->
length
,
PCI_DMA_TODEVICE
);
buffer_info
->
dma
=
0
;
}
if
(
buffer_info
->
skb
)
{
dev_kfree_skb_any
(
buffer_info
->
skb
);
buffer_info
->
skb
=
NULL
;
}
}
/**
* ixgb_clean_tx_ring - Free Tx Buffers
* @adapter: board private structure
**/
static
void
ixgb_clean_tx_ring
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_clean_tx_ring
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
tx_ring
=
&
adapter
->
tx_ring
;
struct
ixgb_buffer
*
buffer_info
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
unsigned
long
size
;
unsigned
int
i
;
/* Free all the Tx ring sk_buffs */
for
(
i
=
0
;
i
<
tx_ring
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
tx_ring
->
count
;
i
++
)
{
buffer_info
=
&
tx_ring
->
buffer_info
[
i
];
if
(
buffer_info
->
skb
)
{
pci_unmap_page
(
pdev
,
buffer_info
->
dma
,
buffer_info
->
length
,
PCI_DMA_TODEVICE
);
dev_kfree_skb
(
buffer_info
->
skb
);
buffer_info
->
skb
=
NULL
;
}
ixgb_unmap_and_free_tx_resource
(
adapter
,
buffer_info
);
}
size
=
sizeof
(
struct
ixgb_buffer
)
*
tx_ring
->
count
;
...
...
@@ -924,14 +949,15 @@ static void ixgb_clean_tx_ring(struct ixgb_adapter *adapter)
* Free all receive software resources
**/
static
void
ixgb_free_rx_resources
(
struct
ixgb_adapter
*
adapter
)
void
ixgb_free_rx_resources
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
rx_ring
=
&
adapter
->
rx_ring
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
ixgb_clean_rx_ring
(
adapter
);
k
free
(
rx_ring
->
buffer_info
);
v
free
(
rx_ring
->
buffer_info
);
rx_ring
->
buffer_info
=
NULL
;
pci_free_consistent
(
pdev
,
rx_ring
->
size
,
rx_ring
->
desc
,
rx_ring
->
dma
);
...
...
@@ -944,7 +970,8 @@ static void ixgb_free_rx_resources(struct ixgb_adapter *adapter)
* @adapter: board private structure
**/
static
void
ixgb_clean_rx_ring
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_clean_rx_ring
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
rx_ring
=
&
adapter
->
rx_ring
;
struct
ixgb_buffer
*
buffer_info
;
...
...
@@ -954,9 +981,9 @@ static void ixgb_clean_rx_ring(struct ixgb_adapter *adapter)
/* Free all the Rx ring sk_buffs */
for
(
i
=
0
;
i
<
rx_ring
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
rx_ring
->
count
;
i
++
)
{
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
if
(
buffer_info
->
skb
)
{
if
(
buffer_info
->
skb
)
{
pci_unmap_single
(
pdev
,
buffer_info
->
dma
,
...
...
@@ -991,12 +1018,13 @@ static void ixgb_clean_rx_ring(struct ixgb_adapter *adapter)
* Returns 0 on success, negative on failure
**/
static
int
ixgb_set_mac
(
struct
net_device
*
netdev
,
void
*
p
)
static
int
ixgb_set_mac
(
struct
net_device
*
netdev
,
void
*
p
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
sockaddr
*
addr
=
p
;
if
(
!
is_valid_ether_addr
(
addr
->
sa_data
))
if
(
!
is_valid_ether_addr
(
addr
->
sa_data
))
return
-
EADDRNOTAVAIL
;
memcpy
(
netdev
->
dev_addr
,
addr
->
sa_data
,
netdev
->
addr_len
);
...
...
@@ -1016,7 +1044,8 @@ static int ixgb_set_mac(struct net_device *netdev, void *p)
* promiscuous mode, and all-multi behavior.
**/
static
void
ixgb_set_multi
(
struct
net_device
*
netdev
)
static
void
ixgb_set_multi
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
...
...
@@ -1028,16 +1057,16 @@ static void ixgb_set_multi(struct net_device *netdev)
rctl
=
IXGB_READ_REG
(
hw
,
RCTL
);
if
(
netdev
->
flags
&
IFF_PROMISC
)
{
if
(
netdev
->
flags
&
IFF_PROMISC
)
{
rctl
|=
(
IXGB_RCTL_UPE
|
IXGB_RCTL_MPE
);
}
else
if
(
netdev
->
flags
&
IFF_ALLMULTI
)
{
}
else
if
(
netdev
->
flags
&
IFF_ALLMULTI
)
{
rctl
|=
IXGB_RCTL_MPE
;
rctl
&=
~
IXGB_RCTL_UPE
;
}
else
{
rctl
&=
~
(
IXGB_RCTL_UPE
|
IXGB_RCTL_MPE
);
}
if
(
netdev
->
mc_count
>
IXGB_MAX_NUM_MULTICAST_ADDRESSES
)
{
if
(
netdev
->
mc_count
>
IXGB_MAX_NUM_MULTICAST_ADDRESSES
)
{
rctl
|=
IXGB_RCTL_MPE
;
IXGB_WRITE_REG
(
hw
,
RCTL
,
rctl
);
}
else
{
...
...
@@ -1045,10 +1074,10 @@ static void ixgb_set_multi(struct net_device *netdev)
IXGB_WRITE_REG
(
hw
,
RCTL
,
rctl
);
for
(
i
=
0
,
mc_ptr
=
netdev
->
mc_list
;
mc_ptr
;
i
++
,
mc_ptr
=
mc_ptr
->
next
)
for
(
i
=
0
,
mc_ptr
=
netdev
->
mc_list
;
mc_ptr
;
i
++
,
mc_ptr
=
mc_ptr
->
next
)
memcpy
(
&
mta
[
i
*
IXGB_ETH_LENGTH_OF_ADDRESS
],
mc_ptr
->
dmi_addr
,
IXGB_ETH_LENGTH_OF_ADDRESS
);
mc_ptr
->
dmi_addr
,
IXGB_ETH_LENGTH_OF_ADDRESS
);
ixgb_mc_addr_list_update
(
hw
,
mta
,
netdev
->
mc_count
,
0
);
}
...
...
@@ -1059,7 +1088,8 @@ static void ixgb_set_multi(struct net_device *netdev)
* @data: pointer to netdev cast into an unsigned long
**/
static
void
ixgb_watchdog
(
unsigned
long
data
)
static
void
ixgb_watchdog
(
unsigned
long
data
)
{
struct
ixgb_adapter
*
adapter
=
(
struct
ixgb_adapter
*
)
data
;
struct
net_device
*
netdev
=
adapter
->
netdev
;
...
...
@@ -1073,21 +1103,22 @@ static void ixgb_watchdog(unsigned long data)
netif_stop_queue
(
netdev
);
}
if
(
adapter
->
hw
.
link_up
)
{
if
(
!
netif_carrier_ok
(
netdev
))
{
if
(
adapter
->
hw
.
link_up
)
{
if
(
!
netif_carrier_ok
(
netdev
))
{
printk
(
KERN_INFO
"ixgb: %s NIC Link is Up %d Mbps %s
\n
"
,
netdev
->
name
,
10000
,
"Full Duplex"
);
netdev
->
name
,
10000
,
"Full Duplex"
);
adapter
->
link_speed
=
10000
;
adapter
->
link_duplex
=
FULL_DUPLEX
;
netif_carrier_on
(
netdev
);
netif_wake_queue
(
netdev
);
}
}
else
{
if
(
netif_carrier_ok
(
netdev
))
{
if
(
netif_carrier_ok
(
netdev
))
{
adapter
->
link_speed
=
0
;
adapter
->
link_duplex
=
0
;
printk
(
KERN_INFO
"ixgb: %s NIC Link is Down
\n
"
,
netdev
->
name
);
"ixgb: %s NIC Link is Down
\n
"
,
netdev
->
name
);
netif_carrier_off
(
netdev
);
netif_stop_queue
(
netdev
);
...
...
@@ -1096,8 +1127,8 @@ static void ixgb_watchdog(unsigned long data)
ixgb_update_stats
(
adapter
);
if
(
!
netif_carrier_ok
(
netdev
))
{
if
(
IXGB_DESC_UNUSED
(
txdr
)
+
1
<
txdr
->
count
)
{
if
(
!
netif_carrier_ok
(
netdev
))
{
if
(
IXGB_DESC_UNUSED
(
txdr
)
+
1
<
txdr
->
count
)
{
/* We've lost link, so the controller stops DMA,
* but we've got queued Tx work that's never going
* to get done, so reset controller to flush Tx.
...
...
@@ -1108,9 +1139,9 @@ static void ixgb_watchdog(unsigned long data)
/* Early detection of hung controller */
i
=
txdr
->
next_to_clean
;
if
(
txdr
->
buffer_info
[
i
].
dma
&&
time_after
(
jiffies
,
txdr
->
buffer_info
[
i
].
time_stamp
+
HZ
)
&&
!
(
IXGB_READ_REG
(
&
adapter
->
hw
,
STATUS
)
&
IXGB_STATUS_TXOFF
))
if
(
txdr
->
buffer_info
[
i
].
dma
&&
time_after
(
jiffies
,
txdr
->
buffer_info
[
i
].
time_stamp
+
HZ
)
&&
!
(
IXGB_READ_REG
(
&
adapter
->
hw
,
STATUS
)
&
IXGB_STATUS_TXOFF
))
netif_stop_queue
(
netdev
);
/* generate an interrupt to force clean up of any stragglers */
...
...
@@ -1133,7 +1164,7 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
uint8_t
ipcss
,
ipcso
,
tucss
,
tucso
,
hdr_len
;
uint16_t
ipcse
,
tucse
,
mss
;
if
(
likely
(
skb_shinfo
(
skb
)
->
tso_size
))
{
if
(
likely
(
skb_shinfo
(
skb
)
->
tso_size
))
{
hdr_len
=
((
skb
->
h
.
raw
-
skb
->
data
)
+
(
skb
->
h
.
th
->
doff
<<
2
));
mss
=
skb_shinfo
(
skb
)
->
tso_size
;
skb
->
nh
.
iph
->
tot_len
=
0
;
...
...
@@ -1160,22 +1191,16 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
context_desc
->
mss
=
cpu_to_le16
(
mss
);
context_desc
->
hdr_len
=
hdr_len
;
context_desc
->
status
=
0
;
context_desc
->
cmd_type_len
=
cpu_to_le32
(
IXGB_CONTEXT_DESC_TYPE
|
IXGB_CONTEXT_DESC_CMD_TSE
|
IXGB_CONTEXT_DESC_CMD_IP
|
IXGB_CONTEXT_DESC_CMD_TCP
|
IXGB_CONTEXT_DESC_CMD_RS
|
IXGB_CONTEXT_DESC_CMD_IDE
|
(
skb
->
len
-
(
hdr_len
)));
if
(
++
i
==
adapter
->
tx_ring
.
count
)
i
=
0
;
context_desc
->
cmd_type_len
=
cpu_to_le32
(
IXGB_CONTEXT_DESC_TYPE
|
IXGB_CONTEXT_DESC_CMD_TSE
|
IXGB_CONTEXT_DESC_CMD_IP
|
IXGB_CONTEXT_DESC_CMD_TCP
|
IXGB_CONTEXT_DESC_CMD_RS
|
IXGB_CONTEXT_DESC_CMD_IDE
|
(
skb
->
len
-
(
hdr_len
)));
if
(
++
i
==
adapter
->
tx_ring
.
count
)
i
=
0
;
adapter
->
tx_ring
.
next_to_use
=
i
;
return
TRUE
;
...
...
@@ -1192,7 +1217,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
unsigned
int
i
;
uint8_t
css
,
cso
;
if
(
likely
(
skb
->
ip_summed
==
CHECKSUM_HW
))
{
if
(
likely
(
skb
->
ip_summed
==
CHECKSUM_HW
))
{
css
=
skb
->
h
.
raw
-
skb
->
data
;
cso
=
(
skb
->
h
.
raw
+
skb
->
csum
)
-
skb
->
data
;
...
...
@@ -1203,16 +1228,16 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
context_desc
->
tucso
=
cso
;
context_desc
->
tucse
=
0
;
/* zero out any previously existing data in one instruction */
*
(
uint32_t
*
)
&
(
context_desc
->
ipcss
)
=
0
;
*
(
uint32_t
*
)
&
(
context_desc
->
ipcss
)
=
0
;
context_desc
->
status
=
0
;
context_desc
->
hdr_len
=
0
;
context_desc
->
mss
=
0
;
context_desc
->
cmd_type_len
=
cpu_to_le32
(
IXGB_CONTEXT_DESC_TYPE
|
IXGB_TX_DESC_CMD_RS
|
IXGB_TX_DESC_CMD_IDE
);
cpu_to_le32
(
IXGB_CONTEXT_DESC_TYPE
|
IXGB_TX_DESC_CMD_RS
|
IXGB_TX_DESC_CMD_IDE
);
if
(
++
i
==
adapter
->
tx_ring
.
count
)
i
=
0
;
if
(
++
i
==
adapter
->
tx_ring
.
count
)
i
=
0
;
adapter
->
tx_ring
.
next_to_use
=
i
;
return
TRUE
;
...
...
@@ -1239,45 +1264,46 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,
i
=
tx_ring
->
next_to_use
;
while
(
len
)
{
while
(
len
)
{
buffer_info
=
&
tx_ring
->
buffer_info
[
i
];
size
=
min
(
len
,
IXGB_MAX_JUMBO_FRAME_SIZE
);
buffer_info
->
length
=
size
;
buffer_info
->
dma
=
pci_map_single
(
adapter
->
pdev
,
skb
->
data
+
offset
,
size
,
PCI_DMA_TODEVICE
);
pci_map_single
(
adapter
->
pdev
,
skb
->
data
+
offset
,
size
,
PCI_DMA_TODEVICE
);
buffer_info
->
time_stamp
=
jiffies
;
len
-=
size
;
offset
+=
size
;
count
++
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
}
for
(
f
=
0
;
f
<
nr_frags
;
f
++
)
{
for
(
f
=
0
;
f
<
nr_frags
;
f
++
)
{
struct
skb_frag_struct
*
frag
;
frag
=
&
skb_shinfo
(
skb
)
->
frags
[
f
];
len
=
frag
->
size
;
offset
=
0
;
while
(
len
)
{
while
(
len
)
{
buffer_info
=
&
tx_ring
->
buffer_info
[
i
];
size
=
min
(
len
,
IXGB_MAX_JUMBO_FRAME_SIZE
);
buffer_info
->
length
=
size
;
buffer_info
->
dma
=
pci_map_page
(
adapter
->
pdev
,
frag
->
page
,
frag
->
page_offset
+
offset
,
size
,
PCI_DMA_TODEVICE
);
pci_map_page
(
adapter
->
pdev
,
frag
->
page
,
frag
->
page_offset
+
offset
,
size
,
PCI_DMA_TODEVICE
);
buffer_info
->
time_stamp
=
jiffies
;
len
-=
size
;
offset
+=
size
;
count
++
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
}
}
i
=
(
i
==
0
)
?
tx_ring
->
count
-
1
:
i
-
1
;
...
...
@@ -1288,8 +1314,7 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb,
}
static
inline
void
ixgb_tx_queue
(
struct
ixgb_adapter
*
adapter
,
int
count
,
int
vlan_id
,
int
tx_flags
)
ixgb_tx_queue
(
struct
ixgb_adapter
*
adapter
,
int
count
,
int
vlan_id
,
int
tx_flags
)
{
struct
ixgb_desc_ring
*
tx_ring
=
&
adapter
->
tx_ring
;
struct
ixgb_tx_desc
*
tx_desc
=
NULL
;
...
...
@@ -1299,36 +1324,35 @@ ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,
uint8_t
popts
=
0
;
unsigned
int
i
;
if
(
tx_flags
&
IXGB_TX_FLAGS_TSO
)
{
if
(
tx_flags
&
IXGB_TX_FLAGS_TSO
)
{
cmd_type_len
|=
IXGB_TX_DESC_CMD_TSE
;
popts
|=
(
IXGB_TX_DESC_POPTS_IXSM
|
IXGB_TX_DESC_POPTS_TXSM
);
}
if
(
tx_flags
&
IXGB_TX_FLAGS_CSUM
)
if
(
tx_flags
&
IXGB_TX_FLAGS_CSUM
)
popts
|=
IXGB_TX_DESC_POPTS_TXSM
;
if
(
tx_flags
&
IXGB_TX_FLAGS_VLAN
)
{
if
(
tx_flags
&
IXGB_TX_FLAGS_VLAN
)
{
cmd_type_len
|=
IXGB_TX_DESC_CMD_VLE
;
}
i
=
tx_ring
->
next_to_use
;
while
(
count
--
)
{
while
(
count
--
)
{
buffer_info
=
&
tx_ring
->
buffer_info
[
i
];
tx_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
i
);
tx_desc
->
buff_addr
=
cpu_to_le64
(
buffer_info
->
dma
);
tx_desc
->
cmd_type_len
=
cpu_to_le32
(
cmd_type_len
|
buffer_info
->
length
);
cpu_to_le32
(
cmd_type_len
|
buffer_info
->
length
);
tx_desc
->
status
=
status
;
tx_desc
->
popts
=
popts
;
tx_desc
->
vlan
=
cpu_to_le16
(
vlan_id
);
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
}
tx_desc
->
cmd_type_len
|=
cpu_to_le32
(
IXGB_TX_DESC_CMD_EOP
|
IXGB_TX_DESC_CMD_RS
);
tx_desc
->
cmd_type_len
|=
cpu_to_le32
(
IXGB_TX_DESC_CMD_EOP
|
IXGB_TX_DESC_CMD_RS
);
/* Force memory writes to complete before letting h/w
* know there are new descriptors to fetch. (Only
...
...
@@ -1346,7 +1370,8 @@ ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,
#define DESC_NEEDED TXD_USE_COUNT(IXGB_MAX_DATA_PER_TXD) + \
MAX_SKB_FRAGS * TXD_USE_COUNT(PAGE_SIZE) + 1
static
int
ixgb_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
)
static
int
ixgb_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
unsigned
int
first
;
...
...
@@ -1354,33 +1379,33 @@ static int ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
unsigned
long
flags
;
int
vlan_id
=
0
;
if
(
skb
->
len
<=
0
)
{
if
(
skb
->
len
<=
0
)
{
dev_kfree_skb_any
(
skb
);
return
0
;
}
spin_lock_irqsave
(
&
adapter
->
tx_lock
,
flags
);
if
(
unlikely
(
IXGB_DESC_UNUSED
(
&
adapter
->
tx_ring
)
<
DESC_NEEDED
))
{
if
(
unlikely
(
IXGB_DESC_UNUSED
(
&
adapter
->
tx_ring
)
<
DESC_NEEDED
))
{
netif_stop_queue
(
netdev
);
spin_unlock_irqrestore
(
&
adapter
->
tx_lock
,
flags
);
return
1
;
}
spin_unlock_irqrestore
(
&
adapter
->
tx_lock
,
flags
);
if
(
adapter
->
vlgrp
&&
vlan_tx_tag_present
(
skb
))
{
if
(
adapter
->
vlgrp
&&
vlan_tx_tag_present
(
skb
))
{
tx_flags
|=
IXGB_TX_FLAGS_VLAN
;
vlan_id
=
vlan_tx_tag_get
(
skb
);
}
first
=
adapter
->
tx_ring
.
next_to_use
;
if
(
ixgb_tso
(
adapter
,
skb
))
if
(
ixgb_tso
(
adapter
,
skb
))
tx_flags
|=
IXGB_TX_FLAGS_TSO
;
else
if
(
ixgb_tx_csum
(
adapter
,
skb
))
else
if
(
ixgb_tx_csum
(
adapter
,
skb
))
tx_flags
|=
IXGB_TX_FLAGS_CSUM
;
ixgb_tx_queue
(
adapter
,
ixgb_tx_map
(
adapter
,
skb
,
first
),
vlan_id
,
tx_flags
);
tx_flags
);
netdev
->
trans_start
=
jiffies
;
...
...
@@ -1392,7 +1417,8 @@ static int ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
* @netdev: network interface device structure
**/
static
void
ixgb_tx_timeout
(
struct
net_device
*
netdev
)
static
void
ixgb_tx_timeout
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
...
...
@@ -1400,14 +1426,13 @@ static void ixgb_tx_timeout(struct net_device *netdev)
schedule_work
(
&
adapter
->
tx_timeout_task
);
}
static
void
ixgb_tx_timeout_task
(
struct
net_device
*
netdev
)
static
void
ixgb_tx_timeout_task
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
netif_device_detach
(
netdev
);
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
netif_device_attach
(
netdev
);
}
/**
...
...
@@ -1418,7 +1443,8 @@ static void ixgb_tx_timeout_task(struct net_device *netdev)
* The statistics are actually updated from the timer callback.
**/
static
struct
net_device_stats
*
ixgb_get_stats
(
struct
net_device
*
netdev
)
static
struct
net_device_stats
*
ixgb_get_stats
(
struct
net_device
*
netdev
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
...
...
@@ -1433,27 +1459,28 @@ static struct net_device_stats *ixgb_get_stats(struct net_device *netdev)
* Returns 0 on success, negative on failure
**/
static
int
ixgb_change_mtu
(
struct
net_device
*
netdev
,
int
new_mtu
)
static
int
ixgb_change_mtu
(
struct
net_device
*
netdev
,
int
new_mtu
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
uint32_t
old_mtu
=
adapter
->
rx_buffer_len
;
int
max_frame
=
new_mtu
+
ENET_HEADER_SIZE
+
ENET_FCS_LENGTH
;
int
old_max_frame
=
netdev
->
mtu
+
ENET_HEADER_SIZE
+
ENET_FCS_LENGTH
;
if
((
max_frame
<
IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
||
(
max_frame
>
IXGB_MAX_JUMBO_FRAME_SIZE
+
ENET_FCS_LENGTH
))
{
if
((
max_frame
<
IXGB_MIN_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
||
(
max_frame
>
IXGB_MAX_JUMBO_FRAME_SIZE
+
ENET_FCS_LENGTH
))
{
IXGB_ERR
(
"Invalid MTU setting
\n
"
);
return
-
EINVAL
;
}
if
((
max_frame
<=
IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
||
(
max_frame
<=
IXGB_RXBUFFER_2048
))
{
if
((
max_frame
<=
IXGB_MAX_ENET_FRAME_SIZE_WITHOUT_FCS
+
ENET_FCS_LENGTH
)
||
(
max_frame
<=
IXGB_RXBUFFER_2048
))
{
adapter
->
rx_buffer_len
=
IXGB_RXBUFFER_2048
;
}
else
if
(
max_frame
<=
IXGB_RXBUFFER_4096
)
{
}
else
if
(
max_frame
<=
IXGB_RXBUFFER_4096
)
{
adapter
->
rx_buffer_len
=
IXGB_RXBUFFER_4096
;
}
else
if
(
max_frame
<=
IXGB_RXBUFFER_8192
)
{
}
else
if
(
max_frame
<=
IXGB_RXBUFFER_8192
)
{
adapter
->
rx_buffer_len
=
IXGB_RXBUFFER_8192
;
}
else
{
...
...
@@ -1462,7 +1489,7 @@ static int ixgb_change_mtu(struct net_device *netdev, int new_mtu)
netdev
->
mtu
=
new_mtu
;
if
(
old_mtu
!=
adapter
->
rx_buffer_len
&&
netif_running
(
netdev
))
{
if
(
old_max_frame
!=
max_frame
&&
netif_running
(
netdev
))
{
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
...
...
@@ -1476,7 +1503,8 @@ static int ixgb_change_mtu(struct net_device *netdev, int new_mtu)
* @adapter: board private structure
**/
static
void
ixgb_update_stats
(
struct
ixgb_adapter
*
adapter
)
void
ixgb_update_stats
(
struct
ixgb_adapter
*
adapter
)
{
adapter
->
stats
.
tprl
+=
IXGB_READ_REG
(
&
adapter
->
hw
,
TPRL
);
adapter
->
stats
.
tprh
+=
IXGB_READ_REG
(
&
adapter
->
hw
,
TPRH
);
...
...
@@ -1585,31 +1613,33 @@ static void ixgb_update_stats(struct ixgb_adapter *adapter)
* @pt_regs: CPU registers structure
**/
static
irqreturn_t
ixgb_intr
(
int
irq
,
void
*
data
,
struct
pt_regs
*
regs
)
static
irqreturn_t
ixgb_intr
(
int
irq
,
void
*
data
,
struct
pt_regs
*
regs
)
{
struct
net_device
*
netdev
=
data
;
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
icr
=
IXGB_READ_REG
(
&
adapter
->
hw
,
ICR
);
uint32_t
icr
=
IXGB_READ_REG
(
hw
,
ICR
);
#ifndef CONFIG_IXGB_NAPI
unsigned
int
i
;
#endif
if
(
unlikely
(
!
icr
))
return
IRQ_NONE
;
/* Not our interrupt */
if
(
unlikely
(
!
icr
))
return
IRQ_NONE
;
/* Not our interrupt */
if
(
unlikely
(
icr
&
(
IXGB_INT_RXSEQ
|
IXGB_INT_LSC
)))
{
if
(
unlikely
(
icr
&
(
IXGB_INT_RXSEQ
|
IXGB_INT_LSC
)))
{
mod_timer
(
&
adapter
->
watchdog_timer
,
jiffies
);
}
#ifdef CONFIG_IXGB_NAPI
if
(
netif_rx_schedule_prep
(
netdev
))
{
if
(
netif_rx_schedule_prep
(
netdev
))
{
/* Disable interrupts and register for poll. The flush
of the posted write is intentionally left out.
*/
of the posted write is intentionally left out.
*/
atomic_inc
(
&
adapter
->
irq_sem
);
IXGB_WRITE_REG
(
hw
,
IMC
,
~
0
);
IXGB_WRITE_REG
(
&
adapter
->
hw
,
IMC
,
~
0
);
__netif_rx_schedule
(
netdev
);
}
#else
...
...
@@ -1621,16 +1651,7 @@ static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs)
if
(
!
ixgb_clean_rx_irq
(
adapter
)
&
!
ixgb_clean_tx_irq
(
adapter
))
break
;
/* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to
* set IMS:RXDMT0 to 1 to restart the RBD timer (POLL)
*/
if
((
icr
&
IXGB_INT_RXDMT0
)
&&
adapter
->
raidc
)
{
/* ready the timer by writing the clear reg */
IXGB_WRITE_REG
(
hw
,
IMC
,
IXGB_INT_RXDMT0
);
/* now restart it, h/w will decide if its necessary */
IXGB_WRITE_REG
(
hw
,
IMS
,
IXGB_INT_RXDMT0
);
}
#endif
#endif
return
IRQ_HANDLED
;
}
...
...
@@ -1640,25 +1661,32 @@ static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs)
* @adapter: board private structure
**/
static
int
ixgb_clean
(
struct
net_device
*
netdev
,
int
*
budget
)
static
int
ixgb_clean
(
struct
net_device
*
netdev
,
int
*
budget
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
int
work_to_do
=
min
(
*
budget
,
netdev
->
quota
);
int
tx_cleaned
;
int
work_done
=
0
;
if
(
!
netif_carrier_ok
(
netdev
))
goto
quit_polling
;
ixgb_clean_tx_irq
(
adapter
);
tx_cleaned
=
ixgb_clean_tx_irq
(
adapter
);
ixgb_clean_rx_irq
(
adapter
,
&
work_done
,
work_to_do
);
*
budget
-=
work_done
;
netdev
->
quota
-=
work_done
;
if
(
work_done
<
work_to_do
||
!
netif_running
(
netdev
))
{
netif_rx_complete
(
netdev
);
/* RAIDC will be automatically restarted by irq_enable */
/* if no Tx cleanup and not enough Rx work done, exit the polling mode */
if
((
!
tx_cleaned
&&
(
work_done
<
work_to_do
))
||
!
netif_running
(
netdev
))
{
quit_polling:
netif_rx_complete
(
netdev
);
ixgb_irq_enable
(
adapter
);
return
0
;
}
return
(
work_done
>=
work_to_do
)
;
return
1
;
}
#endif
...
...
@@ -1667,11 +1695,11 @@ static int ixgb_clean(struct net_device *netdev, int *budget)
* @adapter: board private structure
**/
static
boolean_t
ixgb_clean_tx_irq
(
struct
ixgb_adapter
*
adapter
)
static
boolean_t
ixgb_clean_tx_irq
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
tx_ring
=
&
adapter
->
tx_ring
;
struct
net_device
*
netdev
=
adapter
->
netdev
;
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
struct
ixgb_tx_desc
*
tx_desc
,
*
eop_desc
;
struct
ixgb_buffer
*
buffer_info
;
unsigned
int
i
,
eop
;
...
...
@@ -1681,9 +1709,9 @@ static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
eop
=
tx_ring
->
buffer_info
[
i
].
next_to_watch
;
eop_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
eop
);
while
(
eop_desc
->
status
&
IXGB_TX_DESC_STATUS_DD
)
{
while
(
eop_desc
->
status
&
IXGB_TX_DESC_STATUS_DD
)
{
for
(
cleaned
=
FALSE
;
!
cleaned
;
)
{
for
(
cleaned
=
FALSE
;
!
cleaned
;
)
{
tx_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
i
);
buffer_info
=
&
tx_ring
->
buffer_info
[
i
];
...
...
@@ -1692,28 +1720,12 @@ static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
IXGB_TX_DESC_POPTS_IXSM
))
adapter
->
hw_csum_tx_good
++
;
if
(
buffer_info
->
dma
)
{
pci_unmap_page
(
pdev
,
buffer_info
->
dma
,
buffer_info
->
length
,
PCI_DMA_TODEVICE
);
buffer_info
->
dma
=
0
;
}
ixgb_unmap_and_free_tx_resource
(
adapter
,
buffer_info
);
if
(
buffer_info
->
skb
)
{
dev_kfree_skb_any
(
buffer_info
->
skb
);
buffer_info
->
skb
=
NULL
;
}
*
(
uint32_t
*
)
&
(
tx_desc
->
status
)
=
0
;
*
(
uint32_t
*
)
&
(
tx_desc
->
status
)
=
0
;
cleaned
=
(
i
==
eop
);
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
if
(
++
i
==
tx_ring
->
count
)
i
=
0
;
}
eop
=
tx_ring
->
buffer_info
[
i
].
next_to_watch
;
...
...
@@ -1723,8 +1735,8 @@ static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
tx_ring
->
next_to_clean
=
i
;
spin_lock
(
&
adapter
->
tx_lock
);
if
(
cleaned
&&
netif_queue_stopped
(
netdev
)
&&
netif_carrier_ok
(
netdev
)
&&
(
IXGB_DESC_UNUSED
(
tx_ring
)
>
IXGB_TX_QUEUE_WAKE
))
{
if
(
cleaned
&&
netif_queue_stopped
(
netdev
)
&&
netif_carrier_ok
(
netdev
)
&&
(
IXGB_DESC_UNUSED
(
tx_ring
)
>
IXGB_TX_QUEUE_WAKE
))
{
netif_wake_queue
(
netdev
);
}
...
...
@@ -1742,20 +1754,21 @@ static boolean_t ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
static
inline
void
ixgb_rx_checksum
(
struct
ixgb_adapter
*
adapter
,
struct
ixgb_rx_desc
*
rx_desc
,
struct
sk_buff
*
skb
)
struct
ixgb_rx_desc
*
rx_desc
,
struct
sk_buff
*
skb
)
{
/* Ignore Checksum bit is set OR
* TCP Checksum has not been calculated
*/
if
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_IXSM
)
||
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_TCPCS
)))
{
if
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_IXSM
)
||
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_TCPCS
)))
{
skb
->
ip_summed
=
CHECKSUM_NONE
;
return
;
}
/* At this point we know the hardware did the TCP checksum */
/* now look at the TCP checksum error bit */
if
(
rx_desc
->
errors
&
IXGB_RX_DESC_ERRORS_TCPE
)
{
if
(
rx_desc
->
errors
&
IXGB_RX_DESC_ERRORS_TCPE
)
{
/* let the stack verify checksum errors */
skb
->
ip_summed
=
CHECKSUM_NONE
;
adapter
->
hw_csum_rx_error
++
;
...
...
@@ -1792,18 +1805,22 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
while
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
)
{
while
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
)
{
#ifdef CONFIG_IXGB_NAPI
if
(
*
work_done
>=
work_to_do
)
break
;
(
*
work_done
)
++
;
#endif
skb
=
buffer_info
->
skb
;
prefetch
(
skb
->
data
);
if
(
++
i
==
rx_ring
->
count
)
i
=
0
;
if
(
++
i
==
rx_ring
->
count
)
i
=
0
;
next_rxd
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
prefetch
(
next_rxd
);
if
((
j
=
i
+
1
)
==
rx_ring
->
count
)
j
=
0
;
if
((
j
=
i
+
1
)
==
rx_ring
->
count
)
j
=
0
;
next2_buffer
=
&
rx_ring
->
buffer_info
[
j
];
prefetch
(
next2_buffer
);
...
...
@@ -1811,27 +1828,22 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
next_skb
=
next_buffer
->
skb
;
prefetch
(
next_skb
);
#ifdef CONFIG_IXGB_NAPI
if
(
*
work_done
>=
work_to_do
)
break
;
(
*
work_done
)
++
;
#endif
cleaned
=
TRUE
;
pci_unmap_single
(
pdev
,
buffer_info
->
dma
,
buffer_info
->
length
,
PCI_DMA_FROMDEVICE
);
buffer_info
->
length
,
PCI_DMA_FROMDEVICE
);
length
=
le16_to_cpu
(
rx_desc
->
length
);
if
(
unlikely
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_EOP
)))
{
if
(
unlikely
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_EOP
)))
{
/* All receives must fit into a single buffer */
IXGB_DBG
(
"Receive packet consumed multiple buffers "
"length<%x>
\n
"
,
length
);
"length<%x>
\n
"
,
length
);
dev_kfree_skb_irq
(
skb
);
rx_desc
->
status
=
0
;
...
...
@@ -1864,26 +1876,22 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
skb
->
protocol
=
eth_type_trans
(
skb
,
netdev
);
#ifdef CONFIG_IXGB_NAPI
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
vlan_hwaccel_receive_skb
(
skb
,
adapter
->
vlgrp
,
le16_to_cpu
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
le16_to_cpu
(
rx_desc
->
special
)
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
);
}
else
{
netif_receive_skb
(
skb
);
}
#else
/* CONFIG_IXGB_NAPI */
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
#else
/* CONFIG_IXGB_NAPI */
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
vlan_hwaccel_rx
(
skb
,
adapter
->
vlgrp
,
le16_to_cpu
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
le16_to_cpu
(
rx_desc
->
special
)
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
);
}
else
{
netif_rx
(
skb
);
}
#endif
/* CONFIG_IXGB_NAPI */
#endif
/* CONFIG_IXGB_NAPI */
netdev
->
last_rx
=
jiffies
;
rx_desc
->
status
=
0
;
...
...
@@ -1905,7 +1913,8 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
* @adapter: address of board private structure
**/
static
void
ixgb_alloc_rx_buffers
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_alloc_rx_buffers
(
struct
ixgb_adapter
*
adapter
)
{
struct
ixgb_desc_ring
*
rx_ring
=
&
adapter
->
rx_ring
;
struct
net_device
*
netdev
=
adapter
->
netdev
;
...
...
@@ -1921,19 +1930,15 @@ static void ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
cleancount
=
IXGB_DESC_UNUSED
(
rx_ring
);
/* lessen this to 4 if we're
* in the midst of raidc and rbd is occuring
* because we don't want to delay returning buffers when low
*/
num_group_tail_writes
=
adapter
->
raidc
?
4
:
IXGB_RX_BUFFER_WRITE
;
num_group_tail_writes
=
IXGB_RX_BUFFER_WRITE
;
/* leave one descriptor unused */
while
(
--
cleancount
>
0
)
{
while
(
--
cleancount
>
0
)
{
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
skb
=
dev_alloc_skb
(
adapter
->
rx_buffer_len
+
NET_IP_ALIGN
);
if
(
unlikely
(
!
skb
))
{
if
(
unlikely
(
!
skb
))
{
/* Better luck next round */
break
;
}
...
...
@@ -1949,13 +1954,14 @@ static void ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
buffer_info
->
skb
=
skb
;
buffer_info
->
length
=
adapter
->
rx_buffer_len
;
buffer_info
->
dma
=
pci_map_single
(
pdev
,
pci_map_single
(
pdev
,
skb
->
data
,
adapter
->
rx_buffer_len
,
PCI_DMA_FROMDEVICE
);
adapter
->
rx_buffer_len
,
PCI_DMA_FROMDEVICE
);
rx_desc
->
buff_addr
=
cpu_to_le64
(
buffer_info
->
dma
);
if
((
i
&
~
(
num_group_tail_writes
-
1
))
==
i
)
{
if
((
i
&
~
(
num_group_tail_writes
-
1
))
==
i
)
{
/* Force memory writes to complete before letting h/w
* know there are new descriptors to fetch. (Only
* applicable for weak-ordered memory model archs,
...
...
@@ -1965,8 +1971,7 @@ static void ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
IXGB_WRITE_REG
(
&
adapter
->
hw
,
RDT
,
i
);
}
if
(
++
i
==
rx_ring
->
count
)
i
=
0
;
if
(
++
i
==
rx_ring
->
count
)
i
=
0
;
buffer_info
=
&
rx_ring
->
buffer_info
[
i
];
}
...
...
@@ -1988,7 +1993,7 @@ ixgb_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
ixgb_irq_disable
(
adapter
);
adapter
->
vlgrp
=
grp
;
if
(
grp
)
{
if
(
grp
)
{
/* enable VLAN tag insert/strip */
ctrl
=
IXGB_READ_REG
(
&
adapter
->
hw
,
CTRL0
);
ctrl
|=
IXGB_CTRL0_VME
;
...
...
@@ -2017,7 +2022,8 @@ ixgb_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
ixgb_irq_enable
(
adapter
);
}
static
void
ixgb_vlan_rx_add_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
)
static
void
ixgb_vlan_rx_add_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
uint32_t
vfta
,
index
;
...
...
@@ -2030,19 +2036,20 @@ static void ixgb_vlan_rx_add_vid(struct net_device *netdev, uint16_t vid)
ixgb_write_vfta
(
&
adapter
->
hw
,
index
,
vfta
);
}
static
void
ixgb_vlan_rx_kill_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
)
static
void
ixgb_vlan_rx_kill_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
uint32_t
vfta
,
index
;
ixgb_irq_disable
(
adapter
);
if
(
adapter
->
vlgrp
)
if
(
adapter
->
vlgrp
)
adapter
->
vlgrp
->
vlan_devices
[
vid
]
=
NULL
;
ixgb_irq_enable
(
adapter
);
/* remove VID from filter table
*/
/* remove VID from filter table*/
index
=
(
vid
>>
5
)
&
0x7F
;
vfta
=
IXGB_READ_REG_ARRAY
(
&
adapter
->
hw
,
VFTA
,
index
);
...
...
@@ -2050,14 +2057,15 @@ static void ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid)
ixgb_write_vfta
(
&
adapter
->
hw
,
index
,
vfta
);
}
static
void
ixgb_restore_vlan
(
struct
ixgb_adapter
*
adapter
)
static
void
ixgb_restore_vlan
(
struct
ixgb_adapter
*
adapter
)
{
ixgb_vlan_rx_register
(
adapter
->
netdev
,
adapter
->
vlgrp
);
if
(
adapter
->
vlgrp
)
{
if
(
adapter
->
vlgrp
)
{
uint16_t
vid
;
for
(
vid
=
0
;
vid
<
VLAN_GROUP_ARRAY_LEN
;
vid
++
)
{
if
(
!
adapter
->
vlgrp
->
vlan_devices
[
vid
])
for
(
vid
=
0
;
vid
<
VLAN_GROUP_ARRAY_LEN
;
vid
++
)
{
if
(
!
adapter
->
vlgrp
->
vlan_devices
[
vid
])
continue
;
ixgb_vlan_rx_add_vid
(
adapter
->
netdev
,
vid
);
}
...
...
@@ -2075,7 +2083,7 @@ ixgb_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
{
struct
pci_dev
*
pdev
=
NULL
;
switch
(
event
)
{
switch
(
event
)
{
case
SYS_DOWN
:
case
SYS_HALT
:
case
SYS_POWER_OFF
:
...
...
@@ -2092,14 +2100,15 @@ ixgb_notify_reboot(struct notifier_block *nb, unsigned long event, void *p)
* @param pdev pci driver structure used for passing to
* @param state power state to enter
**/
static
int
ixgb_suspend
(
struct
pci_dev
*
pdev
,
uint32_t
state
)
static
int
ixgb_suspend
(
struct
pci_dev
*
pdev
,
uint32_t
state
)
{
struct
net_device
*
netdev
=
pci_get_drvdata
(
pdev
);
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
netif_device_detach
(
netdev
);
if
(
netif_running
(
netdev
))
if
(
netif_running
(
netdev
))
ixgb_down
(
adapter
,
TRUE
);
pci_save_state
(
pdev
);
...
...
drivers/net/ixgb/ixgb_osdep.h
View file @
3fa8f148
...
...
@@ -78,19 +78,19 @@ typedef enum {
#define DEBUGOUT7 DEBUGOUT3
#define IXGB_WRITE_REG(a, reg, value) ( \
writel((value), ((a)->hw_addr + IXGB_##reg)))
writel((value), ((a)->hw_addr + IXGB_##reg)))
#define IXGB_READ_REG(a, reg) ( \
readl((a)->hw_addr + IXGB_##reg))
readl((a)->hw_addr + IXGB_##reg))
#define IXGB_WRITE_REG_ARRAY(a, reg, offset, value) ( \
writel((value), ((a)->hw_addr + IXGB_##reg + ((offset) << 2))))
writel((value), ((a)->hw_addr + IXGB_##reg + ((offset) << 2))))
#define IXGB_READ_REG_ARRAY(a, reg, offset) ( \
readl((a)->hw_addr + IXGB_##reg + ((offset) << 2)))
readl((a)->hw_addr + IXGB_##reg + ((offset) << 2)))
#define IXGB_WRITE_FLUSH(a) IXGB_READ_REG(a, STATUS)
#define IXGB_MEMCPY memcpy
#endif
/* _IXGB_OSDEP_H_ */
#endif
/* _IXGB_OSDEP_H_ */
drivers/net/ixgb/ixgb_param.c
View file @
3fa8f148
...
...
@@ -34,31 +34,21 @@
#define IXGB_MAX_NIC 8
#define OPTION_UNSET
-1
#define OPTION_UNSET
-1
#define OPTION_DISABLED 0
#define OPTION_ENABLED 1
/* Module Parameters are always initialized to -1, so that the driver
* can tell the difference between no user specified value or the
* user asking for the default value.
* The true default values are loaded in when ixgb_check_options is called.
*
* This is a GCC extension to ANSI C.
* See the item "Labeled Elements in Initializers" in the section
* "Extensions to the C Language Family" of the GCC documentation.
*/
#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET }
/* All parameters are treated the same, as an integer array of values.
* This macro just reduces the need to repeat the same declaration code
* over and over (plus this helps to avoid typo bugs).
*/
#define IXGB_PARAM(X, S) \
static int __devinitdata X[IXGB_MAX_NIC + 1] = IXGB_PARAM_INIT; \
module_param_array(X, int, NULL, 0); \
MODULE_PARM_DESC(X, S);
#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET }
#define IXGB_PARAM(X, desc) \
static int __devinitdata X[IXGB_MAX_NIC+1] = IXGB_PARAM_INIT; \
static int num_##X = 0; \
module_param_array_named(X, X, int, &num_##X, 0); \
MODULE_PARM_DESC(X, desc);
/* Transmit Descriptor Count
*
...
...
@@ -121,15 +111,6 @@ IXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay");
IXGB_PARAM
(
RxIntDelay
,
"Receive Interrupt Delay"
);
/* Receive Interrupt Moderation enable (uses RxIntDelay too)
*
* Valid Range: 0,1
*
* Default Value: 1
*/
IXGB_PARAM
(
RAIDC
,
"Disable or enable Receive Interrupt Moderation"
);
/* Receive Flow control high threshold (when we send a pause frame)
* (FCRTH)
*
...
...
@@ -173,13 +154,6 @@ IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout");
IXGB_PARAM
(
IntDelayEnable
,
"Transmit Interrupt Delay Enable"
);
#define DEFAULT_TXD 256
#define MAX_TXD 4096
#define MIN_TXD 64
#define DEFAULT_RXD 1024
#define MAX_RXD 4096
#define MIN_RXD 64
#define DEFAULT_TIDV 32
#define MAX_TIDV 0xFFFF
...
...
@@ -224,9 +198,10 @@ struct ixgb_option {
}
arg
;
};
static
int
__devinit
ixgb_validate_option
(
int
*
value
,
struct
ixgb_option
*
opt
)
static
int
__devinit
ixgb_validate_option
(
int
*
value
,
struct
ixgb_option
*
opt
)
{
if
(
*
value
==
OPTION_UNSET
)
{
if
(
*
value
==
OPTION_UNSET
)
{
*
value
=
opt
->
def
;
return
0
;
}
...
...
@@ -243,32 +218,31 @@ static int __devinit ixgb_validate_option(int *value, struct ixgb_option *opt)
}
break
;
case
range_option
:
if
(
*
value
>=
opt
->
arg
.
r
.
min
&&
*
value
<=
opt
->
arg
.
r
.
max
)
{
if
(
*
value
>=
opt
->
arg
.
r
.
min
&&
*
value
<=
opt
->
arg
.
r
.
max
)
{
printk
(
KERN_INFO
"%s set to %i
\n
"
,
opt
->
name
,
*
value
);
return
0
;
}
break
;
case
list_option
:{
int
i
;
struct
ixgb_opt_list
*
ent
;
for
(
i
=
0
;
i
<
opt
->
arg
.
l
.
nr
;
i
++
)
{
ent
=
&
opt
->
arg
.
l
.
p
[
i
];
if
(
*
value
==
ent
->
i
)
{
if
(
ent
->
str
[
0
]
!=
'\0'
)
printk
(
KERN_INFO
"%s
\n
"
,
ent
->
str
);
return
0
;
}
case
list_option
:
{
int
i
;
struct
ixgb_opt_list
*
ent
;
for
(
i
=
0
;
i
<
opt
->
arg
.
l
.
nr
;
i
++
)
{
ent
=
&
opt
->
arg
.
l
.
p
[
i
];
if
(
*
value
==
ent
->
i
)
{
if
(
ent
->
str
[
0
]
!=
'\0'
)
printk
(
KERN_INFO
"%s
\n
"
,
ent
->
str
);
return
0
;
}
}
}
break
;
default:
BUG
();
}
printk
(
KERN_INFO
"Invalid %s specified (%i) %s
\n
"
,
opt
->
name
,
*
value
,
opt
->
err
);
opt
->
name
,
*
value
,
opt
->
err
);
*
value
=
opt
->
def
;
return
-
1
;
}
...
...
@@ -285,198 +259,218 @@ static int __devinit ixgb_validate_option(int *value, struct ixgb_option *opt)
* in a variable in the adapter structure.
**/
void
__devinit
ixgb_check_options
(
struct
ixgb_adapter
*
adapter
)
void
__devinit
ixgb_check_options
(
struct
ixgb_adapter
*
adapter
)
{
int
bd
=
adapter
->
bd_number
;
if
(
bd
>=
IXGB_MAX_NIC
)
{
if
(
bd
>=
IXGB_MAX_NIC
)
{
printk
(
KERN_NOTICE
"Warning: no configuration for board #%i
\n
"
,
bd
);
"Warning: no configuration for board #%i
\n
"
,
bd
);
printk
(
KERN_NOTICE
"Using defaults for all values
\n
"
);
bd
=
IXGB_MAX_NIC
;
}
{
/* Transmit Descriptor Count */
{
/* Transmit Descriptor Count */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Transmit Descriptors"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TXD
),
.
def
=
DEFAULT_TXD
,
.
arg
=
{.
r
=
{
.
min
=
MIN_TXD
,
.
max
=
MAX_TXD
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TXD
),
.
def
=
DEFAULT_TXD
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_TXD
,
.
max
=
MAX_TXD
}}
};
struct
ixgb_desc_ring
*
tx_ring
=
&
adapter
->
tx_ring
;
tx_ring
->
count
=
TxDescriptors
[
bd
];
ixgb_validate_option
(
&
tx_ring
->
count
,
&
opt
);
if
(
num_TxDescriptors
>
bd
)
{
tx_ring
->
count
=
TxDescriptors
[
bd
];
ixgb_validate_option
(
&
tx_ring
->
count
,
&
opt
);
}
else
{
tx_ring
->
count
=
opt
.
def
;
}
IXGB_ROUNDUP
(
tx_ring
->
count
,
IXGB_REQ_TX_DESCRIPTOR_MULTIPLE
);
}
{
/* Receive Descriptor Count */
{
/* Receive Descriptor Count */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Receive Descriptors"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RXD
),
.
def
=
DEFAULT_RXD
,
.
arg
=
{.
r
=
{
.
min
=
MIN_RXD
,
.
max
=
MAX_RXD
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RXD
),
.
def
=
DEFAULT_RXD
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_RXD
,
.
max
=
MAX_RXD
}}
};
struct
ixgb_desc_ring
*
rx_ring
=
&
adapter
->
rx_ring
;
rx_ring
->
count
=
RxDescriptors
[
bd
];
ixgb_validate_option
(
&
rx_ring
->
count
,
&
opt
);
if
(
num_RxDescriptors
>
bd
)
{
rx_ring
->
count
=
RxDescriptors
[
bd
];
ixgb_validate_option
(
&
rx_ring
->
count
,
&
opt
);
}
else
{
rx_ring
->
count
=
opt
.
def
;
}
IXGB_ROUNDUP
(
rx_ring
->
count
,
IXGB_REQ_RX_DESCRIPTOR_MULTIPLE
);
}
{
/* Receive Checksum Offload Enable */
{
/* Receive Checksum Offload Enable */
struct
ixgb_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"Receive Checksum Offload"
,
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
};
int
rx_csum
=
XsumRX
[
bd
];
ixgb_validate_option
(
&
rx_csum
,
&
opt
);
adapter
->
rx_csum
=
rx_csum
;
if
(
num_XsumRX
>
bd
)
{
int
rx_csum
=
XsumRX
[
bd
];
ixgb_validate_option
(
&
rx_csum
,
&
opt
);
adapter
->
rx_csum
=
rx_csum
;
}
else
{
adapter
->
rx_csum
=
opt
.
def
;
}
}
{
/* Flow Control */
{
/* Flow Control */
struct
ixgb_opt_list
fc_list
[]
=
{
{
ixgb_fc_none
,
"Flow Control Disabled"
},
{
ixgb_fc_rx_pause
,
"Flow Control Receive Only"
},
{
ixgb_fc_tx_pause
,
"Flow Control Transmit Only"
},
{
ixgb_fc_full
,
"Flow Control Enabled"
},
{
ixgb_fc_default
,
"Flow Control Hardware Default"
}
};
{{
ixgb_fc_none
,
"Flow Control Disabled"
},
{
ixgb_fc_rx_pause
,
"Flow Control Receive Only"
},
{
ixgb_fc_tx_pause
,
"Flow Control Transmit Only"
},
{
ixgb_fc_full
,
"Flow Control Enabled"
},
{
ixgb_fc_default
,
"Flow Control Hardware Default"
}};
struct
ixgb_option
opt
=
{
.
type
=
list_option
,
.
name
=
"Flow Control"
,
.
err
=
"reading default settings from EEPROM"
,
.
def
=
ixgb_fc_full
,
.
arg
=
{.
l
=
{
.
nr
=
LIST_LEN
(
fc_list
),
.
p
=
fc_list
}}
.
err
=
"reading default settings from EEPROM"
,
.
def
=
ixgb_fc_full
,
.
arg
=
{
.
l
=
{
.
nr
=
LIST_LEN
(
fc_list
),
.
p
=
fc_list
}}
};
int
fc
=
FlowControl
[
bd
];
ixgb_validate_option
(
&
fc
,
&
opt
);
adapter
->
hw
.
fc
.
type
=
fc
;
if
(
num_FlowControl
>
bd
)
{
int
fc
=
FlowControl
[
bd
];
ixgb_validate_option
(
&
fc
,
&
opt
);
adapter
->
hw
.
fc
.
type
=
fc
;
}
else
{
adapter
->
hw
.
fc
.
type
=
opt
.
def
;
}
}
{
/* Receive Flow Control High Threshold */
{
/* Receive Flow Control High Threshold */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Rx Flow Control High Threshold"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTH
),
.
def
=
DEFAULT_FCRTH
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTH
,
.
max
=
MAX_FCRTH
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTH
),
.
def
=
DEFAULT_FCRTH
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_FCRTH
,
.
max
=
MAX_FCRTH
}}
};
adapter
->
hw
.
fc
.
high_water
=
RxFCHighThresh
[
bd
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
high_water
,
&
opt
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
))
printk
(
KERN_INFO
"Ignoring RxFCHighThresh when no RxFC
\n
"
);
if
(
num_RxFCHighThresh
>
bd
)
{
adapter
->
hw
.
fc
.
high_water
=
RxFCHighThresh
[
bd
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
high_water
,
&
opt
);
}
else
{
adapter
->
hw
.
fc
.
high_water
=
opt
.
def
;
}
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCHighThresh when no RxFC
\n
"
);
}
{
/* Receive Flow Control Low Threshold */
{
/* Receive Flow Control Low Threshold */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Rx Flow Control Low Threshold"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTL
),
.
def
=
DEFAULT_FCRTL
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTL
,
.
max
=
MAX_FCRTL
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTL
),
.
def
=
DEFAULT_FCRTL
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_FCRTL
,
.
max
=
MAX_FCRTL
}}
};
adapter
->
hw
.
fc
.
low_water
=
RxFCLowThresh
[
bd
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
low_water
,
&
opt
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
))
printk
(
KERN_INFO
"Ignoring RxFCLowThresh when no RxFC
\n
"
);
if
(
num_RxFCLowThresh
>
bd
)
{
adapter
->
hw
.
fc
.
low_water
=
RxFCLowThresh
[
bd
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
low_water
,
&
opt
);
}
else
{
adapter
->
hw
.
fc
.
low_water
=
opt
.
def
;
}
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCLowThresh when no RxFC
\n
"
);
}
{
/* Flow Control Pause Time Request
*/
{
/* Flow Control Pause Time Request
*/
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Flow Control Pause Time Request"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCPAUSE
),
.
def
=
DEFAULT_FCPAUSE
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCPAUSE
,
.
max
=
MAX_FCPAUSE
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCPAUSE
),
.
def
=
DEFAULT_FCPAUSE
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_FCPAUSE
,
.
max
=
MAX_FCPAUSE
}}
};
int
pause_time
=
FCReqTimeout
[
bd
];
ixgb_validate_option
(
&
pause_time
,
&
opt
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
))
printk
(
KERN_INFO
"Ignoring FCReqTimeout when no RxFC
\n
"
);
adapter
->
hw
.
fc
.
pause_time
=
pause_time
;
if
(
num_FCReqTimeout
>
bd
)
{
int
pause_time
=
FCReqTimeout
[
bd
];
ixgb_validate_option
(
&
pause_time
,
&
opt
);
adapter
->
hw
.
fc
.
pause_time
=
pause_time
;
}
else
{
adapter
->
hw
.
fc
.
pause_time
=
opt
.
def
;
}
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring FCReqTimeout when no RxFC
\n
"
);
}
/* high low and spacing check for rx flow control thresholds */
if
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
{
/* high must be greater than low */
if
(
adapter
->
hw
.
fc
.
high_water
<
(
adapter
->
hw
.
fc
.
low_water
+
8
))
{
/* set defaults */
printk
(
KERN_INFO
"RxFCHighThresh must be >= (RxFCLowThresh + 8), "
"Using Defaults
\n
"
);
printk
(
KERN_INFO
"RxFCHighThresh must be >= (RxFCLowThresh + 8), "
"Using Defaults
\n
"
);
adapter
->
hw
.
fc
.
high_water
=
DEFAULT_FCRTH
;
adapter
->
hw
.
fc
.
low_water
=
DEFAULT_FCRTL
;
adapter
->
hw
.
fc
.
low_water
=
DEFAULT_FCRTL
;
}
}
{
/* Receive Interrupt Delay */
{
/* Receive Interrupt Delay */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Receive Interrupt Delay"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RDTR
),
.
def
=
DEFAULT_RDTR
,
.
arg
=
{.
r
=
{.
min
=
MIN_RDTR
,
.
max
=
MAX_RDTR
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RDTR
),
.
def
=
DEFAULT_RDTR
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_RDTR
,
.
max
=
MAX_RDTR
}}
};
adapter
->
rx_int_delay
=
RxIntDelay
[
bd
];
ixgb_validate_option
(
&
adapter
->
rx_int_delay
,
&
opt
);
}
{
/* Receive Interrupt Moderation */
struct
ixgb_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"Advanced Receive Interrupt Moderation"
,
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
};
int
raidc
=
RAIDC
[
bd
];
ixgb_validate_option
(
&
raidc
,
&
opt
);
adapter
->
raidc
=
raidc
;
if
(
num_RxIntDelay
>
bd
)
{
adapter
->
rx_int_delay
=
RxIntDelay
[
bd
];
ixgb_validate_option
(
&
adapter
->
rx_int_delay
,
&
opt
);
}
else
{
adapter
->
rx_int_delay
=
opt
.
def
;
}
}
{
/* Transmit Interrupt Delay */
{
/* Transmit Interrupt Delay */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Transmit Interrupt Delay"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TIDV
),
.
def
=
DEFAULT_TIDV
,
.
arg
=
{.
r
=
{.
min
=
MIN_TIDV
,
.
max
=
MAX_TIDV
}}
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TIDV
),
.
def
=
DEFAULT_TIDV
,
.
arg
=
{
.
r
=
{
.
min
=
MIN_TIDV
,
.
max
=
MAX_TIDV
}}
};
adapter
->
tx_int_delay
=
TxIntDelay
[
bd
];
ixgb_validate_option
(
&
adapter
->
tx_int_delay
,
&
opt
);
if
(
num_TxIntDelay
>
bd
)
{
adapter
->
tx_int_delay
=
TxIntDelay
[
bd
];
ixgb_validate_option
(
&
adapter
->
tx_int_delay
,
&
opt
);
}
else
{
adapter
->
tx_int_delay
=
opt
.
def
;
}
}
{
/* Transmit Interrupt Delay Enable */
{
/* Transmit Interrupt Delay Enable */
struct
ixgb_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"Tx Interrupt Delay Enable"
,
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
.
err
=
"defaulting to Enabled"
,
.
def
=
OPTION_ENABLED
};
int
ide
=
IntDelayEnable
[
bd
];
ixgb_validate_option
(
&
ide
,
&
opt
);
adapter
->
tx_int_delay_enable
=
ide
;
if
(
num_IntDelayEnable
>
bd
)
{
int
ide
=
IntDelayEnable
[
bd
];
ixgb_validate_option
(
&
ide
,
&
opt
);
adapter
->
tx_int_delay_enable
=
ide
;
}
else
{
adapter
->
tx_int_delay_enable
=
opt
.
def
;
}
}
}
drivers/net/s2io.c
View file @
3fa8f148
...
...
@@ -560,21 +560,35 @@ static void free_shared_mem(struct s2io_nic *nic)
for
(
i
=
0
;
i
<
config
->
rx_ring_num
;
i
++
)
{
blk_cnt
=
config
->
rx_cfg
[
i
].
num_rxd
/
(
MAX_RXDS_PER_BLOCK
+
1
);
if
(
!
nic
->
ba
[
i
])
goto
end_free
;
for
(
j
=
0
;
j
<
blk_cnt
;
j
++
)
{
int
k
=
0
;
if
(
!
nic
->
ba
[
i
][
j
])
continue
;
if
(
!
nic
->
ba
[
i
][
j
])
{
kfree
(
nic
->
ba
[
i
]);
goto
end_free
;
}
while
(
k
!=
MAX_RXDS_PER_BLOCK
)
{
buffAdd_t
*
ba
=
&
nic
->
ba
[
i
][
j
][
k
];
if
(
!
ba
||
!
ba
->
ba_0_org
||
!
ba
->
ba_1_org
)
{
kfree
(
nic
->
ba
[
i
]);
kfree
(
nic
->
ba
[
i
][
j
]);
if
(
ba
->
ba_0_org
)
kfree
(
ba
->
ba_0_org
);
if
(
ba
->
ba_1_org
)
kfree
(
ba
->
ba_1_org
);
goto
end_free
;
}
kfree
(
ba
->
ba_0_org
);
kfree
(
ba
->
ba_1_org
);
k
++
;
}
kfree
(
nic
->
ba
[
i
][
j
]);
}
if
(
nic
->
ba
[
i
])
kfree
(
nic
->
ba
[
i
]);
kfree
(
nic
->
ba
[
i
]);
}
end_free:
#endif
if
(
mac_control
->
stats_mem
)
{
...
...
drivers/net/s2io.h
View file @
3fa8f148
...
...
@@ -740,8 +740,8 @@ static inline u64 readq(void *addr)
{
u64
ret
=
0
;
ret
=
readl
(
addr
+
4
);
(
u64
)
ret
<<=
32
;
(
u64
)
ret
|=
readl
(
addr
);
ret
<<=
32
;
ret
|=
readl
(
addr
);
return
ret
;
}
...
...
drivers/net/smc-ultra.c
View file @
3fa8f148
...
...
@@ -156,8 +156,6 @@ static int __init do_ultra_probe(struct net_device *dev)
/* Look for any installed ISAPnP cards */
if
(
isapnp_present
()
&&
(
ultra_probe_isapnp
(
dev
)
==
0
))
return
0
;
printk
(
KERN_NOTICE
"smc-ultra.c: No ISAPnP cards found, trying standard ones...
\n
"
);
#endif
for
(
i
=
0
;
ultra_portlist
[
i
];
i
++
)
{
...
...
drivers/net/smc91x.c
View file @
3fa8f148
...
...
@@ -1333,6 +1333,19 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
return
IRQ_HANDLED
;
}
#ifdef CONFIG_NET_POLL_CONTROLLER
/*
* Polling receive - used by netconsole and other diagnostic tools
* to allow network i/o with interrupts disabled.
*/
static
void
smc_poll_controller
(
struct
net_device
*
dev
)
{
disable_irq
(
dev
->
irq
);
smc_interrupt
(
dev
->
irq
,
dev
,
NULL
);
enable_irq
(
dev
->
irq
);
}
#endif
/* Our watchdog timed out. Called by the networking layer */
static
void
smc_timeout
(
struct
net_device
*
dev
)
{
...
...
@@ -1912,6 +1925,9 @@ static int __init smc_probe(struct net_device *dev, unsigned long ioaddr)
dev
->
get_stats
=
smc_query_statistics
;
dev
->
set_multicast_list
=
smc_set_multicast_list
;
dev
->
ethtool_ops
=
&
smc_ethtool_ops
;
#ifdef CONFIG_NET_POLL_CONTROLLER
dev
->
poll_controller
=
smc_poll_controller
;
#endif
tasklet_init
(
&
lp
->
tx_task
,
smc_hardware_send_pkt
,
(
unsigned
long
)
dev
);
INIT_WORK
(
&
lp
->
phy_configure
,
smc_phy_configure
,
dev
);
...
...
drivers/net/wireless/orinoco.c
View file @
3fa8f148
...
...
@@ -617,9 +617,8 @@ static int orinoco_open(struct net_device *dev)
unsigned
long
flags
;
int
err
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
__orinoco_up
(
dev
);
...
...
@@ -671,10 +670,9 @@ static struct iw_statistics *orinoco_get_wireless_stats(struct net_device *dev)
return
NULL
;
/* FIXME: Can we do better than this? */
}
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
NULL
;
/* FIXME: Erg, we've been signalled, how
* do we propagate this back up? */
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
NULL
;
/* FIXME: Erg, we've been signalled, how
* do we propagate this back up? */
if
(
priv
->
iw_mode
==
IW_MODE_ADHOC
)
{
memset
(
&
wstats
->
qual
,
0
,
sizeof
(
wstats
->
qual
));
...
...
@@ -1819,10 +1817,8 @@ static int orinoco_reconfigure(struct net_device *dev)
return
0
;
}
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_disable_port
(
hw
,
0
);
if
(
err
)
{
...
...
@@ -1864,11 +1860,10 @@ static void orinoco_reset(struct net_device *dev)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
struct
hermes
*
hw
=
&
priv
->
hw
;
int
err
;
int
err
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
/* When the hardware becomes available again, whatever
* detects that is responsible for re-initializing
* it. So no need for anything further */
...
...
@@ -2411,9 +2406,8 @@ static int orinoco_hw_get_bssid(struct orinoco_private *priv,
int
err
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_ltv
(
hw
,
USER_BAP
,
HERMES_RID_CURRENTBSSID
,
ETH_ALEN
,
NULL
,
buf
);
...
...
@@ -2433,9 +2427,8 @@ static int orinoco_hw_get_essid(struct orinoco_private *priv, int *active,
int
len
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
strlen
(
priv
->
desired_essid
)
>
0
)
{
/* We read the desired SSID from the hardware rather
...
...
@@ -2486,9 +2479,8 @@ static long orinoco_hw_get_freq(struct orinoco_private *priv)
long
freq
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_wordrec
(
hw
,
USER_BAP
,
HERMES_RID_CURRENTCHANNEL
,
&
channel
);
if
(
err
)
...
...
@@ -2528,9 +2520,8 @@ static int orinoco_hw_get_bitratelist(struct orinoco_private *priv,
int
i
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_ltv
(
hw
,
USER_BAP
,
HERMES_RID_SUPPORTEDDATARATES
,
sizeof
(
list
),
NULL
,
&
list
);
...
...
@@ -2568,9 +2559,8 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, struct iw_point *rrq
rrq
->
length
=
sizeof
(
range
);
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
mode
=
priv
->
iw_mode
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -2639,9 +2629,8 @@ static int orinoco_ioctl_getiwrange(struct net_device *dev, struct iw_point *rrq
range
.
min_frag
=
256
;
range
.
max_frag
=
2346
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
priv
->
has_wep
)
{
range
.
max_encoding_tokens
=
ORINOCO_MAX_KEYS
;
...
...
@@ -2706,10 +2695,9 @@ static int orinoco_ioctl_setiwencode(struct net_device *dev, struct iw_point *er
if
(
copy_from_user
(
keybuf
,
erq
->
pointer
,
erq
->
length
))
return
-
EFAULT
;
}
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
erq
->
pointer
)
{
if
(
erq
->
length
>
ORINOCO_MAX_KEY_SIZE
)
{
...
...
@@ -2788,12 +2776,10 @@ static int orinoco_ioctl_getiwencode(struct net_device *dev, struct iw_point *er
int
index
=
(
erq
->
flags
&
IW_ENCODE_INDEX
)
-
1
;
u16
xlen
=
0
;
char
keybuf
[
ORINOCO_MAX_KEY_SIZE
];
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
((
index
<
0
)
||
(
index
>=
ORINOCO_MAX_KEYS
))
index
=
priv
->
tx_key
;
...
...
@@ -2833,7 +2819,6 @@ static int orinoco_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
char
essidbuf
[
IW_ESSID_MAX_SIZE
+
1
];
int
err
;
unsigned
long
flags
;
/* Note : ESSID is ignored in Ad-Hoc demo mode, but we can set it
...
...
@@ -2851,9 +2836,8 @@ static int orinoco_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
essidbuf
[
erq
->
length
]
=
'\0'
;
}
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
memcpy
(
priv
->
desired_essid
,
essidbuf
,
sizeof
(
priv
->
desired_essid
));
...
...
@@ -2877,9 +2861,8 @@ static int orinoco_ioctl_getessid(struct net_device *dev, struct iw_point *erq)
if
(
err
)
return
err
;
}
else
{
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
memcpy
(
essidbuf
,
priv
->
desired_essid
,
sizeof
(
essidbuf
));
orinoco_unlock
(
priv
,
&
flags
);
}
...
...
@@ -2899,7 +2882,6 @@ static int orinoco_ioctl_setnick(struct net_device *dev, struct iw_point *nrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
char
nickbuf
[
IW_ESSID_MAX_SIZE
+
1
];
int
err
;
unsigned
long
flags
;
if
(
nrq
->
length
>
IW_ESSID_MAX_SIZE
)
...
...
@@ -2912,9 +2894,8 @@ static int orinoco_ioctl_setnick(struct net_device *dev, struct iw_point *nrq)
nickbuf
[
nrq
->
length
]
=
'\0'
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
memcpy
(
priv
->
nick
,
nickbuf
,
sizeof
(
priv
->
nick
));
...
...
@@ -2927,12 +2908,10 @@ static int orinoco_ioctl_getnick(struct net_device *dev, struct iw_point *nrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
char
nickbuf
[
IW_ESSID_MAX_SIZE
+
1
];
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
memcpy
(
nickbuf
,
priv
->
nick
,
IW_ESSID_MAX_SIZE
+
1
);
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -2949,7 +2928,6 @@ static int orinoco_ioctl_setfreq(struct net_device *dev, struct iw_freq *frq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
chan
=
-
1
;
int
err
;
unsigned
long
flags
;
/* We can only use this in Ad-Hoc demo mode to set the operating
...
...
@@ -2978,9 +2956,8 @@ static int orinoco_ioctl_setfreq(struct net_device *dev, struct iw_freq *frq)
!
(
priv
->
channel_mask
&
(
1
<<
(
chan
-
1
))
)
)
return
-
EINVAL
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
priv
->
channel
=
chan
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -2998,9 +2975,8 @@ static int orinoco_ioctl_getsens(struct net_device *dev, struct iw_param *srq)
if
(
!
priv
->
has_sensitivity
)
return
-
EOPNOTSUPP
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_wordrec
(
hw
,
USER_BAP
,
HERMES_RID_CNFSYSTEMSCALE
,
&
val
);
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3018,7 +2994,6 @@ static int orinoco_ioctl_setsens(struct net_device *dev, struct iw_param *srq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
val
=
srq
->
value
;
int
err
;
unsigned
long
flags
;
if
(
!
priv
->
has_sensitivity
)
...
...
@@ -3027,9 +3002,8 @@ static int orinoco_ioctl_setsens(struct net_device *dev, struct iw_param *srq)
if
((
val
<
1
)
||
(
val
>
3
))
return
-
EINVAL
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
priv
->
ap_density
=
val
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3040,7 +3014,6 @@ static int orinoco_ioctl_setrts(struct net_device *dev, struct iw_param *rrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
val
=
rrq
->
value
;
int
err
;
unsigned
long
flags
;
if
(
rrq
->
disabled
)
...
...
@@ -3049,9 +3022,8 @@ static int orinoco_ioctl_setrts(struct net_device *dev, struct iw_param *rrq)
if
(
(
val
<
0
)
||
(
val
>
2347
)
)
return
-
EINVAL
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
priv
->
rts_thresh
=
val
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3065,9 +3037,8 @@ static int orinoco_ioctl_setfrag(struct net_device *dev, struct iw_param *frq)
int
err
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
priv
->
has_mwo
)
{
if
(
frq
->
disabled
)
...
...
@@ -3102,9 +3073,8 @@ static int orinoco_ioctl_getfrag(struct net_device *dev, struct iw_param *frq)
u16
val
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
priv
->
has_mwo
)
{
err
=
hermes_read_wordrec
(
hw
,
USER_BAP
,
...
...
@@ -3166,9 +3136,8 @@ static int orinoco_ioctl_setrate(struct net_device *dev, struct iw_param *rrq)
if
(
ratemode
==
-
1
)
return
-
EINVAL
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
priv
->
bitratemode
=
ratemode
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3185,9 +3154,8 @@ static int orinoco_ioctl_getrate(struct net_device *dev, struct iw_param *rrq)
u16
val
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
ratemode
=
priv
->
bitratemode
;
...
...
@@ -3247,9 +3215,8 @@ static int orinoco_ioctl_setpower(struct net_device *dev, struct iw_param *prq)
int
err
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
prq
->
disabled
)
{
priv
->
pm_on
=
0
;
...
...
@@ -3302,9 +3269,8 @@ static int orinoco_ioctl_getpower(struct net_device *dev, struct iw_param *prq)
u16
enable
,
period
,
timeout
,
mcast
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_wordrec
(
hw
,
USER_BAP
,
HERMES_RID_CNFPMENABLED
,
&
enable
);
if
(
err
)
...
...
@@ -3351,9 +3317,8 @@ static int orinoco_ioctl_getretry(struct net_device *dev, struct iw_param *rrq)
u16
short_limit
,
long_limit
,
lifetime
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
err
=
hermes_read_wordrec
(
hw
,
USER_BAP
,
HERMES_RID_SHORTRETRYLIMIT
,
&
short_limit
);
...
...
@@ -3399,12 +3364,10 @@ static int orinoco_ioctl_setibssport(struct net_device *dev, struct iwreq *wrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
val
=
*
(
(
int
*
)
wrq
->
u
.
name
);
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
priv
->
ibss_port
=
val
;
...
...
@@ -3419,12 +3382,10 @@ static int orinoco_ioctl_getibssport(struct net_device *dev, struct iwreq *wrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
*
val
=
(
int
*
)
wrq
->
u
.
name
;
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
*
val
=
priv
->
ibss_port
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3439,9 +3400,8 @@ static int orinoco_ioctl_setport3(struct net_device *dev, struct iwreq *wrq)
int
err
=
0
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
switch
(
val
)
{
case
0
:
/* Try to do IEEE ad-hoc mode */
...
...
@@ -3478,12 +3438,10 @@ static int orinoco_ioctl_getport3(struct net_device *dev, struct iwreq *wrq)
{
struct
orinoco_private
*
priv
=
netdev_priv
(
dev
);
int
*
val
=
(
int
*
)
wrq
->
u
.
name
;
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
*
val
=
priv
->
prefer_port3
;
orinoco_unlock
(
priv
,
&
flags
);
...
...
@@ -3513,9 +3471,8 @@ static int orinoco_ioctl_setspy(struct net_device *dev, struct iw_point *srq)
}
/* Make sure nobody mess with the structure while we do */
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
/* orinoco_lock() doesn't disable interrupts, so make sure the
* interrupt rx path don't get confused while we copy */
...
...
@@ -3546,12 +3503,10 @@ static int orinoco_ioctl_getspy(struct net_device *dev, struct iw_point *srq)
struct
iw_quality
spy_stat
[
IW_MAX_SPY
];
int
number
;
int
i
;
int
err
;
unsigned
long
flags
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
number
=
priv
->
spy_number
;
if
((
number
>
0
)
&&
(
srq
->
pointer
))
{
...
...
@@ -3621,9 +3576,8 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break
;
case
SIOCSIWMODE
:
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
switch
(
wrq
->
u
.
mode
)
{
case
IW_MODE_ADHOC
:
if
(
!
(
priv
->
has_ibss
||
priv
->
has_port3
)
)
...
...
@@ -3648,9 +3602,8 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break
;
case
SIOCGIWMODE
:
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
wrq
->
u
.
mode
=
priv
->
iw_mode
;
orinoco_unlock
(
priv
,
&
flags
);
break
;
...
...
@@ -3865,9 +3818,8 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
if
(
priv
->
has_preamble
)
{
int
val
=
*
(
(
int
*
)
wrq
->
u
.
name
);
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
if
(
val
)
priv
->
preamble
=
1
;
else
...
...
@@ -3882,9 +3834,8 @@ orinoco_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
if
(
priv
->
has_preamble
)
{
int
*
val
=
(
int
*
)
wrq
->
u
.
name
;
err
=
orinoco_lock
(
priv
,
&
flags
);
if
(
err
)
return
err
;
if
(
orinoco_lock
(
priv
,
&
flags
)
!=
0
)
return
-
EBUSY
;
*
val
=
priv
->
preamble
;
orinoco_unlock
(
priv
,
&
flags
);
}
else
...
...
drivers/net/wireless/wl3501_cs.c
View file @
3fa8f148
...
...
@@ -100,7 +100,7 @@ module_param(pc_debug, int, 0);
/* Parameters that can be set with 'insmod' */
/* Bit map of interrupts to choose from */
/* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */
static
unsigned
long
wl3501_irq_mask
=
0xdeb8
;
static
unsigned
int
wl3501_irq_mask
=
0xdeb8
;
static
int
wl3501_irq_list
[
4
]
=
{
-
1
};
/*
...
...
@@ -2273,7 +2273,7 @@ static void __exit wl3501_exit_module(void)
module_init
(
wl3501_init_module
);
module_exit
(
wl3501_exit_module
);
module_param
(
wl3501_irq_mask
,
int
,
0
);
module_param
(
wl3501_irq_mask
,
u
int
,
0
);
module_param_array
(
wl3501_irq_list
,
int
,
NULL
,
0
);
MODULE_AUTHOR
(
"Fox Chen <mhchen@golf.ccl.itri.org.tw>, "
"Arnaldo Carvalho de Melo <acme@conectiva.com.br>,"
...
...
include/linux/arcdevice.h
View file @
3fa8f148
...
...
@@ -343,7 +343,6 @@ void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc,
void
arcnet_unregister_proto
(
struct
ArcProto
*
proto
);
irqreturn_t
arcnet_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
);
void
arcdev_setup
(
struct
net_device
*
dev
);
struct
net_device
*
alloc_arcdev
(
char
*
name
);
void
arcnet_rx
(
struct
net_device
*
dev
,
int
bufnum
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment