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
nexedi
linux
Commits
ca247341
Commit
ca247341
authored
Apr 27, 2003
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[netdrvr ixgb] Lindent, then fix up obvious indent uglies by hand
parent
d2f797b0
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
2121 additions
and
2184 deletions
+2121
-2184
drivers/net/ixgb/ixgb.h
drivers/net/ixgb/ixgb.h
+62
-64
drivers/net/ixgb/ixgb_ee.c
drivers/net/ixgb/ixgb_ee.c
+333
-335
drivers/net/ixgb/ixgb_ee.h
drivers/net/ixgb/ixgb_ee.h
+29
-35
drivers/net/ixgb/ixgb_ethtool.c
drivers/net/ixgb/ixgb_ethtool.c
+403
-409
drivers/net/ixgb/ixgb_hw.c
drivers/net/ixgb/ixgb_hw.c
+671
-699
drivers/net/ixgb/ixgb_hw.h
drivers/net/ixgb/ixgb_hw.h
+288
-311
drivers/net/ixgb/ixgb_ids.h
drivers/net/ixgb/ixgb_ids.h
+3
-4
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgb/ixgb_main.c
+280
-275
drivers/net/ixgb/ixgb_osdep.h
drivers/net/ixgb/ixgb_osdep.h
+3
-4
drivers/net/ixgb/ixgb_param.c
drivers/net/ixgb/ixgb_param.c
+49
-48
No files found.
drivers/net/ixgb/ixgb.h
View file @
ca247341
...
...
@@ -64,16 +64,14 @@ struct ixgb_adapter;
#define BAR_0 0
#define BAR_1 1
#define BAR_5 5
#define BAR_5 5
#define PCI_DMA_64BIT 0xffffffffffffffffULL
#define PCI_DMA_32BIT 0x00000000ffffffffULL
#include "ixgb_hw.h"
#include "ixgb_ee.h"
#include "ixgb_ids.h"
#if _DEBUG_DRIVER_
#define IXGB_DBG(args...) printk(KERN_DEBUG "ixgb: " args)
#else
...
...
@@ -100,27 +98,27 @@ struct ixgb_adapter;
/* wrapper around a pointer to a socket buffer,
* so a DMA handle can be stored along with the buffer */
struct
ixgb_buffer
{
struct
sk_buff
*
skb
;
uint64_t
dma
;
unsigned
long
length
;
unsigned
long
time_stamp
;
struct
sk_buff
*
skb
;
uint64_t
dma
;
unsigned
long
length
;
unsigned
long
time_stamp
;
};
struct
ixgb_desc_ring
{
/* pointer to the descriptor ring memory */
void
*
desc
;
/* physical address of the descriptor ring */
dma_addr_t
dma
;
/* length of descriptor ring in bytes */
unsigned
int
size
;
/* number of descriptors in the ring */
unsigned
int
count
;
/* next descriptor to associate a buffer with */
unsigned
int
next_to_use
;
/* next descriptor to check for DD status bit */
unsigned
int
next_to_clean
;
/* array of buffer information structs */
struct
ixgb_buffer
*
buffer_info
;
/* pointer to the descriptor ring memory */
void
*
desc
;
/* physical address of the descriptor ring */
dma_addr_t
dma
;
/* length of descriptor ring in bytes */
unsigned
int
size
;
/* number of descriptors in the ring */
unsigned
int
count
;
/* next descriptor to associate a buffer with */
unsigned
int
next_to_use
;
/* next descriptor to check for DD status bit */
unsigned
int
next_to_clean
;
/* array of buffer information structs */
struct
ixgb_buffer
*
buffer_info
;
};
#define IXGB_DESC_UNUSED(R) \
...
...
@@ -134,54 +132,54 @@ struct ixgb_desc_ring {
/* board specific private data structure */
struct
ixgb_adapter
{
struct
timer_list
watchdog_timer
;
struct
timer_list
watchdog_timer
;
struct
vlan_group
*
vlgrp
;
char
*
id_string
;
uint32_t
bd_number
;
uint32_t
rx_buffer_len
;
uint32_t
part_num
;
uint16_t
link_speed
;
uint16_t
link_duplex
;
atomic_t
irq_sem
;
struct
work_struct
tx_timeout_task
;
char
*
id_string
;
uint32_t
bd_number
;
uint32_t
rx_buffer_len
;
uint32_t
part_num
;
uint16_t
link_speed
;
uint16_t
link_duplex
;
atomic_t
irq_sem
;
struct
work_struct
tx_timeout_task
;
#ifdef ETHTOOL_PHYS_ID
struct
timer_list
blink_timer
;
unsigned
long
led_status
;
struct
timer_list
blink_timer
;
unsigned
long
led_status
;
#endif
#ifdef _INTERNAL_LOOPBACK_DRIVER_
struct
ixgb_desc_ring
diag_tx_ring
;
struct
ixgb_desc_ring
diag_rx_ring
;
struct
ixgb_desc_ring
diag_tx_ring
;
struct
ixgb_desc_ring
diag_rx_ring
;
#endif
/* TX */
struct
ixgb_desc_ring
tx_ring
;
unsigned
long
timeo_start
;
uint32_t
tx_cmd_type
;
int
max_data_per_txd
;
uint64_t
hw_csum_tx_good
;
uint64_t
hw_csum_tx_error
;
boolean_t
tx_csum
;
uint32_t
tx_int_delay
;
boolean_t
tx_int_delay_enable
;
/* RX */
struct
ixgb_desc_ring
rx_ring
;
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 */
struct
net_device
*
netdev
;
struct
pci_dev
*
pdev
;
struct
net_device_stats
net_stats
;
/* structs defined in ixgb_hw.h */
struct
ixgb_hw
hw
;
struct
ixgb_hw_stats
stats
;
uint32_t
pci_state
[
16
];
char
ifname
[
IFNAMSIZ
];
/* TX */
struct
ixgb_desc_ring
tx_ring
;
unsigned
long
timeo_start
;
uint32_t
tx_cmd_type
;
int
max_data_per_txd
;
uint64_t
hw_csum_tx_good
;
uint64_t
hw_csum_tx_error
;
boolean_t
tx_csum
;
uint32_t
tx_int_delay
;
boolean_t
tx_int_delay_enable
;
/* RX */
struct
ixgb_desc_ring
rx_ring
;
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 */
struct
net_device
*
netdev
;
struct
pci_dev
*
pdev
;
struct
net_device_stats
net_stats
;
/* structs defined in ixgb_hw.h */
struct
ixgb_hw
hw
;
struct
ixgb_hw_stats
stats
;
uint32_t
pci_state
[
16
];
char
ifname
[
IFNAMSIZ
];
};
#endif
/* _IXGB_H_ */
#endif
/* _IXGB_H_ */
drivers/net/ixgb/ixgb_ee.c
View file @
ca247341
...
...
@@ -25,15 +25,13 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#include "ixgb_hw.h"
#include "ixgb_ee.h"
/* Local prototypes */
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
);
...
...
@@ -47,16 +45,15 @@ static void ixgb_cleanup_eeprom(struct ixgb_hw *hw);
* eecd_reg - EECD's current value
*****************************************************************************/
static
void
ixgb_raise_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
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.
*/
*
eecd_reg
=
*
eecd_reg
|
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
*
eecd_reg
);
usec_delay
(
50
);
return
;
/* Raise the clock input to the EEPROM (by setting the SK bit), and then
* wait 50 microseconds.
*/
*
eecd_reg
=
*
eecd_reg
|
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
*
eecd_reg
);
usec_delay
(
50
);
return
;
}
/******************************************************************************
...
...
@@ -66,16 +63,15 @@ ixgb_raise_clock(struct ixgb_hw *hw,
* eecd_reg - EECD's current value
*****************************************************************************/
static
void
ixgb_lower_clock
(
struct
ixgb_hw
*
hw
,
uint32_t
*
eecd_reg
)
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.
*/
*
eecd_reg
=
*
eecd_reg
&
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
*
eecd_reg
);
usec_delay
(
50
);
return
;
/* Lower the clock input to the EEPROM (by clearing the SK bit), and then
* wait 50 microseconds.
*/
*
eecd_reg
=
*
eecd_reg
&
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
*
eecd_reg
);
usec_delay
(
50
);
return
;
}
/******************************************************************************
...
...
@@ -86,46 +82,44 @@ ixgb_lower_clock(struct ixgb_hw *hw,
* 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
;
/* We need to shift "count" bits out to the EEPROM. So, value in the
* "data" parameter will be shifted out to the EEPROM one bit at a time.
* In order to do this, "data" must be broken down into bits.
*/
mask
=
0x01
<<
(
count
-
1
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_DO
|
IXGB_EECD_DI
);
do
{
/* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1",
* and then raising and then lowering the clock (the SK bit controls
* the clock input to the EEPROM). A "0" is shifted out to the EEPROM
* by setting "DI" to "0" and then raising and then lowering the clock.
*/
eecd_reg
&=
~
IXGB_EECD_DI
;
if
(
data
&
mask
)
eecd_reg
|=
IXGB_EECD_DI
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
ixgb_raise_clock
(
hw
,
&
eecd_reg
);
ixgb_lower_clock
(
hw
,
&
eecd_reg
);
mask
=
mask
>>
1
;
}
while
(
mask
);
/* We leave the "DI" bit set to "0" when we leave this routine. */
eecd_reg
&=
~
IXGB_EECD_DI
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
return
;
uint32_t
eecd_reg
;
uint32_t
mask
;
/* We need to shift "count" bits out to the EEPROM. So, value in the
* "data" parameter will be shifted out to the EEPROM one bit at a time.
* In order to do this, "data" must be broken down into bits.
*/
mask
=
0x01
<<
(
count
-
1
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_DO
|
IXGB_EECD_DI
);
do
{
/* A "1" is shifted out to the EEPROM by setting bit "DI" to a "1",
* and then raising and then lowering the clock (the SK bit controls
* the clock input to the EEPROM). A "0" is shifted out to the EEPROM
* by setting "DI" to "0" and then raising and then lowering the clock.
*/
eecd_reg
&=
~
IXGB_EECD_DI
;
if
(
data
&
mask
)
eecd_reg
|=
IXGB_EECD_DI
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
ixgb_raise_clock
(
hw
,
&
eecd_reg
);
ixgb_lower_clock
(
hw
,
&
eecd_reg
);
mask
=
mask
>>
1
;
}
while
(
mask
);
/* We leave the "DI" bit set to "0" when we leave this routine. */
eecd_reg
&=
~
IXGB_EECD_DI
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
return
;
}
/******************************************************************************
...
...
@@ -136,36 +130,36 @@ ixgb_shift_out_bits(struct ixgb_hw *hw,
static
uint16_t
ixgb_shift_in_bits
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
i
;
uint16_t
data
;
uint32_t
eecd_reg
;
uint32_t
i
;
uint16_t
data
;
/* In order to read a register from the EEPROM, we need to shift 16 bits
* in from the EEPROM. Bits are "shifted in" by raising the clock input to
* the EEPROM (setting the SK bit), and then reading the value of the "DO"
* bit. During this "shifting in" process the "DI" bit should always be
* clear..
*/
/* In order to read a register from the EEPROM, we need to shift 16 bits
* in from the EEPROM. Bits are "shifted in" by raising the clock input to
* the EEPROM (setting the SK bit), and then reading the value of the "DO"
* bit. During this "shifting in" process the "DI" bit should always be
* clear..
*/
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_DO
|
IXGB_EECD_DI
);
data
=
0
;
eecd_reg
&=
~
(
IXGB_EECD_DO
|
IXGB_EECD_DI
);
data
=
0
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
data
=
data
<<
1
;
ixgb_raise_clock
(
hw
,
&
eecd_reg
);
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_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_DI
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
data
|=
1
;
eecd_reg
&=
~
(
IXGB_EECD_DI
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
data
|=
1
;
ixgb_lower_clock
(
hw
,
&
eecd_reg
);
}
ixgb_lower_clock
(
hw
,
&
eecd_reg
);
}
return
data
;
return
data
;
}
/******************************************************************************
...
...
@@ -179,18 +173,18 @@ ixgb_shift_in_bits(struct ixgb_hw *hw)
static
void
ixgb_setup_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
eecd_reg
;
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
/* Clear SK and DI */
eecd_reg
&=
~
(
IXGB_EECD_SK
|
IXGB_EECD_DI
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
/* Clear SK and DI */
eecd_reg
&=
~
(
IXGB_EECD_SK
|
IXGB_EECD_DI
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
/* Set CS */
eecd_reg
|=
IXGB_EECD_CS
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
return
;
/* Set CS */
eecd_reg
|=
IXGB_EECD_CS
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
return
;
}
/******************************************************************************
...
...
@@ -201,30 +195,30 @@ ixgb_setup_eeprom(struct ixgb_hw *hw)
static
void
ixgb_standby_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
/* Deselct EEPROM */
eecd_reg
&=
~
(
IXGB_EECD_CS
|
IXGB_EECD_SK
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Clock high */
eecd_reg
|=
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Select EEPROM */
eecd_reg
|=
IXGB_EECD_CS
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Clock low */
eecd_reg
&=
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
return
;
uint32_t
eecd_reg
;
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
/* Deselct EEPROM */
eecd_reg
&=
~
(
IXGB_EECD_CS
|
IXGB_EECD_SK
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Clock high */
eecd_reg
|=
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Select EEPROM */
eecd_reg
|=
IXGB_EECD_CS
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Clock low */
eecd_reg
&=
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
return
;
}
/******************************************************************************
...
...
@@ -235,20 +229,20 @@ ixgb_standby_eeprom(struct ixgb_hw *hw)
static
void
ixgb_clock_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
eecd_reg
;
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
/* Rising edge of clock */
eecd_reg
|=
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Rising edge of clock */
eecd_reg
|=
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
/* Falling edge of clock */
eecd_reg
&=
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
return
;
/* Falling edge of clock */
eecd_reg
&=
~
IXGB_EECD_SK
;
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
usec_delay
(
50
);
return
;
}
/******************************************************************************
...
...
@@ -259,16 +253,16 @@ ixgb_clock_eeprom(struct ixgb_hw *hw)
static
void
ixgb_cleanup_eeprom
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
eecd_reg
;
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
eecd_reg
&=
~
(
IXGB_EECD_CS
|
IXGB_EECD_DI
);
eecd_reg
&=
~
(
IXGB_EECD_CS
|
IXGB_EECD_DI
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
IXGB_WRITE_REG
(
hw
,
EECD
,
eecd_reg
);
ixgb_clock_eeprom
(
hw
);
return
;
ixgb_clock_eeprom
(
hw
);
return
;
}
/******************************************************************************
...
...
@@ -285,32 +279,30 @@ ixgb_cleanup_eeprom(struct ixgb_hw *hw)
static
boolean_t
ixgb_wait_eeprom_command
(
struct
ixgb_hw
*
hw
)
{
uint32_t
eecd_reg
;
uint32_t
i
;
/* Toggle the CS line. This in effect tells to EEPROM to actually execute
* the command in question.
*/
ixgb_standby_eeprom
(
hw
);
/* Now read DO repeatedly until is high (equal to '1'). The EEEPROM will
* 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
++
)
{
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
return
(
TRUE
);
usec_delay
(
50
);
}
ASSERT
(
0
);
return
(
FALSE
);
uint32_t
eecd_reg
;
uint32_t
i
;
/* Toggle the CS line. This in effect tells to EEPROM to actually execute
* the command in question.
*/
ixgb_standby_eeprom
(
hw
);
/* Now read DO repeatedly until is high (equal to '1'). The EEEPROM will
* 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
++
)
{
eecd_reg
=
IXGB_READ_REG
(
hw
,
EECD
);
if
(
eecd_reg
&
IXGB_EECD_DO
)
return
(
TRUE
);
usec_delay
(
50
);
}
ASSERT
(
0
);
return
(
FALSE
);
}
/******************************************************************************
* Verifies that the EEPROM has a valid checksum
*
...
...
@@ -325,18 +317,18 @@ ixgb_wait_eeprom_command(struct ixgb_hw *hw)
* FALSE: Checksum is not valid.
*****************************************************************************/
boolean_t
ixgb_validate_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
ixgb_validate_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
{
uint16_t
checksum
=
0
;
uint16_t
i
;
uint16_t
checksum
=
0
;
uint16_t
i
;
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
for
(
i
=
0
;
i
<
(
EEPROM_CHECKSUM_REG
+
1
);
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
if
(
checksum
==
(
uint16_t
)
EEPROM_SUM
)
return
(
TRUE
);
else
return
(
FALSE
);
if
(
checksum
==
(
uint16_t
)
EEPROM_SUM
)
return
(
TRUE
);
else
return
(
FALSE
);
}
/******************************************************************************
...
...
@@ -350,16 +342,16 @@ ixgb_validate_eeprom_checksum(struct ixgb_hw *hw)
void
ixgb_update_eeprom_checksum
(
struct
ixgb_hw
*
hw
)
{
uint16_t
checksum
=
0
;
uint16_t
i
;
uint16_t
checksum
=
0
;
uint16_t
i
;
for
(
i
=
0
;
i
<
EEPROM_CHECKSUM_REG
;
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
for
(
i
=
0
;
i
<
EEPROM_CHECKSUM_REG
;
i
++
)
checksum
+=
ixgb_read_eeprom
(
hw
,
i
);
checksum
=
(
uint16_t
)
EEPROM_SUM
-
checksum
;
checksum
=
(
uint16_t
)
EEPROM_SUM
-
checksum
;
ixgb_write_eeprom
(
hw
,
EEPROM_CHECKSUM_REG
,
checksum
);
return
;
ixgb_write_eeprom
(
hw
,
EEPROM_CHECKSUM_REG
,
checksum
);
return
;
}
/******************************************************************************
...
...
@@ -374,45 +366,43 @@ ixgb_update_eeprom_checksum(struct ixgb_hw *hw)
*
*****************************************************************************/
void
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
,
uint16_t
data
)
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
,
uint16_t
data
)
{
/* Prepare the EEPROM for writing */
ixgb_setup_eeprom
(
hw
);
/* Prepare the EEPROM for writing */
ixgb_setup_eeprom
(
hw
);
/* Send the 9-bit EWEN (write enable) command to the EEPROM (5-bit opcode
* plus 4-bit dummy). This puts the EEPROM into write/erase mode.
*/
ixgb_shift_out_bits
(
hw
,
EEPROM_EWEN_OPCODE
,
5
);
ixgb_shift_out_bits
(
hw
,
0
,
4
);
/* Send the 9-bit EWEN (write enable) command to the EEPROM (5-bit opcode
* plus 4-bit dummy). This puts the EEPROM into write/erase mode.
*/
ixgb_shift_out_bits
(
hw
,
EEPROM_EWEN_OPCODE
,
5
);
ixgb_shift_out_bits
(
hw
,
0
,
4
);
/* Prepare the EEPROM */
ixgb_standby_eeprom
(
hw
);
/* Prepare the EEPROM */
ixgb_standby_eeprom
(
hw
);
/* Send the Write command (3-bit opcode + 6-bit addr) */
ixgb_shift_out_bits
(
hw
,
EEPROM_WRITE_OPCODE
,
3
);
ixgb_shift_out_bits
(
hw
,
offset
,
6
);
/* Send the Write command (3-bit opcode + 6-bit addr) */
ixgb_shift_out_bits
(
hw
,
EEPROM_WRITE_OPCODE
,
3
);
ixgb_shift_out_bits
(
hw
,
offset
,
6
);
/* Send the data */
ixgb_shift_out_bits
(
hw
,
data
,
16
);
/* Send the data */
ixgb_shift_out_bits
(
hw
,
data
,
16
);
ixgb_wait_eeprom_command
(
hw
);
ixgb_wait_eeprom_command
(
hw
);
/* Recover from write */
ixgb_standby_eeprom
(
hw
);
/* Recover from write */
ixgb_standby_eeprom
(
hw
);
/* Send the 9-bit EWDS (write disable) command to the EEPROM (5-bit
* opcode plus 4-bit dummy). This takes the EEPROM out of write/erase
* mode.
*/
ixgb_shift_out_bits
(
hw
,
EEPROM_EWDS_OPCODE
,
5
);
ixgb_shift_out_bits
(
hw
,
0
,
4
);
/* Send the 9-bit EWDS (write disable) command to the EEPROM (5-bit
* opcode plus 4-bit dummy). This takes the EEPROM out of write/erase
* mode.
*/
ixgb_shift_out_bits
(
hw
,
EEPROM_EWDS_OPCODE
,
5
);
ixgb_shift_out_bits
(
hw
,
0
,
4
);
/* Done with writing */
ixgb_cleanup_eeprom
(
hw
);
/* Done with writing */
ixgb_cleanup_eeprom
(
hw
);
return
;
return
;
}
/******************************************************************************
...
...
@@ -425,28 +415,27 @@ ixgb_write_eeprom(struct ixgb_hw *hw,
* The 16-bit value read from the eeprom
*****************************************************************************/
uint16_t
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
)
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
offset
)
{
uint16_t
data
;
uint16_t
data
;
/* Prepare the EEPROM for reading */
ixgb_setup_eeprom
(
hw
);
/* Prepare the EEPROM for reading */
ixgb_setup_eeprom
(
hw
);
/* Send the READ command (opcode + addr) */
ixgb_shift_out_bits
(
hw
,
EEPROM_READ_OPCODE
,
3
);
/*
* We have a 64 word EEPROM, there are 6 address bits
*/
ixgb_shift_out_bits
(
hw
,
offset
,
6
);
/* Send the READ command (opcode + addr) */
ixgb_shift_out_bits
(
hw
,
EEPROM_READ_OPCODE
,
3
);
/*
* We have a 64 word EEPROM, there are 6 address bits
*/
ixgb_shift_out_bits
(
hw
,
offset
,
6
);
/* Read the data */
data
=
ixgb_shift_in_bits
(
hw
);
/* Read the data */
data
=
ixgb_shift_in_bits
(
hw
);
/* End this read operation */
ixgb_standby_eeprom
(
hw
);
/* End this read operation */
ixgb_standby_eeprom
(
hw
);
return
(
data
);
return
(
data
);
}
/******************************************************************************
...
...
@@ -460,38 +449,37 @@ ixgb_read_eeprom(struct ixgb_hw *hw,
* FALSE: otherwise.
*****************************************************************************/
boolean_t
ixgb_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
ixgb_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
{
uint16_t
i
;
uint16_t
checksum
=
0
;
struct
ixgb_ee_map_type
*
ee_map
;
DEBUGFUNC
(
"ixgb_get_eeprom_data"
);
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
DEBUGOUT
(
"ixgb_ee: Reading eeprom data
\n
"
);
for
(
i
=
0
;
i
<
IXGB_EEPROM_SIZE
;
i
++
)
{
uint16_t
ee_data
;
ee_data
=
ixgb_read_eeprom
(
hw
,
i
);
checksum
+=
ee_data
;
hw
->
eeprom
[
i
]
=
le16_to_cpu
(
ee_data
);
}
if
(
checksum
!=
(
uint16_t
)
EEPROM_SUM
)
{
DEBUGOUT
(
"ixgb_ee: Checksum invalid.
\n
"
);
return
(
FALSE
);
}
if
((
ee_map
->
init_ctrl_reg_1
&
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_MASK
))
!=
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
DEBUGOUT
(
"ixgb_ee: Signature invalid.
\n
"
);
return
(
FALSE
);
}
return
(
TRUE
);
}
uint16_t
i
;
uint16_t
checksum
=
0
;
struct
ixgb_ee_map_type
*
ee_map
;
DEBUGFUNC
(
"ixgb_get_eeprom_data"
);
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
DEBUGOUT
(
"ixgb_ee: Reading eeprom data
\n
"
);
for
(
i
=
0
;
i
<
IXGB_EEPROM_SIZE
;
i
++
)
{
uint16_t
ee_data
;
ee_data
=
ixgb_read_eeprom
(
hw
,
i
);
checksum
+=
ee_data
;
hw
->
eeprom
[
i
]
=
le16_to_cpu
(
ee_data
);
}
if
(
checksum
!=
(
uint16_t
)
EEPROM_SUM
)
{
DEBUGOUT
(
"ixgb_ee: Checksum invalid.
\n
"
);
return
(
FALSE
);
}
if
((
ee_map
->
init_ctrl_reg_1
&
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_MASK
))
!=
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
DEBUGOUT
(
"ixgb_ee: Signature invalid.
\n
"
);
return
(
FALSE
);
}
return
(
TRUE
);
}
/******************************************************************************
* Local function to check if the eeprom signature is good
...
...
@@ -504,17 +492,17 @@ ixgb_get_eeprom_data(struct ixgb_hw *hw)
* FALSE: otherwise.
******************************************************************************/
static
boolean_t
ixgb_check_and_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
ixgb_check_and_get_eeprom_data
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
((
ee_map
->
init_ctrl_reg_1
&
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_MASK
))
==
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
return
(
TRUE
);
}
else
{
return
ixgb_get_eeprom_data
(
hw
);
}
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
if
((
ee_map
->
init_ctrl_reg_1
&
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_MASK
))
==
le16_to_cpu
(
EEPROM_ICW1_SIGNATURE_VALID
))
{
return
(
TRUE
);
}
else
{
return
ixgb_get_eeprom_data
(
hw
);
}
}
/******************************************************************************
...
...
@@ -526,21 +514,21 @@ ixgb_check_and_get_eeprom_data (struct ixgb_hw* hw)
* Returns: None.
******************************************************************************/
void
ixgb_get_ee_mac_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mac_addr
)
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
;
DEBUGFUNC
(
"ixgb_get_ee_mac_addr"
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
{
for
(
i
=
0
;
i
<
IXGB_ETH_LENGTH_OF_ADDRESS
;
i
++
)
{
mac_addr
[
i
]
=
ee_map
->
mac_addr
[
i
];
DEBUGOUT2
(
"mac(%d) = %.2X
\n
"
,
i
,
mac_addr
[
i
]);
}
}
}
int
i
;
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
DEBUGFUNC
(
"ixgb_get_ee_mac_addr"
);
if
(
ixgb_check_and_get_eeprom_data
(
hw
)
==
TRUE
)
{
for
(
i
=
0
;
i
<
IXGB_ETH_LENGTH_OF_ADDRESS
;
i
++
)
{
mac_addr
[
i
]
=
ee_map
->
mac_addr
[
i
];
DEBUGOUT2
(
"mac(%d) = %.2X
\n
"
,
i
,
mac_addr
[
i
]);
}
}
}
/******************************************************************************
* return the compatibility flags from EEPROM
...
...
@@ -553,12 +541,13 @@ ixgb_get_ee_mac_addr(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
;
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
);
}
/******************************************************************************
...
...
@@ -570,13 +559,13 @@ ixgb_get_ee_compatibility(struct ixgb_hw *hw)
* PBA number if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint32_t
ixgb_get_ee_pba_number
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_pba_number
(
struct
ixgb_hw
*
hw
)
{
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
));
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
));
return
(
0
);
return
(
0
);
}
/******************************************************************************
...
...
@@ -588,15 +577,16 @@ ixgb_get_ee_pba_number(struct ixgb_hw *hw)
* Initialization Control Word 1 if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_init_ctrl_reg_1
(
struct
ixgb_hw
*
hw
)
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
;
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
);
}
/******************************************************************************
* return the Initialization Control Word 2 from EEPROM
...
...
@@ -607,15 +597,16 @@ ixgb_get_ee_init_ctrl_reg_1(struct ixgb_hw *hw)
* Initialization Control Word 2 if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_init_ctrl_reg_2
(
struct
ixgb_hw
*
hw
)
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
;
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
);
}
/******************************************************************************
* return the Subsystem Id from EEPROM
...
...
@@ -626,15 +617,16 @@ ixgb_get_ee_init_ctrl_reg_2(struct ixgb_hw *hw)
* Subsystem Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_subsystem_id
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_subsystem_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the Sub Vendor Id from EEPROM
...
...
@@ -645,15 +637,16 @@ ixgb_get_ee_subsystem_id(struct ixgb_hw *hw)
* Sub Vendor Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_subvendor_id
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_subvendor_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the Device Id from EEPROM
...
...
@@ -664,15 +657,16 @@ ixgb_get_ee_subvendor_id(struct ixgb_hw *hw)
* Device Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_device_id
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_device_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the Vendor Id from EEPROM
...
...
@@ -683,15 +677,16 @@ ixgb_get_ee_device_id(struct ixgb_hw *hw)
* Device Id if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_vendor_id
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_vendor_id
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the Software Defined Pins Register from EEPROM
...
...
@@ -702,15 +697,16 @@ ixgb_get_ee_vendor_id(struct ixgb_hw *hw)
* SDP Register if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint16_t
ixgb_get_ee_swdpins_reg
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_swdpins_reg
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the D3 Power Management Bits from EEPROM
...
...
@@ -721,15 +717,16 @@ ixgb_get_ee_swdpins_reg(struct ixgb_hw *hw)
* D3 Power Management Bits if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint8_t
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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
);
}
/******************************************************************************
* return the D0 Power Management Bits from EEPROM
...
...
@@ -740,12 +737,13 @@ ixgb_get_ee_d3_power(struct ixgb_hw *hw)
* D0 Power Management Bits if EEPROM contents are valid, 0 otherwise
******************************************************************************/
uint8_t
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
)
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
)
{
struct
ixgb_ee_map_type
*
ee_map
=
(
struct
ixgb_ee_map_type
*
)
hw
->
eeprom
;
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_ee.h
View file @
ca247341
...
...
@@ -28,18 +28,16 @@
#ifndef _IXGB_EE_H_
#define _IXGB_EE_H_
#define IXGB_EEPROM_SIZE 64
/* Size in words */
#define IXGB_EEPROM_SIZE 64
/* Size in words */
#define IXGB_ETH_LENGTH_OF_ADDRESS 6
/* EEPROM Commands */
#define EEPROM_READ_OPCODE 0x6
/* EERPOM read opcode */
#define EEPROM_WRITE_OPCODE 0x5
/* EERPOM write opcode */
#define EEPROM_ERASE_OPCODE 0x7
/* EERPOM erase opcode */
#define EEPROM_EWEN_OPCODE 0x13
/* EERPOM erase/write enable */
#define EEPROM_EWDS_OPCODE 0x10
/* EERPOM erast/write disable */
#define EEPROM_READ_OPCODE 0x6
/* EERPOM read opcode */
#define EEPROM_WRITE_OPCODE 0x5
/* EERPOM write opcode */
#define EEPROM_ERASE_OPCODE 0x7
/* EERPOM erase opcode */
#define EEPROM_EWEN_OPCODE 0x13
/* EERPOM erase/write enable */
#define EEPROM_EWDS_OPCODE 0x10
/* EERPOM erast/write disable */
/* EEPROM MAP (Word Offsets) */
#define EEPROM_IA_1_2_REG 0x0000
...
...
@@ -74,37 +72,33 @@
/* EEPROM Map defines (WORD OFFSETS)*/
/* EEPROM structure */
struct
ixgb_ee_map_type
{
uint8_t
mac_addr
[
IXGB_ETH_LENGTH_OF_ADDRESS
];
uint16_t
compatibility
;
uint16_t
reserved1
[
4
];
uint32_t
pba_number
;
uint16_t
init_ctrl_reg_1
;
uint16_t
subsystem_id
;
uint16_t
subvendor_id
;
uint16_t
device_id
;
uint16_t
vendor_id
;
uint16_t
init_ctrl_reg_2
;
uint16_t
oem_reserved
[
16
];
uint16_t
swdpins_reg
;
uint16_t
circuit_ctrl_reg
;
uint8_t
d3_power
;
uint8_t
d0_power
;
uint16_t
reserved2
[
28
];
uint16_t
checksum
;
};
struct
ixgb_ee_map_type
{
uint8_t
mac_addr
[
IXGB_ETH_LENGTH_OF_ADDRESS
];
uint16_t
compatibility
;
uint16_t
reserved1
[
4
];
uint32_t
pba_number
;
uint16_t
init_ctrl_reg_1
;
uint16_t
subsystem_id
;
uint16_t
subvendor_id
;
uint16_t
device_id
;
uint16_t
vendor_id
;
uint16_t
init_ctrl_reg_2
;
uint16_t
oem_reserved
[
16
];
uint16_t
swdpins_reg
;
uint16_t
circuit_ctrl_reg
;
uint8_t
d3_power
;
uint8_t
d0_power
;
uint16_t
reserved2
[
28
];
uint16_t
checksum
;
};
/* EEPROM Functions */
uint16_t
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
reg
);
uint16_t
ixgb_read_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
reg
);
boolean_t
ixgb_validate_eeprom_checksum
(
struct
ixgb_hw
*
hw
);
void
ixgb_update_eeprom_checksum
(
struct
ixgb_hw
*
hw
);
void
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
reg
,
uint16_t
data
);
#endif
/* IXGB_EE_H */
void
ixgb_write_eeprom
(
struct
ixgb_hw
*
hw
,
uint16_t
reg
,
uint16_t
data
);
#endif
/* IXGB_EE_H */
drivers/net/ixgb/ixgb_ethtool.c
View file @
ca247341
...
...
@@ -25,7 +25,6 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* ethtool support for ixgb */
#include "ixgb.h"
...
...
@@ -47,324 +46,320 @@ extern int ixgb_down(struct ixgb_adapter *adapter);
static
inline
int
ixgb_eeprom_size
(
struct
ixgb_hw
*
hw
)
{
/* return size in bytes */
return
(
IXGB_EEPROM_SIZE
<<
1
);
/* return size in bytes */
return
(
IXGB_EEPROM_SIZE
<<
1
);
}
#define SUPPORTED_10000baseT_Full (1 << 11)
#define SPEED_10000 10000
static
void
ixgb_ethtool_gset
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_cmd
*
ecmd
)
ixgb_ethtool_gset
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_cmd
*
ecmd
)
{
ecmd
->
supported
=
(
SUPPORTED_10000baseT_Full
|
SUPPORTED_FIBRE
);
ecmd
->
advertising
=
(
SUPPORTED_10000baseT_Full
|
SUPPORTED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
if
(
netif_carrier_ok
(
adapter
->
netdev
))
{
ecmd
->
speed
=
10000
;
ecmd
->
duplex
=
DUPLEX_FULL
;
}
else
{
ecmd
->
speed
=
-
1
;
ecmd
->
duplex
=
-
1
;
}
ecmd
->
autoneg
=
AUTONEG_DISABLE
;
ecmd
->
supported
=
(
SUPPORTED_10000baseT_Full
|
SUPPORTED_FIBRE
);
ecmd
->
advertising
=
(
SUPPORTED_10000baseT_Full
|
SUPPORTED_FIBRE
);
ecmd
->
port
=
PORT_FIBRE
;
ecmd
->
transceiver
=
XCVR_EXTERNAL
;
if
(
netif_carrier_ok
(
adapter
->
netdev
))
{
ecmd
->
speed
=
10000
;
ecmd
->
duplex
=
DUPLEX_FULL
;
}
else
{
ecmd
->
speed
=
-
1
;
ecmd
->
duplex
=
-
1
;
}
ecmd
->
autoneg
=
AUTONEG_DISABLE
;
}
static
int
ixgb_ethtool_sset
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_cmd
*
ecmd
)
ixgb_ethtool_sset
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_cmd
*
ecmd
)
{
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
||
ecmd
->
speed
+
ecmd
->
duplex
!=
SPEED_10000
+
DUPLEX_FULL
)
return
-
EINVAL
;
else
{
ixgb_down
(
adapter
);
ixgb_up
(
adapter
);
}
return
0
;
if
(
ecmd
->
autoneg
==
AUTONEG_ENABLE
||
ecmd
->
speed
+
ecmd
->
duplex
!=
SPEED_10000
+
DUPLEX_FULL
)
return
-
EINVAL
;
else
{
ixgb_down
(
adapter
);
ixgb_up
(
adapter
);
}
return
0
;
}
#if 0
static int
ixgb_ethtool_promiscuous(struct ixgb_adapter *adapter,
struct ethtool_pmode *pmode)
struct ethtool_pmode *pmode)
{
uint32_t rctl = IXGB_READ_REG(&adapter->hw, RCTL);
uint32_t rctl = IXGB_READ_REG(&adapter->hw, RCTL);
pmode->rctl_old = rctl;
if
(pmode->upe)
rctl |= IXGB_RCTL_UPE;
else
rctl &= ~IXGB_RCTL_UPE;
pmode->rctl_old = rctl;
if
(pmode->upe)
rctl |= IXGB_RCTL_UPE;
else
rctl &= ~IXGB_RCTL_UPE;
if
(pmode->mpe)
rctl |= IXGB_RCTL_MPE;
else
rctl &= ~IXGB_RCTL_MPE;
if
(pmode->mpe)
rctl |= IXGB_RCTL_MPE;
else
rctl &= ~IXGB_RCTL_MPE;
IXGB_WRITE_REG(&adapter->hw, RCTL, rctl);
IXGB_WRITE_REG(&adapter->hw, RCTL, rctl);
pmode->rctl_new = IXGB_READ_REG(&adapter->hw, RCTL);
pmode->rctl_new = IXGB_READ_REG(&adapter->hw, RCTL);
return 0;
return 0;
}
#endif
#define IXGB_REG_DUMP_LEN 136*sizeof(uint32_t)
static
void
ixgb_ethtool_gdrvinfo
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_drvinfo
*
drvinfo
)
struct
ethtool_drvinfo
*
drvinfo
)
{
strncpy
(
drvinfo
->
driver
,
ixgb_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
ixgb_driver_version
,
32
);
strncpy
(
drvinfo
->
fw_version
,
""
,
32
);
strncpy
(
drvinfo
->
bus_info
,
adapter
->
pdev
->
slot_name
,
32
);
strncpy
(
drvinfo
->
driver
,
ixgb_driver_name
,
32
);
strncpy
(
drvinfo
->
version
,
ixgb_driver_version
,
32
);
strncpy
(
drvinfo
->
fw_version
,
""
,
32
);
strncpy
(
drvinfo
->
bus_info
,
adapter
->
pdev
->
slot_name
,
32
);
#ifdef ETHTOOL_GREGS
drvinfo
->
regdump_len
=
IXGB_REG_DUMP_LEN
;
#endif
/* ETHTOOL_GREGS */
drvinfo
->
eedump_len
=
ixgb_eeprom_size
(
&
adapter
->
hw
);
drvinfo
->
regdump_len
=
IXGB_REG_DUMP_LEN
;
#endif
/* ETHTOOL_GREGS */
drvinfo
->
eedump_len
=
ixgb_eeprom_size
(
&
adapter
->
hw
);
}
#ifdef ETHTOOL_GREGS
#define IXGB_GET_STAT(_A_, _R_) _A_->stats._R_
static
void
ixgb_ethtool_gregs
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_regs
*
regs
,
uint8_t
*
regs_buff
)
struct
ethtool_regs
*
regs
,
uint8_t
*
regs_buff
)
{
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
*
reg
=
(
uint32_t
*
)
regs_buff
;
uint32_t
*
reg_start
=
reg
;
uint8_t
i
;
regs
->
version
=
(
adapter
->
hw
.
device_id
<<
16
)
|
adapter
->
hw
.
subsystem_id
;
/* General Registers */
*
reg
++
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* 0 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
CTRL1
);
/* 1 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
STATUS
);
/* 2 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
EECD
);
/* 3 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MFS
);
/* 4 */
/* Interrupt */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ICR
);
/* 5 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ICS
);
/* 6 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
IMS
);
/* 7 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
IMC
);
/* 8 */
/* Receive */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RCTL
);
/* 9 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
FCRTL
);
/* 10 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
FCRTH
);
/* 11 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDBAL
);
/* 12 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDBAH
);
/* 13 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDLEN
);
/* 14 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDH
);
/* 15 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDT
);
/* 16 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDTR
);
/* 17 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RXDCTL
);
/* 18 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RAIDC
);
/* 19 */
*
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 */
}
/* Transmit */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TCTL
);
/* 53 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDBAL
);
/* 54 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDBAH
);
/* 55 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDLEN
);
/* 56 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDH
);
/* 57 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDT
);
/* 58 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TIDV
);
/* 59 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TXDCTL
);
/* 60 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TSPMT
);
/* 61 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PAP
);
/* 62 */
/* Physical */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSC1
);
/* 63 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSC2
);
/* 64 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSS1
);
/* 65 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSS2
);
/* 66 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
XPCSS
);
/* 67 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
UCCR
);
/* 68 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
XPCSTC
);
/* 69 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MACA
);
/* 70 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
APAE
);
/* 71 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ARD
);
/* 72 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
AIS
);
/* 73 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MSCA
);
/* 74 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MSRWD
);
/* 75 */
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
*
reg
=
(
uint32_t
*
)
regs_buff
;
uint32_t
*
reg_start
=
reg
;
uint8_t
i
;
regs
->
version
=
(
adapter
->
hw
.
device_id
<<
16
)
|
adapter
->
hw
.
subsystem_id
;
/* General Registers */
*
reg
++
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* 0 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
CTRL1
);
/* 1 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
STATUS
);
/* 2 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
EECD
);
/* 3 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MFS
);
/* 4 */
/* Interrupt */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ICR
);
/* 5 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ICS
);
/* 6 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
IMS
);
/* 7 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
IMC
);
/* 8 */
/* Receive */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RCTL
);
/* 9 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
FCRTL
);
/* 10 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
FCRTH
);
/* 11 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDBAL
);
/* 12 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDBAH
);
/* 13 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDLEN
);
/* 14 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDH
);
/* 15 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDT
);
/* 16 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RDTR
);
/* 17 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RXDCTL
);
/* 18 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
RAIDC
);
/* 19 */
*
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 */
}
/* Transmit */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TCTL
);
/* 53 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDBAL
);
/* 54 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDBAH
);
/* 55 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDLEN
);
/* 56 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDH
);
/* 57 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TDT
);
/* 58 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TIDV
);
/* 59 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TXDCTL
);
/* 60 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
TSPMT
);
/* 61 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PAP
);
/* 62 */
/* Physical */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSC1
);
/* 63 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSC2
);
/* 64 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSS1
);
/* 65 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
PCSS2
);
/* 66 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
XPCSS
);
/* 67 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
UCCR
);
/* 68 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
XPCSTC
);
/* 69 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MACA
);
/* 70 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
APAE
);
/* 71 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
ARD
);
/* 72 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
AIS
);
/* 73 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MSCA
);
/* 74 */
*
reg
++
=
IXGB_READ_REG
(
hw
,
MSRWD
);
/* 75 */
#if 0
/* Wake-up */
reg[IXGB_WUFC] = IXGB_READ_REG(hw, WUFC);
reg[IXGB_WUS] = IXGB_READ_REG(hw, WUS);
reg[IXGB_FFLT] = IXGB_READ_REG(hw, FFLT);
reg[IXGB_FFMT] = IXGB_READ_REG(hw, FFMT);
reg[IXGB_FTVT] = IXGB_READ_REG(hw, FTVT);
/* Wake-up */
reg[IXGB_WUFC] = IXGB_READ_REG(hw, WUFC);
reg[IXGB_WUS] = IXGB_READ_REG(hw, WUS);
reg[IXGB_FFLT] = IXGB_READ_REG(hw, FFLT);
reg[IXGB_FFMT] = IXGB_READ_REG(hw, FFMT);
reg[IXGB_FTVT] = IXGB_READ_REG(hw, FTVT);
#endif
/* Statistics */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tprl
);
/* 76 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tprh
);
/* 77 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gprcl
);
/* 78 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gprch
);
/* 79 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bprcl
);
/* 80 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bprch
);
/* 81 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mprcl
);
/* 82 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mprch
);
/* 83 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uprcl
);
/* 84 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uprch
);
/* 85 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vprcl
);
/* 86 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vprch
);
/* 87 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jprcl
);
/* 88 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jprch
);
/* 89 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gorcl
);
/* 90 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gorch
);
/* 91 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
torl
);
/* 92 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
torh
);
/* 93 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rnbc
);
/* 94 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ruc
);
/* 95 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
roc
);
/* 96 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rlec
);
/* 97 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
crcerrs
);
/* 98 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
icbc
);
/* 99 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ecbc
);
/* 100 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mpc
);
/* 101 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tptl
);
/* 102 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tpth
);
/* 103 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gptcl
);
/* 104 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gptch
);
/* 105 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bptcl
);
/* 106 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bptch
);
/* 107 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mptcl
);
/* 108 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mptch
);
/* 109 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uptcl
);
/* 110 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uptch
);
/* 111 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vptcl
);
/* 112 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vptch
);
/* 113 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jptcl
);
/* 114 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jptch
);
/* 115 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gotcl
);
/* 116 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gotch
);
/* 117 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
totl
);
/* 118 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
toth
);
/* 119 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
dc
);
/* 120 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
plt64c
);
/* 121 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tsctc
);
/* 122 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tsctfc
);
/* 123 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ibic
);
/* 124 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rfc
);
/* 125 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
lfc
);
/* 126 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
pfrc
);
/* 127 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
pftc
);
/* 128 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mcfrc
);
/* 129 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mcftc
);
/* 130 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xonrxc
);
/* 131 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xontxc
);
/* 132 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xoffrxc
);
/* 133 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xofftxc
);
/* 134 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rjc
);
/* 135 */
/* Statistics */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tprl
);
/* 76 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tprh
);
/* 77 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gprcl
);
/* 78 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gprch
);
/* 79 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bprcl
);
/* 80 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bprch
);
/* 81 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mprcl
);
/* 82 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mprch
);
/* 83 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uprcl
);
/* 84 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uprch
);
/* 85 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vprcl
);
/* 86 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vprch
);
/* 87 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jprcl
);
/* 88 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jprch
);
/* 89 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gorcl
);
/* 90 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gorch
);
/* 91 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
torl
);
/* 92 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
torh
);
/* 93 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rnbc
);
/* 94 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ruc
);
/* 95 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
roc
);
/* 96 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rlec
);
/* 97 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
crcerrs
);
/* 98 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
icbc
);
/* 99 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ecbc
);
/* 100 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mpc
);
/* 101 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tptl
);
/* 102 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tpth
);
/* 103 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gptcl
);
/* 104 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gptch
);
/* 105 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bptcl
);
/* 106 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
bptch
);
/* 107 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mptcl
);
/* 108 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mptch
);
/* 109 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uptcl
);
/* 110 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
uptch
);
/* 111 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vptcl
);
/* 112 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
vptch
);
/* 113 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jptcl
);
/* 114 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
jptch
);
/* 115 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gotcl
);
/* 116 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
gotch
);
/* 117 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
totl
);
/* 118 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
toth
);
/* 119 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
dc
);
/* 120 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
plt64c
);
/* 121 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tsctc
);
/* 122 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
tsctfc
);
/* 123 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
ibic
);
/* 124 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rfc
);
/* 125 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
lfc
);
/* 126 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
pfrc
);
/* 127 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
pftc
);
/* 128 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mcfrc
);
/* 129 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
mcftc
);
/* 130 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xonrxc
);
/* 131 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xontxc
);
/* 132 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xoffrxc
);
/* 133 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
xofftxc
);
/* 134 */
*
reg
++
=
IXGB_GET_STAT
(
adapter
,
rjc
);
/* 135 */
#if 0
#endif
regs
->
len
=
(
reg
-
reg_start
)
*
sizeof
(
uint32_t
);
regs
->
len
=
(
reg
-
reg_start
)
*
sizeof
(
uint32_t
);
}
#endif
/* ETHTOOL_GREGS */
#endif
/* ETHTOOL_GREGS */
static
int
ixgb_ethtool_geeprom
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_eeprom
*
eeprom
,
uint16_t
*
eeprom_buff
)
struct
ethtool_eeprom
*
eeprom
,
uint16_t
*
eeprom_buff
)
{
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
int
i
,
max_len
,
first_word
,
last_word
;
IXGB_DBG
(
"ixgb_ethtool_geeprom
\n
"
);
if
(
eeprom
->
len
==
0
)
return
-
EINVAL
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
int
i
,
max_len
,
first_word
,
last_word
;
IXGB_DBG
(
"ixgb_ethtool_geeprom
\n
"
);
if
(
eeprom
->
len
==
0
)
return
-
EINVAL
;
eeprom
->
magic
=
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
);
eeprom
->
magic
=
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
);
max_len
=
ixgb_eeprom_size
(
hw
);
max_len
=
ixgb_eeprom_size
(
hw
);
/* use our function to read the eeprom and update our cache */
ixgb_get_eeprom_data
(
hw
);
/* use our function to read the eeprom and update our cache */
ixgb_get_eeprom_data
(
hw
);
if
(
eeprom
->
offset
>
eeprom
->
offset
+
eeprom
->
len
)
return
-
EINVAL
;
if
(
eeprom
->
offset
>
eeprom
->
offset
+
eeprom
->
len
)
return
-
EINVAL
;
if
((
eeprom
->
offset
+
eeprom
->
len
)
>
max_len
)
eeprom
->
len
=
(
max_len
-
eeprom
->
offset
);
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
;
first_word
=
eeprom
->
offset
>>
1
;
last_word
=
(
eeprom
->
offset
+
eeprom
->
len
-
1
)
>>
1
;
for
(
i
=
0
;
i
<=
(
last_word
-
first_word
);
i
++
)
{
eeprom_buff
[
i
]
=
hw
->
eeprom
[
first_word
+
i
];
}
for
(
i
=
0
;
i
<=
(
last_word
-
first_word
);
i
++
)
{
eeprom_buff
[
i
]
=
hw
->
eeprom
[
first_word
+
i
];
}
return
0
;
return
0
;
}
static
int
static
int
ixgb_ethtool_seeprom
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_eeprom
*
eeprom
,
void
*
user_data
)
struct
ethtool_eeprom
*
eeprom
,
void
*
user_data
)
{
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint16_t
eeprom_buff
[
256
];
int
i
,
max_len
,
first_word
,
last_word
;
void
*
ptr
;
if
(
eeprom
->
magic
!=
(
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
)))
return
-
EFAULT
;
if
(
eeprom
->
len
==
0
)
return
-
EINVAL
;
max_len
=
ixgb_eeprom_size
(
hw
);
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
=
(
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
)
{
/* 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
);
}
if
(
copy_from_user
(
ptr
,
user_data
,
eeprom
->
len
))
return
-
EFAULT
;
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
)
ixgb_update_eeprom_checksum
(
hw
);
return
0
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint16_t
eeprom_buff
[
256
];
int
i
,
max_len
,
first_word
,
last_word
;
void
*
ptr
;
if
(
eeprom
->
magic
!=
(
hw
->
vendor_id
|
(
hw
->
device_id
<<
16
)))
return
-
EFAULT
;
if
(
eeprom
->
len
==
0
)
return
-
EINVAL
;
max_len
=
ixgb_eeprom_size
(
hw
);
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
=
(
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
)
{
/* 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
);
}
if
(
copy_from_user
(
ptr
,
user_data
,
eeprom
->
len
))
return
-
EFAULT
;
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
)
ixgb_update_eeprom_checksum
(
hw
);
return
0
;
}
#ifdef ETHTOOL_PHYS_ID
...
...
@@ -378,184 +373,183 @@ ixgb_ethtool_seeprom(struct ixgb_adapter *adapter,
static
void
ixgb_led_blink_callback
(
unsigned
long
data
)
{
struct
ixgb_adapter
*
adapter
=
(
struct
ixgb_adapter
*
)
data
;
struct
ixgb_adapter
*
adapter
=
(
struct
ixgb_adapter
*
)
data
;
if
(
test_and_change_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
))
ixgb_led_off
(
&
adapter
->
hw
);
else
ixgb_led_on
(
&
adapter
->
hw
);
if
(
test_and_change_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
))
ixgb_led_off
(
&
adapter
->
hw
);
else
ixgb_led_on
(
&
adapter
->
hw
);
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
+
IXGB_ID_INTERVAL
);
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
+
IXGB_ID_INTERVAL
);
}
static
int
ixgb_ethtool_led_blink
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_value
*
id
)
ixgb_ethtool_led_blink
(
struct
ixgb_adapter
*
adapter
,
struct
ethtool_value
*
id
)
{
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
;
}
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
;
}
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
mod_timer
(
&
adapter
->
blink_timer
,
jiffies
);
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
id
->
data
)
schedule_timeout
(
id
->
data
*
HZ
);
else
schedule_timeout
(
MAX_SCHEDULE_TIMEOUT
);
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
id
->
data
)
schedule_timeout
(
id
->
data
*
HZ
);
else
schedule_timeout
(
MAX_SCHEDULE_TIMEOUT
);
del_timer_sync
(
&
adapter
->
blink_timer
);
ixgb_led_off
(
&
adapter
->
hw
);
clear_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
);
del_timer_sync
(
&
adapter
->
blink_timer
);
ixgb_led_off
(
&
adapter
->
hw
);
clear_bit
(
IXGB_LED_ON
,
&
adapter
->
led_status
);
return
0
;
return
0
;
}
#endif
/* ETHTOOL_PHYS_ID */
#endif
/* ETHTOOL_PHYS_ID */
int
ixgb_ethtool_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
)
ixgb_ethtool_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
)
{
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
void
*
addr
=
ifr
->
ifr_data
;
uint32_t
cmd
;
struct
ixgb_adapter
*
adapter
=
netdev
->
priv
;
void
*
addr
=
ifr
->
ifr_data
;
uint32_t
cmd
;
if
(
get_user
(
cmd
,
(
uint32_t
*
)
addr
))
return
-
EFAULT
;
if
(
get_user
(
cmd
,
(
uint32_t
*
)
addr
))
return
-
EFAULT
;
switch
(
cmd
)
{
switch
(
cmd
)
{
#if 0
case ETHTOOL_PROMISCUOUS:
{
struct ethtool_pmode pmode;
case ETHTOOL_PROMISCUOUS:
{
struct ethtool_pmode pmode;
if(copy_from_user(&pmode, addr, sizeof
(pmode)))
return -EFAULT;
if (copy_from_user(&pmode, addr, sizeof
(pmode)))
return -EFAULT;
ixgb_ethtool_promiscuous(adapter, &pmode);
ixgb_ethtool_promiscuous(adapter, &pmode);
if(copy_to_user(addr, &pmode, sizeof
(pmode)))
return -EFAULT;
if (copy_to_user(addr, &pmode, sizeof
(pmode)))
return -EFAULT;
return 0;
}
case ETHTOOL_DOWN_UP:
ixgb_down(netdev->priv);
ixgb_up(netdev->priv);
return 0;
return 0;
}
case ETHTOOL_DOWN_UP:
ixgb_down(netdev->priv);
ixgb_up(netdev->priv);
return 0;
#endif
case
ETHTOOL_GSET
:
{
struct
ethtool_cmd
ecmd
=
{
ETHTOOL_GSET
};
ixgb_ethtool_gset
(
adapter
,
&
ecmd
);
if
(
copy_to_user
(
addr
,
&
ecmd
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_SSET
:
{
struct
ethtool_cmd
ecmd
;
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
copy_from_user
(
&
ecmd
,
addr
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
ixgb_ethtool_sset
(
adapter
,
&
ecmd
);
}
case
ETHTOOL_GDRVINFO
:
{
struct
ethtool_drvinfo
drvinfo
=
{
ETHTOOL_GDRVINFO
};
ixgb_ethtool_gdrvinfo
(
adapter
,
&
drvinfo
);
if
(
copy_to_user
(
addr
,
&
drvinfo
,
sizeof
(
drvinfo
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_GSET
:
{
struct
ethtool_cmd
ecmd
=
{
ETHTOOL_GSET
};
ixgb_ethtool_gset
(
adapter
,
&
ecmd
);
if
(
copy_to_user
(
addr
,
&
ecmd
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_SSET
:
{
struct
ethtool_cmd
ecmd
;
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
copy_from_user
(
&
ecmd
,
addr
,
sizeof
(
ecmd
)))
return
-
EFAULT
;
return
ixgb_ethtool_sset
(
adapter
,
&
ecmd
);
}
case
ETHTOOL_GDRVINFO
:
{
struct
ethtool_drvinfo
drvinfo
=
{
ETHTOOL_GDRVINFO
};
ixgb_ethtool_gdrvinfo
(
adapter
,
&
drvinfo
);
if
(
copy_to_user
(
addr
,
&
drvinfo
,
sizeof
(
drvinfo
)))
return
-
EFAULT
;
return
0
;
}
#if defined(ETHTOOL_GREGS) && defined(ETHTOOL_GEEPROM)
case
ETHTOOL_GREGS
:
{
struct
ethtool_regs
regs
=
{
ETHTOOL_GREGS
};
uint8_t
regs_buff
[
IXGB_REG_DUMP_LEN
];
case
ETHTOOL_GREGS
:
{
struct
ethtool_regs
regs
=
{
ETHTOOL_GREGS
};
uint8_t
regs_buff
[
IXGB_REG_DUMP_LEN
];
ixgb_ethtool_gregs
(
adapter
,
&
regs
,
regs_buff
);
ixgb_ethtool_gregs
(
adapter
,
&
regs
,
regs_buff
);
if
(
copy_to_user
(
addr
,
&
regs
,
sizeof
(
regs
)))
return
-
EFAULT
;
if
(
copy_to_user
(
addr
,
&
regs
,
sizeof
(
regs
)))
return
-
EFAULT
;
addr
+=
offsetof
(
struct
ethtool_regs
,
data
);
addr
+=
offsetof
(
struct
ethtool_regs
,
data
);
if
(
copy_to_user
(
addr
,
regs_buff
,
regs
.
len
))
return
-
EFAULT
;
return
0
;
}
#endif
/* ETHTOOL_GREGS */
case
ETHTOOL_NWAY_RST
:
{
IXGB_DBG
(
"ETHTOOL_NWAY_RST
\n
"
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
copy_to_user
(
addr
,
regs_buff
,
regs
.
len
))
return
-
EFAULT
;
return
0
;
}
#endif
/* ETHTOOL_GREGS */
case
ETHTOOL_NWAY_RST
:
{
IXGB_DBG
(
"ETHTOOL_NWAY_RST
\n
"
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
ixgb_down
(
adapter
);
ixgb_up
(
adapter
);
ixgb_down
(
adapter
);
ixgb_up
(
adapter
);
return
0
;
}
return
0
;
}
#ifdef ETHTOOL_PHYS_ID
case
ETHTOOL_PHYS_ID
:
{
struct
ethtool_value
id
;
IXGB_DBG
(
"ETHTOOL_PHYS_ID
\n
"
);
if
(
copy_from_user
(
&
id
,
addr
,
sizeof
(
id
)))
return
-
EFAULT
;
return
ixgb_ethtool_led_blink
(
adapter
,
&
id
);
}
#endif
/* ETHTOOL_PHYS_ID */
case
ETHTOOL_GLINK
:
{
struct
ethtool_value
link
=
{
ETHTOOL_GLINK
};
IXGB_DBG
(
"ETHTOOL_GLINK
\n
"
);
link
.
data
=
netif_carrier_ok
(
netdev
);
if
(
copy_to_user
(
addr
,
&
link
,
sizeof
(
link
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_GEEPROM
:
{
struct
ethtool_eeprom
eeprom
=
{
ETHTOOL_GEEPROM
};
uint16_t
eeprom_buff
[
IXGB_EEPROM_SIZE
];
void
*
ptr
;
int
err
;
IXGB_DBG
(
"ETHTOOL_GEEPROM
\n
"
);
if
(
copy_from_user
(
&
eeprom
,
addr
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
if
((
err
=
ixgb_ethtool_geeprom
(
adapter
,
&
eeprom
,
eeprom_buff
))
<
0
)
return
err
;
if
(
copy_to_user
(
addr
,
&
eeprom
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
addr
+=
offsetof
(
struct
ethtool_eeprom
,
data
);
ptr
=
((
void
*
)
eeprom_buff
)
+
(
eeprom
.
offset
&
1
);
if
(
copy_to_user
(
addr
,
ptr
,
eeprom
.
len
))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_SEEPROM
:
{
struct
ethtool_eeprom
eeprom
;
IXGB_DBG
(
"ETHTOOL_SEEPROM
\n
"
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
copy_from_user
(
&
eeprom
,
addr
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
addr
+=
offsetof
(
struct
ethtool_eeprom
,
data
);
return
ixgb_ethtool_seeprom
(
adapter
,
&
eeprom
,
addr
);
}
default:
return
-
EOPNOTSUPP
;
}
case
ETHTOOL_PHYS_ID
:{
struct
ethtool_value
id
;
IXGB_DBG
(
"ETHTOOL_PHYS_ID
\n
"
);
if
(
copy_from_user
(
&
id
,
addr
,
sizeof
(
id
)))
return
-
EFAULT
;
return
ixgb_ethtool_led_blink
(
adapter
,
&
id
);
}
#endif
/* ETHTOOL_PHYS_ID */
case
ETHTOOL_GLINK
:{
struct
ethtool_value
link
=
{
ETHTOOL_GLINK
};
IXGB_DBG
(
"ETHTOOL_GLINK
\n
"
);
link
.
data
=
netif_carrier_ok
(
netdev
);
if
(
copy_to_user
(
addr
,
&
link
,
sizeof
(
link
)))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_GEEPROM
:{
struct
ethtool_eeprom
eeprom
=
{
ETHTOOL_GEEPROM
};
uint16_t
eeprom_buff
[
IXGB_EEPROM_SIZE
];
void
*
ptr
;
int
err
;
IXGB_DBG
(
"ETHTOOL_GEEPROM
\n
"
);
if
(
copy_from_user
(
&
eeprom
,
addr
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
if
((
err
=
ixgb_ethtool_geeprom
(
adapter
,
&
eeprom
,
eeprom_buff
))
<
0
)
return
err
;
if
(
copy_to_user
(
addr
,
&
eeprom
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
addr
+=
offsetof
(
struct
ethtool_eeprom
,
data
);
ptr
=
((
void
*
)
eeprom_buff
)
+
(
eeprom
.
offset
&
1
);
if
(
copy_to_user
(
addr
,
ptr
,
eeprom
.
len
))
return
-
EFAULT
;
return
0
;
}
case
ETHTOOL_SEEPROM
:{
struct
ethtool_eeprom
eeprom
;
IXGB_DBG
(
"ETHTOOL_SEEPROM
\n
"
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
copy_from_user
(
&
eeprom
,
addr
,
sizeof
(
eeprom
)))
return
-
EFAULT
;
addr
+=
offsetof
(
struct
ethtool_eeprom
,
data
);
return
ixgb_ethtool_seeprom
(
adapter
,
&
eeprom
,
addr
);
}
default:
return
-
EOPNOTSUPP
;
}
}
drivers/net/ixgb/ixgb_hw.c
View file @
ca247341
...
...
@@ -25,7 +25,6 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* ixgb_hw.c
* Shared functions for accessing and configuring the adapter
*/
...
...
@@ -35,52 +34,46 @@
/* Local function prototypes */
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
);
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
);
static
void
ixgb_get_bus_info
(
struct
ixgb_hw
*
hw
);
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
);
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
);
static
boolean_t
ixgb_link_reset
(
struct
ixgb_hw
*
hw
);
static
void
ixgb_optics_reset
(
struct
ixgb_hw
*
hw
);
uint32_t
ixgb_mac_reset
(
struct
ixgb_hw
*
hw
);
uint32_t
ixgb_mac_reset
(
struct
ixgb_hw
*
hw
);
uint32_t
ixgb_mac_reset
(
struct
ixgb_hw
*
hw
)
uint32_t
ixgb_mac_reset
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl_reg
;
/* Setup up hardware to known state with RESET. */
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
;
uint32_t
ctrl_reg
;
/* Setup up hardware to known state with RESET. */
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
outl
(
IXGB_CTRL0
,
hw
->
io_base
);
outl
(
ctrl_reg
,
hw
->
io_base
+
4
);
outl
(
IXGB_CTRL0
,
hw
->
io_base
);
outl
(
ctrl_reg
,
hw
->
io_base
+
4
);
#else
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl_reg
);
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl_reg
);
#endif
/* Delay a few ms just to allow the reset to complete */
msec_delay
(
IXGB_DELAY_AFTER_RESET
);
ctrl_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* Delay a few ms just to allow the reset to complete */
msec_delay
(
IXGB_DELAY_AFTER_RESET
);
ctrl_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
#if DBG
/* Make sure the self-clearing global reset bit did self clear */
ASSERT
(
!
(
ctrl_reg
&
IXGB_CTRL0_RST
));
/* Make sure the self-clearing global reset bit did self clear */
ASSERT
(
!
(
ctrl_reg
&
IXGB_CTRL0_RST
));
#endif
ixgb_optics_reset
(
hw
);
return
ctrl_reg
;
ixgb_optics_reset
(
hw
);
return
ctrl_reg
;
}
/******************************************************************************
...
...
@@ -89,55 +82,55 @@ 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
)
ixgb_adapter_stop
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl_reg
;
uint32_t
icr_reg
;
DEBUGFUNC
(
"ixgb_adapter_stop"
);
/* If we are stopped or resetting exit gracefully and wait to be
* started again before accessing the hardware.
*/
if
(
hw
->
adapter_stopped
)
{
DEBUGOUT
(
"Exiting because the adapter is already stopped!!!
\n
"
);
return
FALSE
;
}
/* Set the Adapter Stopped flag so other driver functions stop
* touching the Hardware.
*/
hw
->
adapter_stopped
=
TRUE
;
/* Clear interrupt mask to stop board from generating interrupts */
DEBUGOUT
(
"Masking off all interrupts
\n
"
);
IXGB_WRITE_REG
(
hw
,
IMC
,
0xFFFFFFFF
);
/* Disable the Transmit and Receive units. Then delay to allow
* any pending transactions to complete before we hit the MAC with
* the global reset.
*/
IXGB_WRITE_REG
(
hw
,
RCTL
,
IXGB_READ_REG
(
hw
,
RCTL
)
&
~
IXGB_RCTL_RXEN
);
IXGB_WRITE_REG
(
hw
,
TCTL
,
IXGB_READ_REG
(
hw
,
TCTL
)
&
~
IXGB_TCTL_TXEN
);
msec_delay
(
IXGB_DELAY_BEFORE_RESET
);
/* Issue a global reset to the MAC. This will reset the chip's
* transmit, receive, DMA, and link units. It will not effect
* the current PCI configuration. The global reset bit is self-
* clearing, and should clear within a microsecond.
*/
DEBUGOUT
(
"Issuing a global reset to MAC
\n
"
);
ctrl_reg
=
ixgb_mac_reset
(
hw
);
/* Clear interrupt mask to stop board from generating interrupts */
DEBUGOUT
(
"Masking off all interrupts
\n
"
);
IXGB_WRITE_REG
(
hw
,
IMC
,
0xffffffff
);
/* Clear any pending interrupt events. */
icr_reg
=
IXGB_READ_REG
(
hw
,
ICR
);
return
(
ctrl_reg
&
IXGB_CTRL0_RST
);
uint32_t
ctrl_reg
;
uint32_t
icr_reg
;
DEBUGFUNC
(
"ixgb_adapter_stop"
);
/* If we are stopped or resetting exit gracefully and wait to be
* started again before accessing the hardware.
*/
if
(
hw
->
adapter_stopped
)
{
DEBUGOUT
(
"Exiting because the adapter is already stopped!!!
\n
"
);
return
FALSE
;
}
/* Set the Adapter Stopped flag so other driver functions stop
* touching the Hardware.
*/
hw
->
adapter_stopped
=
TRUE
;
/* Clear interrupt mask to stop board from generating interrupts */
DEBUGOUT
(
"Masking off all interrupts
\n
"
);
IXGB_WRITE_REG
(
hw
,
IMC
,
0xFFFFFFFF
);
/* Disable the Transmit and Receive units. Then delay to allow
* any pending transactions to complete before we hit the MAC with
* the global reset.
*/
IXGB_WRITE_REG
(
hw
,
RCTL
,
IXGB_READ_REG
(
hw
,
RCTL
)
&
~
IXGB_RCTL_RXEN
);
IXGB_WRITE_REG
(
hw
,
TCTL
,
IXGB_READ_REG
(
hw
,
TCTL
)
&
~
IXGB_TCTL_TXEN
);
msec_delay
(
IXGB_DELAY_BEFORE_RESET
);
/* Issue a global reset to the MAC. This will reset the chip's
* transmit, receive, DMA, and link units. It will not effect
* the current PCI configuration. The global reset bit is self-
* clearing, and should clear within a microsecond.
*/
DEBUGOUT
(
"Issuing a global reset to MAC
\n
"
);
ctrl_reg
=
ixgb_mac_reset
(
hw
);
/* Clear interrupt mask to stop board from generating interrupts */
DEBUGOUT
(
"Masking off all interrupts
\n
"
);
IXGB_WRITE_REG
(
hw
,
IMC
,
0xffffffff
);
/* Clear any pending interrupt events. */
icr_reg
=
IXGB_READ_REG
(
hw
,
ICR
);
return
(
ctrl_reg
&
IXGB_CTRL0_RST
);
}
/******************************************************************************
...
...
@@ -158,77 +151,76 @@ ixgb_adapter_stop(struct ixgb_hw *hw)
* FALSE if unrecoverable problems were encountered.
*****************************************************************************/
boolean_t
ixgb_init_hw
(
struct
ixgb_hw
*
hw
)
ixgb_init_hw
(
struct
ixgb_hw
*
hw
)
{
uint32_t
i
;
uint32_t
ctrl_reg
;
boolean_t
status
;
uint32_t
i
;
uint32_t
ctrl_reg
;
boolean_t
status
;
DEBUGFUNC
(
"ixgb_init_hw"
);
DEBUGFUNC
(
"ixgb_init_hw"
);
/* Issue a global reset to the MAC. This will reset the chip's
* transmit, receive, DMA, and link units. It will not effect
* the current PCI configuration. The global reset bit is self-
* clearing, and should clear within a microsecond.
*/
DEBUGOUT
(
"Issuing a global reset to MAC
\n
"
);
/* Issue a global reset to the MAC. This will reset the chip's
* transmit, receive, DMA, and link units. It will not effect
* the current PCI configuration. The global reset bit is self-
* clearing, and should clear within a microsecond.
*/
DEBUGOUT
(
"Issuing a global reset to MAC
\n
"
);
ctrl_reg
=
ixgb_mac_reset
(
hw
);
ctrl_reg
=
ixgb_mac_reset
(
hw
);
DEBUGOUT
(
"Issuing an EE reset to MAC
\n
"
);
DEBUGOUT
(
"Issuing an EE reset to MAC
\n
"
);
#ifdef HP_ZX1
outl
(
IXGB_CTRL1
,
hw
->
io_base
);
outl
(
IXGB_CTRL1_EE_RST
,
hw
->
io_base
+
4
);
outl
(
IXGB_CTRL1
,
hw
->
io_base
);
outl
(
IXGB_CTRL1_EE_RST
,
hw
->
io_base
+
4
);
#else
IXGB_WRITE_REG
(
hw
,
CTRL1
,
IXGB_CTRL1_EE_RST
);
IXGB_WRITE_REG
(
hw
,
CTRL1
,
IXGB_CTRL1_EE_RST
);
#endif
/* Delay a few ms just to allow the reset to complete */
msec_delay
(
IXGB_DELAY_AFTER_EE_RESET
);
/* Delay a few ms just to allow the reset to complete */
msec_delay
(
IXGB_DELAY_AFTER_EE_RESET
);
if
(
ixgb_get_eeprom_data
(
hw
)
==
FALSE
)
{
return
(
FALSE
);
}
if
(
ixgb_get_eeprom_data
(
hw
)
==
FALSE
)
{
return
(
FALSE
);
}
/* Setup the receive addresses.
* Receive Address Registers (RARs 0 - 15).
*/
ixgb_init_rx_addrs
(
hw
);
/* Setup the receive addresses.
* Receive Address Registers (RARs 0 - 15).
*/
ixgb_init_rx_addrs
(
hw
);
/*
* Check that a valid MAC address has been set.
* If it is not valid, we fail hardware init.
*/
if
(
!
mac_addr_valid
(
hw
->
curr_mac_addr
))
{
DEBUGOUT
(
"MAC address invalid after ixgb_init_rx_addrs
\n
"
);
return
(
FALSE
);
}
/*
* Check that a valid MAC address has been set.
* If it is not valid, we fail hardware init.
*/
if
(
!
mac_addr_valid
(
hw
->
curr_mac_addr
))
{
DEBUGOUT
(
"MAC address invalid after ixgb_init_rx_addrs
\n
"
);
return
(
FALSE
);
}
/* tell the routines in this file they can access hardware again */
hw
->
adapter_stopped
=
FALSE
;
/* tell the routines in this file they can access hardware again
*/
hw
->
adapter_stopped
=
FALSE
;
/* Fill in the bus_info structure
*/
ixgb_get_bus_info
(
hw
)
;
/* Fill in the bus_info structure */
ixgb_get_bus_info
(
hw
);
/* Zero out the Multicast HASH table */
DEBUGOUT
(
"Zeroing the MTA
\n
"
);
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
/* Zero out the Multicast HASH table */
DEBUGOUT
(
"Zeroing the MTA
\n
"
);
for
(
i
=
0
;
i
<
IXGB_MC_TBL_SIZE
;
i
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
/* Zero out the VLAN Filter Table Array */
ixgb_clear_vfta
(
hw
);
/* Zero out the VLAN Filter Table Array */
ixgb_clear_vfta
(
hw
);
/* Zero all of the hardware counters */
ixgb_clear_hw_cntrs
(
hw
);
/* Zero all of the hardware counters */
ixgb_clear_hw_cntrs
(
hw
);
/* Call a subroutine to setup flow control. */
status
=
ixgb_setup_fc
(
hw
);
/* Call a subroutine to setup flow control. */
status
=
ixgb_setup_fc
(
hw
);
/* check-for-link in case lane deskew is locked */
ixgb_check_for_link
(
hw
);
/* check-for-link in case lane deskew is locked */
ixgb_check_for_link
(
hw
);
return
(
status
);
return
(
status
);
}
/******************************************************************************
...
...
@@ -243,53 +235,48 @@ ixgb_init_hw(struct ixgb_hw *hw)
void
ixgb_init_rx_addrs
(
struct
ixgb_hw
*
hw
)
{
uint32_t
i
;
DEBUGFUNC
(
"ixgb_init_rx_addrs"
);
/*
* If the current mac address is valid, assume it is a software override
* to the permanent address.
* Otherwise, use the permanent address from the eeprom.
*/
if
(
!
mac_addr_valid
(
hw
->
curr_mac_addr
))
{
/* Get the MAC address from the eeprom for later reference */
ixgb_get_ee_mac_addr
(
hw
,
hw
->
curr_mac_addr
);
DEBUGOUT3
(
" Keeping Permanent MAC Addr =%.2X %.2X %.2X "
,
hw
->
curr_mac_addr
[
0
],
hw
->
curr_mac_addr
[
1
],
hw
->
curr_mac_addr
[
2
]);
DEBUGOUT3
(
"%.2X %.2X %.2X
\n
"
,
hw
->
curr_mac_addr
[
3
],
hw
->
curr_mac_addr
[
4
],
hw
->
curr_mac_addr
[
5
]);
}
else
{
/* Setup the receive address. */
DEBUGOUT
(
"Overriding MAC Address in RAR[0]
\n
"
);
DEBUGOUT3
(
" New MAC Addr =%.2X %.2X %.2X "
,
hw
->
curr_mac_addr
[
0
],
hw
->
curr_mac_addr
[
1
],
hw
->
curr_mac_addr
[
2
]);
DEBUGOUT3
(
"%.2X %.2X %.2X
\n
"
,
hw
->
curr_mac_addr
[
3
],
hw
->
curr_mac_addr
[
4
],
hw
->
curr_mac_addr
[
5
]);
ixgb_rar_set
(
hw
,
hw
->
curr_mac_addr
,
0
);
}
/* Zero out the other 15 receive addresses. */
DEBUGOUT
(
"Clearing RAR[1-15]
\n
"
);
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
);
}
return
;
uint32_t
i
;
DEBUGFUNC
(
"ixgb_init_rx_addrs"
);
/*
* If the current mac address is valid, assume it is a software override
* to the permanent address.
* Otherwise, use the permanent address from the eeprom.
*/
if
(
!
mac_addr_valid
(
hw
->
curr_mac_addr
))
{
/* Get the MAC address from the eeprom for later reference */
ixgb_get_ee_mac_addr
(
hw
,
hw
->
curr_mac_addr
);
DEBUGOUT3
(
" Keeping Permanent MAC Addr =%.2X %.2X %.2X "
,
hw
->
curr_mac_addr
[
0
],
hw
->
curr_mac_addr
[
1
],
hw
->
curr_mac_addr
[
2
]);
DEBUGOUT3
(
"%.2X %.2X %.2X
\n
"
,
hw
->
curr_mac_addr
[
3
],
hw
->
curr_mac_addr
[
4
],
hw
->
curr_mac_addr
[
5
]);
}
else
{
/* Setup the receive address. */
DEBUGOUT
(
"Overriding MAC Address in RAR[0]
\n
"
);
DEBUGOUT3
(
" New MAC Addr =%.2X %.2X %.2X "
,
hw
->
curr_mac_addr
[
0
],
hw
->
curr_mac_addr
[
1
],
hw
->
curr_mac_addr
[
2
]);
DEBUGOUT3
(
"%.2X %.2X %.2X
\n
"
,
hw
->
curr_mac_addr
[
3
],
hw
->
curr_mac_addr
[
4
],
hw
->
curr_mac_addr
[
5
]);
ixgb_rar_set
(
hw
,
hw
->
curr_mac_addr
,
0
);
}
/* Zero out the other 15 receive addresses. */
DEBUGOUT
(
"Clearing RAR[1-15]
\n
"
);
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
);
}
return
;
}
/******************************************************************************
...
...
@@ -307,65 +294,72 @@ 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 */
DEBUGFUNC
(
"ixgb_mc_addr_list_update"
);
/* Set the new number of MC addresses that we are being requested to use. */
hw
->
num_mc_addrs
=
mc_addr_count
;
/* Clear RAR[1-15] */
DEBUGOUT
(
" Clearing RAR[1-15]
\n
"
);
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
++
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
}
/* Add the new addresses */
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
)],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
1
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
2
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
3
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
4
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
5
]);
/* Place this multicast address in the RAR if there is room, *
* else put it in the MTA
*/
if
(
rar_used_count
<
IXGB_RAR_ENTRIES
)
{
ixgb_rar_set
(
hw
,
mc_addr_list
+
(
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)),
rar_used_count
);
DEBUGOUT1
(
"Added a multicast address to RAR[%d]
\n
"
,
i
);
rar_used_count
++
;
}
else
{
hash_value
=
ixgb_hash_mc_addr
(
hw
,
mc_addr_list
+
(
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)));
DEBUGOUT1
(
" Hash value = 0x%03X
\n
"
,
hash_value
);
ixgb_mta_set
(
hw
,
hash_value
);
}
}
DEBUGOUT
(
"MC Update Complete
\n
"
);
return
;
uint32_t
hash_value
;
uint32_t
i
;
uint32_t
rar_used_count
=
1
;
/* RAR[0] is used for our MAC address */
DEBUGFUNC
(
"ixgb_mc_addr_list_update"
);
/* Set the new number of MC addresses that we are being requested to use. */
hw
->
num_mc_addrs
=
mc_addr_count
;
/* Clear RAR[1-15] */
DEBUGOUT
(
" Clearing RAR[1-15]
\n
"
);
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
++
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
i
,
0
);
}
/* Add the new addresses */
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
)],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
1
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
2
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
3
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
4
],
mc_addr_list
[
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)
+
5
]);
/* Place this multicast address in the RAR if there is room, *
* else put it in the MTA
*/
if
(
rar_used_count
<
IXGB_RAR_ENTRIES
)
{
ixgb_rar_set
(
hw
,
mc_addr_list
+
(
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)),
rar_used_count
);
DEBUGOUT1
(
"Added a multicast address to RAR[%d]
\n
"
,
i
);
rar_used_count
++
;
}
else
{
hash_value
=
ixgb_hash_mc_addr
(
hw
,
mc_addr_list
+
(
i
*
(
IXGB_ETH_LENGTH_OF_ADDRESS
+
pad
)));
DEBUGOUT1
(
" Hash value = 0x%03X
\n
"
,
hash_value
);
ixgb_mta_set
(
hw
,
hash_value
);
}
}
DEBUGOUT
(
"MC Update Complete
\n
"
);
return
;
}
/******************************************************************************
...
...
@@ -378,42 +372,44 @@ ixgb_mc_addr_list_update(struct ixgb_hw *hw,
* The hash value
*****************************************************************************/
static
uint32_t
ixgb_hash_mc_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr
)
ixgb_hash_mc_addr
(
struct
ixgb_hw
*
hw
,
uint8_t
*
mc_addr
)
{
uint32_t
hash_value
=
0
;
DEBUGFUNC
(
"ixgb_hash_mc_addr"
);
/* The portion of the address that is used for the hash table is
* determined by the mc_filter_type setting.
*/
switch
(
hw
->
mc_filter_type
)
{
/* [0] [1] [2] [3] [4] [5]
* 01 AA 00 12 34 56
* LSB MSB - According to H/W docs */
case
0
:
/* [47:36] i.e. 0x563 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
4
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
4
));
break
;
case
1
:
/* [46:35] i.e. 0xAC6 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
3
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
5
));
break
;
case
2
:
/* [45:34] i.e. 0x5D8 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
2
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
6
));
break
;
case
3
:
/* [43:32] i.e. 0x634 for above example address */
hash_value
=
((
mc_addr
[
4
])
|
(((
uint16_t
)
mc_addr
[
5
])
<<
8
));
break
;
default:
/* Invalid mc_filter_type, what should we do? */
DEBUGOUT
(
"MC filter type param set incorrectly
\n
"
);
ASSERT
(
0
);
break
;
}
hash_value
&=
0xFFF
;
return
(
hash_value
);
uint32_t
hash_value
=
0
;
DEBUGFUNC
(
"ixgb_hash_mc_addr"
);
/* The portion of the address that is used for the hash table is
* determined by the mc_filter_type setting.
*/
switch
(
hw
->
mc_filter_type
)
{
/* [0] [1] [2] [3] [4] [5]
* 01 AA 00 12 34 56
* LSB MSB - According to H/W docs */
case
0
:
/* [47:36] i.e. 0x563 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
4
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
4
));
break
;
case
1
:
/* [46:35] i.e. 0xAC6 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
3
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
5
));
break
;
case
2
:
/* [45:34] i.e. 0x5D8 for above example address */
hash_value
=
((
mc_addr
[
4
]
>>
2
)
|
(((
uint16_t
)
mc_addr
[
5
])
<<
6
));
break
;
case
3
:
/* [43:32] i.e. 0x634 for above example address */
hash_value
=
((
mc_addr
[
4
])
|
(((
uint16_t
)
mc_addr
[
5
])
<<
8
));
break
;
default:
/* Invalid mc_filter_type, what should we do? */
DEBUGOUT
(
"MC filter type param set incorrectly
\n
"
);
ASSERT
(
0
);
break
;
}
hash_value
&=
0xFFF
;
return
(
hash_value
);
}
/******************************************************************************
...
...
@@ -423,30 +419,29 @@ ixgb_hash_mc_addr(struct ixgb_hw *hw,
* hash_value - Multicast address hash value
*****************************************************************************/
static
void
ixgb_mta_set
(
struct
ixgb_hw
*
hw
,
uint32_t
hash_value
)
ixgb_mta_set
(
struct
ixgb_hw
*
hw
,
uint32_t
hash_value
)
{
uint32_t
hash_bit
,
hash_reg
;
uint32_t
mta_reg
;
/* The MTA is a register array of 128 32-bit registers.
* It is treated like an array of 4096 bits. We want to set
* bit BitArray[hash_value]. So we figure out what register
* the bit is in, read it, OR in the new bit, then write
* back the new value. The register is determined by the
* upper 7 bits of the hash value and the bit within that
* register are determined by the lower 5 bits of the value.
*/
hash_reg
=
(
hash_value
>>
5
)
&
0x7F
;
hash_bit
=
hash_value
&
0x1F
;
uint32_t
hash_bit
,
hash_reg
;
uint32_t
mta_reg
;
/* The MTA is a register array of 128 32-bit registers.
* It is treated like an array of 4096 bits. We want to set
* bit BitArray[hash_value]. So we figure out what register
* the bit is in, read it, OR in the new bit, then write
* back the new value. The register is determined by the
* upper 7 bits of the hash value and the bit within that
* register are determined by the lower 5 bits of the value.
*/
hash_reg
=
(
hash_value
>>
5
)
&
0x7F
;
hash_bit
=
hash_value
&
0x1F
;
mta_reg
=
IXGB_READ_REG_ARRAY
(
hw
,
MTA
,
hash_reg
);
mta_reg
=
IXGB_READ_REG_ARRAY
(
hw
,
MTA
,
hash_reg
);
mta_reg
|=
(
1
<<
hash_bit
);
mta_reg
|=
(
1
<<
hash_bit
);
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
hash_reg
,
mta_reg
);
IXGB_WRITE_REG_ARRAY
(
hw
,
MTA
,
hash_reg
,
mta_reg
);
return
;
return
;
}
/******************************************************************************
...
...
@@ -457,29 +452,25 @@ ixgb_mta_set(struct ixgb_hw *hw,
* index - Receive address register to write
*****************************************************************************/
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
)
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
)
{
uint32_t
rar_low
,
rar_high
;
uint32_t
rar_low
,
rar_high
;
DEBUGFUNC
(
"ixgb_rar_set"
);
DEBUGFUNC
(
"ixgb_rar_set"
);
/* HW expects these in little endian so we reverse the byte order
* 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
));
/* HW expects these in little endian so we reverse the byte order
* 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
));
rar_high
=
((
uint32_t
)
addr
[
4
]
|
((
uint32_t
)
addr
[
5
]
<<
8
)
|
IXGB_RAH_AV
);
rar_high
=
((
uint32_t
)
addr
[
4
]
|
((
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
);
return
;
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
(
index
<<
1
),
rar_low
);
IXGB_WRITE_REG_ARRAY
(
hw
,
RA
,
((
index
<<
1
)
+
1
),
rar_high
);
return
;
}
/******************************************************************************
...
...
@@ -490,12 +481,10 @@ ixgb_rar_set(struct ixgb_hw *hw,
* value - Value to write into VLAN filter table
*****************************************************************************/
void
ixgb_write_vfta
(
struct
ixgb_hw
*
hw
,
uint32_t
offset
,
uint32_t
value
)
ixgb_write_vfta
(
struct
ixgb_hw
*
hw
,
uint32_t
offset
,
uint32_t
value
)
{
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
value
);
return
;
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
value
);
return
;
}
/******************************************************************************
...
...
@@ -506,11 +495,11 @@ ixgb_write_vfta(struct ixgb_hw *hw,
void
ixgb_clear_vfta
(
struct
ixgb_hw
*
hw
)
{
uint32_t
offset
;
uint32_t
offset
;
for
(
offset
=
0
;
offset
<
IXGB_VLAN_FILTER_TBL_SIZE
;
offset
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
0
);
return
;
for
(
offset
=
0
;
offset
<
IXGB_VLAN_FILTER_TBL_SIZE
;
offset
++
)
IXGB_WRITE_REG_ARRAY
(
hw
,
VFTA
,
offset
,
0
);
return
;
}
/******************************************************************************
...
...
@@ -518,90 +507,90 @@ ixgb_clear_vfta(struct ixgb_hw *hw)
*
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
boolean_t
ixgb_setup_fc
(
struct
ixgb_hw
*
hw
)
ixgb_setup_fc
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl_reg
;
uint32_t
pap_reg
=
0
;
/* by default, assume no pause time */
boolean_t
status
=
TRUE
;
DEBUGFUNC
(
"ixgb_setup_fc"
);
/* Get the current control reg 0 settings */
ctrl_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* Clear the Receive Pause Enable and Transmit Pause Enable bits */
ctrl_reg
&=
~
(
IXGB_CTRL0_RPE
|
IXGB_CTRL0_TPE
);
/* The possible values of the "flow_control" parameter are:
* 0: Flow control is completely disabled
* 1: Rx flow control is enabled (we can receive pause frames
* but not send pause frames).
* 2: Tx flow control is enabled (we can send pause frames
* but we do not support receiving pause frames).
* 3: Both Rx and TX flow control (symmetric) are enabled.
* other: Invalid.
*/
switch
(
hw
->
fc
.
type
)
{
case
ixgb_fc_none
:
/* 0 */
break
;
case
ixgb_fc_rx_pause
:
/* 1 */
/* RX Flow control is enabled, and TX Flow control is
* disabled.
*/
ctrl_reg
|=
(
IXGB_CTRL0_RPE
);
break
;
case
ixgb_fc_tx_pause
:
/* 2 */
/* TX Flow control is enabled, and RX Flow control is
* disabled, by a software over-ride.
*/
ctrl_reg
|=
(
IXGB_CTRL0_TPE
);
pap_reg
=
hw
->
fc
.
pause_time
;
break
;
case
ixgb_fc_full
:
/* 3 */
/* Flow control (both RX and TX) is enabled by a software
* over-ride.
*/
ctrl_reg
|=
(
IXGB_CTRL0_RPE
|
IXGB_CTRL0_TPE
);
pap_reg
=
hw
->
fc
.
pause_time
;
break
;
default:
/* We should never get here. The value should be 0-3. */
DEBUGOUT
(
"Flow control param set incorrectly
\n
"
);
ASSERT
(
0
);
break
;
}
/* Write the new settings */
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl_reg
);
if
(
pap_reg
!=
0
)
{
IXGB_WRITE_REG
(
hw
,
PAP
,
pap_reg
);
}
/* Set the flow control receive threshold registers. Normally,
* these registers will be set to a default threshold that may be
* adjusted later by the driver's runtime code. However, if the
* ability to transmit pause frames in not enabled, then these
* registers will be set to 0.
*/
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
)
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
(
hw
->
fc
.
low_water
|
IXGB_FCRTL_XONE
));
}
else
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
hw
->
fc
.
low_water
);
}
IXGB_WRITE_REG
(
hw
,
FCRTH
,
hw
->
fc
.
high_water
);
}
return
(
status
);
uint32_t
ctrl_reg
;
uint32_t
pap_reg
=
0
;
/* by default, assume no pause time */
boolean_t
status
=
TRUE
;
DEBUGFUNC
(
"ixgb_setup_fc"
);
/* Get the current control reg 0 settings */
ctrl_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* Clear the Receive Pause Enable and Transmit Pause Enable bits */
ctrl_reg
&=
~
(
IXGB_CTRL0_RPE
|
IXGB_CTRL0_TPE
);
/* The possible values of the "flow_control" parameter are:
* 0: Flow control is completely disabled
* 1: Rx flow control is enabled (we can receive pause frames
* but not send pause frames).
* 2: Tx flow control is enabled (we can send pause frames
* but we do not support receiving pause frames).
* 3: Both Rx and TX flow control (symmetric) are enabled.
* other: Invalid.
*/
switch
(
hw
->
fc
.
type
)
{
case
ixgb_fc_none
:
/* 0 */
break
;
case
ixgb_fc_rx_pause
:
/* 1 */
/* RX Flow control is enabled, and TX Flow control is
* disabled.
*/
ctrl_reg
|=
(
IXGB_CTRL0_RPE
);
break
;
case
ixgb_fc_tx_pause
:
/* 2 */
/* TX Flow control is enabled, and RX Flow control is
* disabled, by a software over-ride.
*/
ctrl_reg
|=
(
IXGB_CTRL0_TPE
);
pap_reg
=
hw
->
fc
.
pause_time
;
break
;
case
ixgb_fc_full
:
/* 3 */
/* Flow control (both RX and TX) is enabled by a software
* over-ride.
*/
ctrl_reg
|=
(
IXGB_CTRL0_RPE
|
IXGB_CTRL0_TPE
);
pap_reg
=
hw
->
fc
.
pause_time
;
break
;
default:
/* We should never get here. The value should be 0-3. */
DEBUGOUT
(
"Flow control param set incorrectly
\n
"
);
ASSERT
(
0
);
break
;
}
/* Write the new settings */
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl_reg
);
if
(
pap_reg
!=
0
)
{
IXGB_WRITE_REG
(
hw
,
PAP
,
pap_reg
);
}
/* Set the flow control receive threshold registers. Normally,
* these registers will be set to a default threshold that may be
* adjusted later by the driver's runtime code. However, if the
* ability to transmit pause frames in not enabled, then these
* registers will be set to 0.
*/
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
)
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
(
hw
->
fc
.
low_water
|
IXGB_FCRTL_XONE
));
}
else
{
IXGB_WRITE_REG
(
hw
,
FCRTL
,
hw
->
fc
.
low_water
);
}
IXGB_WRITE_REG
(
hw
,
FCRTH
,
hw
->
fc
.
high_water
);
}
return
(
status
);
}
/******************************************************************************
...
...
@@ -619,26 +608,25 @@ 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
;
uint32_t
command
=
0
;
uint32_t
i
;
uint32_t
data
;
uint32_t
command
=
0
;
ASSERT
(
reg_address
<=
IXGB_MAX_PHY_REG_ADDRESS
);
ASSERT
(
phy_address
<=
IXGB_MAX_PHY_ADDRESS
);
ASSERT
(
device_type
<=
IXGB_MAX_PHY_DEV_TYPE
);
ASSERT
(
reg_address
<=
IXGB_MAX_PHY_REG_ADDRESS
);
ASSERT
(
phy_address
<=
IXGB_MAX_PHY_ADDRESS
);
ASSERT
(
device_type
<=
IXGB_MAX_PHY_DEV_TYPE
);
/* 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
));
/* 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
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the address cycle completed
...
...
@@ -647,25 +635,24 @@ ixgb_read_phy_reg(struct ixgb_hw *hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
/* Address cycle complete, setup and write the read 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_READ
|
IXGB_MSCA_MDI_COMMAND
));
/* Address cycle complete, setup and write the read 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_READ
|
IXGB_MSCA_MDI_COMMAND
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the read command completed
...
...
@@ -674,24 +661,23 @@ ixgb_read_phy_reg(struct ixgb_hw *hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
/* Operation is complete, get the data from the MDIO Read/Write Data
* register and return.
*/
data
=
IXGB_READ_REG
(
hw
,
MSRWD
);
data
>>=
IXGB_MSRWD_READ_DATA_SHIFT
;
return
((
uint16_t
)
data
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
/* Operation is complete, get the data from the MDIO Read/Write Data
* register and return.
*/
data
=
IXGB_READ_REG
(
hw
,
MSRWD
);
data
>>=
IXGB_MSRWD_READ_DATA_SHIFT
;
return
((
uint16_t
)
data
);
}
/******************************************************************************
...
...
@@ -712,28 +698,26 @@ 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
;
uint32_t
i
;
uint32_t
command
=
0
;
ASSERT
(
reg_address
<=
IXGB_MAX_PHY_REG_ADDRESS
);
ASSERT
(
phy_address
<=
IXGB_MAX_PHY_ADDRESS
);
ASSERT
(
device_type
<=
IXGB_MAX_PHY_DEV_TYPE
);
ASSERT
(
reg_address
<=
IXGB_MAX_PHY_REG_ADDRESS
);
ASSERT
(
phy_address
<=
IXGB_MAX_PHY_ADDRESS
);
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
);
/* Put the data in the MDIO Read/Write Data register */
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
));
/* 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
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the address cycle completed
...
...
@@ -742,25 +726,24 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
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
));
/* 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
));
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
IXGB_WRITE_REG
(
hw
,
MSCA
,
command
);
/**************************************************************
** Check every 10 usec to see if the read command completed
...
...
@@ -769,22 +752,20 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
** from the CPU Write to the Ready bit assertion.
**************************************************************/
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
usec_delay
(
10
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
command
=
IXGB_READ_REG
(
hw
,
MSCA
);
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
if
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
)
break
;
}
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
ASSERT
((
command
&
IXGB_MSCA_MDI_COMMAND
)
==
0
);
/* Operation is complete, return. */
/* Operation is complete, return. */
}
/******************************************************************************
* Checks to see if the link status of the hardware has changed.
*
...
...
@@ -795,47 +776,49 @@ ixgb_write_phy_reg(struct ixgb_hw *hw,
void
ixgb_check_for_link
(
struct
ixgb_hw
*
hw
)
{
uint32_t
status_reg
;
uint32_t
xpcss_reg
;
DEBUGFUNC
(
"ixgb_check_for_link"
);
xpcss_reg
=
IXGB_READ_REG
(
hw
,
XPCSS
);
status_reg
=
IXGB_READ_REG
(
hw
,
STATUS
);
if
((
xpcss_reg
&
IXGB_XPCSS_ALIGN_STATUS
)
&&
(
status_reg
&
IXGB_STATUS_LU
))
{
hw
->
link_up
=
TRUE
;
}
else
if
(
!
(
xpcss_reg
&
IXGB_XPCSS_ALIGN_STATUS
)
&&
(
status_reg
&
IXGB_STATUS_LU
))
{
DEBUGOUT
(
"XPCSS Not Aligned while Status:LU is set.
\n
"
);
hw
->
link_up
=
ixgb_link_reset
(
hw
);
}
else
{
hw
->
link_up
=
ixgb_link_reset
(
hw
);
}
/* Anything else for 10 Gig?? */
uint32_t
status_reg
;
uint32_t
xpcss_reg
;
DEBUGFUNC
(
"ixgb_check_for_link"
);
xpcss_reg
=
IXGB_READ_REG
(
hw
,
XPCSS
);
status_reg
=
IXGB_READ_REG
(
hw
,
STATUS
);
if
((
xpcss_reg
&
IXGB_XPCSS_ALIGN_STATUS
)
&&
(
status_reg
&
IXGB_STATUS_LU
))
{
hw
->
link_up
=
TRUE
;
}
else
if
(
!
(
xpcss_reg
&
IXGB_XPCSS_ALIGN_STATUS
)
&&
(
status_reg
&
IXGB_STATUS_LU
))
{
DEBUGOUT
(
"XPCSS Not Aligned while Status:LU is set.
\n
"
);
hw
->
link_up
=
ixgb_link_reset
(
hw
);
}
else
{
hw
->
link_up
=
ixgb_link_reset
(
hw
);
}
/* Anything else for 10 Gig?? */
}
boolean_t
ixgb_check_for_bad_link
(
struct
ixgb_hw
*
hw
)
boolean_t
ixgb_check_for_bad_link
(
struct
ixgb_hw
*
hw
)
{
uint32_t
newLFC
,
newRFC
;
boolean_t
bad_link_returncode
=
FALSE
;
/* check for a bad reset that may have occured
uint32_t
newLFC
,
newRFC
;
boolean_t
bad_link_returncode
=
FALSE
;
/* check for a bad reset that may have occured
* the indication is that the RFC / LFC registers may be incrementing
* continually. Do a full adapter reset to recover
*/
newLFC
=
IXGB_READ_REG
(
hw
,
LFC
);
newRFC
=
IXGB_READ_REG
(
hw
,
RFC
);
if
((
hw
->
lastLFC
+
250
<
newLFC
)
||
(
hw
->
lastRFC
+
250
<
newRFC
))
{
DEBUGOUT
(
"BAD LINK! too many LFC/RFC since last check
\n
"
);
bad_link_returncode
=
TRUE
;
}
hw
->
lastLFC
=
newLFC
;
hw
->
lastRFC
=
newRFC
;
return
bad_link_returncode
;
newLFC
=
IXGB_READ_REG
(
hw
,
LFC
);
newRFC
=
IXGB_READ_REG
(
hw
,
RFC
);
if
((
hw
->
lastLFC
+
250
<
newLFC
)
||
(
hw
->
lastRFC
+
250
<
newRFC
))
{
DEBUGOUT
(
"BAD LINK! too many LFC/RFC since last check
\n
"
);
bad_link_returncode
=
TRUE
;
}
hw
->
lastLFC
=
newLFC
;
hw
->
lastRFC
=
newRFC
;
return
bad_link_returncode
;
}
/******************************************************************************
* Clears all hardware statistics counters.
*
...
...
@@ -844,80 +827,79 @@ boolean_t ixgb_check_for_bad_link(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
)
{
DEBUGOUT
(
"Exiting because the adapter is stopped!!!
\n
"
);
return
;
}
temp_reg
=
IXGB_READ_REG
(
hw
,
TPRL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPRH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GORCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GORCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TORL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TORH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RNBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RUC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ROC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RLEC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
CRCERRS
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ICBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ECBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPTL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPTH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GOTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GOTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TOTL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TOTH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
DC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PLT64C
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TSCTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TSCTFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
IBIC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
LFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PFRC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PFTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MCFRC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MCFTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XONRXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XONTXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XOFFRXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XOFFTXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RJC
);
return
;
volatile
uint32_t
temp_reg
;
DEBUGFUNC
(
"ixgb_clear_hw_cntrs"
);
/* if we are stopped or resetting exit gracefully */
if
(
hw
->
adapter_stopped
)
{
DEBUGOUT
(
"Exiting because the adapter is stopped!!!
\n
"
);
return
;
}
temp_reg
=
IXGB_READ_REG
(
hw
,
TPRL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPRH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPRCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPRCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GORCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GORCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TORL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TORH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RNBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RUC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ROC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RLEC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
CRCERRS
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ICBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
ECBC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPTL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TPTH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
BPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
UPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
VPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
JPTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GOTCL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
GOTCH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TOTL
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TOTH
);
temp_reg
=
IXGB_READ_REG
(
hw
,
DC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PLT64C
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TSCTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
TSCTFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
IBIC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
LFC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PFRC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
PFTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MCFRC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
MCFTC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XONRXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XONTXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XOFFRXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
XOFFTXC
);
temp_reg
=
IXGB_READ_REG
(
hw
,
RJC
);
return
;
}
/******************************************************************************
* Turns on the software controllable LED
*
...
...
@@ -926,12 +908,12 @@ ixgb_clear_hw_cntrs(struct ixgb_hw *hw)
void
ixgb_led_on
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* To turn on the LED, clear software-definable pin 0 (SDP0). */
ctrl0_reg
&=
~
IXGB_CTRL0_SDP0
;
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl0_reg
);
return
;
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* To turn on the LED, clear software-definable pin 0 (SDP0). */
ctrl0_reg
&=
~
IXGB_CTRL0_SDP0
;
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl0_reg
);
return
;
}
/******************************************************************************
...
...
@@ -942,14 +924,13 @@ ixgb_led_on(struct ixgb_hw *hw)
void
ixgb_led_off
(
struct
ixgb_hw
*
hw
)
{
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* To turn off the LED, set software-definable pin 0 (SDP0). */
ctrl0_reg
|=
IXGB_CTRL0_SDP0
;
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl0_reg
);
return
;
}
uint32_t
ctrl0_reg
=
IXGB_READ_REG
(
hw
,
CTRL0
);
/* To turn off the LED, set software-definable pin 0 (SDP0). */
ctrl0_reg
|=
IXGB_CTRL0_SDP0
;
IXGB_WRITE_REG
(
hw
,
CTRL0
,
ctrl0_reg
);
return
;
}
/******************************************************************************
* Gets the current PCI bus type, speed, and width of the hardware
...
...
@@ -959,41 +940,39 @@ ixgb_led_off(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
;
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
;
}
else
{
switch
(
status_reg
&
IXGB_STATUS_PCIX_SPD_MASK
)
{
case
IXGB_STATUS_PCIX_SPD_66
:
hw
->
bus
.
speed
=
ixgb_bus_speed_66
;
break
;
case
IXGB_STATUS_PCIX_SPD_100
:
hw
->
bus
.
speed
=
ixgb_bus_speed_100
;
break
;
case
IXGB_STATUS_PCIX_SPD_133
:
hw
->
bus
.
speed
=
ixgb_bus_speed_133
;
break
;
default:
hw
->
bus
.
speed
=
ixgb_bus_speed_reserved
;
break
;
}
}
hw
->
bus
.
width
=
(
status_reg
&
IXGB_STATUS_BUS64
)
?
ixgb_bus_width_64
:
ixgb_bus_width_32
;
return
;
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
;
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
;
}
else
{
switch
(
status_reg
&
IXGB_STATUS_PCIX_SPD_MASK
)
{
case
IXGB_STATUS_PCIX_SPD_66
:
hw
->
bus
.
speed
=
ixgb_bus_speed_66
;
break
;
case
IXGB_STATUS_PCIX_SPD_100
:
hw
->
bus
.
speed
=
ixgb_bus_speed_100
;
break
;
case
IXGB_STATUS_PCIX_SPD_133
:
hw
->
bus
.
speed
=
ixgb_bus_speed_133
;
break
;
default:
hw
->
bus
.
speed
=
ixgb_bus_speed_reserved
;
break
;
}
}
hw
->
bus
.
width
=
(
status_reg
&
IXGB_STATUS_BUS64
)
?
ixgb_bus_width_64
:
ixgb_bus_width_32
;
return
;
}
/******************************************************************************
* Tests a MAC address to ensure it is a valid Individual Address
*
...
...
@@ -1001,35 +980,30 @@ ixgb_get_bus_info(struct ixgb_hw *hw)
*
*****************************************************************************/
boolean_t
mac_addr_valid
(
uint8_t
*
mac_addr
)
mac_addr_valid
(
uint8_t
*
mac_addr
)
{
boolean_t
is_valid
=
TRUE
;
DEBUGFUNC
(
"mac_addr_valid"
);
/* Make sure it is not a multicast address */
if
(
IS_MULTICAST
(
mac_addr
))
{
DEBUGOUT
(
"MAC address is multicast
\n
"
);
is_valid
=
FALSE
;
}
/* Not a broadcast address */
else
if
(
IS_BROADCAST
(
mac_addr
))
{
DEBUGOUT
(
"MAC address is broadcast
\n
"
);
is_valid
=
FALSE
;
}
/* 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
)
{
DEBUGOUT
(
"MAC address is all zeros
\n
"
);
is_valid
=
FALSE
;
}
return
(
is_valid
);
boolean_t
is_valid
=
TRUE
;
DEBUGFUNC
(
"mac_addr_valid"
);
/* Make sure it is not a multicast address */
if
(
IS_MULTICAST
(
mac_addr
))
{
DEBUGOUT
(
"MAC address is multicast
\n
"
);
is_valid
=
FALSE
;
}
/* Not a broadcast address */
else
if
(
IS_BROADCAST
(
mac_addr
))
{
DEBUGOUT
(
"MAC address is broadcast
\n
"
);
is_valid
=
FALSE
;
}
/* 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
)
{
DEBUGOUT
(
"MAC address is all zeros
\n
"
);
is_valid
=
FALSE
;
}
return
(
is_valid
);
}
/******************************************************************************
...
...
@@ -1039,28 +1013,28 @@ mac_addr_valid(uint8_t *mac_addr)
* hw - Struct containing variables accessed by shared code
*****************************************************************************/
boolean_t
ixgb_link_reset
(
struct
ixgb_hw
*
hw
)
ixgb_link_reset
(
struct
ixgb_hw
*
hw
)
{
boolean_t
link_status
=
FALSE
;
uint8_t
wait_retries
=
MAX_RESET_ITERATIONS
;
uint8_t
lrst_retries
=
MAX_RESET_ITERATIONS
;
do
{
IXGB_WRITE_REG
(
hw
,
CTRL0
,
IXGB_READ_REG
(
hw
,
CTRL0
)
|
IXGB_CTRL0_LRST
);
do
{
usec_delay
(
IXGB_DELAY_USECS_AFTER_LINK_RESET
);
link_status
=
((
IXGB_READ_REG
(
hw
,
STATUS
)
&
IXGB_STATUS_LU
)
&&
(
IXGB_READ_REG
(
hw
,
XPCSS
)
&
IXGB_XPCSS_ALIGN_STATUS
))
?
TRUE
:
FALSE
;
}
while
(
!
link_status
&&
--
wait_retries
);
}
while
(
!
link_status
&&
--
lrst_retries
);
return
link_status
;
boolean_t
link_status
=
FALSE
;
uint8_t
wait_retries
=
MAX_RESET_ITERATIONS
;
uint8_t
lrst_retries
=
MAX_RESET_ITERATIONS
;
do
{
IXGB_WRITE_REG
(
hw
,
CTRL0
,
IXGB_READ_REG
(
hw
,
CTRL0
)
|
IXGB_CTRL0_LRST
);
do
{
usec_delay
(
IXGB_DELAY_USECS_AFTER_LINK_RESET
);
link_status
=
((
IXGB_READ_REG
(
hw
,
STATUS
)
&
IXGB_STATUS_LU
)
&&
(
IXGB_READ_REG
(
hw
,
XPCSS
)
&
IXGB_XPCSS_ALIGN_STATUS
))
?
TRUE
:
FALSE
;
}
while
(
!
link_status
&&
--
wait_retries
);
}
while
(
!
link_status
&&
--
lrst_retries
);
return
link_status
;
}
/******************************************************************************
* Resets the 10GbE optics module.
*
...
...
@@ -1069,15 +1043,13 @@ ixgb_link_reset(struct ixgb_hw *hw)
void
ixgb_optics_reset
(
struct
ixgb_hw
*
hw
)
{
uint16_t
mdio_reg
;
ixgb_write_phy_reg
(
hw
,
TXN17401_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
TXN17401_PMA_PMD_DID
,
TXN17401_PMA_PMD_CR1_RESET
);
mdio_reg
=
ixgb_read_phy_reg
(
hw
,
TXN17401_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
TXN17401_PMA_PMD_DID
);
}
uint16_t
mdio_reg
;
ixgb_write_phy_reg
(
hw
,
TXN17401_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
TXN17401_PMA_PMD_DID
,
TXN17401_PMA_PMD_CR1_RESET
);
mdio_reg
=
ixgb_read_phy_reg
(
hw
,
TXN17401_PMA_PMD_CR1
,
IXGB_PHY_ADDRESS
,
TXN17401_PMA_PMD_DID
);
}
drivers/net/ixgb/ixgb_hw.h
View file @
ca247341
...
...
@@ -32,198 +32,195 @@
/* Enums */
typedef
enum
{
ixgb_mac_unknown
=
0
,
ixgb_82597
,
ixgb_num_macs
ixgb_mac_unknown
=
0
,
ixgb_82597
,
ixgb_num_macs
}
ixgb_mac_type
;
/* Media Types */
typedef
enum
{
ixgb_media_type_unknown
=
0
,
ixgb_media_type_fiber
=
1
,
ixgb_num_media_types
ixgb_media_type_unknown
=
0
,
ixgb_media_type_fiber
=
1
,
ixgb_num_media_types
}
ixgb_media_type
;
/* Flow Control Settings */
typedef
enum
{
ixgb_fc_none
=
0
,
ixgb_fc_rx_pause
=
1
,
ixgb_fc_tx_pause
=
2
,
ixgb_fc_full
=
3
,
ixgb_fc_default
=
0xFF
ixgb_fc_none
=
0
,
ixgb_fc_rx_pause
=
1
,
ixgb_fc_tx_pause
=
2
,
ixgb_fc_full
=
3
,
ixgb_fc_default
=
0xFF
}
ixgb_fc_type
;
/* PCI bus types */
typedef
enum
{
ixgb_bus_type_unknown
=
0
,
ixgb_bus_type_pci
,
ixgb_bus_type_pcix
ixgb_bus_type_unknown
=
0
,
ixgb_bus_type_pci
,
ixgb_bus_type_pcix
}
ixgb_bus_type
;
/* PCI bus speeds */
typedef
enum
{
ixgb_bus_speed_unknown
=
0
,
ixgb_bus_speed_33
,
ixgb_bus_speed_66
,
ixgb_bus_speed_100
,
ixgb_bus_speed_133
,
ixgb_bus_speed_reserved
ixgb_bus_speed_unknown
=
0
,
ixgb_bus_speed_33
,
ixgb_bus_speed_66
,
ixgb_bus_speed_100
,
ixgb_bus_speed_133
,
ixgb_bus_speed_reserved
}
ixgb_bus_speed
;
/* PCI bus widths */
typedef
enum
{
ixgb_bus_width_unknown
=
0
,
ixgb_bus_width_32
,
ixgb_bus_width_64
ixgb_bus_width_unknown
=
0
,
ixgb_bus_width_32
,
ixgb_bus_width_64
}
ixgb_bus_width
;
#define IXGB_ETH_LENGTH_OF_ADDRESS 6
#define IXGB_EEPROM_SIZE 64
/* Size in words */
#define IXGB_EEPROM_SIZE 64
/* Size in words */
#define SPEED_10000 10000
#define FULL_DUPLEX 2
#define IXGB_DELAY_BEFORE_RESET 10
/* allow 10ms after idling rx/tx units */
#define IXGB_DELAY_AFTER_RESET 1
/* allow 1ms after the reset */
#define IXGB_DELAY_AFTER_EE_RESET 10
/* allow 10ms after the EEPROM reset */
#define IXGB_DELAY_BEFORE_RESET 10
/* allow 10ms after idling rx/tx units */
#define IXGB_DELAY_AFTER_RESET 1
/* allow 1ms after the reset */
#define IXGB_DELAY_AFTER_EE_RESET 10
/* allow 10ms after the EEPROM reset */
#define IXGB_DELAY_USECS_AFTER_LINK_RESET 13
/* allow 13 microseconds after the reset */
/* NOTE: this is MICROSECONDS */
#define MAX_RESET_ITERATIONS 8
/* number of iterations to get things right */
#define IXGB_DELAY_USECS_AFTER_LINK_RESET 13
/* allow 13 microseconds after the reset */
/* NOTE: this is MICROSECONDS */
#define MAX_RESET_ITERATIONS 8
/* number of iterations to get things right */
/* General Registers */
#define IXGB_CTRL0 0x00000
/* Device Control Register 0 - RW */
#define IXGB_CTRL1 0x00008
/* Device Control Register 1 - RW */
#define IXGB_STATUS 0x00010
/* Device Status Register - RO */
#define IXGB_EECD 0x00018
/* EEPROM/Flash Control/Data Register - RW */
#define IXGB_MFS 0x00020
/* Maximum Frame Size - RW */
#define IXGB_CTRL0 0x00000
/* Device Control Register 0 - RW */
#define IXGB_CTRL1 0x00008
/* Device Control Register 1 - RW */
#define IXGB_STATUS 0x00010
/* Device Status Register - RO */
#define IXGB_EECD 0x00018
/* EEPROM/Flash Control/Data Register - RW */
#define IXGB_MFS 0x00020
/* Maximum Frame Size - RW */
/* Interrupt */
#define IXGB_ICR 0x00080
/* Interrupt Cause Read - R/clr */
#define IXGB_ICS 0x00088
/* Interrupt Cause Set - RW */
#define IXGB_IMS 0x00090
/* Interrupt Mask Set/Read - RW */
#define IXGB_IMC 0x00098
/* Interrupt Mask Clear - WO */
#define IXGB_ICR 0x00080
/* Interrupt Cause Read - R/clr */
#define IXGB_ICS 0x00088
/* Interrupt Cause Set - RW */
#define IXGB_IMS 0x00090
/* Interrupt Mask Set/Read - RW */
#define IXGB_IMC 0x00098
/* Interrupt Mask Clear - WO */
/* Receive */
#define IXGB_RCTL 0x00100
/* RX Control - RW */
#define IXGB_FCRTL 0x00108
/* Flow Control Receive Threshold Low - RW */
#define IXGB_FCRTH 0x00110
/* Flow Control Receive Threshold High - RW */
#define IXGB_RDBAL 0x00118
/* RX Descriptor Base Low - RW */
#define IXGB_RDBAH 0x0011C
/* RX Descriptor Base High - RW */
#define IXGB_RDLEN 0x00120
/* RX Descriptor Length - RW */
#define IXGB_RDH 0x00128
/* RX Descriptor Head - RW */
#define IXGB_RDT 0x00130
/* RX Descriptor Tail - RW */
#define IXGB_RDTR 0x00138
/* RX Delay Timer Ring - RW */
#define IXGB_RXDCTL 0x00140
/* Receive Descriptor Control - RW */
#define IXGB_RAIDC 0x00148
/* Receive Adaptive Interrupt Delay Control - RW */
#define IXGB_RXCSUM 0x00158
/* Receive Checksum Control - RW */
#define IXGB_RA 0x00180
/* Receive Address Array Base - RW */
#define IXGB_RAL 0x00180
/* Receive Address Low [0:15] - RW */
#define IXGB_RAH 0x00184
/* Receive Address High [0:15] - RW */
#define IXGB_MTA 0x00200
/* Multicast Table Array [0:127] - RW */
#define IXGB_VFTA 0x00400
/* VLAN Filter Table Array [0:127] - RW */
#define IXGB_RCTL 0x00100
/* RX Control - RW */
#define IXGB_FCRTL 0x00108
/* Flow Control Receive Threshold Low - RW */
#define IXGB_FCRTH 0x00110
/* Flow Control Receive Threshold High - RW */
#define IXGB_RDBAL 0x00118
/* RX Descriptor Base Low - RW */
#define IXGB_RDBAH 0x0011C
/* RX Descriptor Base High - RW */
#define IXGB_RDLEN 0x00120
/* RX Descriptor Length - RW */
#define IXGB_RDH 0x00128
/* RX Descriptor Head - RW */
#define IXGB_RDT 0x00130
/* RX Descriptor Tail - RW */
#define IXGB_RDTR 0x00138
/* RX Delay Timer Ring - RW */
#define IXGB_RXDCTL 0x00140
/* Receive Descriptor Control - RW */
#define IXGB_RAIDC 0x00148
/* Receive Adaptive Interrupt Delay Control - RW */
#define IXGB_RXCSUM 0x00158
/* Receive Checksum Control - RW */
#define IXGB_RA 0x00180
/* Receive Address Array Base - RW */
#define IXGB_RAL 0x00180
/* Receive Address Low [0:15] - RW */
#define IXGB_RAH 0x00184
/* Receive Address High [0:15] - RW */
#define IXGB_MTA 0x00200
/* Multicast Table Array [0:127] - RW */
#define IXGB_VFTA 0x00400
/* VLAN Filter Table Array [0:127] - RW */
#define IXGB_REQ_RX_DESCRIPTOR_MULTIPLE 8
/* Transmit */
#define IXGB_TCTL 0x00600
/* TX Control - RW */
#define IXGB_TDBAL 0x00608
/* TX Descriptor Base Low - RW */
#define IXGB_TDBAH 0x0060C
/* TX Descriptor Base High - RW */
#define IXGB_TDLEN 0x00610
/* TX Descriptor Length - RW */
#define IXGB_TDH 0x00618
/* TX Descriptor Head - RW */
#define IXGB_TDT 0x00620
/* TX Descriptor Tail - RW */
#define IXGB_TIDV 0x00628
/* TX Interrupt Delay Value - RW */
#define IXGB_TXDCTL 0x00630
/* Transmit Descriptor Control - RW */
#define IXGB_TSPMT 0x00638
/* TCP Segmentation PAD & Min Threshold - RW */
#define IXGB_PAP 0x00640
/* Pause and Pace - RW */
#define IXGB_TCTL 0x00600
/* TX Control - RW */
#define IXGB_TDBAL 0x00608
/* TX Descriptor Base Low - RW */
#define IXGB_TDBAH 0x0060C
/* TX Descriptor Base High - RW */
#define IXGB_TDLEN 0x00610
/* TX Descriptor Length - RW */
#define IXGB_TDH 0x00618
/* TX Descriptor Head - RW */
#define IXGB_TDT 0x00620
/* TX Descriptor Tail - RW */
#define IXGB_TIDV 0x00628
/* TX Interrupt Delay Value - RW */
#define IXGB_TXDCTL 0x00630
/* Transmit Descriptor Control - RW */
#define IXGB_TSPMT 0x00638
/* TCP Segmentation PAD & Min Threshold - RW */
#define IXGB_PAP 0x00640
/* Pause and Pace - RW */
#define IXGB_REQ_TX_DESCRIPTOR_MULTIPLE 8
/* Physical */
#define IXGB_PCSC1 0x00700
/* PCS Control 1 - RW */
#define IXGB_PCSC2 0x00708
/* PCS Control 2 - RW */
#define IXGB_PCSS1 0x00710
/* PCS Status 1 - RO */
#define IXGB_PCSS2 0x00718
/* PCS Status 2 - RO */
#define IXGB_XPCSS 0x00720
/* 10GBASE-X PCS Status (or XGXS Lane Status) - RO */
#define IXGB_UCCR 0x00728
/* Unilink Circuit Control Register */
#define IXGB_XPCSTC 0x00730
/* 10GBASE-X PCS Test Control */
#define IXGB_MACA 0x00738
/* MDI Autoscan Command and Address - RW */
#define IXGB_APAE 0x00740
/* Autoscan PHY Address Enable - RW */
#define IXGB_ARD 0x00748
/* Autoscan Read Data - RO */
#define IXGB_AIS 0x00750
/* Autoscan Interrupt Status - RO */
#define IXGB_MSCA 0x00758
/* MDI Single Command and Address - RW */
#define IXGB_MSRWD 0x00760
/* MDI Single Read and Write Data - RW, RO */
#define IXGB_PCSC1 0x00700
/* PCS Control 1 - RW */
#define IXGB_PCSC2 0x00708
/* PCS Control 2 - RW */
#define IXGB_PCSS1 0x00710
/* PCS Status 1 - RO */
#define IXGB_PCSS2 0x00718
/* PCS Status 2 - RO */
#define IXGB_XPCSS 0x00720
/* 10GBASE-X PCS Status (or XGXS Lane Status) - RO */
#define IXGB_UCCR 0x00728
/* Unilink Circuit Control Register */
#define IXGB_XPCSTC 0x00730
/* 10GBASE-X PCS Test Control */
#define IXGB_MACA 0x00738
/* MDI Autoscan Command and Address - RW */
#define IXGB_APAE 0x00740
/* Autoscan PHY Address Enable - RW */
#define IXGB_ARD 0x00748
/* Autoscan Read Data - RO */
#define IXGB_AIS 0x00750
/* Autoscan Interrupt Status - RO */
#define IXGB_MSCA 0x00758
/* MDI Single Command and Address - RW */
#define IXGB_MSRWD 0x00760
/* MDI Single Read and Write Data - RW, RO */
/* Wake-up */
#define IXGB_WUFC 0x00808
/* Wake Up Filter Control - RW */
#define IXGB_WUS 0x00810
/* Wake Up Status - RO */
#define IXGB_FFLT 0x01000
/* Flexible Filter Length Table - RW */
#define IXGB_FFMT 0x01020
/* Flexible Filter Mask Table - RW */
#define IXGB_FTVT 0x01420
/* Flexible Filter Value Table - RW */
#define IXGB_WUFC 0x00808
/* Wake Up Filter Control - RW */
#define IXGB_WUS 0x00810
/* Wake Up Status - RO */
#define IXGB_FFLT 0x01000
/* Flexible Filter Length Table - RW */
#define IXGB_FFMT 0x01020
/* Flexible Filter Mask Table - RW */
#define IXGB_FTVT 0x01420
/* Flexible Filter Value Table - RW */
/* Statistics */
#define IXGB_TPRL 0x02000
/* Total Packets Received (Low) */
#define IXGB_TPRH 0x02004
/* Total Packets Received (High) */
#define IXGB_GPRCL 0x02008
/* Good Packets Received Count (Low) */
#define IXGB_GPRCH 0x0200C
/* Good Packets Received Count (High) */
#define IXGB_BPRCL 0x02010
/* Broadcast Packets Received Count (Low) */
#define IXGB_BPRCH 0x02014
/* Broadcast Packets Received Count (High) */
#define IXGB_MPRCL 0x02018
/* Multicast Packets Received Count (Low) */
#define IXGB_MPRCH 0x0201C
/* Multicast Packets Received Count (High) */
#define IXGB_UPRCL 0x02020
/* Unicast Packets Received Count (Low) */
#define IXGB_UPRCH 0x02024
/* Unicast Packets Received Count (High) */
#define IXGB_VPRCL 0x02028
/* VLAN Packets Received Count (Low) */
#define IXGB_VPRCH 0x0202C
/* VLAN Packets Received Count (High) */
#define IXGB_JPRCL 0x02030
/* Jumbo Packets Received Count (Low) */
#define IXGB_JPRCH 0x02034
/* Jumbo Packets Received Count (High) */
#define IXGB_GORCL 0x02038
/* Good Octets Received Count (Low) */
#define IXGB_GORCH 0x0203C
/* Good Octets Received Count (High) */
#define IXGB_TORL 0x02040
/* Total Octets Received (Low) */
#define IXGB_TORH 0x02044
/* Total Octets Received (High) */
#define IXGB_RNBC 0x02048
/* Receive No Buffers Count */
#define IXGB_RUC 0x02050
/* Receive Undersize Count */
#define IXGB_ROC 0x02058
/* Receive Oversize Count */
#define IXGB_RLEC 0x02060
/* Receive Length Error Count */
#define IXGB_CRCERRS 0x02068
/* CRC Error Count */
#define IXGB_ICBC 0x02070
/* Illegal control byte in mid-packet Count */
#define IXGB_ECBC 0x02078
/* Error Control byte in mid-packet Count */
#define IXGB_MPC 0x02080
/* Missed Packets Count */
#define IXGB_TPTL 0x02100
/* Total Packets Transmitted (Low) */
#define IXGB_TPTH 0x02104
/* Total Packets Transmitted (High) */
#define IXGB_GPTCL 0x02108
/* Good Packets Transmitted Count (Low) */
#define IXGB_GPTCH 0x0210C
/* Good Packets Transmitted Count (High) */
#define IXGB_BPTCL 0x02110
/* Broadcast Packets Transmitted Count (Low) */
#define IXGB_BPTCH 0x02114
/* Broadcast Packets Transmitted Count (High) */
#define IXGB_MPTCL 0x02118
/* Multicast Packets Transmitted Count (Low) */
#define IXGB_MPTCH 0x0211C
/* Multicast Packets Transmitted Count (High) */
#define IXGB_UPTCL 0x02120
/* Unicast Packets Transmitted Count (Low) */
#define IXGB_UPTCH 0x02124
/* Unicast Packets Transmitted Count (High) */
#define IXGB_VPTCL 0x02128
/* VLAN Packets Transmitted Count (Low) */
#define IXGB_VPTCH 0x0212C
/* VLAN Packets Transmitted Count (High) */
#define IXGB_JPTCL 0x02130
/* Jumbo Packets Transmitted Count (Low) */
#define IXGB_JPTCH 0x02134
/* Jumbo Packets Transmitted Count (High) */
#define IXGB_GOTCL 0x02138
/* Good Octets Transmitted Count (Low) */
#define IXGB_GOTCH 0x0213C
/* Good Octets Transmitted Count (High) */
#define IXGB_TOTL 0x02140
/* Total Octets Transmitted Count (Low) */
#define IXGB_TOTH 0x02144
/* Total Octets Transmitted Count (High) */
#define IXGB_DC 0x02148
/* Defer Count */
#define IXGB_PLT64C 0x02150
/* Packet Transmitted was less than 64 bytes Count */
#define IXGB_TSCTC 0x02170
/* TCP Segmentation Context Transmitted Count */
#define IXGB_TSCTFC 0x02178
/* TCP Segmentation Context Tx Fail Count */
#define IXGB_IBIC 0x02180
/* Illegal byte during Idle stream count */
#define IXGB_RFC 0x02188
/* Remote Fault Count */
#define IXGB_LFC 0x02190
/* Local Fault Count */
#define IXGB_PFRC 0x02198
/* Pause Frame Receive Count */
#define IXGB_PFTC 0x021A0
/* Pause Frame Transmit Count */
#define IXGB_MCFRC 0x021A8
/* MAC Control Frames (non-Pause) Received Count */
#define IXGB_MCFTC 0x021B0
/* MAC Control Frames (non-Pause) Transmitted Count */
#define IXGB_XONRXC 0x021B8
/* XON Received Count */
#define IXGB_XONTXC 0x021C0
/* XON Transmitted Count */
#define IXGB_XOFFRXC 0x021C8
/* XOFF Received Count */
#define IXGB_XOFFTXC 0x021D0
/* XOFF Transmitted Count */
#define IXGB_RJC 0x021D8
/* Receive Jabber Count */
#define IXGB_TPRL 0x02000
/* Total Packets Received (Low) */
#define IXGB_TPRH 0x02004
/* Total Packets Received (High) */
#define IXGB_GPRCL 0x02008
/* Good Packets Received Count (Low) */
#define IXGB_GPRCH 0x0200C
/* Good Packets Received Count (High) */
#define IXGB_BPRCL 0x02010
/* Broadcast Packets Received Count (Low) */
#define IXGB_BPRCH 0x02014
/* Broadcast Packets Received Count (High) */
#define IXGB_MPRCL 0x02018
/* Multicast Packets Received Count (Low) */
#define IXGB_MPRCH 0x0201C
/* Multicast Packets Received Count (High) */
#define IXGB_UPRCL 0x02020
/* Unicast Packets Received Count (Low) */
#define IXGB_UPRCH 0x02024
/* Unicast Packets Received Count (High) */
#define IXGB_VPRCL 0x02028
/* VLAN Packets Received Count (Low) */
#define IXGB_VPRCH 0x0202C
/* VLAN Packets Received Count (High) */
#define IXGB_JPRCL 0x02030
/* Jumbo Packets Received Count (Low) */
#define IXGB_JPRCH 0x02034
/* Jumbo Packets Received Count (High) */
#define IXGB_GORCL 0x02038
/* Good Octets Received Count (Low) */
#define IXGB_GORCH 0x0203C
/* Good Octets Received Count (High) */
#define IXGB_TORL 0x02040
/* Total Octets Received (Low) */
#define IXGB_TORH 0x02044
/* Total Octets Received (High) */
#define IXGB_RNBC 0x02048
/* Receive No Buffers Count */
#define IXGB_RUC 0x02050
/* Receive Undersize Count */
#define IXGB_ROC 0x02058
/* Receive Oversize Count */
#define IXGB_RLEC 0x02060
/* Receive Length Error Count */
#define IXGB_CRCERRS 0x02068
/* CRC Error Count */
#define IXGB_ICBC 0x02070
/* Illegal control byte in mid-packet Count */
#define IXGB_ECBC 0x02078
/* Error Control byte in mid-packet Count */
#define IXGB_MPC 0x02080
/* Missed Packets Count */
#define IXGB_TPTL 0x02100
/* Total Packets Transmitted (Low) */
#define IXGB_TPTH 0x02104
/* Total Packets Transmitted (High) */
#define IXGB_GPTCL 0x02108
/* Good Packets Transmitted Count (Low) */
#define IXGB_GPTCH 0x0210C
/* Good Packets Transmitted Count (High) */
#define IXGB_BPTCL 0x02110
/* Broadcast Packets Transmitted Count (Low) */
#define IXGB_BPTCH 0x02114
/* Broadcast Packets Transmitted Count (High) */
#define IXGB_MPTCL 0x02118
/* Multicast Packets Transmitted Count (Low) */
#define IXGB_MPTCH 0x0211C
/* Multicast Packets Transmitted Count (High) */
#define IXGB_UPTCL 0x02120
/* Unicast Packets Transmitted Count (Low) */
#define IXGB_UPTCH 0x02124
/* Unicast Packets Transmitted Count (High) */
#define IXGB_VPTCL 0x02128
/* VLAN Packets Transmitted Count (Low) */
#define IXGB_VPTCH 0x0212C
/* VLAN Packets Transmitted Count (High) */
#define IXGB_JPTCL 0x02130
/* Jumbo Packets Transmitted Count (Low) */
#define IXGB_JPTCH 0x02134
/* Jumbo Packets Transmitted Count (High) */
#define IXGB_GOTCL 0x02138
/* Good Octets Transmitted Count (Low) */
#define IXGB_GOTCH 0x0213C
/* Good Octets Transmitted Count (High) */
#define IXGB_TOTL 0x02140
/* Total Octets Transmitted Count (Low) */
#define IXGB_TOTH 0x02144
/* Total Octets Transmitted Count (High) */
#define IXGB_DC 0x02148
/* Defer Count */
#define IXGB_PLT64C 0x02150
/* Packet Transmitted was less than 64 bytes Count */
#define IXGB_TSCTC 0x02170
/* TCP Segmentation Context Transmitted Count */
#define IXGB_TSCTFC 0x02178
/* TCP Segmentation Context Tx Fail Count */
#define IXGB_IBIC 0x02180
/* Illegal byte during Idle stream count */
#define IXGB_RFC 0x02188
/* Remote Fault Count */
#define IXGB_LFC 0x02190
/* Local Fault Count */
#define IXGB_PFRC 0x02198
/* Pause Frame Receive Count */
#define IXGB_PFTC 0x021A0
/* Pause Frame Transmit Count */
#define IXGB_MCFRC 0x021A8
/* MAC Control Frames (non-Pause) Received Count */
#define IXGB_MCFTC 0x021B0
/* MAC Control Frames (non-Pause) Transmitted Count */
#define IXGB_XONRXC 0x021B8
/* XON Received Count */
#define IXGB_XONTXC 0x021C0
/* XON Transmitted Count */
#define IXGB_XOFFRXC 0x021C8
/* XOFF Received Count */
#define IXGB_XOFFTXC 0x021D0
/* XOFF Transmitted Count */
#define IXGB_RJC 0x021D8
/* Receive Jabber Count */
/* CTRL0 Bit Masks */
#define IXGB_CTRL0_LRST 0x00000008
...
...
@@ -245,14 +242,11 @@ typedef enum {
#define IXGB_CTRL1_EE_RST 0x00002000
/* STATUS Bit Masks */
#define IXGB_STATUS_LU 0x00000002
#define IXGB_STATUS_TXOFF 0x00000010
#define IXGB_STATUS_PCI_SPD 0x00000800
#define IXGB_STATUS_BUS64 0x00001000
#define IXGB_STATUS_PCIX_MODE 0x00002000
...
...
@@ -261,14 +255,12 @@ typedef enum {
#define IXGB_STATUS_PCIX_SPD_100 0x00004000
#define IXGB_STATUS_PCIX_SPD_133 0x00008000
/* EECD Bit Masks */
#define IXGB_EECD_SK 0x00000001
#define IXGB_EECD_CS 0x00000002
#define IXGB_EECD_DI 0x00000004
#define IXGB_EECD_DO 0x00000008
/* MFS */
#define IXGB_MFS_SHIFT 16
...
...
@@ -297,18 +289,17 @@ typedef enum {
#define IXGB_RCTL_CFF 0x00800000
#define IXGB_RCTL_SECRC 0x04000000
/* FCRTL Bit Masks */
#define IXGB_FCRTL_XONE 0x80000000
/* RXDCTL Bit Masks */
#define IXGB_RXDCTL_PTHRESH_SHIFT 0
#define IXGB_RXDCTL_HTHRESH_SHIFT 9
#define IXGB_RXDCTL_WTHRESH_SHIFT 18
#define IXGB_RXDCTL_PTHRESH_SHIFT 0
#define IXGB_RXDCTL_HTHRESH_SHIFT 9
#define IXGB_RXDCTL_WTHRESH_SHIFT 18
/* RAIDC Bit Masks */
#define IXGB_RAIDC_DELAY_SHIFT 11
#define IXGB_RAIDC_POLL_SHIFT 20
#define IXGB_RAIDC_DELAY_SHIFT 11
#define IXGB_RAIDC_POLL_SHIFT 20
#define IXGB_RAIDC_RXT_GATE 0x40000000
#define IXGB_RAIDC_EN 0x80000000
...
...
@@ -323,9 +314,8 @@ typedef enum {
#define IXGB_TCTL_TXEN 0x00000002
#define IXGB_TCTL_TPDE 0x00000004
/* TXDCTL Bit Masks */
#define IXGB_TXDCTL_HTHRESH_SHIFT 8
#define IXGB_TXDCTL_HTHRESH_SHIFT 8
/* TSPMT Bit Masks */
...
...
@@ -361,7 +351,7 @@ typedef enum {
#define IXGB_MSRWD_READ_DATA_SHIFT 16
/* Definitions for the TXN17401 devices on the MDIO bus. */
#define IXGB_PHY_ADDRESS 0x0
/* Single PHY, multiple "Devices" */
#define IXGB_PHY_ADDRESS 0x0
/* Single PHY, multiple "Devices" */
/* Five bit Device IDs */
#define TXN17401_PMA_PMD_DID 0x01
...
...
@@ -376,12 +366,12 @@ typedef enum {
#define TXN17401_PMA_PMD_CR1_RESET 0x8000
struct
ixgb_rx_desc
{
uint64_t
buff_addr
;
uint16_t
length
;
uint16_t
reserved
;
uint8_t
status
;
uint8_t
errors
;
uint16_t
special
;
uint64_t
buff_addr
;
uint16_t
length
;
uint16_t
reserved
;
uint8_t
status
;
uint8_t
errors
;
uint16_t
special
;
};
#define IXGB_RX_DESC_STATUS_DD 0x01
...
...
@@ -396,14 +386,14 @@ struct ixgb_rx_desc {
#define IXGB_RX_DESC_ERRORS_TCPE 0x20
#define IXGB_RX_DESC_ERRORS_RXE 0x80
#define IXGB_RX_DESC_SPECIAL_VLAN_MASK 0x0FFF
/* VLAN ID is in lower 12 bits */
#define IXGB_RX_DESC_SPECIAL_VLAN_MASK 0x0FFF
/* VLAN ID is in lower 12 bits */
struct
ixgb_tx_desc
{
uint64_t
buff_addr
;
uint32_t
cmd_type_len
;
uint8_t
status
;
uint8_t
popts
;
uint16_t
vlan
;
uint64_t
buff_addr
;
uint32_t
cmd_type_len
;
uint8_t
status
;
uint8_t
popts
;
uint16_t
vlan
;
};
#define IXGB_TX_DESC_CMD_EOP 0x01000000
...
...
@@ -420,18 +410,18 @@ struct ixgb_tx_desc {
#define IXGB_TX_DESC_POPTS_TXSM 0x02
struct
ixgb_context_desc
{
uint8_t
ipcss
;
uint8_t
ipcso
;
uint16_t
ipcse
;
uint8_t
tucss
;
uint8_t
tucso
;
uint16_t
tucse
;
uint32_t
cmd_type_len
;
uint8_t
status
;
uint8_t
hdr_len
;
uint16_t
mss
;
uint8_t
ipcss
;
uint8_t
ipcso
;
uint16_t
ipcse
;
uint8_t
tucss
;
uint8_t
tucso
;
uint16_t
tucse
;
uint32_t
cmd_type_len
;
uint8_t
status
;
uint8_t
hdr_len
;
uint16_t
mss
;
};
#define IXGB_CONTEXT_DESC_CMD_TCP 0x01000000
#define IXGB_CONTEXT_DESC_CMD_IP 0x02000000
#define IXGB_CONTEXT_DESC_CMD_TSE 0x04000000
...
...
@@ -440,11 +430,10 @@ struct ixgb_context_desc {
#define IXGB_CONTEXT_DESC_TYPE 0x00000000
/* 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 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 ENET_HEADER_SIZE 14
#define ENET_FCS_LENGTH 4
...
...
@@ -461,7 +450,6 @@ struct ixgb_context_desc {
#define IS_MULTICAST(Address) \
(boolean_t)(((uint8_t *)(Address))[0] & ((uint8_t)0x01))
/*
* Check whether an address is broadcast.
*/
...
...
@@ -470,11 +458,11 @@ struct ixgb_context_desc {
/* Flow control parameters */
struct
ixgb_fc
{
uint32_t
high_water
;
/* Flow Control High-water */
uint32_t
low_water
;
/* Flow Control Low-water */
uint16_t
pause_time
;
/* Flow Control Pause timer */
boolean_t
send_xon
;
/* Flow control send XON */
ixgb_fc_type
type
;
/* Type of flow control */
uint32_t
high_water
;
/* Flow Control High-water */
uint32_t
low_water
;
/* Flow Control Low-water */
uint16_t
pause_time
;
/* Flow Control Pause timer */
boolean_t
send_xon
;
/* Flow control send XON */
ixgb_fc_type
type
;
/* Type of flow control */
};
/* The historical defaults for the flow control values are given below. */
...
...
@@ -486,102 +474,102 @@ struct ixgb_fc {
/* Bus parameters */
struct
ixgb_bus
{
ixgb_bus_speed
speed
;
ixgb_bus_width
width
;
ixgb_bus_type
type
;
ixgb_bus_speed
speed
;
ixgb_bus_width
width
;
ixgb_bus_type
type
;
};
struct
ixgb_hw
{
uint8_t
*
hw_addr
;
/* Base Address of the hardware */
void
*
back
;
/* Pointer to OS-dependent struct */
struct
ixgb_fc
fc
;
/* Flow control parameters */
struct
ixgb_bus
bus
;
/* Bus parameters */
uint32_t
phy_id
;
/* Phy Identifier */
uint32_t
phy_addr
;
/* XGMII address of Phy */
ixgb_mac_type
mac_type
;
/* Identifier for MAC controller */
uint32_t
max_frame_size
;
/* Maximum frame size supported */
uint32_t
mc_filter_type
;
/* Multicast filter hash type */
uint32_t
num_mc_addrs
;
/* Number of current Multicast addrs
*/
uint8_t
curr_mac_addr
[
IXGB_ETH_LENGTH_OF_ADDRESS
];
/* Individual address currently programmed in MAC */
uint32_t
num_tx_desc
;
/* Number of Transmit descriptors */
uint32_t
num_rx_desc
;
/* Number of Receive descriptors */
uint32_t
rx_buffer_size
;
/* Size of Receive buffer */
boolean_t
link_up
;
/* TRUE if link is valid */
boolean_t
adapter_stopped
;
/* State of adapter */
uint16_t
device_id
;
/* device id from PCI configuration space */
uint16_t
vendor_id
;
/* vendor id from PCI configuration space */
uint8_t
revision_id
;
/* revision id from PCI configuration space */
uint16_t
subsystem_vendor_id
;
/* subsystem vendor id from PCI configuration space */
uint16_t
subsystem_id
;
/* subsystem id from PCI configuration space */
uint16_t
pci_cmd_word
;
/* PCI command register id from PCI configuration space */
uint16_t
eeprom
[
IXGB_EEPROM_SIZE
];
/* EEPROM contents read at init time */
uint64_t
io_base
;
/* Our I/O mapped location */
uint32_t
lastLFC
;
uint32_t
lastRFC
;
uint8_t
*
hw_addr
;
/* Base Address of the hardware */
void
*
back
;
/* Pointer to OS-dependent struct */
struct
ixgb_fc
fc
;
/* Flow control parameters */
struct
ixgb_bus
bus
;
/* Bus parameters */
uint32_t
phy_id
;
/* Phy Identifier */
uint32_t
phy_addr
;
/* XGMII address of Phy */
ixgb_mac_type
mac_type
;
/* Identifier for MAC controller */
uint32_t
max_frame_size
;
/* Maximum frame size supported */
uint32_t
mc_filter_type
;
/* Multicast filter hash type */
uint32_t
num_mc_addrs
;
/* Number of current Multicast addrs
*/
uint8_t
curr_mac_addr
[
IXGB_ETH_LENGTH_OF_ADDRESS
];
/* Individual address currently programmed in MAC */
uint32_t
num_tx_desc
;
/* Number of Transmit descriptors */
uint32_t
num_rx_desc
;
/* Number of Receive descriptors */
uint32_t
rx_buffer_size
;
/* Size of Receive buffer */
boolean_t
link_up
;
/* TRUE if link is valid */
boolean_t
adapter_stopped
;
/* State of adapter */
uint16_t
device_id
;
/* device id from PCI configuration space */
uint16_t
vendor_id
;
/* vendor id from PCI configuration space */
uint8_t
revision_id
;
/* revision id from PCI configuration space */
uint16_t
subsystem_vendor_id
;
/* subsystem vendor id from PCI configuration space */
uint16_t
subsystem_id
;
/* subsystem id from PCI configuration space */
uint16_t
pci_cmd_word
;
/* PCI command register id from PCI configuration space */
uint16_t
eeprom
[
IXGB_EEPROM_SIZE
];
/* EEPROM contents read at init time */
uint64_t
io_base
;
/* Our I/O mapped location */
uint32_t
lastLFC
;
uint32_t
lastRFC
;
};
struct
ixgb_hw_stats
{
uint64_t
tprl
;
uint64_t
tprh
;
uint64_t
gprcl
;
uint64_t
gprch
;
uint64_t
bprcl
;
uint64_t
bprch
;
uint64_t
mprcl
;
uint64_t
mprch
;
uint64_t
uprcl
;
uint64_t
uprch
;
uint64_t
vprcl
;
uint64_t
vprch
;
uint64_t
jprcl
;
uint64_t
jprch
;
uint64_t
gorcl
;
uint64_t
gorch
;
uint64_t
torl
;
uint64_t
torh
;
uint64_t
rnbc
;
uint64_t
ruc
;
uint64_t
roc
;
uint64_t
rlec
;
uint64_t
crcerrs
;
uint64_t
icbc
;
uint64_t
ecbc
;
uint64_t
mpc
;
uint64_t
tptl
;
uint64_t
tpth
;
uint64_t
gptcl
;
uint64_t
gptch
;
uint64_t
bptcl
;
uint64_t
bptch
;
uint64_t
mptcl
;
uint64_t
mptch
;
uint64_t
uptcl
;
uint64_t
uptch
;
uint64_t
vptcl
;
uint64_t
vptch
;
uint64_t
jptcl
;
uint64_t
jptch
;
uint64_t
gotcl
;
uint64_t
gotch
;
uint64_t
totl
;
uint64_t
toth
;
uint64_t
dc
;
uint64_t
plt64c
;
uint64_t
tsctc
;
uint64_t
tsctfc
;
uint64_t
ibic
;
uint64_t
rfc
;
uint64_t
lfc
;
uint64_t
pfrc
;
uint64_t
pftc
;
uint64_t
mcfrc
;
uint64_t
mcftc
;
uint64_t
xonrxc
;
uint64_t
xontxc
;
uint64_t
xoffrxc
;
uint64_t
xofftxc
;
uint64_t
rjc
;
};
uint64_t
tprl
;
uint64_t
tprh
;
uint64_t
gprcl
;
uint64_t
gprch
;
uint64_t
bprcl
;
uint64_t
bprch
;
uint64_t
mprcl
;
uint64_t
mprch
;
uint64_t
uprcl
;
uint64_t
uprch
;
uint64_t
vprcl
;
uint64_t
vprch
;
uint64_t
jprcl
;
uint64_t
jprch
;
uint64_t
gorcl
;
uint64_t
gorch
;
uint64_t
torl
;
uint64_t
torh
;
uint64_t
rnbc
;
uint64_t
ruc
;
uint64_t
roc
;
uint64_t
rlec
;
uint64_t
crcerrs
;
uint64_t
icbc
;
uint64_t
ecbc
;
uint64_t
mpc
;
uint64_t
tptl
;
uint64_t
tpth
;
uint64_t
gptcl
;
uint64_t
gptch
;
uint64_t
bptcl
;
uint64_t
bptch
;
uint64_t
mptcl
;
uint64_t
mptch
;
uint64_t
uptcl
;
uint64_t
uptch
;
uint64_t
vptcl
;
uint64_t
vptch
;
uint64_t
jptcl
;
uint64_t
jptch
;
uint64_t
gotcl
;
uint64_t
gotch
;
uint64_t
totl
;
uint64_t
toth
;
uint64_t
dc
;
uint64_t
plt64c
;
uint64_t
tsctc
;
uint64_t
tsctfc
;
uint64_t
ibic
;
uint64_t
rfc
;
uint64_t
lfc
;
uint64_t
pfrc
;
uint64_t
pftc
;
uint64_t
mcfrc
;
uint64_t
mcftc
;
uint64_t
xonrxc
;
uint64_t
xontxc
;
uint64_t
xoffrxc
;
uint64_t
xofftxc
;
uint64_t
rjc
;
};
/* Function Prototypes */
extern
boolean_t
ixgb_adapter_stop
(
struct
ixgb_hw
*
hw
);
...
...
@@ -592,40 +580,32 @@ 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
);
extern
void
ixgb_rar_set
(
struct
ixgb_hw
*
hw
,
uint8_t
*
addr
,
uint32_t
index
);
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
);
/* 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
);
...
...
@@ -635,16 +615,13 @@ uint16_t ixgb_get_ee_subvendor_id(struct ixgb_hw *hw);
uint16_t
ixgb_get_ee_device_id
(
struct
ixgb_hw
*
hw
);
uint16_t
ixgb_get_ee_vendor_id
(
struct
ixgb_hw
*
hw
);
uint16_t
ixgb_get_ee_swdpins_reg
(
struct
ixgb_hw
*
hw
);
uint8_t
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
);
uint8_t
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
);
uint8_t
ixgb_get_ee_d3_power
(
struct
ixgb_hw
*
hw
);
uint8_t
ixgb_get_ee_d0_power
(
struct
ixgb_hw
*
hw
);
boolean_t
ixgb_get_eeprom_data
(
struct
ixgb_hw
*
hw
);
/* 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 @
ca247341
...
...
@@ -25,7 +25,6 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
#ifndef _IXGB_IDS_H_
#define _IXGB_IDS_H_
...
...
@@ -37,9 +36,9 @@
#define INTEL_SUBVENDOR_ID 0x8086
#define IXGB_DEVICE_ID_82597EX 0x1048
#define IXGB_SUBDEVICE_ID_A11F 0xA11F
/* Adapter-OEM-1310nm-Fiber */
#define IXGB_SUBDEVICE_ID_A01F 0xA01F
/* Adapter-Retail-1310nm-Fiber */
#define IXGB_SUBDEVICE_ID_A11F 0xA11F
/* Adapter-OEM-1310nm-Fiber */
#define IXGB_SUBDEVICE_ID_A01F 0xA01F
/* Adapter-Retail-1310nm-Fiber */
#endif
/* #ifndef _IXGB_IDS_H_ */
#endif
/* #ifndef _IXGB_IDS_H_ */
/* End of File */
drivers/net/ixgb/ixgb_main.c
View file @
ca247341
...
...
@@ -88,12 +88,13 @@ 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
inline
boolean_t
ixgb_tso
(
struct
ixgb_adapter
*
adapter
,
struct
sk_buff
*
skb
);
static
inline
boolean_t
ixgb_tso
(
struct
ixgb_adapter
*
adapter
,
struct
sk_buff
*
skb
);
static
int
ixgb_xmit_frame
(
struct
sk_buff
*
skb
,
struct
net_device
*
netdev
);
static
void
ixgb_tx_timeout
(
struct
net_device
*
netdev
);
static
void
ixgb_tx_timeout_task
(
struct
net_device
*
netdev
);
static
void
ixgb_vlan_rx_register
(
struct
net_device
*
netdev
,
struct
vlan_group
*
grp
);
static
void
ixgb_vlan_rx_register
(
struct
net_device
*
netdev
,
struct
vlan_group
*
grp
);
static
void
ixgb_vlan_rx_add_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
);
static
void
ixgb_vlan_rx_kill_vid
(
struct
net_device
*
netdev
,
uint16_t
vid
);
static
void
ixgb_restore_vlan
(
struct
ixgb_adapter
*
adapter
);
...
...
@@ -113,9 +114,10 @@ static void ixgb_clean_rx_irq(struct ixgb_adapter *adapter);
static
void
ixgb_alloc_rx_buffers
(
struct
ixgb_adapter
*
adapter
);
static
int
ixgb_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
,
int
cmd
);
static
inline
void
ixgb_rx_checksum
(
struct
ixgb_adapter
*
adapter
,
struct
ixgb_rx_desc
*
rx_desc
,
struct
sk_buff
*
skb
);
static
int
ixgb_notify_reboot
(
struct
notifier_block
*
,
unsigned
long
event
,
void
*
ptr
);
struct
ixgb_rx_desc
*
rx_desc
,
struct
sk_buff
*
skb
);
static
int
ixgb_notify_reboot
(
struct
notifier_block
*
,
unsigned
long
event
,
void
*
ptr
);
static
int
ixgb_suspend
(
struct
pci_dev
*
pdev
,
uint32_t
state
);
struct
notifier_block
ixgb_notifier_reboot
=
{
...
...
@@ -124,13 +126,11 @@ struct notifier_block ixgb_notifier_reboot = {
.
priority
=
0
};
/* Exported from other modules */
extern
void
ixgb_check_options
(
struct
ixgb_adapter
*
adapter
);
extern
int
ixgb_ethtool_ioctl
(
struct
net_device
*
netdev
,
struct
ifreq
*
ifr
);
static
struct
pci_driver
ixgb_driver
=
{
.
name
=
ixgb_driver_name
,
.
id_table
=
ixgb_pci_tbl
,
...
...
@@ -146,10 +146,10 @@ MODULE_DESCRIPTION("Intel(R) PRO/10GbE Network Driver");
MODULE_LICENSE
(
"GPL"
);
/* some defines for controlling descriptor fetches in h/w */
#define RXDCTL_PTHRESH_DEFAULT 128
/* chip considers prefech below this */
#define RXDCTL_HTHRESH_DEFAULT 16
/* chip will only prefetch if tail is
pushed this many descriptors from head */
#define RXDCTL_WTHRESH_DEFAULT 16
/* chip writes back at this many or RXT0 */
#define RXDCTL_PTHRESH_DEFAULT 128
/* chip considers prefech below this */
#define RXDCTL_HTHRESH_DEFAULT 16
/* chip will only prefetch if tail is
pushed this many descriptors from head */
#define RXDCTL_WTHRESH_DEFAULT 16
/* chip writes back at this many or RXT0 */
/**
* ixgb_init_module - Driver Registration Routine.
...
...
@@ -171,7 +171,7 @@ ixgb_init_module(void)
printk
(
KERN_INFO
"NAPI Enabled
\n
"
);
#endif
ret
=
pci_module_init
(
&
ixgb_driver
);
if
(
ret
>=
0
)
{
if
(
ret
>=
0
)
{
register_reboot_notifier
(
&
ixgb_notifier_reboot
);
}
return
ret
;
...
...
@@ -211,8 +211,8 @@ ixgb_up(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_up
\n
"
);
if
(
request_irq
(
netdev
->
irq
,
&
ixgb_intr
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
netdev
->
name
,
netdev
))
{
if
(
request_irq
(
netdev
->
irq
,
&
ixgb_intr
,
SA_SHIRQ
|
SA_SAMPLE_RANDOM
,
netdev
->
name
,
netdev
))
{
IXGB_DBG
(
"%s: request_irq failed
\n
"
,
netdev
->
name
);
return
-
1
;
}
...
...
@@ -233,7 +233,7 @@ ixgb_up(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_up: RAH_0 is <%x>
\n
"
,
IXGB_READ_REG
(
&
adapter
->
hw
,
RAH
));
IXGB_DBG
(
"ixgb_up: RDBAL is <%x>
\n
"
,
IXGB_READ_REG
(
&
adapter
->
hw
,
RDBAL
));
IXGB_READ_REG
(
&
adapter
->
hw
,
RDBAL
));
return
0
;
}
...
...
@@ -253,7 +253,7 @@ ixgb_down(struct ixgb_adapter *adapter, boolean_t kill_watchdog)
ixgb_irq_disable
(
adapter
);
free_irq
(
netdev
->
irq
,
netdev
);
if
(
kill_watchdog
)
if
(
kill_watchdog
)
del_timer_sync
(
&
adapter
->
watchdog_timer
);
adapter
->
link_speed
=
0
;
adapter
->
link_duplex
=
0
;
...
...
@@ -278,7 +278,7 @@ ixgb_reset(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_reset
\n
"
);
ixgb_adapter_stop
(
&
adapter
->
hw
);
if
(
!
ixgb_init_hw
(
&
adapter
->
hw
))
if
(
!
ixgb_init_hw
(
&
adapter
->
hw
))
IXGB_DBG
(
"ixgb_init_hw failed.
\n
"
);
}
...
...
@@ -303,22 +303,22 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
IXGB_DBG
(
"ixgb_probe
\n
"
);
if
((
i
=
pci_enable_device
(
pdev
)))
{
if
((
i
=
pci_enable_device
(
pdev
)))
{
IXGB_ERR
(
"pci_enable_device failed
\n
"
);
return
i
;
}
if
(
!
(
i
=
pci_set_dma_mask
(
pdev
,
PCI_DMA_64BIT
)))
{
if
(
!
(
i
=
pci_set_dma_mask
(
pdev
,
PCI_DMA_64BIT
)))
{
pci_using_dac
=
1
;
}
else
{
if
((
i
=
pci_set_dma_mask
(
pdev
,
PCI_DMA_32BIT
)))
{
if
((
i
=
pci_set_dma_mask
(
pdev
,
PCI_DMA_32BIT
)))
{
IXGB_ERR
(
"No usable DMA configuration, aborting
\n
"
);
return
i
;
}
pci_using_dac
=
0
;
}
if
((
i
=
pci_request_regions
(
pdev
,
ixgb_driver_name
)))
{
if
((
i
=
pci_request_regions
(
pdev
,
ixgb_driver_name
)))
{
IXGB_ERR
(
"Failed to reserve PCI I/O and Memory resources.
\n
"
);
return
i
;
}
...
...
@@ -326,8 +326,8 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master
(
pdev
);
/* alloc_etherdev clears the memory for us */
netdev
=
alloc_etherdev
(
sizeof
(
struct
ixgb_adapter
));
if
(
!
netdev
)
{
netdev
=
alloc_etherdev
(
sizeof
(
struct
ixgb_adapter
));
if
(
!
netdev
)
{
IXGB_ERR
(
"Unable to allocate net_device struct
\n
"
);
goto
err_alloc_etherdev
;
}
...
...
@@ -344,19 +344,19 @@ 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
)
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
;
}
}
IXGB_DBG
(
"mmio_start<%lx> hw_addr<%p>
\n
"
,
mmio_start
,
adapter
->
hw
.
hw_addr
);
IXGB_DBG
(
"mmio_start<%lx> hw_addr<%p>
\n
"
,
mmio_start
,
adapter
->
hw
.
hw_addr
);
netdev
->
open
=
&
ixgb_open
;
netdev
->
stop
=
&
ixgb_close
;
...
...
@@ -378,7 +378,7 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
netdev
->
irq
=
pdev
->
irq
;
netdev
->
mem_start
=
mmio_start
;
netdev
->
mem_end
=
mmio_start
+
mmio_len
;
netdev
->
mem_end
=
mmio_start
+
mmio_len
;
netdev
->
base_addr
=
adapter
->
hw
.
io_base
;
adapter
->
bd_number
=
cards_found
;
...
...
@@ -390,27 +390,25 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ixgb_sw_init
(
adapter
);
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
))
{
IXGB_DBG
(
"Invalid EEPROM checksum.
\n
"
);
goto
err_eeprom
;
}
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
))
{
IXGB_DBG
(
"Invalid MAC address in EEPROM.
\n
"
);
goto
err_eeprom
;
}
...
...
@@ -418,17 +416,16 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
adapter
->
max_data_per_txd
=
IXGB_MAX_JUMBO_FRAME_SIZE
;
adapter
->
part_num
=
ixgb_get_ee_pba_number
(
&
adapter
->
hw
);
init_timer
(
&
adapter
->
watchdog_timer
);
adapter
->
watchdog_timer
.
function
=
&
ixgb_watchdog
;
adapter
->
watchdog_timer
.
data
=
(
unsigned
long
)
adapter
;
INIT_WORK
(
&
adapter
->
tx_timeout_task
,
(
void
(
*
)(
void
*
))
ixgb_tx_timeout_task
,
netdev
);
INIT_WORK
(
&
adapter
->
tx_timeout_task
,
(
void
(
*
)(
void
*
))
ixgb_tx_timeout_task
,
netdev
);
register_netdev
(
netdev
);
memcpy
(
adapter
->
ifname
,
netdev
->
name
,
IFNAMSIZ
);
adapter
->
ifname
[
IFNAMSIZ
-
1
]
=
0
;
adapter
->
ifname
[
IFNAMSIZ
-
1
]
=
0
;
/* we're going to reset, so assume we have no link for now */
...
...
@@ -437,19 +434,19 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
printk
(
KERN_INFO
"%s: %s
\n
"
,
netdev
->
name
,
adapter
->
id_string
);
ixgb_check_options
(
adapter
);
/* reset the hardware with the new settings */
ixgb_reset
(
adapter
);
cards_found
++
;
return
0
;
err_eeprom:
err_eeprom:
iounmap
(
adapter
->
hw
.
hw_addr
);
err_ioremap:
err_ioremap:
pci_release_regions
(
pdev
);
kfree
(
netdev
);
err_alloc_etherdev:
err_alloc_etherdev:
return
-
ENOMEM
;
}
...
...
@@ -477,7 +474,6 @@ ixgb_remove(struct pci_dev *pdev)
ixgb_identify_stop
(
adapter
);
#endif
iounmap
((
void
*
)
adapter
->
hw
.
hw_addr
);
pci_release_regions
(
pdev
);
...
...
@@ -508,7 +504,7 @@ ixgb_sw_init(struct ixgb_adapter *adapter)
pci_read_config_word
(
pdev
,
PCI_DEVICE_ID
,
&
hw
->
device_id
);
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
hw
->
revision_id
);
pci_read_config_word
(
pdev
,
PCI_SUBSYSTEM_VENDOR_ID
,
&
hw
->
subsystem_vendor_id
);
&
hw
->
subsystem_vendor_id
);
pci_read_config_word
(
pdev
,
PCI_SUBSYSTEM_ID
,
&
hw
->
subsystem_id
);
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
hw
->
pci_cmd_word
);
...
...
@@ -516,7 +512,7 @@ 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
)
if
(
hw
->
device_id
==
IXGB_DEVICE_ID_82597EX
)
hw
->
mac_type
=
ixgb_82597
;
else
{
/* should never have loaded on this device */
...
...
@@ -551,27 +547,27 @@ ixgb_open(struct net_device *netdev)
/* allocate transmit descriptors */
if
(
ixgb_setup_tx_resources
(
adapter
))
{
if
(
ixgb_setup_tx_resources
(
adapter
))
{
IXGB_DBG
(
"ixgb_open: failed ixgb_setup_tx_resources.
\n
"
);
goto
err_setup_tx
;
}
/* allocate receive descriptors and buffers */
if
(
ixgb_setup_rx_resources
(
adapter
))
{
if
(
ixgb_setup_rx_resources
(
adapter
))
{
IXGB_DBG
(
"ixgb_open: failed ixgb_setup_rx_resources.
\n
"
);
goto
err_setup_rx
;
}
if
(
ixgb_up
(
adapter
))
if
(
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
-
EBUSY
;
}
...
...
@@ -619,19 +615,19 @@ ixgb_setup_tx_resources(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_setup_tx_resources
\n
"
);
size
=
sizeof
(
struct
ixgb_buffer
)
*
txdr
->
count
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
txdr
->
count
;
txdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
!
txdr
->
buffer_info
)
{
if
(
!
txdr
->
buffer_info
)
{
return
-
ENOMEM
;
}
memset
(
txdr
->
buffer_info
,
0
,
size
);
/* round up to nearest 4K */
txdr
->
size
=
txdr
->
count
*
sizeof
(
struct
ixgb_tx_desc
);
txdr
->
size
=
txdr
->
count
*
sizeof
(
struct
ixgb_tx_desc
);
IXGB_ROUNDUP
(
txdr
->
size
,
4096
);
txdr
->
desc
=
pci_alloc_consistent
(
pdev
,
txdr
->
size
,
&
txdr
->
dma
);
if
(
!
txdr
->
desc
)
{
if
(
!
txdr
->
desc
)
{
kfree
(
txdr
->
buffer_info
);
return
-
ENOMEM
;
}
...
...
@@ -658,7 +654,7 @@ static void
ixgb_configure_tx
(
struct
ixgb_adapter
*
adapter
)
{
uint32_t
tctl
;
uint32_t
tdlen
=
adapter
->
tx_ring
.
count
*
sizeof
(
struct
ixgb_tx_desc
);
uint32_t
tdlen
=
adapter
->
tx_ring
.
count
*
sizeof
(
struct
ixgb_tx_desc
);
uint64_t
tdba
=
adapter
->
tx_ring
.
dma
;
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
...
...
@@ -680,11 +676,11 @@ ixgb_configure_tx(struct ixgb_adapter *adapter)
/* don't set up txdctl, it induces performance problems if
* configured incorrectly
txdctl = TXDCTL_PTHRESH_DEFAULT; // prefetch txds below this threshold
txdctl |= (TXDCTL_HTHRESH_DEFAULT // only prefetch if there are this many ready
<< IXGB_TXDCTL_HTHRESH_SHIFT);
IXGB_WRITE_REG (hw, TXDCTL, txdctl);
*/
txdctl = TXDCTL_PTHRESH_DEFAULT; // prefetch txds below this threshold
txdctl |= (TXDCTL_HTHRESH_DEFAULT // only prefetch if there are this many ready
<< IXGB_TXDCTL_HTHRESH_SHIFT);
IXGB_WRITE_REG (hw, TXDCTL, txdctl);
*/
/* Set the Tx Interrupt Delay register */
...
...
@@ -697,7 +693,7 @@ ixgb_configure_tx(struct ixgb_adapter *adapter)
/* Setup Transmit Descriptor Settings for this adapter */
adapter
->
tx_cmd_type
=
IXGB_TX_DESC_TYPE
|
IXGB_TX_DESC_CMD_RS
IXGB_TX_DESC_TYPE
|
IXGB_TX_DESC_CMD_RS
|
(
adapter
->
tx_int_delay_enable
?
IXGB_TX_DESC_CMD_IDE
:
0
);
}
...
...
@@ -717,20 +713,20 @@ ixgb_setup_rx_resources(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_setup_rx_resources.
\n
"
);
size
=
sizeof
(
struct
ixgb_buffer
)
*
rxdr
->
count
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
rxdr
->
count
;
rxdr
->
buffer_info
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
!
rxdr
->
buffer_info
)
{
if
(
!
rxdr
->
buffer_info
)
{
return
-
ENOMEM
;
}
memset
(
rxdr
->
buffer_info
,
0
,
size
);
/* Round up to nearest 4K */
rxdr
->
size
=
rxdr
->
count
*
sizeof
(
struct
ixgb_rx_desc
);
rxdr
->
size
=
rxdr
->
count
*
sizeof
(
struct
ixgb_rx_desc
);
IXGB_ROUNDUP
(
rxdr
->
size
,
4096
);
rxdr
->
desc
=
pci_alloc_consistent
(
pdev
,
rxdr
->
size
,
&
rxdr
->
dma
);
if
(
!
rxdr
->
desc
)
{
if
(
!
rxdr
->
desc
)
{
IXGB_DBG
(
"pci_alloc_consistent failed.
\n
"
);
kfree
(
rxdr
->
buffer_info
);
return
-
ENOMEM
;
...
...
@@ -764,9 +760,9 @@ 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
;
...
...
@@ -799,7 +795,7 @@ 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
);
uint32_t
rdlen
=
adapter
->
rx_ring
.
count
*
sizeof
(
struct
ixgb_rx_desc
);
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
uint32_t
rctl
;
uint32_t
rxcsum
;
...
...
@@ -823,18 +819,18 @@ ixgb_configure_rx(struct ixgb_adapter *adapter)
IXGB_WRITE_REG
(
hw
,
RDH
,
0
);
IXGB_WRITE_REG
(
hw
,
RDT
,
0
);
{
uint32_t
rxdctl
;
/* 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
);
}
{
uint32_t
rxdctl
;
/* 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
;
uint8_t
poll_threshold
;
/* Poll every rx_int_delay period, if RBD exists
* Receive Backlog Detection is set to <threshold>
...
...
@@ -843,35 +839,34 @@ ixgb_configure_rx(struct ixgb_adapter *adapter)
* min is 0 */
/* polling times are 1 == 0.8192us
2 == 1.6384us
3 == 3.2768us etc
...
511 == 418 us
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 */
#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_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
)
|
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
);
...
...
@@ -902,7 +897,7 @@ ixgb_free_tx_resources(struct ixgb_adapter *adapter)
adapter
->
tx_ring
.
buffer_info
=
NULL
;
pci_free_consistent
(
pdev
,
adapter
->
tx_ring
.
size
,
adapter
->
tx_ring
.
desc
,
adapter
->
tx_ring
.
dma
);
adapter
->
tx_ring
.
dma
);
adapter
->
tx_ring
.
desc
=
NULL
;
}
...
...
@@ -923,13 +918,13 @@ ixgb_clean_tx_ring(struct ixgb_adapter *adapter)
/* Free all the Tx ring sk_buffs */
for
(
i
=
0
;
i
<
adapter
->
tx_ring
.
count
;
i
++
)
{
if
(
adapter
->
tx_ring
.
buffer_info
[
i
].
skb
)
{
for
(
i
=
0
;
i
<
adapter
->
tx_ring
.
count
;
i
++
)
{
if
(
adapter
->
tx_ring
.
buffer_info
[
i
].
skb
)
{
pci_unmap_page
(
pdev
,
adapter
->
tx_ring
.
buffer_info
[
i
].
dma
,
adapter
->
tx_ring
.
buffer_info
[
i
].
length
,
PCI_DMA_TODEVICE
);
adapter
->
tx_ring
.
buffer_info
[
i
].
dma
,
adapter
->
tx_ring
.
buffer_info
[
i
].
length
,
PCI_DMA_TODEVICE
);
dev_kfree_skb
(
adapter
->
tx_ring
.
buffer_info
[
i
].
skb
);
...
...
@@ -937,7 +932,7 @@ ixgb_clean_tx_ring(struct ixgb_adapter *adapter)
}
}
size
=
sizeof
(
struct
ixgb_buffer
)
*
adapter
->
tx_ring
.
count
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
adapter
->
tx_ring
.
count
;
memset
(
adapter
->
tx_ring
.
buffer_info
,
0
,
size
);
/* Zero out the descriptor ring */
...
...
@@ -971,7 +966,7 @@ ixgb_free_rx_resources(struct ixgb_adapter *adapter)
adapter
->
rx_ring
.
buffer_info
=
NULL
;
pci_free_consistent
(
pdev
,
adapter
->
rx_ring
.
size
,
adapter
->
rx_ring
.
desc
,
adapter
->
rx_ring
.
dma
);
adapter
->
rx_ring
.
desc
,
adapter
->
rx_ring
.
dma
);
adapter
->
rx_ring
.
desc
=
NULL
;
}
...
...
@@ -992,13 +987,13 @@ ixgb_clean_rx_ring(struct ixgb_adapter *adapter)
/* Free all the Rx ring sk_buffs */
for
(
i
=
0
;
i
<
adapter
->
rx_ring
.
count
;
i
++
)
{
if
(
adapter
->
rx_ring
.
buffer_info
[
i
].
skb
)
{
for
(
i
=
0
;
i
<
adapter
->
rx_ring
.
count
;
i
++
)
{
if
(
adapter
->
rx_ring
.
buffer_info
[
i
].
skb
)
{
pci_unmap_single
(
pdev
,
adapter
->
rx_ring
.
buffer_info
[
i
].
dma
,
adapter
->
rx_ring
.
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
adapter
->
rx_ring
.
buffer_info
[
i
].
dma
,
adapter
->
rx_ring
.
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
dev_kfree_skb
(
adapter
->
rx_ring
.
buffer_info
[
i
].
skb
);
...
...
@@ -1006,7 +1001,7 @@ ixgb_clean_rx_ring(struct ixgb_adapter *adapter)
}
}
size
=
sizeof
(
struct
ixgb_buffer
)
*
adapter
->
rx_ring
.
count
;
size
=
sizeof
(
struct
ixgb_buffer
)
*
adapter
->
rx_ring
.
count
;
memset
(
adapter
->
rx_ring
.
buffer_info
,
0
,
size
);
/* Zero out the descriptor ring */
...
...
@@ -1045,16 +1040,16 @@ ixgb_set_multi(struct net_device *netdev)
rctl
=
IXGB_READ_REG
(
&
adapter
->
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
{
...
...
@@ -1062,8 +1057,8 @@ 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
);
...
...
@@ -1089,8 +1084,8 @@ 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"
);
adapter
->
link_speed
=
10000
;
...
...
@@ -1099,8 +1094,9 @@ ixgb_watchdog(unsigned long data)
netif_wake_queue
(
netdev
);
}
}
else
{
if
(
netif_carrier_ok
(
netdev
))
{
printk
(
KERN_INFO
"ixgb: %s NIC Link is Down
\n
"
,
netdev
->
name
);
if
(
netif_carrier_ok
(
netdev
))
{
printk
(
KERN_INFO
"ixgb: %s NIC Link is Down
\n
"
,
netdev
->
name
);
adapter
->
link_speed
=
0
;
adapter
->
link_duplex
=
0
;
netif_carrier_off
(
netdev
);
...
...
@@ -1118,17 +1114,19 @@ ixgb_watchdog(unsigned long data)
struct
ixgb_desc_ring
*
txdr
=
&
adapter
->
tx_ring
;
int
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
))
{
IXGB_DBG
(
"ixgb: %s Hung controller? Watchdog stopping queue
\n
"
,
netdev
->
name
);
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
))
{
IXGB_DBG
(
"ixgb: %s Hung controller? Watchdog stopping queue
\n
"
,
netdev
->
name
);
netif_stop_queue
(
netdev
);
}
}
/* generate an interrupt to force clean up of any stragglers */
IXGB_WRITE_REG
(
&
adapter
->
hw
,
ICS
,
IXGB_INT_TXDW
);
IXGB_WRITE_REG
(
&
adapter
->
hw
,
ICS
,
IXGB_INT_TXDW
);
/* Reset the timer */
mod_timer
(
&
adapter
->
watchdog_timer
,
jiffies
+
2
*
HZ
);
...
...
@@ -1152,44 +1150,47 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
int
i
;
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
;
skb
->
nh
.
iph
->
check
=
0
;
skb
->
h
.
th
->
check
=
~
csum_tcpudp_magic
(
skb
->
nh
.
iph
->
saddr
,
skb
->
nh
.
iph
->
daddr
,
0
,
IPPROTO_TCP
,
0
);
skb
->
nh
.
iph
->
daddr
,
0
,
IPPROTO_TCP
,
0
);
ipcss
=
skb
->
nh
.
raw
-
skb
->
data
;
ipcso
=
(
void
*
)
&
(
skb
->
nh
.
iph
->
check
)
-
(
void
*
)
skb
->
data
;
ipcso
=
(
void
*
)
&
(
skb
->
nh
.
iph
->
check
)
-
(
void
*
)
skb
->
data
;
ipcse
=
skb
->
h
.
raw
-
skb
->
data
-
1
;
tucss
=
skb
->
h
.
raw
-
skb
->
data
;
tucso
=
(
void
*
)
&
(
skb
->
h
.
th
->
check
)
-
(
void
*
)
skb
->
data
;
tucso
=
(
void
*
)
&
(
skb
->
h
.
th
->
check
)
-
(
void
*
)
skb
->
data
;
tucse
=
0
;
i
=
adapter
->
tx_ring
.
next_to_use
;
context_desc
=
IXGB_CONTEXT_DESC
(
adapter
->
tx_ring
,
i
);
context_desc
->
ipcss
=
ipcss
;
context_desc
->
ipcso
=
ipcso
;
context_desc
->
ipcse
=
cpu_to_le16
(
ipcse
);
context_desc
->
tucss
=
tucss
;
context_desc
->
tucso
=
tucso
;
context_desc
->
tucse
=
cpu_to_le16
(
tucse
);
context_desc
->
mss
=
cpu_to_le16
(
mss
);
context_desc
->
hdr_len
=
hdr_len
;
context_desc
->
ipcss
=
ipcss
;
context_desc
->
ipcso
=
ipcso
;
context_desc
->
ipcse
=
cpu_to_le16
(
ipcse
);
context_desc
->
tucss
=
tucss
;
context_desc
->
tucso
=
tucso
;
context_desc
->
tucse
=
cpu_to_le16
(
tucse
);
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
)));
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
)));
i
=
(
i
+
1
)
%
adapter
->
tx_ring
.
count
;
adapter
->
tx_ring
.
next_to_use
=
i
;
...
...
@@ -1200,7 +1201,6 @@ ixgb_tso(struct ixgb_adapter *adapter, struct sk_buff *skb)
return
FALSE
;
}
/**
* ixgb_tx_csum - prepare context descriptor for checksum offload.
*
...
...
@@ -1215,7 +1215,7 @@ ixgb_tx_csum(struct ixgb_adapter *adapter, struct sk_buff *skb)
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
;
i
=
adapter
->
tx_ring
.
next_to_use
;
...
...
@@ -1225,14 +1225,13 @@ 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
);
|
IXGB_TX_DESC_CMD_RS
|
IXGB_TX_DESC_CMD_IDE
);
i
=
(
i
+
1
)
%
adapter
->
tx_ring
.
count
;
adapter
->
tx_ring
.
next_to_use
=
i
;
...
...
@@ -1264,13 +1263,13 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb)
offset
=
0
;
while
(
len
)
{
while
(
len
)
{
i
=
(
i
+
1
)
%
tx_ring
->
count
;
size
=
min
(
len
,
adapter
->
max_data_per_txd
);
tx_ring
->
buffer_info
[
i
].
length
=
size
;
tx_ring
->
buffer_info
[
i
].
dma
=
pci_map_single
(
adapter
->
pdev
,
skb
->
data
+
offset
,
size
,
PCI_DMA_TODEVICE
);
PCI_DMA_TODEVICE
);
tx_ring
->
buffer_info
[
i
].
time_stamp
=
jiffies
;
...
...
@@ -1279,21 +1278,21 @@ ixgb_tx_map(struct ixgb_adapter *adapter, struct sk_buff *skb)
count
++
;
}
for
(
f
=
0
;
f
<
skb_shinfo
(
skb
)
->
nr_frags
;
f
++
)
{
for
(
f
=
0
;
f
<
skb_shinfo
(
skb
)
->
nr_frags
;
f
++
)
{
struct
skb_frag_struct
*
frag
;
frag
=
&
skb_shinfo
(
skb
)
->
frags
[
f
];
len
=
frag
->
size
;
offset
=
0
;
while
(
len
)
{
while
(
len
)
{
i
=
(
i
+
1
)
%
tx_ring
->
count
;
size
=
min
(
len
,
adapter
->
max_data_per_txd
);
tx_ring
->
buffer_info
[
i
].
length
=
size
;
tx_ring
->
buffer_info
[
i
].
dma
=
pci_map_page
(
adapter
->
pdev
,
frag
->
page
,
frag
->
page_offset
+
offset
,
size
,
PCI_DMA_TODEVICE
);
frag
->
page_offset
+
offset
,
size
,
PCI_DMA_TODEVICE
);
tx_ring
->
buffer_info
[
i
].
time_stamp
=
jiffies
;
len
-=
size
;
...
...
@@ -1316,7 +1315,8 @@ 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
;
...
...
@@ -1325,21 +1325,21 @@ ixgb_tx_queue(struct ixgb_adapter *adapter, int count, int vlan_id,int tx_flags)
uint8_t
popts
=
0
;
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
--
)
{
tx_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
i
);
tx_desc
->
buff_addr
=
cpu_to_le64
(
tx_ring
->
buffer_info
[
i
].
dma
);
tx_desc
->
cmd_type_len
=
...
...
@@ -1384,35 +1384,35 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
count
=
TXD_USE_COUNT
(
skb
->
len
-
skb
->
data_len
,
adapter
->
max_data_per_txd
);
if
(
count
==
0
)
{
dev_kfree_skb_any
(
skb
);
if
(
count
==
0
)
{
dev_kfree_skb_any
(
skb
);
return
0
;
}
}
for
(
f
=
0
;
f
<
skb_shinfo
(
skb
)
->
nr_frags
;
f
++
)
for
(
f
=
0
;
f
<
skb_shinfo
(
skb
)
->
nr_frags
;
f
++
)
count
+=
TXD_USE_COUNT
(
skb_shinfo
(
skb
)
->
frags
[
f
].
size
,
adapter
->
max_data_per_txd
);
adapter
->
max_data_per_txd
);
#ifdef NETIF_F_TSO
if
((
skb_shinfo
(
skb
)
->
tso_size
)
||
(
skb
->
ip_summed
==
CHECKSUM_HW
))
if
((
skb_shinfo
(
skb
)
->
tso_size
)
||
(
skb
->
ip_summed
==
CHECKSUM_HW
))
count
++
;
#else
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
if
(
skb
->
ip_summed
==
CHECKSUM_HW
)
count
++
;
#endif
if
(
unlikely
(
IXGB_DESC_UNUSED
(
&
adapter
->
tx_ring
)
<
count
))
{
if
(
unlikely
(
IXGB_DESC_UNUSED
(
&
adapter
->
tx_ring
)
<
count
))
{
netif_stop_queue
(
netdev
);
return
1
;
}
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
);
}
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
;
count
=
ixgb_tx_map
(
adapter
,
skb
);
...
...
@@ -1491,44 +1491,45 @@ ixgb_change_mtu(struct net_device *netdev, int new_mtu)
IXGB_DBG
(
"ixgb_change_mtu
\n
"
);
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
{
adapter
->
rx_buffer_len
=
IXGB_RXBUFFER_16384
;
}
if
(
old_mtu
!=
adapter
->
rx_buffer_len
&&
netif_running
(
netdev
))
{
if
(
old_mtu
!=
adapter
->
rx_buffer_len
&&
netif_running
(
netdev
))
{
ixgb_down
(
adapter
,
TRUE
);
ixgb_up
(
adapter
);
}
if
(
adapter
->
hw
.
max_frame_size
!=
max_frame
)
{
if
(
adapter
->
hw
.
max_frame_size
!=
max_frame
)
{
struct
ixgb_hw
*
hw
=
&
adapter
->
hw
;
adapter
->
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
);
}
...
...
@@ -1648,8 +1649,10 @@ ixgb_update_stats(struct ixgb_adapter *adapter)
/* ignore RLEC as it reports errors for padded (<64bytes) frames
* with a length in the type/len field */
adapter
->
net_stats
.
rx_errors
=
/* adapter->stats.rnbc + */
adapter
->
stats
.
crcerrs
+
adapter
->
stats
.
ruc
+
adapter
->
stats
.
roc
/*+ adapter->stats.rlec*/
+
adapter
->
stats
.
icbc
+
/* adapter->stats.rnbc + */
adapter
->
stats
.
crcerrs
+
adapter
->
stats
.
ruc
+
adapter
->
stats
.
roc
/*+ adapter->stats.rlec */
+
adapter
->
stats
.
icbc
+
adapter
->
stats
.
ecbc
+
adapter
->
stats
.
mpc
;
adapter
->
net_stats
.
rx_dropped
=
adapter
->
stats
.
mpc
;
...
...
@@ -1697,10 +1700,10 @@ ixgb_irq_enable(struct ixgb_adapter *adapter)
{
IXGB_DBG
(
"ixgb_irq_enable
\n
"
);
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
);
}
}
...
...
@@ -1728,11 +1731,11 @@ ixgb_intr(int irq, void *data, struct pt_regs *regs)
uint
i
=
IXGB_MAX_INTR
;
boolean_t
rxdmt0
=
FALSE
;
while
(
i
&&
(
icr
=
IXGB_READ_REG
(
hw
,
ICR
)))
{
if
(
icr
&
IXGB_INT_RXDMT0
)
rxdmt0
=
TRUE
;
while
(
i
&&
(
icr
=
IXGB_READ_REG
(
hw
,
ICR
)))
{
if
(
icr
&
IXGB_INT_RXDMT0
)
rxdmt0
=
TRUE
;
if
(
unlikely
(
icr
&
(
IXGB_INT_RXSEQ
|
IXGB_INT_LSC
)))
{
if
(
unlikely
(
icr
&
(
IXGB_INT_RXSEQ
|
IXGB_INT_LSC
)))
{
mod_timer
(
&
adapter
->
watchdog_timer
,
jiffies
);
}
...
...
@@ -1746,13 +1749,13 @@ ixgb_intr(int irq, void *data, struct pt_regs *regs)
/* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to
* set IMS:RXDMT0 to 1 to restart the RBD timer (POLL)
*/
if
(
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
);
if
(
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
// NAPI else
#endif
// NAPI else
}
#ifdef CONFIG_IXGB_NAPI
...
...
@@ -1764,17 +1767,17 @@ ixgb_process_intr(struct net_device *netdev)
int
i
=
IXGB_MAX_INTR
;
int
hasReceived
=
0
;
while
(
i
&&
(
icr
=
IXGB_READ_REG
(
&
adapter
->
hw
,
ICR
)))
{
while
(
i
&&
(
icr
=
IXGB_READ_REG
(
&
adapter
->
hw
,
ICR
)))
{
if
(
icr
&
IXGB_INT_RXT0
)
hasReceived
=
1
;
if
(
!
(
icr
&
~
(
IXGB_INT_RXT0
)))
break
;
if
(
icr
&
(
IXGB_INT_RXSEQ
|
IXGB_INT_LSC
))
{
mod_timer
(
&
adapter
->
watchdog_timer
,
jiffies
);
}
ixgb_clean_tx_irq
(
adapter
);
i
--
;
}
...
...
@@ -1796,24 +1799,24 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
struct
pci_dev
*
pdev
=
adapter
->
pdev
;
int
i
=
adapter
->
tx_ring
.
next_to_clean
;
struct
ixgb_tx_desc
*
tx_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
i
);
while
((
tx_desc
->
status
&
IXGB_TX_DESC_STATUS_DD
))
{
while
((
tx_desc
->
status
&
IXGB_TX_DESC_STATUS_DD
))
{
if
(
tx_desc
->
popts
&
(
IXGB_TX_DESC_POPTS_TXSM
|
IXGB_TX_DESC_POPTS_IXSM
))
adapter
->
hw_csum_tx_good
++
;
if
(
tx_ring
->
buffer_info
[
i
].
dma
)
{
if
(
tx_ring
->
buffer_info
[
i
].
dma
)
{
pci_unmap_page
(
pdev
,
tx_ring
->
buffer_info
[
i
].
dma
,
tx_ring
->
buffer_info
[
i
].
length
,
PCI_DMA_TODEVICE
);
tx_ring
->
buffer_info
[
i
].
dma
=
0
;
}
if
(
tx_ring
->
buffer_info
[
i
].
skb
)
{
if
(
tx_ring
->
buffer_info
[
i
].
skb
)
{
dev_kfree_skb_any
(
tx_ring
->
buffer_info
[
i
].
skb
);
tx_ring
->
buffer_info
[
i
].
skb
=
NULL
;
}
*
(
uint32_t
*
)
&
(
tx_desc
->
status
)
=
0
;
*
(
uint32_t
*
)
&
(
tx_desc
->
status
)
=
0
;
i
=
(
i
+
1
)
%
tx_ring
->
count
;
tx_desc
=
IXGB_TX_DESC
(
*
tx_ring
,
i
);
...
...
@@ -1821,8 +1824,8 @@ ixgb_clean_tx_irq(struct ixgb_adapter *adapter)
tx_ring
->
next_to_clean
=
i
;
if
(
netif_queue_stopped
(
netdev
)
&&
netif_carrier_ok
(
netdev
)
&&
(
IXGB_DESC_UNUSED
(
tx_ring
)
>
IXGB_TX_QUEUE_WAKE
))
{
if
(
netif_queue_stopped
(
netdev
)
&&
netif_carrier_ok
(
netdev
)
&&
(
IXGB_DESC_UNUSED
(
tx_ring
)
>
IXGB_TX_QUEUE_WAKE
))
{
netif_wake_queue
(
netdev
);
}
...
...
@@ -1842,7 +1845,7 @@ ixgb_poll(struct net_device *netdev, int *budget)
int
received
=
0
;
int
rx_work_limit
=
*
budget
;
if
(
rx_work_limit
>
netdev
->
quota
)
if
(
rx_work_limit
>
netdev
->
quota
)
rx_work_limit
=
netdev
->
quota
;
ixgb_process_intr
(
netdev
);
...
...
@@ -1850,19 +1853,19 @@ ixgb_poll(struct net_device *netdev, int *budget)
i
=
rx_ring
->
next_to_clean
;
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
while
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
))
{
if
(
--
rx_work_limit
<
0
)
while
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
))
{
if
(
--
rx_work_limit
<
0
)
goto
not_done
;
pci_unmap_single
(
pdev
,
rx_ring
->
buffer_info
[
i
].
dma
,
rx_ring
->
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
rx_ring
->
buffer_info
[
i
].
dma
,
rx_ring
->
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
skb
=
rx_ring
->
buffer_info
[
i
].
skb
;
length
=
le16_to_cpu
(
rx_desc
->
length
);
if
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_EOP
))
{
if
(
!
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_EOP
))
{
/* All receives must fit into a single buffer */
...
...
@@ -1878,12 +1881,13 @@ ixgb_poll(struct net_device *netdev, int *budget)
continue
;
}
if
(
rx_desc
->
errors
&
(
IXGB_RX_DESC_ERRORS_CE
|
IXGB_RX_DESC_ERRORS_SE
|
IXGB_RX_DESC_ERRORS_P
|
IXGB_RX_DESC_ERRORS_RXE
))
{
if
(
rx_desc
->
errors
&
(
IXGB_RX_DESC_ERRORS_CE
|
IXGB_RX_DESC_ERRORS_SE
|
IXGB_RX_DESC_ERRORS_P
|
IXGB_RX_DESC_ERRORS_RXE
))
{
IXGB_DBG
(
"Receive Errors Reported by Hardware-%x.
\n
"
,
rx_desc
->
errors
);
IXGB_DBG
(
"Receive Errors Reported by Hardware-%x.
\n
"
,
rx_desc
->
errors
);
dev_kfree_skb_irq
(
skb
);
rx_desc
->
status
=
0
;
...
...
@@ -1900,9 +1904,12 @@ ixgb_poll(struct net_device *netdev, int *budget)
ixgb_rx_checksum
(
adapter
,
rx_desc
,
skb
);
skb
->
protocol
=
eth_type_trans
(
skb
,
netdev
);
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
vlan_hwaccel_rx
(
skb
,
adapter
->
vlgrp
,
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
}
else
{
netif_receive_skb
(
skb
);
}
...
...
@@ -1917,11 +1924,11 @@ ixgb_poll(struct net_device *netdev, int *budget)
received
++
;
}
if
(
!
received
)
if
(
!
received
)
received
=
1
;
ixgb_alloc_rx_buffers
(
adapter
);
rx_ring
->
next_to_clean
=
i
;
netdev
->
quota
-=
received
;
*
budget
-=
received
;
...
...
@@ -1932,10 +1939,10 @@ ixgb_poll(struct net_device *netdev, int *budget)
ixgb_irq_enable
(
adapter
);
return
0
;
not_done:
not_done:
ixgb_alloc_rx_buffers
(
adapter
);
rx_ring
->
next_to_clean
=
i
;
netdev
->
quota
-=
received
;
*
budget
-=
received
;
...
...
@@ -1959,24 +1966,23 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
uint32_t
length
;
int
i
;
i
=
rx_ring
->
next_to_clean
;
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
while
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
))
{
while
((
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_DD
))
{
pci_unmap_single
(
pdev
,
rx_ring
->
buffer_info
[
i
].
dma
,
rx_ring
->
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
rx_ring
->
buffer_info
[
i
].
length
,
PCI_DMA_FROMDEVICE
);
skb
=
rx_ring
->
buffer_info
[
i
].
skb
;
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
;
...
...
@@ -1986,12 +1992,13 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
continue
;
}
if
(
unlikely
(
rx_desc
->
errors
&
(
IXGB_RX_DESC_ERRORS_CE
|
IXGB_RX_DESC_ERRORS_SE
|
IXGB_RX_DESC_ERRORS_P
|
IXGB_RX_DESC_ERRORS_RXE
)))
{
if
(
unlikely
(
rx_desc
->
errors
&
(
IXGB_RX_DESC_ERRORS_CE
|
IXGB_RX_DESC_ERRORS_SE
|
IXGB_RX_DESC_ERRORS_P
|
IXGB_RX_DESC_ERRORS_RXE
)))
{
IXGB_DBG
(
"Receive Errors Reported by Hardware-%x.
\n
"
,
rx_desc
->
errors
);
IXGB_DBG
(
"Receive Errors Reported by Hardware-%x.
\n
"
,
rx_desc
->
errors
);
dev_kfree_skb_irq
(
skb
);
rx_desc
->
status
=
0
;
...
...
@@ -2002,15 +2009,18 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
}
/* Good Receive */
skb_put
(
skb
,
length
);
skb_put
(
skb
,
length
);
/* Receive Checksum Offload */
ixgb_rx_checksum
(
adapter
,
rx_desc
,
skb
);
skb
->
protocol
=
eth_type_trans
(
skb
,
netdev
);
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
if
(
adapter
->
vlgrp
&&
(
rx_desc
->
status
&
IXGB_RX_DESC_STATUS_VP
))
{
vlan_hwaccel_rx
(
skb
,
adapter
->
vlgrp
,
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
(
rx_desc
->
special
&
IXGB_RX_DESC_SPECIAL_VLAN_MASK
));
}
else
{
netif_rx
(
skb
);
}
...
...
@@ -2023,8 +2033,7 @@ ixgb_clean_rx_irq(struct ixgb_adapter *adapter)
i
=
(
i
+
1
)
%
rx_ring
->
count
;
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
}
/* while */
}
/* while */
rx_ring
->
next_to_clean
=
i
;
...
...
@@ -2053,23 +2062,22 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
reserve_len
=
2
;
i
=
rx_ring
->
next_to_use
;
cleancount
=
IXGB_DESC_UNUSED
(
rx_ring
);
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
=
adapter
->
raidc
?
4
:
IXGB_RX_BUFFER_WRITE
;
/* leave one descriptor unused */
while
(
--
cleancount
>
0
)
{
while
(
--
cleancount
>
0
)
{
rx_desc
=
IXGB_RX_DESC
(
*
rx_ring
,
i
);
/* allocate a new one */
skb
=
dev_alloc_skb
(
adapter
->
rx_buffer_len
+
reserve_len
);
if
(
unlikely
(
!
skb
))
{
if
(
unlikely
(
!
skb
))
{
/* better luck next time around */
IXGB_DBG
(
"Could not allocate SKB
\n
"
);
break
;
...
...
@@ -2085,12 +2093,12 @@ ixgb_alloc_rx_buffers(struct ixgb_adapter *adapter)
rx_ring
->
buffer_info
[
i
].
skb
=
skb
;
rx_ring
->
buffer_info
[
i
].
length
=
adapter
->
rx_buffer_len
;
rx_ring
->
buffer_info
[
i
].
dma
=
pci_map_single
(
pdev
,
skb
->
data
,
adapter
->
rx_buffer_len
,
PCI_DMA_FROMDEVICE
);
pci_map_single
(
pdev
,
skb
->
data
,
adapter
->
rx_buffer_len
,
PCI_DMA_FROMDEVICE
);
rx_desc
->
buff_addr
=
cpu_to_le64
(
rx_ring
->
buffer_info
[
i
].
dma
);
if
(
!
(
i
%
num_group_tail_writes
))
{
if
(
!
(
i
%
num_group_tail_writes
))
{
/* Force memory writes to complete before letting h/w
* know there are new descriptors to fetch. (Only
* applicable for weak-ordered memory model archs,
...
...
@@ -2143,7 +2151,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
;
...
...
@@ -2203,12 +2211,12 @@ ixgb_vlan_rx_kill_vid(struct net_device *netdev, uint16_t vid)
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
);
...
...
@@ -2225,10 +2233,10 @@ 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
);
}
...
...
@@ -2244,14 +2252,13 @@ ixgb_restore_vlan(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
;
}
...
...
@@ -2259,7 +2266,7 @@ ixgb_rx_checksum(struct ixgb_adapter *adapter,
/* 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
++
;
...
...
@@ -2278,7 +2285,7 @@ ixgb_rx_checksum(struct ixgb_adapter *adapter,
**/
void
ixgb_write_pci_cfg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg
,
uint16_t
*
value
)
ixgb_write_pci_cfg
(
struct
ixgb_hw
*
hw
,
uint32_t
reg
,
uint16_t
*
value
)
{
struct
ixgb_adapter
*
adapter
=
(
struct
ixgb_adapter
*
)
hw
->
back
;
...
...
@@ -2296,19 +2303,18 @@ 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
:
pci_for_each_dev
(
pdev
)
{
if
(
pci_dev_driver
(
pdev
)
==
&
ixgb_driver
)
if
(
pci_dev_driver
(
pdev
)
==
&
ixgb_driver
)
ixgb_suspend
(
pdev
,
3
);
}
}
return
NOTIFY_DONE
;
}
/**
* ixgb_suspend - driver suspend function called from notify.
* @param pdev pci driver structure used for passing to
...
...
@@ -2322,7 +2328,7 @@ ixgb_suspend(struct pci_dev *pdev, uint32_t state)
netif_device_detach
(
netdev
);
if
(
netif_running
(
netdev
))
if
(
netif_running
(
netdev
))
ixgb_down
(
adapter
,
TRUE
);
pci_save_state
(
pdev
,
adapter
->
pci_state
);
...
...
@@ -2334,5 +2340,4 @@ ixgb_suspend(struct pci_dev *pdev, uint32_t state)
return
0
;
}
/* ixgb_main.c */
drivers/net/ixgb/ixgb_osdep.h
View file @
ca247341
...
...
@@ -25,7 +25,6 @@
Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
*******************************************************************************/
/* glue for the OS independant part of ixgb
* includes register access macros
*/
...
...
@@ -52,8 +51,8 @@
#define CMD_MEM_WRT_INVALIDATE PCI_COMMAND_INVALIDATE
typedef
enum
{
FALSE
=
0
,
TRUE
=
1
FALSE
=
0
,
TRUE
=
1
}
boolean_t
;
#define MSGOUT(S, A, B) printk(KERN_DEBUG S "\n", A, B)
...
...
@@ -87,4 +86,4 @@ typedef enum {
#define IXGB_MEMCPY memcpy
#endif
/* IXGB_OSDEP_H */
#endif
/* IXGB_OSDEP_H */
drivers/net/ixgb/ixgb_param.c
View file @
ca247341
...
...
@@ -132,7 +132,6 @@ IXGB_PARAM(RxIntDelay, "Receive Interrupt Delay");
IXGB_PARAM
(
RAIDC
,
"Disable or enable Receive Interrupt Moderation"
);
/* Receive Flow control high threshold (when we send a pause frame)
* (FCRTH)
*
...
...
@@ -143,7 +142,6 @@ IXGB_PARAM(RAIDC, "Disable or enable Receive Interrupt Moderation");
IXGB_PARAM
(
RxFCHighThresh
,
"Receive Flow Control High Threshold"
);
/* Receive Flow control low threshold (when we send a resume frame)
* (FCRTL)
*
...
...
@@ -155,7 +153,6 @@ IXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold");
IXGB_PARAM
(
RxFCLowThresh
,
"Receive Flow Control Low Threshold"
);
/* Flow control request timeout (how long to pause the link partner's tx)
* (PAP 15:0)
*
...
...
@@ -166,7 +163,6 @@ IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold");
IXGB_PARAM
(
FCReqTimeout
,
"Flow Control Request Timeout"
);
/* Transmit Interrupt Delay in units of 0.8192 microseconds
*
* Valid Range: 0-65535
...
...
@@ -213,7 +209,6 @@ IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
#define MIN_FCPAUSE 1
#define MAX_FCPAUSE 0xffff
struct
ixgb_option
{
enum
{
enable_option
,
range_option
,
list_option
}
type
;
char
*
name
;
...
...
@@ -235,10 +230,9 @@ struct ixgb_option {
};
static
int
__devinit
ixgb_validate_option
(
int
*
value
,
struct
ixgb_option
*
opt
)
ixgb_validate_option
(
int
*
value
,
struct
ixgb_option
*
opt
)
{
if
(
*
value
==
OPTION_UNSET
)
{
if
(
*
value
==
OPTION_UNSET
)
{
*
value
=
opt
->
def
;
return
0
;
}
...
...
@@ -255,7 +249,7 @@ ixgb_validate_option(int *value,
}
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
;
}
...
...
@@ -265,10 +259,10 @@ ixgb_validate_option(int *value,
int
i
;
struct
ixgb_opt_list
*
ent
;
for
(
i
=
0
;
i
<
opt
->
arg
.
l
.
nr
;
i
++
)
{
for
(
i
=
0
;
i
<
opt
->
arg
.
l
.
nr
;
i
++
)
{
ent
=
&
opt
->
arg
.
l
.
p
[
i
];
if
(
*
value
==
ent
->
i
)
{
if
(
ent
->
str
[
0
]
!=
'\0'
)
if
(
*
value
==
ent
->
i
)
{
if
(
ent
->
str
[
0
]
!=
'\0'
)
printk
(
KERN_INFO
"%s"
,
ent
->
str
);
return
0
;
...
...
@@ -305,8 +299,9 @@ ixgb_check_options(struct ixgb_adapter *adapter)
IXGB_DBG
(
"ixgb_check_options
\n
"
);
if
(
board
>=
IXGB_MAX_NIC
)
{
printk
(
KERN_NOTICE
"Warning: no configuration for board #%i
\n
"
,
board
);
if
(
board
>=
IXGB_MAX_NIC
)
{
printk
(
KERN_NOTICE
"Warning: no configuration for board #%i
\n
"
,
board
);
printk
(
KERN_NOTICE
"Using defaults for all values
\n
"
);
board
=
IXGB_MAX_NIC
;
}
...
...
@@ -317,7 +312,7 @@ ixgb_check_options(struct ixgb_adapter *adapter)
.
name
=
"Transmit Descriptors"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TXD
),
.
def
=
DEFAULT_TXD
,
.
arg
=
{.
r
=
{.
min
=
MIN_TXD
,
.
max
=
MAX_TXD
}}
.
arg
=
{.
r
=
{.
min
=
MIN_TXD
,
.
max
=
MAX_TXD
}}
};
struct
ixgb_desc_ring
*
tx_ring
=
&
adapter
->
tx_ring
;
...
...
@@ -332,7 +327,7 @@ ixgb_check_options(struct ixgb_adapter *adapter)
.
name
=
"Receive Descriptors"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RXD
),
.
def
=
DEFAULT_RXD
,
.
arg
=
{.
r
=
{.
min
=
MIN_RXD
,
.
max
=
MAX_RXD
}}
.
arg
=
{.
r
=
{.
min
=
MIN_RXD
,
.
max
=
MAX_RXD
}}
};
struct
ixgb_desc_ring
*
rx_ring
=
&
adapter
->
rx_ring
;
...
...
@@ -368,7 +363,7 @@ ixgb_check_options(struct ixgb_adapter *adapter)
}
{
/* Flow Control */
struct
ixgb_opt_list
fc_list
[]
=
{
struct
ixgb_opt_list
fc_list
[]
=
{
{
ixgb_fc_none
,
"Flow Control Disabled
\n
"
},
{
ixgb_fc_rx_pause
,
"Flow Control Receive Only
\n
"
},
{
ixgb_fc_tx_pause
,
"Flow Control Transmit Only
\n
"
},
...
...
@@ -381,59 +376,63 @@ ixgb_check_options(struct ixgb_adapter *adapter)
.
name
=
"Flow Control"
,
.
err
=
"reading default settings from EEPROM"
,
.
def
=
ixgb_fc_full
,
.
arg
=
{.
l
=
{.
nr
=
LIST_LEN
(
fc_list
),
.
p
=
fc_list
}}
.
arg
=
{.
l
=
{.
nr
=
LIST_LEN
(
fc_list
),
.
p
=
fc_list
}}
};
int
fc
=
FlowControl
[
board
];
ixgb_validate_option
(
&
fc
,
&
opt
);
adapter
->
hw
.
fc
.
type
=
fc
;
}
}
{
/* Receive Flow Control High Threshold */
struct
ixgb_option
fcrth
=
{
struct
ixgb_option
fcrth
=
{
.
type
=
range_option
,
.
name
=
"Rx Flow Control High Threshold"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTH
),
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTH
),
.
def
=
DEFAULT_FCRTH
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTH
,
.
max
=
MAX_FCRTH
}}
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTH
,
.
max
=
MAX_FCRTH
}}
};
adapter
->
hw
.
fc
.
high_water
=
RxFCHighThresh
[
board
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
high_water
,
&
fcrth
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCHighThresh when no RxFC
\n
"
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCHighThresh when no RxFC
\n
"
);
}
{
/* Receive Flow Control Low Threshold */
struct
ixgb_option
fcrtl
=
{
struct
ixgb_option
fcrtl
=
{
.
type
=
range_option
,
.
name
=
"Rx Flow Control Low Threshold"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTL
),
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCRTL
),
.
def
=
DEFAULT_FCRTL
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTL
,
.
max
=
MAX_FCRTL
}}
.
arg
=
{.
r
=
{.
min
=
MIN_FCRTL
,
.
max
=
MAX_FCRTL
}}
};
adapter
->
hw
.
fc
.
low_water
=
RxFCLowThresh
[
board
];
ixgb_validate_option
(
&
adapter
->
hw
.
fc
.
low_water
,
&
fcrtl
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCLowThresh when no RxFC
\n
"
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring RxFCLowThresh when no RxFC
\n
"
);
}
{
/* Flow Control Pause Time Request*/
struct
ixgb_option
fcpap
=
{
{
/* Flow Control Pause Time Request
*/
struct
ixgb_option
fcpap
=
{
.
type
=
range_option
,
.
name
=
"Flow Control Pause Time Request"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCPAUSE
),
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_FCPAUSE
),
.
def
=
DEFAULT_FCPAUSE
,
.
arg
=
{.
r
=
{.
min
=
MIN_FCPAUSE
,
.
max
=
MAX_FCPAUSE
}}
.
arg
=
{.
r
=
{.
min
=
MIN_FCPAUSE
,
.
max
=
MAX_FCPAUSE
}}
};
int
pause_time
=
FCReqTimeout
[
board
];
ixgb_validate_option
(
&
pause_time
,
&
fcpap
);
if
(
!
(
adapter
->
hw
.
fc
.
type
&
ixgb_fc_rx_pause
)
)
printk
(
KERN_INFO
"Ignoring FCReqTimeout when no RxFC
\n
"
);
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
;
}
/* high low and spacing check for rx flow control thresholds */
...
...
@@ -441,20 +440,21 @@ ixgb_check_options(struct ixgb_adapter *adapter)
/* 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 */
struct
ixgb_option
opt
=
{
.
type
=
range_option
,
.
name
=
"Receive Interrupt Delay"
,
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RDTR
),
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_RDTR
),
.
def
=
DEFAULT_RDTR
,
.
arg
=
{.
r
=
{.
min
=
MIN_RDTR
,
.
max
=
MAX_RDTR
}}
.
arg
=
{.
r
=
{.
min
=
MIN_RDTR
,
.
max
=
MAX_RDTR
}}
};
adapter
->
rx_int_delay
=
RxIntDelay
[
board
];
...
...
@@ -473,20 +473,21 @@ ixgb_check_options(struct ixgb_adapter *adapter)
adapter
->
raidc
=
raidc
;
}
{
/* 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
),
.
err
=
"using default of "
__MODULE_STRING
(
DEFAULT_TIDV
),
.
def
=
DEFAULT_TIDV
,
.
arg
=
{.
r
=
{.
min
=
MIN_TIDV
,
.
max
=
MAX_TIDV
}}
.
arg
=
{.
r
=
{.
min
=
MIN_TIDV
,
.
max
=
MAX_TIDV
}}
};
adapter
->
tx_int_delay
=
TxIntDelay
[
board
];
ixgb_validate_option
(
&
adapter
->
tx_int_delay
,
&
opt
);
}
{
/* Transmit Interrupt Delay Enable */
{
/* Transmit Interrupt Delay Enable */
struct
ixgb_option
opt
=
{
.
type
=
enable_option
,
.
name
=
"Tx Interrupt Delay Enable"
,
...
...
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