Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
4c844d97
Commit
4c844d97
authored
Apr 06, 2011
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-davem' of
git://git.kernel.org/pub/scm/linux/kernel/git/bwh/sfc-next-2.6
parents
66ee33bf
c5e129ac
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
223 additions
and
149 deletions
+223
-149
drivers/net/sfc/efx.c
drivers/net/sfc/efx.c
+17
-3
drivers/net/sfc/ethtool.c
drivers/net/sfc/ethtool.c
+18
-88
drivers/net/sfc/net_driver.h
drivers/net/sfc/net_driver.h
+0
-2
drivers/net/sfc/nic.c
drivers/net/sfc/nic.c
+2
-4
drivers/net/sfc/rx.c
drivers/net/sfc/rx.c
+3
-0
include/linux/ethtool.h
include/linux/ethtool.h
+130
-50
net/core/ethtool.c
net/core/ethtool.c
+53
-2
No files found.
drivers/net/sfc/efx.c
View file @
4c844d97
...
@@ -1874,6 +1874,17 @@ static void efx_set_multicast_list(struct net_device *net_dev)
...
@@ -1874,6 +1874,17 @@ static void efx_set_multicast_list(struct net_device *net_dev)
/* Otherwise efx_start_port() will do this */
/* Otherwise efx_start_port() will do this */
}
}
static
int
efx_set_features
(
struct
net_device
*
net_dev
,
u32
data
)
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
/* If disabling RX n-tuple filtering, clear existing filters */
if
(
net_dev
->
features
&
~
data
&
NETIF_F_NTUPLE
)
efx_filter_clear_rx
(
efx
,
EFX_FILTER_PRI_MANUAL
);
return
0
;
}
static
const
struct
net_device_ops
efx_netdev_ops
=
{
static
const
struct
net_device_ops
efx_netdev_ops
=
{
.
ndo_open
=
efx_net_open
,
.
ndo_open
=
efx_net_open
,
.
ndo_stop
=
efx_net_stop
,
.
ndo_stop
=
efx_net_stop
,
...
@@ -1885,6 +1896,7 @@ static const struct net_device_ops efx_netdev_ops = {
...
@@ -1885,6 +1896,7 @@ static const struct net_device_ops efx_netdev_ops = {
.
ndo_change_mtu
=
efx_change_mtu
,
.
ndo_change_mtu
=
efx_change_mtu
,
.
ndo_set_mac_address
=
efx_set_mac_address
,
.
ndo_set_mac_address
=
efx_set_mac_address
,
.
ndo_set_multicast_list
=
efx_set_multicast_list
,
.
ndo_set_multicast_list
=
efx_set_multicast_list
,
.
ndo_set_features
=
efx_set_features
,
#ifdef CONFIG_NET_POLL_CONTROLLER
#ifdef CONFIG_NET_POLL_CONTROLLER
.
ndo_poll_controller
=
efx_netpoll
,
.
ndo_poll_controller
=
efx_netpoll
,
#endif
#endif
...
@@ -2269,7 +2281,6 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,
...
@@ -2269,7 +2281,6 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type,
strlcpy
(
efx
->
name
,
pci_name
(
pci_dev
),
sizeof
(
efx
->
name
));
strlcpy
(
efx
->
name
,
pci_name
(
pci_dev
),
sizeof
(
efx
->
name
));
efx
->
net_dev
=
net_dev
;
efx
->
net_dev
=
net_dev
;
efx
->
rx_checksum_enabled
=
true
;
spin_lock_init
(
&
efx
->
stats_lock
);
spin_lock_init
(
&
efx
->
stats_lock
);
mutex_init
(
&
efx
->
mac_lock
);
mutex_init
(
&
efx
->
mac_lock
);
efx
->
mac_op
=
type
->
default_mac_ops
;
efx
->
mac_op
=
type
->
default_mac_ops
;
...
@@ -2452,12 +2463,15 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
...
@@ -2452,12 +2463,15 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
return
-
ENOMEM
;
return
-
ENOMEM
;
net_dev
->
features
|=
(
type
->
offload_features
|
NETIF_F_SG
|
net_dev
->
features
|=
(
type
->
offload_features
|
NETIF_F_SG
|
NETIF_F_HIGHDMA
|
NETIF_F_TSO
|
NETIF_F_HIGHDMA
|
NETIF_F_TSO
|
NETIF_F_
GRO
);
NETIF_F_
RXCSUM
);
if
(
type
->
offload_features
&
NETIF_F_V6_CSUM
)
if
(
type
->
offload_features
&
NETIF_F_V6_CSUM
)
net_dev
->
features
|=
NETIF_F_TSO6
;
net_dev
->
features
|=
NETIF_F_TSO6
;
/* Mask for features that also apply to VLAN devices */
/* Mask for features that also apply to VLAN devices */
net_dev
->
vlan_features
|=
(
NETIF_F_ALL_CSUM
|
NETIF_F_SG
|
net_dev
->
vlan_features
|=
(
NETIF_F_ALL_CSUM
|
NETIF_F_SG
|
NETIF_F_HIGHDMA
|
NETIF_F_TSO
);
NETIF_F_HIGHDMA
|
NETIF_F_ALL_TSO
|
NETIF_F_RXCSUM
);
/* All offloads can be toggled */
net_dev
->
hw_features
=
net_dev
->
features
&
~
NETIF_F_HIGHDMA
;
efx
=
netdev_priv
(
net_dev
);
efx
=
netdev_priv
(
net_dev
);
pci_set_drvdata
(
pci_dev
,
efx
);
pci_set_drvdata
(
pci_dev
,
efx
);
SET_NETDEV_DEV
(
net_dev
,
&
pci_dev
->
dev
);
SET_NETDEV_DEV
(
net_dev
,
&
pci_dev
->
dev
);
...
...
drivers/net/sfc/ethtool.c
View file @
4c844d97
...
@@ -178,19 +178,27 @@ static struct efx_ethtool_stat efx_ethtool_stats[] = {
...
@@ -178,19 +178,27 @@ static struct efx_ethtool_stat efx_ethtool_stats[] = {
*/
*/
/* Identify device by flashing LEDs */
/* Identify device by flashing LEDs */
static
int
efx_ethtool_phys_id
(
struct
net_device
*
net_dev
,
u32
count
)
static
int
efx_ethtool_phys_id
(
struct
net_device
*
net_dev
,
enum
ethtool_phys_id_state
state
)
{
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
enum
efx_led_mode
mode
;
do
{
switch
(
state
)
{
efx
->
type
->
set_id_led
(
efx
,
EFX_LED_ON
);
case
ETHTOOL_ID_ON
:
schedule_timeout_interruptible
(
HZ
/
2
);
mode
=
EFX_LED_ON
;
break
;
efx
->
type
->
set_id_led
(
efx
,
EFX_LED_OFF
);
case
ETHTOOL_ID_OFF
:
schedule_timeout_interruptible
(
HZ
/
2
);
mode
=
EFX_LED_OFF
;
}
while
(
!
signal_pending
(
current
)
&&
--
count
!=
0
);
break
;
case
ETHTOOL_ID_INACTIVE
:
mode
=
EFX_LED_DEFAULT
;
break
;
default:
return
-
EINVAL
;
}
efx
->
type
->
set_id_led
(
efx
,
EFX_LED_DEFAULT
);
efx
->
type
->
set_id_led
(
efx
,
mode
);
return
0
;
return
0
;
}
}
...
@@ -518,72 +526,6 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
...
@@ -518,72 +526,6 @@ static void efx_ethtool_get_stats(struct net_device *net_dev,
}
}
}
}
static
int
efx_ethtool_set_tso
(
struct
net_device
*
net_dev
,
u32
enable
)
{
struct
efx_nic
*
efx
__attribute__
((
unused
))
=
netdev_priv
(
net_dev
);
u32
features
;
features
=
NETIF_F_TSO
;
if
(
efx
->
type
->
offload_features
&
NETIF_F_V6_CSUM
)
features
|=
NETIF_F_TSO6
;
if
(
enable
)
net_dev
->
features
|=
features
;
else
net_dev
->
features
&=
~
features
;
return
0
;
}
static
int
efx_ethtool_set_tx_csum
(
struct
net_device
*
net_dev
,
u32
enable
)
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
u32
features
=
efx
->
type
->
offload_features
&
NETIF_F_ALL_CSUM
;
if
(
enable
)
net_dev
->
features
|=
features
;
else
net_dev
->
features
&=
~
features
;
return
0
;
}
static
int
efx_ethtool_set_rx_csum
(
struct
net_device
*
net_dev
,
u32
enable
)
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
/* No way to stop the hardware doing the checks; we just
* ignore the result.
*/
efx
->
rx_checksum_enabled
=
!!
enable
;
return
0
;
}
static
u32
efx_ethtool_get_rx_csum
(
struct
net_device
*
net_dev
)
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
return
efx
->
rx_checksum_enabled
;
}
static
int
efx_ethtool_set_flags
(
struct
net_device
*
net_dev
,
u32
data
)
{
struct
efx_nic
*
efx
=
netdev_priv
(
net_dev
);
u32
supported
=
(
efx
->
type
->
offload_features
&
(
ETH_FLAG_RXHASH
|
ETH_FLAG_NTUPLE
));
int
rc
;
rc
=
ethtool_op_set_flags
(
net_dev
,
data
,
supported
);
if
(
rc
)
return
rc
;
if
(
!
(
data
&
ETH_FLAG_NTUPLE
))
efx_filter_clear_rx
(
efx
,
EFX_FILTER_PRI_MANUAL
);
return
0
;
}
static
void
efx_ethtool_self_test
(
struct
net_device
*
net_dev
,
static
void
efx_ethtool_self_test
(
struct
net_device
*
net_dev
,
struct
ethtool_test
*
test
,
u64
*
data
)
struct
ethtool_test
*
test
,
u64
*
data
)
{
{
...
@@ -1070,22 +1012,10 @@ const struct ethtool_ops efx_ethtool_ops = {
...
@@ -1070,22 +1012,10 @@ const struct ethtool_ops efx_ethtool_ops = {
.
set_ringparam
=
efx_ethtool_set_ringparam
,
.
set_ringparam
=
efx_ethtool_set_ringparam
,
.
get_pauseparam
=
efx_ethtool_get_pauseparam
,
.
get_pauseparam
=
efx_ethtool_get_pauseparam
,
.
set_pauseparam
=
efx_ethtool_set_pauseparam
,
.
set_pauseparam
=
efx_ethtool_set_pauseparam
,
.
get_rx_csum
=
efx_ethtool_get_rx_csum
,
.
set_rx_csum
=
efx_ethtool_set_rx_csum
,
.
get_tx_csum
=
ethtool_op_get_tx_csum
,
/* Need to enable/disable IPv6 too */
.
set_tx_csum
=
efx_ethtool_set_tx_csum
,
.
get_sg
=
ethtool_op_get_sg
,
.
set_sg
=
ethtool_op_set_sg
,
.
get_tso
=
ethtool_op_get_tso
,
/* Need to enable/disable TSO-IPv6 too */
.
set_tso
=
efx_ethtool_set_tso
,
.
get_flags
=
ethtool_op_get_flags
,
.
set_flags
=
efx_ethtool_set_flags
,
.
get_sset_count
=
efx_ethtool_get_sset_count
,
.
get_sset_count
=
efx_ethtool_get_sset_count
,
.
self_test
=
efx_ethtool_self_test
,
.
self_test
=
efx_ethtool_self_test
,
.
get_strings
=
efx_ethtool_get_strings
,
.
get_strings
=
efx_ethtool_get_strings
,
.
phys_id
=
efx_ethtool_phys_id
,
.
set_
phys_id
=
efx_ethtool_phys_id
,
.
get_ethtool_stats
=
efx_ethtool_get_stats
,
.
get_ethtool_stats
=
efx_ethtool_get_stats
,
.
get_wol
=
efx_ethtool_get_wol
,
.
get_wol
=
efx_ethtool_get_wol
,
.
set_wol
=
efx_ethtool_set_wol
,
.
set_wol
=
efx_ethtool_set_wol
,
...
...
drivers/net/sfc/net_driver.h
View file @
4c844d97
...
@@ -681,7 +681,6 @@ struct efx_filter_state;
...
@@ -681,7 +681,6 @@ struct efx_filter_state;
* @port_inhibited: If set, the netif_carrier is always off. Hold the mac_lock
* @port_inhibited: If set, the netif_carrier is always off. Hold the mac_lock
* @port_initialized: Port initialized?
* @port_initialized: Port initialized?
* @net_dev: Operating system network device. Consider holding the rtnl lock
* @net_dev: Operating system network device. Consider holding the rtnl lock
* @rx_checksum_enabled: RX checksumming enabled
* @stats_buffer: DMA buffer for statistics
* @stats_buffer: DMA buffer for statistics
* @mac_op: MAC interface
* @mac_op: MAC interface
* @phy_type: PHY type
* @phy_type: PHY type
...
@@ -771,7 +770,6 @@ struct efx_nic {
...
@@ -771,7 +770,6 @@ struct efx_nic {
bool
port_initialized
;
bool
port_initialized
;
struct
net_device
*
net_dev
;
struct
net_device
*
net_dev
;
bool
rx_checksum_enabled
;
struct
efx_buffer
stats_buffer
;
struct
efx_buffer
stats_buffer
;
...
...
drivers/net/sfc/nic.c
View file @
4c844d97
...
@@ -850,7 +850,6 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
...
@@ -850,7 +850,6 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
unsigned
expected_ptr
;
unsigned
expected_ptr
;
bool
rx_ev_pkt_ok
,
discard
=
false
,
checksummed
;
bool
rx_ev_pkt_ok
,
discard
=
false
,
checksummed
;
struct
efx_rx_queue
*
rx_queue
;
struct
efx_rx_queue
*
rx_queue
;
struct
efx_nic
*
efx
=
channel
->
efx
;
/* Basic packet information */
/* Basic packet information */
rx_ev_byte_cnt
=
EFX_QWORD_FIELD
(
*
event
,
FSF_AZ_RX_EV_BYTE_CNT
);
rx_ev_byte_cnt
=
EFX_QWORD_FIELD
(
*
event
,
FSF_AZ_RX_EV_BYTE_CNT
);
...
@@ -873,9 +872,8 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
...
@@ -873,9 +872,8 @@ efx_handle_rx_event(struct efx_channel *channel, const efx_qword_t *event)
* UDP/IP, then we can rely on the hardware checksum.
* UDP/IP, then we can rely on the hardware checksum.
*/
*/
checksummed
=
checksummed
=
likely
(
efx
->
rx_checksum_enabled
)
&&
rx_ev_hdr_type
==
FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP
||
(
rx_ev_hdr_type
==
FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_TCP
||
rx_ev_hdr_type
==
FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP
;
rx_ev_hdr_type
==
FSE_CZ_RX_EV_HDR_TYPE_IPV4V6_UDP
);
}
else
{
}
else
{
efx_handle_rx_not_ok
(
rx_queue
,
event
,
&
rx_ev_pkt_ok
,
&
discard
);
efx_handle_rx_not_ok
(
rx_queue
,
event
,
&
rx_ev_pkt_ok
,
&
discard
);
checksummed
=
false
;
checksummed
=
false
;
...
...
drivers/net/sfc/rx.c
View file @
4c844d97
...
@@ -605,6 +605,9 @@ void __efx_rx_packet(struct efx_channel *channel,
...
@@ -605,6 +605,9 @@ void __efx_rx_packet(struct efx_channel *channel,
skb_record_rx_queue
(
skb
,
channel
->
channel
);
skb_record_rx_queue
(
skb
,
channel
->
channel
);
}
}
if
(
unlikely
(
!
(
efx
->
net_dev
->
features
&
NETIF_F_RXCSUM
)))
checksummed
=
false
;
if
(
likely
(
checksummed
||
rx_buf
->
is_page
))
{
if
(
likely
(
checksummed
||
rx_buf
->
is_page
))
{
efx_rx_packet_gro
(
channel
,
rx_buf
,
eh
,
checksummed
);
efx_rx_packet_gro
(
channel
,
rx_buf
,
eh
,
checksummed
);
return
;
return
;
...
...
include/linux/ethtool.h
View file @
4c844d97
...
@@ -663,6 +663,22 @@ struct ethtool_rx_ntuple_list {
...
@@ -663,6 +663,22 @@ struct ethtool_rx_ntuple_list {
unsigned
int
count
;
unsigned
int
count
;
};
};
/**
* enum ethtool_phys_id_state - indicator state for physical identification
* @ETHTOOL_ID_INACTIVE: Physical ID indicator should be deactivated
* @ETHTOOL_ID_ACTIVE: Physical ID indicator should be activated
* @ETHTOOL_ID_ON: LED should be turned on (used iff %ETHTOOL_ID_ACTIVE
* is not supported)
* @ETHTOOL_ID_OFF: LED should be turned off (used iff %ETHTOOL_ID_ACTIVE
* is not supported)
*/
enum
ethtool_phys_id_state
{
ETHTOOL_ID_INACTIVE
,
ETHTOOL_ID_ACTIVE
,
ETHTOOL_ID_ON
,
ETHTOOL_ID_OFF
};
struct
net_device
;
struct
net_device
;
/* Some generic methods drivers may use in their ethtool_ops */
/* Some generic methods drivers may use in their ethtool_ops */
...
@@ -683,63 +699,126 @@ void ethtool_ntuple_flush(struct net_device *dev);
...
@@ -683,63 +699,126 @@ void ethtool_ntuple_flush(struct net_device *dev);
bool
ethtool_invalid_flags
(
struct
net_device
*
dev
,
u32
data
,
u32
supported
);
bool
ethtool_invalid_flags
(
struct
net_device
*
dev
,
u32
data
,
u32
supported
);
/**
/**
* ðtool_ops - Alter and report network device settings
* struct ethtool_ops - optional netdev operations
* get_settings: Get device-specific settings
* @get_settings: Get various device settings including Ethernet link
* set_settings: Set device-specific settings
* settings. Returns a negative error code or zero.
* get_drvinfo: Report driver information
* @set_settings: Set various device settings including Ethernet link
* get_regs: Get device registers
* settings. Returns a negative error code or zero.
* get_wol: Report whether Wake-on-Lan is enabled
* @get_drvinfo: Report driver/device information. Should only set the
* set_wol: Turn Wake-on-Lan on or off
* @driver, @version, @fw_version and @bus_info fields. If not
* get_msglevel: Report driver message level
* implemented, the @driver and @bus_info fields will be filled in
* set_msglevel: Set driver message level
* according to the netdev's parent device.
* nway_reset: Restart autonegotiation
* @get_regs_len: Get buffer length required for @get_regs
* get_link: Get link status
* @get_regs: Get device registers
* get_eeprom: Read data from the device EEPROM
* @get_wol: Report whether Wake-on-Lan is enabled
* set_eeprom: Write data to the device EEPROM
* @set_wol: Turn Wake-on-Lan on or off. Returns a negative error code
* get_coalesce: Get interrupt coalescing parameters
* or zero.
* set_coalesce: Set interrupt coalescing parameters
* @get_msglevel: Report driver message level. This should be the value
* get_ringparam: Report ring sizes
* of the @msg_enable field used by netif logging functions.
* set_ringparam: Set ring sizes
* @set_msglevel: Set driver message level
* get_pauseparam: Report pause parameters
* @nway_reset: Restart autonegotiation. Returns a negative error code
* set_pauseparam: Set pause parameters
* or zero.
* get_rx_csum: Report whether receive checksums are turned on or off
* @get_link: Report whether physical link is up. Will only be called if
* set_rx_csum: Turn receive checksum on or off
* the netdev is up. Should usually be set to ethtool_op_get_link(),
* get_tx_csum: Report whether transmit checksums are turned on or off
* which uses netif_carrier_ok().
* set_tx_csum: Turn transmit checksums on or off
* @get_eeprom: Read data from the device EEPROM.
* get_sg: Report whether scatter-gather is enabled
* set_sg: Turn scatter-gather on or off
* get_tso: Report whether TCP segmentation offload is enabled
* set_tso: Turn TCP segmentation offload on or off
* get_ufo: Report whether UDP fragmentation offload is enabled
* set_ufo: Turn UDP fragmentation offload on or off
* self_test: Run specified self-tests
* get_strings: Return a set of strings that describe the requested objects
* phys_id: Identify the device
* get_stats: Return statistics about the device
* get_flags: get 32-bit flags bitmap
* set_flags: set 32-bit flags bitmap
*
* Description:
*
* get_settings:
* @get_settings is passed an ðtool_cmd to fill in. It returns
* an negative errno or zero.
*
* set_settings:
* @set_settings is passed an ðtool_cmd and should attempt to set
* all the settings this device supports. It may return an error value
* if something goes wrong (otherwise 0).
*
* get_eeprom:
* Should fill in the magic field. Don't need to check len for zero
* Should fill in the magic field. Don't need to check len for zero
* or wraparound. Fill in the data argument with the eeprom values
* or wraparound. Fill in the data argument with the eeprom values
* from offset to offset + len. Update len to the amount read.
* from offset to offset + len. Update len to the amount read.
* Returns an error or zero.
* Returns an error or zero.
*
* @set_eeprom: Write data to the device EEPROM.
* set_eeprom:
* Should validate the magic field. Don't need to check len for zero
* Should validate the magic field. Don't need to check len for zero
* or wraparound. Update len to the amount written. Returns an error
* or wraparound. Update len to the amount written. Returns an error
* or zero.
* or zero.
* @get_coalesce: Get interrupt coalescing parameters. Returns a negative
* error code or zero.
* @set_coalesce: Set interrupt coalescing parameters. Returns a negative
* error code or zero.
* @get_ringparam: Report ring sizes
* @set_ringparam: Set ring sizes. Returns a negative error code or zero.
* @get_pauseparam: Report pause parameters
* @set_pauseparam: Set pause parameters. Returns a negative error code
* or zero.
* @get_rx_csum: Deprecated in favour of the netdev feature %NETIF_F_RXCSUM.
* Report whether receive checksums are turned on or off.
* @set_rx_csum: Deprecated in favour of generic netdev features. Turn
* receive checksum on or off. Returns a negative error code or zero.
* @get_tx_csum: Deprecated as redundant. Report whether transmit checksums
* are turned on or off.
* @set_tx_csum: Deprecated in favour of generic netdev features. Turn
* transmit checksums on or off. Returns a egative error code or zero.
* @get_sg: Deprecated as redundant. Report whether scatter-gather is
* enabled.
* @set_sg: Deprecated in favour of generic netdev features. Turn
* scatter-gather on or off. Returns a negative error code or zero.
* @get_tso: Deprecated as redundant. Report whether TCP segmentation
* offload is enabled.
* @set_tso: Deprecated in favour of generic netdev features. Turn TCP
* segmentation offload on or off. Returns a negative error code or zero.
* @self_test: Run specified self-tests
* @get_strings: Return a set of strings that describe the requested objects
* @set_phys_id: Identify the physical devices, e.g. by flashing an LED
* attached to it. The implementation may update the indicator
* asynchronously or synchronously, but in either case it must return
* quickly. It is initially called with the argument %ETHTOOL_ID_ACTIVE,
* and must either activate asynchronous updates or return -%EINVAL.
* If it returns -%EINVAL then it will be called again at intervals with
* argument %ETHTOOL_ID_ON or %ETHTOOL_ID_OFF and should set the state of
* the indicator accordingly. Finally, it is called with the argument
* %ETHTOOL_ID_INACTIVE and must deactivate the indicator. Returns a
* negative error code or zero.
* @phys_id: Deprecated in favour of @set_phys_id.
* Identify the physical device, e.g. by flashing an LED
* attached to it until interrupted by a signal or the given time
* (in seconds) elapses. If the given time is zero, use a default
* time limit. Returns a negative error code or zero. Being
* interrupted by a signal is not an error.
* @get_ethtool_stats: Return extended statistics about the device.
* This is only useful if the device maintains statistics not
* included in &struct rtnl_link_stats64.
* @begin: Function to be called before any other operation. Returns a
* negative error code or zero.
* @complete: Function to be called after any other operation except
* @begin. Will be called even if the other operation failed.
* @get_ufo: Deprecated as redundant. Report whether UDP fragmentation
* offload is enabled.
* @set_ufo: Deprecated in favour of generic netdev features. Turn UDP
* fragmentation offload on or off. Returns a negative error code or zero.
* @get_flags: Deprecated as redundant. Report features included in
* &enum ethtool_flags that are enabled.
* @set_flags: Deprecated in favour of generic netdev features. Turn
* features included in &enum ethtool_flags on or off. Returns a
* negative error code or zero.
* @get_priv_flags: Report driver-specific feature flags.
* @set_priv_flags: Set driver-specific feature flags. Returns a negative
* error code or zero.
* @get_sset_count: Get number of strings that @get_strings will write.
* @get_rxnfc: Get RX flow classification rules. Returns a negative
* error code or zero.
* @set_rxnfc: Set RX flow classification rules. Returns a negative
* error code or zero.
* @flash_device: Write a firmware image to device's flash memory.
* Returns a negative error code or zero.
* @reset: Reset (part of) the device, as specified by a bitmask of
* flags from &enum ethtool_reset_flags. Returns a negative
* error code or zero.
* @set_rx_ntuple: Set an RX n-tuple rule. Returns a negative error code
* or zero.
* @get_rx_ntuple: Deprecated.
* @get_rxfh_indir: Get the contents of the RX flow hash indirection table.
* Returns a negative error code or zero.
* @set_rxfh_indir: Set the contents of the RX flow hash indirection table.
* Returns a negative error code or zero.
*
* All operations are optional (i.e. the function pointer may be set
* to %NULL) and callers must take this into account. Callers must
* hold the RTNL, except that for @get_drvinfo the caller may or may
* not hold the RTNL.
*
* See the structures used by these operations for further documentation.
*
* See &struct net_device and &struct net_device_ops for documentation
* of the generic netdev features interface.
*/
*/
struct
ethtool_ops
{
struct
ethtool_ops
{
int
(
*
get_settings
)(
struct
net_device
*
,
struct
ethtool_cmd
*
);
int
(
*
get_settings
)(
struct
net_device
*
,
struct
ethtool_cmd
*
);
...
@@ -778,6 +857,7 @@ struct ethtool_ops {
...
@@ -778,6 +857,7 @@ struct ethtool_ops {
int
(
*
set_tso
)(
struct
net_device
*
,
u32
);
int
(
*
set_tso
)(
struct
net_device
*
,
u32
);
void
(
*
self_test
)(
struct
net_device
*
,
struct
ethtool_test
*
,
u64
*
);
void
(
*
self_test
)(
struct
net_device
*
,
struct
ethtool_test
*
,
u64
*
);
void
(
*
get_strings
)(
struct
net_device
*
,
u32
stringset
,
u8
*
);
void
(
*
get_strings
)(
struct
net_device
*
,
u32
stringset
,
u8
*
);
int
(
*
set_phys_id
)(
struct
net_device
*
,
enum
ethtool_phys_id_state
);
int
(
*
phys_id
)(
struct
net_device
*
,
u32
);
int
(
*
phys_id
)(
struct
net_device
*
,
u32
);
void
(
*
get_ethtool_stats
)(
struct
net_device
*
,
void
(
*
get_ethtool_stats
)(
struct
net_device
*
,
struct
ethtool_stats
*
,
u64
*
);
struct
ethtool_stats
*
,
u64
*
);
...
...
net/core/ethtool.c
View file @
4c844d97
...
@@ -21,6 +21,8 @@
...
@@ -21,6 +21,8 @@
#include <linux/uaccess.h>
#include <linux/uaccess.h>
#include <linux/vmalloc.h>
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/rtnetlink.h>
#include <linux/sched.h>
/*
/*
* Some useful ethtool_ops methods that're device independent.
* Some useful ethtool_ops methods that're device independent.
...
@@ -1618,14 +1620,63 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
...
@@ -1618,14 +1620,63 @@ static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
static
int
ethtool_phys_id
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
static
int
ethtool_phys_id
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
{
{
struct
ethtool_value
id
;
struct
ethtool_value
id
;
static
bool
busy
;
int
rc
;
if
(
!
dev
->
ethtool_ops
->
phys_id
)
if
(
!
dev
->
ethtool_ops
->
set_phys_id
&&
!
dev
->
ethtool_ops
->
phys_id
)
return
-
EOPNOTSUPP
;
return
-
EOPNOTSUPP
;
if
(
busy
)
return
-
EBUSY
;
if
(
copy_from_user
(
&
id
,
useraddr
,
sizeof
(
id
)))
if
(
copy_from_user
(
&
id
,
useraddr
,
sizeof
(
id
)))
return
-
EFAULT
;
return
-
EFAULT
;
return
dev
->
ethtool_ops
->
phys_id
(
dev
,
id
.
data
);
if
(
!
dev
->
ethtool_ops
->
set_phys_id
)
/* Do it the old way */
return
dev
->
ethtool_ops
->
phys_id
(
dev
,
id
.
data
);
rc
=
dev
->
ethtool_ops
->
set_phys_id
(
dev
,
ETHTOOL_ID_ACTIVE
);
if
(
rc
&&
rc
!=
-
EINVAL
)
return
rc
;
/* Drop the RTNL lock while waiting, but prevent reentry or
* removal of the device.
*/
busy
=
true
;
dev_hold
(
dev
);
rtnl_unlock
();
if
(
rc
==
0
)
{
/* Driver will handle this itself */
schedule_timeout_interruptible
(
id
.
data
?
id
.
data
:
MAX_SCHEDULE_TIMEOUT
);
}
else
{
/* Driver expects to be called periodically */
do
{
rtnl_lock
();
rc
=
dev
->
ethtool_ops
->
set_phys_id
(
dev
,
ETHTOOL_ID_ON
);
rtnl_unlock
();
if
(
rc
)
break
;
schedule_timeout_interruptible
(
HZ
/
2
);
rtnl_lock
();
rc
=
dev
->
ethtool_ops
->
set_phys_id
(
dev
,
ETHTOOL_ID_OFF
);
rtnl_unlock
();
if
(
rc
)
break
;
schedule_timeout_interruptible
(
HZ
/
2
);
}
while
(
!
signal_pending
(
current
)
&&
(
id
.
data
==
0
||
--
id
.
data
!=
0
));
}
rtnl_lock
();
dev_put
(
dev
);
busy
=
false
;
(
void
)
dev
->
ethtool_ops
->
set_phys_id
(
dev
,
ETHTOOL_ID_INACTIVE
);
return
rc
;
}
}
static
int
ethtool_get_stats
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
static
int
ethtool_get_stats
(
struct
net_device
*
dev
,
void
__user
*
useraddr
)
...
...
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