Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Minor conflict in net/core/rtnetlink.c, David Ahern's bug fix in 'net' overlapped the renaming of a netlink attribute in net-next. Signed-off-by: David S. Miller <davem@davemloft.net>
此提交包含在:
@@ -1800,7 +1800,8 @@ struct qlcnic_hardware_ops {
|
||||
int (*config_loopback) (struct qlcnic_adapter *, u8);
|
||||
int (*clear_loopback) (struct qlcnic_adapter *, u8);
|
||||
int (*config_promisc_mode) (struct qlcnic_adapter *, u32);
|
||||
void (*change_l2_filter) (struct qlcnic_adapter *, u64 *, u16);
|
||||
void (*change_l2_filter)(struct qlcnic_adapter *adapter, u64 *addr,
|
||||
u16 vlan, struct qlcnic_host_tx_ring *tx_ring);
|
||||
int (*get_board_info) (struct qlcnic_adapter *);
|
||||
void (*set_mac_filter_count) (struct qlcnic_adapter *);
|
||||
void (*free_mac_list) (struct qlcnic_adapter *);
|
||||
@@ -2064,9 +2065,10 @@ static inline int qlcnic_nic_set_promisc(struct qlcnic_adapter *adapter,
|
||||
}
|
||||
|
||||
static inline void qlcnic_change_filter(struct qlcnic_adapter *adapter,
|
||||
u64 *addr, u16 id)
|
||||
u64 *addr, u16 vlan,
|
||||
struct qlcnic_host_tx_ring *tx_ring)
|
||||
{
|
||||
adapter->ahw->hw_ops->change_l2_filter(adapter, addr, id);
|
||||
adapter->ahw->hw_ops->change_l2_filter(adapter, addr, vlan, tx_ring);
|
||||
}
|
||||
|
||||
static inline int qlcnic_get_board_info(struct qlcnic_adapter *adapter)
|
||||
|
@@ -2135,7 +2135,8 @@ out:
|
||||
}
|
||||
|
||||
void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr,
|
||||
u16 vlan_id)
|
||||
u16 vlan_id,
|
||||
struct qlcnic_host_tx_ring *tx_ring)
|
||||
{
|
||||
u8 mac[ETH_ALEN];
|
||||
memcpy(&mac, addr, ETH_ALEN);
|
||||
|
@@ -550,7 +550,8 @@ int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
|
||||
int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
|
||||
int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *, int);
|
||||
int qlcnic_83xx_config_rss(struct qlcnic_adapter *, int);
|
||||
void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *, u64 *, u16);
|
||||
void qlcnic_83xx_change_l2_filter(struct qlcnic_adapter *adapter, u64 *addr,
|
||||
u16 vlan, struct qlcnic_host_tx_ring *ring);
|
||||
int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *, struct qlcnic_pci_info *);
|
||||
int qlcnic_83xx_set_nic_info(struct qlcnic_adapter *, struct qlcnic_info *);
|
||||
void qlcnic_83xx_initialize_nic(struct qlcnic_adapter *, int);
|
||||
|
@@ -173,7 +173,8 @@ int qlcnic_82xx_napi_add(struct qlcnic_adapter *adapter,
|
||||
struct net_device *netdev);
|
||||
void qlcnic_82xx_get_beacon_state(struct qlcnic_adapter *);
|
||||
void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter,
|
||||
u64 *uaddr, u16 vlan_id);
|
||||
u64 *uaddr, u16 vlan_id,
|
||||
struct qlcnic_host_tx_ring *tx_ring);
|
||||
int qlcnic_82xx_config_intr_coalesce(struct qlcnic_adapter *,
|
||||
struct ethtool_coalesce *);
|
||||
int qlcnic_82xx_set_rx_coalesce(struct qlcnic_adapter *);
|
||||
|
@@ -268,13 +268,12 @@ static void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter,
|
||||
}
|
||||
|
||||
void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
|
||||
u16 vlan_id)
|
||||
u16 vlan_id, struct qlcnic_host_tx_ring *tx_ring)
|
||||
{
|
||||
struct cmd_desc_type0 *hwdesc;
|
||||
struct qlcnic_nic_req *req;
|
||||
struct qlcnic_mac_req *mac_req;
|
||||
struct qlcnic_vlan_req *vlan_req;
|
||||
struct qlcnic_host_tx_ring *tx_ring = adapter->tx_ring;
|
||||
u32 producer;
|
||||
u64 word;
|
||||
|
||||
@@ -301,7 +300,8 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
|
||||
|
||||
static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
|
||||
struct cmd_desc_type0 *first_desc,
|
||||
struct sk_buff *skb)
|
||||
struct sk_buff *skb,
|
||||
struct qlcnic_host_tx_ring *tx_ring)
|
||||
{
|
||||
struct vlan_ethhdr *vh = (struct vlan_ethhdr *)(skb->data);
|
||||
struct ethhdr *phdr = (struct ethhdr *)(skb->data);
|
||||
@@ -335,7 +335,7 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
|
||||
tmp_fil->vlan_id == vlan_id) {
|
||||
if (jiffies > (QLCNIC_READD_AGE * HZ + tmp_fil->ftime))
|
||||
qlcnic_change_filter(adapter, &src_addr,
|
||||
vlan_id);
|
||||
vlan_id, tx_ring);
|
||||
tmp_fil->ftime = jiffies;
|
||||
return;
|
||||
}
|
||||
@@ -350,7 +350,7 @@ static void qlcnic_send_filter(struct qlcnic_adapter *adapter,
|
||||
if (!fil)
|
||||
return;
|
||||
|
||||
qlcnic_change_filter(adapter, &src_addr, vlan_id);
|
||||
qlcnic_change_filter(adapter, &src_addr, vlan_id, tx_ring);
|
||||
fil->ftime = jiffies;
|
||||
fil->vlan_id = vlan_id;
|
||||
memcpy(fil->faddr, &src_addr, ETH_ALEN);
|
||||
@@ -766,7 +766,7 @@ netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
||||
}
|
||||
|
||||
if (adapter->drv_mac_learn)
|
||||
qlcnic_send_filter(adapter, first_desc, skb);
|
||||
qlcnic_send_filter(adapter, first_desc, skb, tx_ring);
|
||||
|
||||
tx_ring->tx_stats.tx_bytes += skb->len;
|
||||
tx_ring->tx_stats.xmit_called++;
|
||||
|
@@ -59,9 +59,6 @@ static int qlcnic_close(struct net_device *netdev);
|
||||
static void qlcnic_tx_timeout(struct net_device *netdev);
|
||||
static void qlcnic_attach_work(struct work_struct *work);
|
||||
static void qlcnic_fwinit_work(struct work_struct *work);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void qlcnic_poll_controller(struct net_device *netdev);
|
||||
#endif
|
||||
|
||||
static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
|
||||
static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
|
||||
@@ -545,9 +542,6 @@ static const struct net_device_ops qlcnic_netdev_ops = {
|
||||
.ndo_udp_tunnel_add = qlcnic_add_vxlan_port,
|
||||
.ndo_udp_tunnel_del = qlcnic_del_vxlan_port,
|
||||
.ndo_features_check = qlcnic_features_check,
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
.ndo_poll_controller = qlcnic_poll_controller,
|
||||
#endif
|
||||
#ifdef CONFIG_QLCNIC_SRIOV
|
||||
.ndo_set_vf_mac = qlcnic_sriov_set_vf_mac,
|
||||
.ndo_set_vf_rate = qlcnic_sriov_set_vf_tx_rate,
|
||||
@@ -3200,45 +3194,6 @@ static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
static void qlcnic_poll_controller(struct net_device *netdev)
|
||||
{
|
||||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
struct qlcnic_host_sds_ring *sds_ring;
|
||||
struct qlcnic_recv_context *recv_ctx;
|
||||
struct qlcnic_host_tx_ring *tx_ring;
|
||||
int ring;
|
||||
|
||||
if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
|
||||
return;
|
||||
|
||||
recv_ctx = adapter->recv_ctx;
|
||||
|
||||
for (ring = 0; ring < adapter->drv_sds_rings; ring++) {
|
||||
sds_ring = &recv_ctx->sds_rings[ring];
|
||||
qlcnic_disable_sds_intr(adapter, sds_ring);
|
||||
napi_schedule(&sds_ring->napi);
|
||||
}
|
||||
|
||||
if (adapter->flags & QLCNIC_MSIX_ENABLED) {
|
||||
/* Only Multi-Tx queue capable devices need to
|
||||
* schedule NAPI for TX rings
|
||||
*/
|
||||
if ((qlcnic_83xx_check(adapter) &&
|
||||
(adapter->flags & QLCNIC_TX_INTR_SHARED)) ||
|
||||
(qlcnic_82xx_check(adapter) &&
|
||||
!qlcnic_check_multi_tx(adapter)))
|
||||
return;
|
||||
|
||||
for (ring = 0; ring < adapter->drv_tx_rings; ring++) {
|
||||
tx_ring = &adapter->tx_ring[ring];
|
||||
qlcnic_disable_tx_intr(adapter, tx_ring);
|
||||
napi_schedule(&tx_ring->napi);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding)
|
||||
{
|
||||
|
新增問題並參考
封鎖使用者