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
89c64d75
Commit
89c64d75
authored
May 15, 2011
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
parents
4dc6ec26
4f6290cf
Changes
13
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
793 additions
and
486 deletions
+793
-486
drivers/net/e1000e/lib.c
drivers/net/e1000e/lib.c
+2
-2
drivers/net/ixgbe/ixgbe.h
drivers/net/ixgbe/ixgbe.h
+62
-48
drivers/net/ixgbe/ixgbe_82599.c
drivers/net/ixgbe/ixgbe_82599.c
+3
-0
drivers/net/ixgbe/ixgbe_common.c
drivers/net/ixgbe/ixgbe_common.c
+22
-0
drivers/net/ixgbe/ixgbe_ethtool.c
drivers/net/ixgbe/ixgbe_ethtool.c
+1
-0
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbe/ixgbe_main.c
+539
-433
drivers/net/ixgbe/ixgbe_mbx.h
drivers/net/ixgbe/ixgbe_mbx.h
+1
-0
drivers/net/ixgbe/ixgbe_sriov.c
drivers/net/ixgbe/ixgbe_sriov.c
+95
-3
drivers/net/ixgbe/ixgbe_type.h
drivers/net/ixgbe/ixgbe_type.h
+2
-0
drivers/net/ixgbevf/ixgbevf_main.c
drivers/net/ixgbevf/ixgbevf_main.c
+30
-0
drivers/net/ixgbevf/mbx.h
drivers/net/ixgbevf/mbx.h
+1
-0
drivers/net/ixgbevf/vf.c
drivers/net/ixgbevf/vf.c
+34
-0
drivers/net/ixgbevf/vf.h
drivers/net/ixgbevf/vf.h
+1
-0
No files found.
drivers/net/e1000e/lib.c
View file @
89c64d75
...
...
@@ -144,7 +144,7 @@ void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
* @hw: pointer to the HW structure
* @rar_count: receive address registers
*
* Setup
s
the receive address registers by setting the base receive address
* Setup the receive address registers by setting the base receive address
* register to the devices MAC address and clearing all the other receive
* address registers to 0.
**/
...
...
@@ -1181,7 +1181,7 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
* of pause frames. In this case, we had to advertise
* FULL flow control because we could not advertise Rx
* ONLY. Hence, we must now check to see if we need to
* turn OFF
the TRANSMISSION of PAUSE frames.
* turn OFF the TRANSMISSION of PAUSE frames.
*/
if
(
hw
->
fc
.
requested_mode
==
e1000_fc_full
)
{
hw
->
fc
.
current_mode
=
e1000_fc_full
;
...
...
drivers/net/ixgbe/ixgbe.h
View file @
89c64d75
...
...
@@ -106,6 +106,7 @@
#define IXGBE_MAX_VF_FUNCTIONS 64
#define IXGBE_MAX_VFTA_ENTRIES 128
#define MAX_EMULATION_MAC_ADDRS 16
#define IXGBE_MAX_PF_MACVLANS 15
#define VMDQ_P(p) ((p) + adapter->num_vfs)
struct
vf_data_storage
{
...
...
@@ -121,6 +122,15 @@ struct vf_data_storage {
u16
tx_rate
;
};
struct
vf_macvlans
{
struct
list_head
l
;
int
vf
;
int
rar_entry
;
bool
free
;
bool
is_macvlan
;
u8
vf_macvlan
[
ETH_ALEN
];
};
/* wrapper around a pointer to a socket buffer,
* so a DMA handle can be stored along with the buffer */
struct
ixgbe_tx_buffer
{
...
...
@@ -331,10 +341,52 @@ struct ixgbe_q_vector {
/* board specific private data structure */
struct
ixgbe_adapter
{
struct
timer_list
watchdog_timer
;
unsigned
long
state
;
/* Some features need tri-state capability,
* thus the additional *_CAPABLE flags.
*/
u32
flags
;
#define IXGBE_FLAG_RX_CSUM_ENABLED (u32)(1)
#define IXGBE_FLAG_MSI_CAPABLE (u32)(1 << 1)
#define IXGBE_FLAG_MSI_ENABLED (u32)(1 << 2)
#define IXGBE_FLAG_MSIX_CAPABLE (u32)(1 << 3)
#define IXGBE_FLAG_MSIX_ENABLED (u32)(1 << 4)
#define IXGBE_FLAG_RX_1BUF_CAPABLE (u32)(1 << 6)
#define IXGBE_FLAG_RX_PS_CAPABLE (u32)(1 << 7)
#define IXGBE_FLAG_RX_PS_ENABLED (u32)(1 << 8)
#define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 9)
#define IXGBE_FLAG_DCA_ENABLED (u32)(1 << 10)
#define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 11)
#define IXGBE_FLAG_IMIR_ENABLED (u32)(1 << 12)
#define IXGBE_FLAG_MQ_CAPABLE (u32)(1 << 13)
#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 14)
#define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 16)
#define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17)
#define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18)
#define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)
#define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20)
#define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)
#define IXGBE_FLAG_NEED_LINK_CONFIG (u32)(1 << 23)
#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 24)
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 25)
#define IXGBE_FLAG_FCOE_CAPABLE (u32)(1 << 26)
#define IXGBE_FLAG_FCOE_ENABLED (u32)(1 << 27)
#define IXGBE_FLAG_SRIOV_CAPABLE (u32)(1 << 28)
#define IXGBE_FLAG_SRIOV_ENABLED (u32)(1 << 29)
u32
flags2
;
#define IXGBE_FLAG2_RSC_CAPABLE (u32)(1)
#define IXGBE_FLAG2_RSC_ENABLED (u32)(1 << 1)
#define IXGBE_FLAG2_TEMP_SENSOR_CAPABLE (u32)(1 << 2)
#define IXGBE_FLAG2_TEMP_SENSOR_EVENT (u32)(1 << 3)
#define IXGBE_FLAG2_SEARCH_FOR_SFP (u32)(1 << 4)
#define IXGBE_FLAG2_SFP_NEEDS_RESET (u32)(1 << 5)
#define IXGBE_FLAG2_RESET_REQUESTED (u32)(1 << 6)
#define IXGBE_FLAG2_FDIR_REQUIRES_REINIT (u32)(1 << 7)
unsigned
long
active_vlans
[
BITS_TO_LONGS
(
VLAN_N_VID
)];
u16
bd_number
;
struct
work_struct
reset_task
;
struct
ixgbe_q_vector
*
q_vector
[
MAX_MSIX_Q_VECTORS
];
/* DCB parameters */
...
...
@@ -377,43 +429,6 @@ struct ixgbe_adapter {
u32
alloc_rx_page_failed
;
u32
alloc_rx_buff_failed
;
/* Some features need tri-state capability,
* thus the additional *_CAPABLE flags.
*/
u32
flags
;
#define IXGBE_FLAG_RX_CSUM_ENABLED (u32)(1)
#define IXGBE_FLAG_MSI_CAPABLE (u32)(1 << 1)
#define IXGBE_FLAG_MSI_ENABLED (u32)(1 << 2)
#define IXGBE_FLAG_MSIX_CAPABLE (u32)(1 << 3)
#define IXGBE_FLAG_MSIX_ENABLED (u32)(1 << 4)
#define IXGBE_FLAG_RX_1BUF_CAPABLE (u32)(1 << 6)
#define IXGBE_FLAG_RX_PS_CAPABLE (u32)(1 << 7)
#define IXGBE_FLAG_RX_PS_ENABLED (u32)(1 << 8)
#define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 9)
#define IXGBE_FLAG_DCA_ENABLED (u32)(1 << 10)
#define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 11)
#define IXGBE_FLAG_IMIR_ENABLED (u32)(1 << 12)
#define IXGBE_FLAG_MQ_CAPABLE (u32)(1 << 13)
#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 14)
#define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 16)
#define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17)
#define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18)
#define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)
#define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20)
#define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)
#define IXGBE_FLAG_IN_SFP_LINK_TASK (u32)(1 << 23)
#define IXGBE_FLAG_IN_SFP_MOD_TASK (u32)(1 << 24)
#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 25)
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 26)
#define IXGBE_FLAG_FCOE_CAPABLE (u32)(1 << 27)
#define IXGBE_FLAG_FCOE_ENABLED (u32)(1 << 28)
#define IXGBE_FLAG_SRIOV_CAPABLE (u32)(1 << 29)
#define IXGBE_FLAG_SRIOV_ENABLED (u32)(1 << 30)
u32
flags2
;
#define IXGBE_FLAG2_RSC_CAPABLE (u32)(1)
#define IXGBE_FLAG2_RSC_ENABLED (u32)(1 << 1)
#define IXGBE_FLAG2_TEMP_SENSOR_CAPABLE (u32)(1 << 2)
/* default to trying for four seconds */
#define IXGBE_TRY_LINK_TIMEOUT (4 * HZ)
...
...
@@ -434,7 +449,6 @@ struct ixgbe_adapter {
u32
rx_eitr_param
;
u32
tx_eitr_param
;
unsigned
long
state
;
u64
tx_busy
;
unsigned
int
tx_ring_count
;
unsigned
int
rx_ring_count
;
...
...
@@ -443,15 +457,12 @@ struct ixgbe_adapter {
bool
link_up
;
unsigned
long
link_check_timeout
;
struct
work_struct
watchdog_task
;
struct
work_struct
sfp_task
;
struct
timer_list
sfp_timer
;
struct
work_struct
multispeed_fiber_task
;
struct
work_struct
sfp_config_module_task
;
struct
work_struct
service_task
;
struct
timer_list
service_timer
;
u32
fdir_pballoc
;
u32
atr_sample_rate
;
unsigned
long
fdir_overflow
;
/* number of times ATR was backed off */
spinlock_t
fdir_perfect_lock
;
struct
work_struct
fdir_reinit_task
;
#ifdef IXGBE_FCOE
struct
ixgbe_fcoe
fcoe
;
#endif
/* IXGBE_FCOE */
...
...
@@ -462,7 +473,6 @@ struct ixgbe_adapter {
int
node
;
u32
led_reg
;
struct
work_struct
check_overtemp_task
;
u32
interrupt_event
;
char
lsc_int_name
[
IFNAMSIZ
+
9
];
...
...
@@ -471,13 +481,17 @@ struct ixgbe_adapter {
unsigned
int
num_vfs
;
struct
vf_data_storage
*
vfinfo
;
int
vf_rate_link_speed
;
struct
vf_macvlans
vf_mvs
;
struct
vf_macvlans
*
mv_list
;
bool
antispoofing_enabled
;
};
enum
ixbge_state_t
{
__IXGBE_TESTING
,
__IXGBE_RESETTING
,
__IXGBE_DOWN
,
__IXGBE_SFP_MODULE_NOT_FOUND
__IXGBE_SERVICE_SCHED
,
__IXGBE_IN_SFP_INIT
,
};
struct
ixgbe_rsc_cb
{
...
...
drivers/net/ixgbe/ixgbe_82599.c
View file @
89c64d75
...
...
@@ -368,6 +368,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
case
IXGBE_DEV_ID_82599_T3_LOM
:
media_type
=
ixgbe_media_type_copper
;
break
;
case
IXGBE_DEV_ID_82599_LS
:
media_type
=
ixgbe_media_type_fiber_lco
;
break
;
default:
media_type
=
ixgbe_media_type_unknown
;
break
;
...
...
drivers/net/ixgbe/ixgbe_common.c
View file @
89c64d75
...
...
@@ -1189,6 +1189,28 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
udelay
(
50
);
}
if
(
i
==
timeout
)
{
hw_dbg
(
hw
,
"Driver can't access the Eeprom - SMBI Semaphore "
"not granted.
\n
"
);
/*
* this release is particularly important because our attempts
* above to get the semaphore may have succeeded, and if there
* was a timeout, we should unconditionally clear the semaphore
* bits to free the driver to make progress
*/
ixgbe_release_eeprom_semaphore
(
hw
);
udelay
(
50
);
/*
* one last try
* If the SMBI bit is 0 when we read it, then the bit will be
* set and we have the semaphore
*/
swsm
=
IXGBE_READ_REG
(
hw
,
IXGBE_SWSM
);
if
(
!
(
swsm
&
IXGBE_SWSM_SMBI
))
status
=
0
;
}
/* Now get the semaphore between SW/FW through the SWESMBI bit */
if
(
status
==
0
)
{
for
(
i
=
0
;
i
<
timeout
;
i
++
)
{
...
...
drivers/net/ixgbe/ixgbe_ethtool.c
View file @
89c64d75
...
...
@@ -84,6 +84,7 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = {
{
"hw_rsc_flushed"
,
IXGBE_STAT
(
rsc_total_flush
)},
{
"fdir_match"
,
IXGBE_STAT
(
stats
.
fdirmatch
)},
{
"fdir_miss"
,
IXGBE_STAT
(
stats
.
fdirmiss
)},
{
"fdir_overflow"
,
IXGBE_STAT
(
fdir_overflow
)},
{
"rx_fifo_errors"
,
IXGBE_NETDEV_STAT
(
rx_fifo_errors
)},
{
"rx_missed_errors"
,
IXGBE_NETDEV_STAT
(
rx_missed_errors
)},
{
"tx_aborted_errors"
,
IXGBE_NETDEV_STAT
(
tx_aborted_errors
)},
...
...
drivers/net/ixgbe/ixgbe_main.c
View file @
89c64d75
This diff is collapsed.
Click to expand it.
drivers/net/ixgbe/ixgbe_mbx.h
View file @
89c64d75
...
...
@@ -67,6 +67,7 @@
#define IXGBE_VF_SET_MULTICAST 0x03
/* VF requests PF to set MC addr */
#define IXGBE_VF_SET_VLAN 0x04
/* VF requests PF to set VLAN */
#define IXGBE_VF_SET_LPE 0x05
/* VF requests PF to set VMOLR.LPE */
#define IXGBE_VF_SET_MACVLAN 0x06
/* VF requests PF for unicast filter */
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
...
...
drivers/net/ixgbe/ixgbe_sriov.c
View file @
89c64d75
...
...
@@ -82,6 +82,21 @@ static int ixgbe_set_vf_multicasts(struct ixgbe_adapter *adapter,
return
0
;
}
static
void
ixgbe_restore_vf_macvlans
(
struct
ixgbe_adapter
*
adapter
)
{
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
struct
list_head
*
pos
;
struct
vf_macvlans
*
entry
;
list_for_each
(
pos
,
&
adapter
->
vf_mvs
.
l
)
{
entry
=
list_entry
(
pos
,
struct
vf_macvlans
,
l
);
if
(
entry
->
free
==
false
)
hw
->
mac
.
ops
.
set_rar
(
hw
,
entry
->
rar_entry
,
entry
->
vf_macvlan
,
entry
->
vf
,
IXGBE_RAH_AV
);
}
}
void
ixgbe_restore_vf_multicasts
(
struct
ixgbe_adapter
*
adapter
)
{
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
...
...
@@ -102,6 +117,9 @@ void ixgbe_restore_vf_multicasts(struct ixgbe_adapter *adapter)
IXGBE_WRITE_REG
(
hw
,
IXGBE_MTA
(
vector_reg
),
mta_reg
);
}
}
/* Restore any VF macvlans */
ixgbe_restore_vf_macvlans
(
adapter
);
}
static
int
ixgbe_set_vf_vlan
(
struct
ixgbe_adapter
*
adapter
,
int
add
,
int
vid
,
...
...
@@ -200,6 +218,61 @@ static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter,
return
0
;
}
static
int
ixgbe_set_vf_macvlan
(
struct
ixgbe_adapter
*
adapter
,
int
vf
,
int
index
,
unsigned
char
*
mac_addr
)
{
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
struct
list_head
*
pos
;
struct
vf_macvlans
*
entry
;
if
(
index
<=
1
)
{
list_for_each
(
pos
,
&
adapter
->
vf_mvs
.
l
)
{
entry
=
list_entry
(
pos
,
struct
vf_macvlans
,
l
);
if
(
entry
->
vf
==
vf
)
{
entry
->
vf
=
-
1
;
entry
->
free
=
true
;
entry
->
is_macvlan
=
false
;
hw
->
mac
.
ops
.
clear_rar
(
hw
,
entry
->
rar_entry
);
}
}
}
/*
* If index was zero then we were asked to clear the uc list
* for the VF. We're done.
*/
if
(
!
index
)
return
0
;
entry
=
NULL
;
list_for_each
(
pos
,
&
adapter
->
vf_mvs
.
l
)
{
entry
=
list_entry
(
pos
,
struct
vf_macvlans
,
l
);
if
(
entry
->
free
)
break
;
}
/*
* If we traversed the entire list and didn't find a free entry
* then we're out of space on the RAR table. Also entry may
* be NULL because the original memory allocation for the list
* failed, which is not fatal but does mean we can't support
* VF requests for MACVLAN because we couldn't allocate
* memory for the list management required.
*/
if
(
!
entry
||
!
entry
->
free
)
return
-
ENOSPC
;
entry
->
free
=
false
;
entry
->
is_macvlan
=
true
;
entry
->
vf
=
vf
;
memcpy
(
entry
->
vf_macvlan
,
mac_addr
,
ETH_ALEN
);
hw
->
mac
.
ops
.
set_rar
(
hw
,
entry
->
rar_entry
,
mac_addr
,
vf
,
IXGBE_RAH_AV
);
return
0
;
}
int
ixgbe_vf_configuration
(
struct
pci_dev
*
pdev
,
unsigned
int
event_mask
)
{
unsigned
char
vf_mac_addr
[
6
];
...
...
@@ -251,12 +324,12 @@ static inline void ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf)
static
int
ixgbe_rcv_msg_from_vf
(
struct
ixgbe_adapter
*
adapter
,
u32
vf
)
{
u32
mbx_size
=
IXGBE_VFMAILBOX_SIZE
;
u32
msgbuf
[
mbx_size
];
u32
msgbuf
[
IXGBE_VFMAILBOX_SIZE
];
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
s32
retval
;
int
entries
;
u16
*
hash_list
;
int
add
,
vid
;
int
add
,
vid
,
index
;
u8
*
new_mac
;
retval
=
ixgbe_read_mbx
(
hw
,
msgbuf
,
mbx_size
,
vf
);
...
...
@@ -345,6 +418,24 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
retval
=
ixgbe_set_vf_vlan
(
adapter
,
add
,
vid
,
vf
);
}
break
;
case
IXGBE_VF_SET_MACVLAN
:
index
=
(
msgbuf
[
0
]
&
IXGBE_VT_MSGINFO_MASK
)
>>
IXGBE_VT_MSGINFO_SHIFT
;
/*
* If the VF is allowed to set MAC filters then turn off
* anti-spoofing to avoid false positives. An index
* greater than 0 will indicate the VF is setting a
* macvlan MAC filter.
*/
if
(
index
>
0
&&
adapter
->
antispoofing_enabled
)
{
hw
->
mac
.
ops
.
set_mac_anti_spoofing
(
hw
,
false
,
adapter
->
num_vfs
);
hw
->
mac
.
ops
.
set_vlan_anti_spoofing
(
hw
,
false
,
vf
);
adapter
->
antispoofing_enabled
=
false
;
}
retval
=
ixgbe_set_vf_macvlan
(
adapter
,
vf
,
index
,
(
unsigned
char
*
)(
&
msgbuf
[
1
]));
break
;
default:
e_err
(
drv
,
"Unhandled Msg %8.8x
\n
"
,
msgbuf
[
0
]);
retval
=
IXGBE_ERR_MBX
;
...
...
@@ -452,7 +543,8 @@ int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos)
goto
out
;
ixgbe_set_vmvir
(
adapter
,
vlan
|
(
qos
<<
VLAN_PRIO_SHIFT
),
vf
);
ixgbe_set_vmolr
(
hw
,
vf
,
false
);
hw
->
mac
.
ops
.
set_vlan_anti_spoofing
(
hw
,
true
,
vf
);
if
(
adapter
->
antispoofing_enabled
)
hw
->
mac
.
ops
.
set_vlan_anti_spoofing
(
hw
,
true
,
vf
);
adapter
->
vfinfo
[
vf
].
pf_vlan
=
vlan
;
adapter
->
vfinfo
[
vf
].
pf_qos
=
qos
;
dev_info
(
&
adapter
->
pdev
->
dev
,
...
...
drivers/net/ixgbe/ixgbe_type.h
View file @
89c64d75
...
...
@@ -62,6 +62,7 @@
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
#define IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ 0x000C
#define IXGBE_DEV_ID_82599_LS 0x154F
#define IXGBE_DEV_ID_X540T 0x1528
/* General Registers */
...
...
@@ -2395,6 +2396,7 @@ enum ixgbe_sfp_type {
enum
ixgbe_media_type
{
ixgbe_media_type_unknown
=
0
,
ixgbe_media_type_fiber
,
ixgbe_media_type_fiber_lco
,
ixgbe_media_type_copper
,
ixgbe_media_type_backplane
,
ixgbe_media_type_cx4
,
...
...
drivers/net/ixgbevf/ixgbevf_main.c
View file @
89c64d75
...
...
@@ -1460,6 +1460,34 @@ static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
}
}
static
int
ixgbevf_write_uc_addr_list
(
struct
net_device
*
netdev
)
{
struct
ixgbevf_adapter
*
adapter
=
netdev_priv
(
netdev
);
struct
ixgbe_hw
*
hw
=
&
adapter
->
hw
;
int
count
=
0
;
if
((
netdev_uc_count
(
netdev
))
>
10
)
{
printk
(
KERN_ERR
"Too many unicast filters - No Space
\n
"
);
return
-
ENOSPC
;
}
if
(
!
netdev_uc_empty
(
netdev
))
{
struct
netdev_hw_addr
*
ha
;
netdev_for_each_uc_addr
(
ha
,
netdev
)
{
hw
->
mac
.
ops
.
set_uc_addr
(
hw
,
++
count
,
ha
->
addr
);
udelay
(
200
);
}
}
else
{
/*
* If the list is empty then send message to PF driver to
* clear all macvlans on this VF.
*/
hw
->
mac
.
ops
.
set_uc_addr
(
hw
,
0
,
NULL
);
}
return
count
;
}
/**
* ixgbevf_set_rx_mode - Multicast set
* @netdev: network interface device structure
...
...
@@ -1476,6 +1504,8 @@ static void ixgbevf_set_rx_mode(struct net_device *netdev)
/* reprogram multicast list */
if
(
hw
->
mac
.
ops
.
update_mc_addr_list
)
hw
->
mac
.
ops
.
update_mc_addr_list
(
hw
,
netdev
);
ixgbevf_write_uc_addr_list
(
netdev
);
}
static
void
ixgbevf_napi_enable_all
(
struct
ixgbevf_adapter
*
adapter
)
...
...
drivers/net/ixgbevf/mbx.h
View file @
89c64d75
...
...
@@ -81,6 +81,7 @@
#define IXGBE_VF_SET_MULTICAST 0x03
/* VF requests PF to set MC addr */
#define IXGBE_VF_SET_VLAN 0x04
/* VF requests PF to set VLAN */
#define IXGBE_VF_SET_LPE 0x05
/* VF requests PF to set VMOLR.LPE */
#define IXGBE_VF_SET_MACVLAN 0x06
/* VF requests PF for unicast filter */
/* length of permanent address message returned from PF */
#define IXGBE_VF_PERMADDR_MSG_LEN 4
...
...
drivers/net/ixgbevf/vf.c
View file @
89c64d75
...
...
@@ -216,6 +216,39 @@ static s32 ixgbevf_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr)
return
0
;
}
static
s32
ixgbevf_set_uc_addr_vf
(
struct
ixgbe_hw
*
hw
,
u32
index
,
u8
*
addr
)
{
struct
ixgbe_mbx_info
*
mbx
=
&
hw
->
mbx
;
u32
msgbuf
[
3
];
u8
*
msg_addr
=
(
u8
*
)(
&
msgbuf
[
1
]);
s32
ret_val
;
memset
(
msgbuf
,
0
,
sizeof
(
msgbuf
));
/*
* If index is one then this is the start of a new list and needs
* indication to the PF so it can do it's own list management.
* If it is zero then that tells the PF to just clear all of
* this VF's macvlans and there is no new list.
*/
msgbuf
[
0
]
|=
index
<<
IXGBE_VT_MSGINFO_SHIFT
;
msgbuf
[
0
]
|=
IXGBE_VF_SET_MACVLAN
;
if
(
addr
)
memcpy
(
msg_addr
,
addr
,
6
);
ret_val
=
mbx
->
ops
.
write_posted
(
hw
,
msgbuf
,
3
);
if
(
!
ret_val
)
ret_val
=
mbx
->
ops
.
read_posted
(
hw
,
msgbuf
,
3
);
msgbuf
[
0
]
&=
~
IXGBE_VT_MSGTYPE_CTS
;
if
(
!
ret_val
)
if
(
msgbuf
[
0
]
==
(
IXGBE_VF_SET_MACVLAN
|
IXGBE_VT_MSGTYPE_NACK
))
ret_val
=
-
ENOMEM
;
return
ret_val
;
}
/**
* ixgbevf_set_rar_vf - set device MAC address
* @hw: pointer to hardware structure
...
...
@@ -378,6 +411,7 @@ static struct ixgbe_mac_operations ixgbevf_mac_ops = {
.
check_link
=
ixgbevf_check_mac_link_vf
,
.
set_rar
=
ixgbevf_set_rar_vf
,
.
update_mc_addr_list
=
ixgbevf_update_mc_addr_list_vf
,
.
set_uc_addr
=
ixgbevf_set_uc_addr_vf
,
.
set_vfta
=
ixgbevf_set_vfta_vf
,
};
...
...
drivers/net/ixgbevf/vf.h
View file @
89c64d75
...
...
@@ -62,6 +62,7 @@ struct ixgbe_mac_operations {
/* RAR, Multicast, VLAN */
s32
(
*
set_rar
)(
struct
ixgbe_hw
*
,
u32
,
u8
*
,
u32
);
s32
(
*
set_uc_addr
)(
struct
ixgbe_hw
*
,
u32
,
u8
*
);
s32
(
*
init_rx_addrs
)(
struct
ixgbe_hw
*
);
s32
(
*
update_mc_addr_list
)(
struct
ixgbe_hw
*
,
struct
net_device
*
);
s32
(
*
enable_mc
)(
struct
ixgbe_hw
*
);
...
...
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