diff options
Diffstat (limited to 'drivers/net/ethernet/intel/fm10k')
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k.h | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c | 8 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c | 93 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_iov.c | 51 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_main.c | 33 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_mbx.c | 34 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | 37 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_pci.c | 61 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_pf.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_ptp.c | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_vf.c | 6 |
12 files changed, 215 insertions, 138 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h b/drivers/net/ethernet/intel/fm10k/fm10k.h index 59edfd4446cd..c8c8c5baefda 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k.h +++ b/drivers/net/ethernet/intel/fm10k/fm10k.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -235,6 +235,9 @@ struct fm10k_vxlan_port { | |||
235 | __be16 port; | 235 | __be16 port; |
236 | }; | 236 | }; |
237 | 237 | ||
238 | /* one work queue for entire driver */ | ||
239 | extern struct workqueue_struct *fm10k_workqueue; | ||
240 | |||
238 | struct fm10k_intfc { | 241 | struct fm10k_intfc { |
239 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; | 242 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; |
240 | struct net_device *netdev; | 243 | struct net_device *netdev; |
@@ -266,7 +269,6 @@ struct fm10k_intfc { | |||
266 | u64 tx_csum_errors; | 269 | u64 tx_csum_errors; |
267 | u64 alloc_failed; | 270 | u64 alloc_failed; |
268 | u64 rx_csum_errors; | 271 | u64 rx_csum_errors; |
269 | u64 rx_errors; | ||
270 | 272 | ||
271 | u64 tx_bytes_nic; | 273 | u64 tx_bytes_nic; |
272 | u64 tx_packets_nic; | 274 | u64 tx_packets_nic; |
@@ -458,6 +460,9 @@ void fm10k_down(struct fm10k_intfc *interface); | |||
458 | void fm10k_update_stats(struct fm10k_intfc *interface); | 460 | void fm10k_update_stats(struct fm10k_intfc *interface); |
459 | void fm10k_service_event_schedule(struct fm10k_intfc *interface); | 461 | void fm10k_service_event_schedule(struct fm10k_intfc *interface); |
460 | void fm10k_update_rx_drop_en(struct fm10k_intfc *interface); | 462 | void fm10k_update_rx_drop_en(struct fm10k_intfc *interface); |
463 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
464 | void fm10k_netpoll(struct net_device *netdev); | ||
465 | #endif | ||
461 | 466 | ||
462 | /* Netdev */ | 467 | /* Netdev */ |
463 | struct net_device *fm10k_alloc_netdev(void); | 468 | struct net_device *fm10k_alloc_netdev(void); |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c b/drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c index 212a92dad222..5c7a4d7662d8 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_dcbnl.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -128,7 +128,7 @@ static int fm10k_dcbnl_ieee_setpfc(struct net_device *dev, struct ieee_pfc *pfc) | |||
128 | * | 128 | * |
129 | * Returns that we support only IEEE DCB for this interface | 129 | * Returns that we support only IEEE DCB for this interface |
130 | **/ | 130 | **/ |
131 | static u8 fm10k_dcbnl_getdcbx(struct net_device *dev) | 131 | static u8 fm10k_dcbnl_getdcbx(struct net_device __always_unused *dev) |
132 | { | 132 | { |
133 | return DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE; | 133 | return DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE; |
134 | } | 134 | } |
@@ -140,7 +140,7 @@ static u8 fm10k_dcbnl_getdcbx(struct net_device *dev) | |||
140 | * | 140 | * |
141 | * Returns error on attempt to enable anything but IEEE DCB for this interface | 141 | * Returns error on attempt to enable anything but IEEE DCB for this interface |
142 | **/ | 142 | **/ |
143 | static u8 fm10k_dcbnl_setdcbx(struct net_device *dev, u8 mode) | 143 | static u8 fm10k_dcbnl_setdcbx(struct net_device __always_unused *dev, u8 mode) |
144 | { | 144 | { |
145 | return (mode != (DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE)) ? 1 : 0; | 145 | return (mode != (DCB_CAP_DCBX_HOST | DCB_CAP_DCBX_VER_IEEE)) ? 1 : 0; |
146 | } | 146 | } |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c b/drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c index 4327f86218b9..f45b4d71adb8 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_debugfs.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -36,14 +36,16 @@ static void *fm10k_dbg_desc_seq_start(struct seq_file *s, loff_t *pos) | |||
36 | return (*pos < ring->count) ? pos : NULL; | 36 | return (*pos < ring->count) ? pos : NULL; |
37 | } | 37 | } |
38 | 38 | ||
39 | static void *fm10k_dbg_desc_seq_next(struct seq_file *s, void *v, loff_t *pos) | 39 | static void *fm10k_dbg_desc_seq_next(struct seq_file *s, |
40 | void __always_unused *v, loff_t *pos) | ||
40 | { | 41 | { |
41 | struct fm10k_ring *ring = s->private; | 42 | struct fm10k_ring *ring = s->private; |
42 | 43 | ||
43 | return (++(*pos) < ring->count) ? pos : NULL; | 44 | return (++(*pos) < ring->count) ? pos : NULL; |
44 | } | 45 | } |
45 | 46 | ||
46 | static void fm10k_dbg_desc_seq_stop(struct seq_file *s, void *v) | 47 | static void fm10k_dbg_desc_seq_stop(struct seq_file __always_unused *s, |
48 | __always_unused void *v) | ||
47 | { | 49 | { |
48 | /* Do nothing. */ | 50 | /* Do nothing. */ |
49 | } | 51 | } |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c index 33b6106c764b..4b9d9f88af70 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -57,13 +57,12 @@ static const struct fm10k_stats fm10k_gstrings_net_stats[] = { | |||
57 | .stat_offset = offsetof(struct fm10k_intfc, _stat) \ | 57 | .stat_offset = offsetof(struct fm10k_intfc, _stat) \ |
58 | } | 58 | } |
59 | 59 | ||
60 | static const struct fm10k_stats fm10k_gstrings_stats[] = { | 60 | static const struct fm10k_stats fm10k_gstrings_global_stats[] = { |
61 | FM10K_STAT("tx_restart_queue", restart_queue), | 61 | FM10K_STAT("tx_restart_queue", restart_queue), |
62 | FM10K_STAT("tx_busy", tx_busy), | 62 | FM10K_STAT("tx_busy", tx_busy), |
63 | FM10K_STAT("tx_csum_errors", tx_csum_errors), | 63 | FM10K_STAT("tx_csum_errors", tx_csum_errors), |
64 | FM10K_STAT("rx_alloc_failed", alloc_failed), | 64 | FM10K_STAT("rx_alloc_failed", alloc_failed), |
65 | FM10K_STAT("rx_csum_errors", rx_csum_errors), | 65 | FM10K_STAT("rx_csum_errors", rx_csum_errors), |
66 | FM10K_STAT("rx_errors", rx_errors), | ||
67 | 66 | ||
68 | FM10K_STAT("tx_packets_nic", tx_packets_nic), | 67 | FM10K_STAT("tx_packets_nic", tx_packets_nic), |
69 | FM10K_STAT("tx_bytes_nic", tx_bytes_nic), | 68 | FM10K_STAT("tx_bytes_nic", tx_bytes_nic), |
@@ -73,38 +72,42 @@ static const struct fm10k_stats fm10k_gstrings_stats[] = { | |||
73 | FM10K_STAT("rx_overrun_pf", rx_overrun_pf), | 72 | FM10K_STAT("rx_overrun_pf", rx_overrun_pf), |
74 | FM10K_STAT("rx_overrun_vf", rx_overrun_vf), | 73 | FM10K_STAT("rx_overrun_vf", rx_overrun_vf), |
75 | 74 | ||
76 | FM10K_STAT("timeout", stats.timeout.count), | ||
77 | FM10K_STAT("ur", stats.ur.count), | ||
78 | FM10K_STAT("ca", stats.ca.count), | ||
79 | FM10K_STAT("um", stats.um.count), | ||
80 | FM10K_STAT("xec", stats.xec.count), | ||
81 | FM10K_STAT("vlan_drop", stats.vlan_drop.count), | ||
82 | FM10K_STAT("loopback_drop", stats.loopback_drop.count), | ||
83 | FM10K_STAT("nodesc_drop", stats.nodesc_drop.count), | ||
84 | |||
85 | FM10K_STAT("swapi_status", hw.swapi.status), | 75 | FM10K_STAT("swapi_status", hw.swapi.status), |
86 | FM10K_STAT("mac_rules_used", hw.swapi.mac.used), | 76 | FM10K_STAT("mac_rules_used", hw.swapi.mac.used), |
87 | FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail), | 77 | FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail), |
88 | 78 | ||
89 | FM10K_STAT("mbx_tx_busy", hw.mbx.tx_busy), | 79 | FM10K_STAT("mbx_tx_busy", hw.mbx.tx_busy), |
90 | FM10K_STAT("mbx_tx_dropped", hw.mbx.tx_dropped), | 80 | FM10K_STAT("mbx_tx_oversized", hw.mbx.tx_dropped), |
91 | FM10K_STAT("mbx_tx_messages", hw.mbx.tx_messages), | 81 | FM10K_STAT("mbx_tx_messages", hw.mbx.tx_messages), |
92 | FM10K_STAT("mbx_tx_dwords", hw.mbx.tx_dwords), | 82 | FM10K_STAT("mbx_tx_dwords", hw.mbx.tx_dwords), |
93 | FM10K_STAT("mbx_rx_messages", hw.mbx.rx_messages), | 83 | FM10K_STAT("mbx_rx_messages", hw.mbx.rx_messages), |
94 | FM10K_STAT("mbx_rx_dwords", hw.mbx.rx_dwords), | 84 | FM10K_STAT("mbx_rx_dwords", hw.mbx.rx_dwords), |
95 | FM10K_STAT("mbx_rx_parse_err", hw.mbx.rx_parse_err), | 85 | FM10K_STAT("mbx_rx_parse_err", hw.mbx.rx_parse_err), |
96 | 86 | ||
87 | FM10K_STAT("tx_hang_count", tx_timeout_count), | ||
88 | |||
97 | FM10K_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts), | 89 | FM10K_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts), |
98 | }; | 90 | }; |
99 | 91 | ||
100 | #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_stats) | 92 | static const struct fm10k_stats fm10k_gstrings_pf_stats[] = { |
93 | FM10K_STAT("timeout", stats.timeout.count), | ||
94 | FM10K_STAT("ur", stats.ur.count), | ||
95 | FM10K_STAT("ca", stats.ca.count), | ||
96 | FM10K_STAT("um", stats.um.count), | ||
97 | FM10K_STAT("xec", stats.xec.count), | ||
98 | FM10K_STAT("vlan_drop", stats.vlan_drop.count), | ||
99 | FM10K_STAT("loopback_drop", stats.loopback_drop.count), | ||
100 | FM10K_STAT("nodesc_drop", stats.nodesc_drop.count), | ||
101 | }; | ||
102 | |||
103 | #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats) | ||
104 | #define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats) | ||
101 | 105 | ||
102 | #define FM10K_QUEUE_STATS_LEN \ | 106 | #define FM10K_QUEUE_STATS_LEN(_n) \ |
103 | (MAX_QUEUES * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64))) | 107 | ( (_n) * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64))) |
104 | 108 | ||
105 | #define FM10K_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \ | 109 | #define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \ |
106 | FM10K_NETDEV_STATS_LEN + \ | 110 | FM10K_NETDEV_STATS_LEN) |
107 | FM10K_QUEUE_STATS_LEN) | ||
108 | 111 | ||
109 | static const char fm10k_gstrings_test[][ETH_GSTRING_LEN] = { | 112 | static const char fm10k_gstrings_test[][ETH_GSTRING_LEN] = { |
110 | "Mailbox test (on/offline)" | 113 | "Mailbox test (on/offline)" |
@@ -117,9 +120,9 @@ enum fm10k_self_test_types { | |||
117 | FM10K_TEST_MAX = FM10K_TEST_LEN | 120 | FM10K_TEST_MAX = FM10K_TEST_LEN |
118 | }; | 121 | }; |
119 | 122 | ||
120 | static void fm10k_get_strings(struct net_device *dev, u32 stringset, | 123 | static void fm10k_get_strings(struct net_device *dev, u32 stringset, u8 *data) |
121 | u8 *data) | ||
122 | { | 124 | { |
125 | struct fm10k_intfc *interface = netdev_priv(dev); | ||
123 | char *p = (char *)data; | 126 | char *p = (char *)data; |
124 | int i; | 127 | int i; |
125 | 128 | ||
@@ -135,12 +138,19 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset, | |||
135 | p += ETH_GSTRING_LEN; | 138 | p += ETH_GSTRING_LEN; |
136 | } | 139 | } |
137 | for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) { | 140 | for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) { |
138 | memcpy(p, fm10k_gstrings_stats[i].stat_string, | 141 | memcpy(p, fm10k_gstrings_global_stats[i].stat_string, |
139 | ETH_GSTRING_LEN); | 142 | ETH_GSTRING_LEN); |
140 | p += ETH_GSTRING_LEN; | 143 | p += ETH_GSTRING_LEN; |
141 | } | 144 | } |
142 | 145 | ||
143 | for (i = 0; i < MAX_QUEUES; i++) { | 146 | if (interface->hw.mac.type != fm10k_mac_vf) |
147 | for (i = 0; i < FM10K_PF_STATS_LEN; i++) { | ||
148 | memcpy(p, fm10k_gstrings_pf_stats[i].stat_string, | ||
149 | ETH_GSTRING_LEN); | ||
150 | p += ETH_GSTRING_LEN; | ||
151 | } | ||
152 | |||
153 | for (i = 0; i < interface->hw.mac.max_queues; i++) { | ||
144 | sprintf(p, "tx_queue_%u_packets", i); | 154 | sprintf(p, "tx_queue_%u_packets", i); |
145 | p += ETH_GSTRING_LEN; | 155 | p += ETH_GSTRING_LEN; |
146 | sprintf(p, "tx_queue_%u_bytes", i); | 156 | sprintf(p, "tx_queue_%u_bytes", i); |
@@ -156,18 +166,28 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset, | |||
156 | 166 | ||
157 | static int fm10k_get_sset_count(struct net_device *dev, int sset) | 167 | static int fm10k_get_sset_count(struct net_device *dev, int sset) |
158 | { | 168 | { |
169 | struct fm10k_intfc *interface = netdev_priv(dev); | ||
170 | struct fm10k_hw *hw = &interface->hw; | ||
171 | int stats_len = FM10K_STATIC_STATS_LEN; | ||
172 | |||
159 | switch (sset) { | 173 | switch (sset) { |
160 | case ETH_SS_TEST: | 174 | case ETH_SS_TEST: |
161 | return FM10K_TEST_LEN; | 175 | return FM10K_TEST_LEN; |
162 | case ETH_SS_STATS: | 176 | case ETH_SS_STATS: |
163 | return FM10K_STATS_LEN; | 177 | stats_len += FM10K_QUEUE_STATS_LEN(hw->mac.max_queues); |
178 | |||
179 | if (hw->mac.type != fm10k_mac_vf) | ||
180 | stats_len += FM10K_PF_STATS_LEN; | ||
181 | |||
182 | return stats_len; | ||
164 | default: | 183 | default: |
165 | return -EOPNOTSUPP; | 184 | return -EOPNOTSUPP; |
166 | } | 185 | } |
167 | } | 186 | } |
168 | 187 | ||
169 | static void fm10k_get_ethtool_stats(struct net_device *netdev, | 188 | static void fm10k_get_ethtool_stats(struct net_device *netdev, |
170 | struct ethtool_stats *stats, u64 *data) | 189 | struct ethtool_stats __always_unused *stats, |
190 | u64 *data) | ||
171 | { | 191 | { |
172 | const int stat_count = sizeof(struct fm10k_queue_stats) / sizeof(u64); | 192 | const int stat_count = sizeof(struct fm10k_queue_stats) / sizeof(u64); |
173 | struct fm10k_intfc *interface = netdev_priv(netdev); | 193 | struct fm10k_intfc *interface = netdev_priv(netdev); |
@@ -184,12 +204,21 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev, | |||
184 | } | 204 | } |
185 | 205 | ||
186 | for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) { | 206 | for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) { |
187 | p = (char *)interface + fm10k_gstrings_stats[i].stat_offset; | 207 | p = (char *)interface + |
188 | *(data++) = (fm10k_gstrings_stats[i].sizeof_stat == | 208 | fm10k_gstrings_global_stats[i].stat_offset; |
209 | *(data++) = (fm10k_gstrings_global_stats[i].sizeof_stat == | ||
189 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; | 210 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; |
190 | } | 211 | } |
191 | 212 | ||
192 | for (i = 0; i < MAX_QUEUES; i++) { | 213 | if (interface->hw.mac.type != fm10k_mac_vf) |
214 | for (i = 0; i < FM10K_PF_STATS_LEN; i++) { | ||
215 | p = (char *)interface + | ||
216 | fm10k_gstrings_pf_stats[i].stat_offset; | ||
217 | *(data++) = (fm10k_gstrings_pf_stats[i].sizeof_stat == | ||
218 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; | ||
219 | } | ||
220 | |||
221 | for (i = 0; i < interface->hw.mac.max_queues; i++) { | ||
193 | struct fm10k_ring *ring; | 222 | struct fm10k_ring *ring; |
194 | u64 *queue_stat; | 223 | u64 *queue_stat; |
195 | 224 | ||
@@ -369,7 +398,7 @@ static void fm10k_get_drvinfo(struct net_device *dev, | |||
369 | strncpy(info->bus_info, pci_name(interface->pdev), | 398 | strncpy(info->bus_info, pci_name(interface->pdev), |
370 | sizeof(info->bus_info) - 1); | 399 | sizeof(info->bus_info) - 1); |
371 | 400 | ||
372 | info->n_stats = FM10K_STATS_LEN; | 401 | info->n_stats = fm10k_get_sset_count(dev, ETH_SS_STATS); |
373 | 402 | ||
374 | info->regdump_len = fm10k_get_regs_len(dev); | 403 | info->regdump_len = fm10k_get_regs_len(dev); |
375 | } | 404 | } |
@@ -645,7 +674,7 @@ static int fm10k_get_rss_hash_opts(struct fm10k_intfc *interface, | |||
645 | } | 674 | } |
646 | 675 | ||
647 | static int fm10k_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, | 676 | static int fm10k_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd, |
648 | u32 *rule_locs) | 677 | u32 __always_unused *rule_locs) |
649 | { | 678 | { |
650 | struct fm10k_intfc *interface = netdev_priv(dev); | 679 | struct fm10k_intfc *interface = netdev_priv(dev); |
651 | int ret = -EOPNOTSUPP; | 680 | int ret = -EOPNOTSUPP; |
@@ -851,7 +880,7 @@ static void fm10k_self_test(struct net_device *dev, | |||
851 | eth_test->flags |= ETH_TEST_FL_FAILED; | 880 | eth_test->flags |= ETH_TEST_FL_FAILED; |
852 | } | 881 | } |
853 | 882 | ||
854 | static u32 fm10k_get_reta_size(struct net_device *netdev) | 883 | static u32 fm10k_get_reta_size(struct net_device __always_unused *netdev) |
855 | { | 884 | { |
856 | return FM10K_RETA_SIZE * FM10K_RETA_ENTRIES_PER_REG; | 885 | return FM10K_RETA_SIZE * FM10K_RETA_ENTRIES_PER_REG; |
857 | } | 886 | } |
@@ -911,7 +940,7 @@ static int fm10k_set_reta(struct net_device *netdev, const u32 *indir) | |||
911 | return 0; | 940 | return 0; |
912 | } | 941 | } |
913 | 942 | ||
914 | static u32 fm10k_get_rssrk_size(struct net_device *netdev) | 943 | static u32 fm10k_get_rssrk_size(struct net_device __always_unused *netdev) |
915 | { | 944 | { |
916 | return FM10K_RSSRK_SIZE * FM10K_RSSRK_ENTRIES_PER_REG; | 945 | return FM10K_RSSRK_SIZE * FM10K_RSSRK_ENTRIES_PER_REG; |
917 | } | 946 | } |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c index a02308f5048f..5b08e6284a3c 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -47,7 +47,7 @@ s32 fm10k_iov_event(struct fm10k_intfc *interface) | |||
47 | { | 47 | { |
48 | struct fm10k_hw *hw = &interface->hw; | 48 | struct fm10k_hw *hw = &interface->hw; |
49 | struct fm10k_iov_data *iov_data; | 49 | struct fm10k_iov_data *iov_data; |
50 | s64 mbicr, vflre; | 50 | s64 vflre; |
51 | int i; | 51 | int i; |
52 | 52 | ||
53 | /* if there is no iov_data then there is no mailboxes to process */ | 53 | /* if there is no iov_data then there is no mailboxes to process */ |
@@ -63,7 +63,7 @@ s32 fm10k_iov_event(struct fm10k_intfc *interface) | |||
63 | goto read_unlock; | 63 | goto read_unlock; |
64 | 64 | ||
65 | if (!(fm10k_read_reg(hw, FM10K_EICR) & FM10K_EICR_VFLR)) | 65 | if (!(fm10k_read_reg(hw, FM10K_EICR) & FM10K_EICR_VFLR)) |
66 | goto process_mbx; | 66 | goto read_unlock; |
67 | 67 | ||
68 | /* read VFLRE to determine if any VFs have been reset */ | 68 | /* read VFLRE to determine if any VFs have been reset */ |
69 | do { | 69 | do { |
@@ -86,32 +86,6 @@ s32 fm10k_iov_event(struct fm10k_intfc *interface) | |||
86 | } | 86 | } |
87 | } while (i != iov_data->num_vfs); | 87 | } while (i != iov_data->num_vfs); |
88 | 88 | ||
89 | process_mbx: | ||
90 | /* read MBICR to determine which VFs require attention */ | ||
91 | mbicr = fm10k_read_reg(hw, FM10K_MBICR(1)); | ||
92 | mbicr <<= 32; | ||
93 | mbicr |= fm10k_read_reg(hw, FM10K_MBICR(0)); | ||
94 | |||
95 | i = iov_data->next_vf_mbx ? : iov_data->num_vfs; | ||
96 | |||
97 | for (mbicr <<= 64 - i; i--; mbicr += mbicr) { | ||
98 | struct fm10k_mbx_info *mbx = &iov_data->vf_info[i].mbx; | ||
99 | |||
100 | if (mbicr >= 0) | ||
101 | continue; | ||
102 | |||
103 | if (!hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU)) | ||
104 | break; | ||
105 | |||
106 | mbx->ops.process(hw, mbx); | ||
107 | } | ||
108 | |||
109 | if (i >= 0) { | ||
110 | iov_data->next_vf_mbx = i + 1; | ||
111 | } else if (iov_data->next_vf_mbx) { | ||
112 | iov_data->next_vf_mbx = 0; | ||
113 | goto process_mbx; | ||
114 | } | ||
115 | read_unlock: | 89 | read_unlock: |
116 | rcu_read_unlock(); | 90 | rcu_read_unlock(); |
117 | 91 | ||
@@ -139,6 +113,13 @@ s32 fm10k_iov_mbx(struct fm10k_intfc *interface) | |||
139 | /* lock the mailbox for transmit and receive */ | 113 | /* lock the mailbox for transmit and receive */ |
140 | fm10k_mbx_lock(interface); | 114 | fm10k_mbx_lock(interface); |
141 | 115 | ||
116 | /* Most VF messages sent to the PF cause the PF to respond by | ||
117 | * requesting from the SM mailbox. This means that too many VF | ||
118 | * messages processed at once could cause a mailbox timeout on the PF. | ||
119 | * To prevent this, store a pointer to the next VF mbx to process. Use | ||
120 | * that as the start of the loop so that we don't starve whichever VF | ||
121 | * got ignored on the previous run. | ||
122 | */ | ||
142 | process_mbx: | 123 | process_mbx: |
143 | for (i = iov_data->next_vf_mbx ? : iov_data->num_vfs; i--;) { | 124 | for (i = iov_data->next_vf_mbx ? : iov_data->num_vfs; i--;) { |
144 | struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; | 125 | struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; |
@@ -155,10 +136,6 @@ process_mbx: | |||
155 | mbx->ops.connect(hw, mbx); | 136 | mbx->ops.connect(hw, mbx); |
156 | } | 137 | } |
157 | 138 | ||
158 | /* no work pending, then just continue */ | ||
159 | if (mbx->ops.tx_complete(mbx) && !mbx->ops.rx_ready(mbx)) | ||
160 | continue; | ||
161 | |||
162 | /* guarantee we have free space in the SM mailbox */ | 139 | /* guarantee we have free space in the SM mailbox */ |
163 | if (!hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU)) | 140 | if (!hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU)) |
164 | break; | 141 | break; |
@@ -167,6 +144,10 @@ process_mbx: | |||
167 | mbx->ops.process(hw, mbx); | 144 | mbx->ops.process(hw, mbx); |
168 | } | 145 | } |
169 | 146 | ||
147 | /* if we stopped processing mailboxes early, update next_vf_mbx. | ||
148 | * Otherwise, reset next_vf_mbx, and restart loop so that we process | ||
149 | * the remaining mailboxes we skipped at the start. | ||
150 | */ | ||
170 | if (i >= 0) { | 151 | if (i >= 0) { |
171 | iov_data->next_vf_mbx = i + 1; | 152 | iov_data->next_vf_mbx = i + 1; |
172 | } else if (iov_data->next_vf_mbx) { | 153 | } else if (iov_data->next_vf_mbx) { |
@@ -488,8 +469,8 @@ int fm10k_ndo_set_vf_vlan(struct net_device *netdev, int vf_idx, u16 vid, | |||
488 | return 0; | 469 | return 0; |
489 | } | 470 | } |
490 | 471 | ||
491 | int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx, int unused, | 472 | int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx, |
492 | int rate) | 473 | int __always_unused unused, int rate) |
493 | { | 474 | { |
494 | struct fm10k_intfc *interface = netdev_priv(netdev); | 475 | struct fm10k_intfc *interface = netdev_priv(netdev); |
495 | struct fm10k_iov_data *iov_data = interface->iov_data; | 476 | struct fm10k_iov_data *iov_data = interface->iov_data; |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c index c325bc0c8338..1b0661e3573b 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c | |||
@@ -28,7 +28,7 @@ | |||
28 | 28 | ||
29 | #include "fm10k.h" | 29 | #include "fm10k.h" |
30 | 30 | ||
31 | #define DRV_VERSION "0.12.2-k" | 31 | #define DRV_VERSION "0.15.2-k" |
32 | const char fm10k_driver_version[] = DRV_VERSION; | 32 | const char fm10k_driver_version[] = DRV_VERSION; |
33 | char fm10k_driver_name[] = "fm10k"; | 33 | char fm10k_driver_name[] = "fm10k"; |
34 | static const char fm10k_driver_string[] = | 34 | static const char fm10k_driver_string[] = |
@@ -41,6 +41,9 @@ MODULE_DESCRIPTION("Intel(R) Ethernet Switch Host Interface Driver"); | |||
41 | MODULE_LICENSE("GPL"); | 41 | MODULE_LICENSE("GPL"); |
42 | MODULE_VERSION(DRV_VERSION); | 42 | MODULE_VERSION(DRV_VERSION); |
43 | 43 | ||
44 | /* single workqueue for entire fm10k driver */ | ||
45 | struct workqueue_struct *fm10k_workqueue = NULL; | ||
46 | |||
44 | /** | 47 | /** |
45 | * fm10k_init_module - Driver Registration Routine | 48 | * fm10k_init_module - Driver Registration Routine |
46 | * | 49 | * |
@@ -52,6 +55,10 @@ static int __init fm10k_init_module(void) | |||
52 | pr_info("%s - version %s\n", fm10k_driver_string, fm10k_driver_version); | 55 | pr_info("%s - version %s\n", fm10k_driver_string, fm10k_driver_version); |
53 | pr_info("%s\n", fm10k_copyright); | 56 | pr_info("%s\n", fm10k_copyright); |
54 | 57 | ||
58 | /* create driver workqueue */ | ||
59 | if (!fm10k_workqueue) | ||
60 | fm10k_workqueue = create_workqueue("fm10k"); | ||
61 | |||
55 | fm10k_dbg_init(); | 62 | fm10k_dbg_init(); |
56 | 63 | ||
57 | return fm10k_register_pci_driver(); | 64 | return fm10k_register_pci_driver(); |
@@ -69,6 +76,11 @@ static void __exit fm10k_exit_module(void) | |||
69 | fm10k_unregister_pci_driver(); | 76 | fm10k_unregister_pci_driver(); |
70 | 77 | ||
71 | fm10k_dbg_exit(); | 78 | fm10k_dbg_exit(); |
79 | |||
80 | /* destroy driver workqueue */ | ||
81 | flush_workqueue(fm10k_workqueue); | ||
82 | destroy_workqueue(fm10k_workqueue); | ||
83 | fm10k_workqueue = NULL; | ||
72 | } | 84 | } |
73 | module_exit(fm10k_exit_module); | 85 | module_exit(fm10k_exit_module); |
74 | 86 | ||
@@ -209,7 +221,7 @@ static inline bool fm10k_page_is_reserved(struct page *page) | |||
209 | 221 | ||
210 | static bool fm10k_can_reuse_rx_page(struct fm10k_rx_buffer *rx_buffer, | 222 | static bool fm10k_can_reuse_rx_page(struct fm10k_rx_buffer *rx_buffer, |
211 | struct page *page, | 223 | struct page *page, |
212 | unsigned int truesize) | 224 | unsigned int __maybe_unused truesize) |
213 | { | 225 | { |
214 | /* avoid re-using remote pages */ | 226 | /* avoid re-using remote pages */ |
215 | if (unlikely(fm10k_page_is_reserved(page))) | 227 | if (unlikely(fm10k_page_is_reserved(page))) |
@@ -240,7 +252,6 @@ static bool fm10k_can_reuse_rx_page(struct fm10k_rx_buffer *rx_buffer, | |||
240 | 252 | ||
241 | /** | 253 | /** |
242 | * fm10k_add_rx_frag - Add contents of Rx buffer to sk_buff | 254 | * fm10k_add_rx_frag - Add contents of Rx buffer to sk_buff |
243 | * @rx_ring: rx descriptor ring to transact packets on | ||
244 | * @rx_buffer: buffer containing page to add | 255 | * @rx_buffer: buffer containing page to add |
245 | * @rx_desc: descriptor containing length of buffer written by hardware | 256 | * @rx_desc: descriptor containing length of buffer written by hardware |
246 | * @skb: sk_buff to place the data into | 257 | * @skb: sk_buff to place the data into |
@@ -253,8 +264,7 @@ static bool fm10k_can_reuse_rx_page(struct fm10k_rx_buffer *rx_buffer, | |||
253 | * The function will then update the page offset if necessary and return | 264 | * The function will then update the page offset if necessary and return |
254 | * true if the buffer can be reused by the interface. | 265 | * true if the buffer can be reused by the interface. |
255 | **/ | 266 | **/ |
256 | static bool fm10k_add_rx_frag(struct fm10k_ring *rx_ring, | 267 | static bool fm10k_add_rx_frag(struct fm10k_rx_buffer *rx_buffer, |
257 | struct fm10k_rx_buffer *rx_buffer, | ||
258 | union fm10k_rx_desc *rx_desc, | 268 | union fm10k_rx_desc *rx_desc, |
259 | struct sk_buff *skb) | 269 | struct sk_buff *skb) |
260 | { | 270 | { |
@@ -330,7 +340,7 @@ static struct sk_buff *fm10k_fetch_rx_buffer(struct fm10k_ring *rx_ring, | |||
330 | DMA_FROM_DEVICE); | 340 | DMA_FROM_DEVICE); |
331 | 341 | ||
332 | /* pull page into skb */ | 342 | /* pull page into skb */ |
333 | if (fm10k_add_rx_frag(rx_ring, rx_buffer, rx_desc, skb)) { | 343 | if (fm10k_add_rx_frag(rx_buffer, rx_desc, skb)) { |
334 | /* hand second half of page back to the ring */ | 344 | /* hand second half of page back to the ring */ |
335 | fm10k_reuse_rx_page(rx_ring, rx_buffer); | 345 | fm10k_reuse_rx_page(rx_ring, rx_buffer); |
336 | } else { | 346 | } else { |
@@ -412,7 +422,7 @@ static void fm10k_rx_hwtstamp(struct fm10k_ring *rx_ring, | |||
412 | } | 422 | } |
413 | 423 | ||
414 | static void fm10k_type_trans(struct fm10k_ring *rx_ring, | 424 | static void fm10k_type_trans(struct fm10k_ring *rx_ring, |
415 | union fm10k_rx_desc *rx_desc, | 425 | union fm10k_rx_desc __maybe_unused *rx_desc, |
416 | struct sk_buff *skb) | 426 | struct sk_buff *skb) |
417 | { | 427 | { |
418 | struct net_device *dev = rx_ring->netdev; | 428 | struct net_device *dev = rx_ring->netdev; |
@@ -509,8 +519,6 @@ static bool fm10k_is_non_eop(struct fm10k_ring *rx_ring, | |||
509 | 519 | ||
510 | /** | 520 | /** |
511 | * fm10k_pull_tail - fm10k specific version of skb_pull_tail | 521 | * fm10k_pull_tail - fm10k specific version of skb_pull_tail |
512 | * @rx_ring: rx descriptor ring packet is being transacted on | ||
513 | * @rx_desc: pointer to the EOP Rx descriptor | ||
514 | * @skb: pointer to current skb being adjusted | 522 | * @skb: pointer to current skb being adjusted |
515 | * | 523 | * |
516 | * This function is an fm10k specific version of __pskb_pull_tail. The | 524 | * This function is an fm10k specific version of __pskb_pull_tail. The |
@@ -520,9 +528,7 @@ static bool fm10k_is_non_eop(struct fm10k_ring *rx_ring, | |||
520 | * As a result we can do things like drop a frag and maintain an accurate | 528 | * As a result we can do things like drop a frag and maintain an accurate |
521 | * truesize for the skb. | 529 | * truesize for the skb. |
522 | */ | 530 | */ |
523 | static void fm10k_pull_tail(struct fm10k_ring *rx_ring, | 531 | static void fm10k_pull_tail(struct sk_buff *skb) |
524 | union fm10k_rx_desc *rx_desc, | ||
525 | struct sk_buff *skb) | ||
526 | { | 532 | { |
527 | struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0]; | 533 | struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0]; |
528 | unsigned char *va; | 534 | unsigned char *va; |
@@ -576,7 +582,7 @@ static bool fm10k_cleanup_headers(struct fm10k_ring *rx_ring, | |||
576 | 582 | ||
577 | /* place header in linear portion of buffer */ | 583 | /* place header in linear portion of buffer */ |
578 | if (skb_is_nonlinear(skb)) | 584 | if (skb_is_nonlinear(skb)) |
579 | fm10k_pull_tail(rx_ring, rx_desc, skb); | 585 | fm10k_pull_tail(skb); |
580 | 586 | ||
581 | /* if eth_skb_pad returns an error the skb was freed */ | 587 | /* if eth_skb_pad returns an error the skb was freed */ |
582 | if (eth_skb_pad(skb)) | 588 | if (eth_skb_pad(skb)) |
@@ -1197,7 +1203,6 @@ void fm10k_tx_timeout_reset(struct fm10k_intfc *interface) | |||
1197 | { | 1203 | { |
1198 | /* Do the reset outside of interrupt context */ | 1204 | /* Do the reset outside of interrupt context */ |
1199 | if (!test_bit(__FM10K_DOWN, &interface->state)) { | 1205 | if (!test_bit(__FM10K_DOWN, &interface->state)) { |
1200 | netdev_err(interface->netdev, "Reset interface\n"); | ||
1201 | interface->tx_timeout_count++; | 1206 | interface->tx_timeout_count++; |
1202 | interface->flags |= FM10K_FLAG_RESET_REQUESTED; | 1207 | interface->flags |= FM10K_FLAG_RESET_REQUESTED; |
1203 | fm10k_service_event_schedule(interface); | 1208 | fm10k_service_event_schedule(interface); |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c index 14ee696e9830..1b2738380518 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_mbx.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -126,6 +126,18 @@ static u16 fm10k_fifo_head_drop(struct fm10k_mbx_fifo *fifo) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | /** | 128 | /** |
129 | * fm10k_fifo_drop_all - Drop all messages in FIFO | ||
130 | * @fifo: pointer to FIFO | ||
131 | * | ||
132 | * This function resets the head pointer to drop all messages in the FIFO, | ||
133 | * and ensure the FIFO is empty. | ||
134 | **/ | ||
135 | static void fm10k_fifo_drop_all(struct fm10k_mbx_fifo *fifo) | ||
136 | { | ||
137 | fifo->head = fifo->tail; | ||
138 | } | ||
139 | |||
140 | /** | ||
129 | * fm10k_mbx_index_len - Convert a head/tail index into a length value | 141 | * fm10k_mbx_index_len - Convert a head/tail index into a length value |
130 | * @mbx: pointer to mailbox | 142 | * @mbx: pointer to mailbox |
131 | * @head: head index | 143 | * @head: head index |
@@ -315,7 +327,7 @@ static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len) | |||
315 | } while (total_len < len); | 327 | } while (total_len < len); |
316 | 328 | ||
317 | /* message extends out of pushed section, but fits in FIFO */ | 329 | /* message extends out of pushed section, but fits in FIFO */ |
318 | if ((len < total_len) && (msg_len <= mbx->rx.size)) | 330 | if ((len < total_len) && (msg_len <= mbx->max_size)) |
319 | return 0; | 331 | return 0; |
320 | 332 | ||
321 | /* return length of invalid section */ | 333 | /* return length of invalid section */ |
@@ -326,8 +338,7 @@ static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len) | |||
326 | * fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem | 338 | * fm10k_mbx_write_copy - pulls data off of Tx FIFO and places it in mbmem |
327 | * @mbx: pointer to mailbox | 339 | * @mbx: pointer to mailbox |
328 | * | 340 | * |
329 | * This function will take a section of the Rx FIFO and copy it into the | 341 | * This function will take a section of the Tx FIFO and copy it into the |
330 | mbx->tail--; | ||
331 | * mailbox memory. The offset in mbmem is based on the lower bits of the | 342 | * mailbox memory. The offset in mbmem is based on the lower bits of the |
332 | * tail and len determines the length to copy. | 343 | * tail and len determines the length to copy. |
333 | **/ | 344 | **/ |
@@ -818,7 +829,7 @@ static void fm10k_mbx_write(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) | |||
818 | /* write new msg header to notify recipient of change */ | 829 | /* write new msg header to notify recipient of change */ |
819 | fm10k_write_reg(hw, mbmem, mbx->mbx_hdr); | 830 | fm10k_write_reg(hw, mbmem, mbx->mbx_hdr); |
820 | 831 | ||
821 | /* write mailbox to sent interrupt */ | 832 | /* write mailbox to send interrupt */ |
822 | if (mbx->mbx_lock) | 833 | if (mbx->mbx_lock) |
823 | fm10k_write_reg(hw, mbx->mbx_reg, mbx->mbx_lock); | 834 | fm10k_write_reg(hw, mbx->mbx_reg, mbx->mbx_lock); |
824 | 835 | ||
@@ -1052,8 +1063,11 @@ static void fm10k_mbx_reset_work(struct fm10k_mbx_info *mbx) | |||
1052 | * @mbx: pointer to mailbox | 1063 | * @mbx: pointer to mailbox |
1053 | * @size: new value for max_size | 1064 | * @size: new value for max_size |
1054 | * | 1065 | * |
1055 | * This function will update the max_size value and drop any outgoing messages | 1066 | * This function updates the max_size value and drops any outgoing messages |
1056 | * from the head of the Tx FIFO that are larger than max_size. | 1067 | * at the head of the Tx FIFO if they are larger than max_size. It does not |
1068 | * drop all messages, as this is too difficult to parse and remove them from | ||
1069 | * the FIFO. Instead, rely on the checking to ensure that messages larger | ||
1070 | * than max_size aren't pushed into the memory buffer. | ||
1057 | **/ | 1071 | **/ |
1058 | static void fm10k_mbx_update_max_size(struct fm10k_mbx_info *mbx, u16 size) | 1072 | static void fm10k_mbx_update_max_size(struct fm10k_mbx_info *mbx, u16 size) |
1059 | { | 1073 | { |
@@ -1371,9 +1385,11 @@ static void fm10k_mbx_disconnect(struct fm10k_hw *hw, | |||
1371 | timeout -= FM10K_MBX_POLL_DELAY; | 1385 | timeout -= FM10K_MBX_POLL_DELAY; |
1372 | } while ((timeout > 0) && (mbx->state != FM10K_STATE_CLOSED)); | 1386 | } while ((timeout > 0) && (mbx->state != FM10K_STATE_CLOSED)); |
1373 | 1387 | ||
1374 | /* in case we didn't close just force the mailbox into shutdown */ | 1388 | /* in case we didn't close, just force the mailbox into shutdown and |
1389 | * drop all left over messages in the FIFO. | ||
1390 | */ | ||
1375 | fm10k_mbx_connect_reset(mbx); | 1391 | fm10k_mbx_connect_reset(mbx); |
1376 | fm10k_mbx_update_max_size(mbx, 0); | 1392 | fm10k_fifo_drop_all(&mbx->tx); |
1377 | 1393 | ||
1378 | fm10k_write_reg(hw, mbx->mbmem_reg, 0); | 1394 | fm10k_write_reg(hw, mbx->mbmem_reg, 0); |
1379 | } | 1395 | } |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c index d5b303dad95e..2f4f41b7eae7 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_netdev.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -770,15 +770,15 @@ static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set) | |||
770 | if (hw->mac.vlan_override) | 770 | if (hw->mac.vlan_override) |
771 | return -EACCES; | 771 | return -EACCES; |
772 | 772 | ||
773 | /* if default VLAN is already present do nothing */ | ||
774 | if (vid == hw->mac.default_vid) | ||
775 | return -EBUSY; | ||
776 | |||
777 | /* update active_vlans bitmask */ | 773 | /* update active_vlans bitmask */ |
778 | set_bit(vid, interface->active_vlans); | 774 | set_bit(vid, interface->active_vlans); |
779 | if (!set) | 775 | if (!set) |
780 | clear_bit(vid, interface->active_vlans); | 776 | clear_bit(vid, interface->active_vlans); |
781 | 777 | ||
778 | /* if default VLAN is already present do nothing */ | ||
779 | if (vid == hw->mac.default_vid) | ||
780 | return 0; | ||
781 | |||
782 | fm10k_mbx_lock(interface); | 782 | fm10k_mbx_lock(interface); |
783 | 783 | ||
784 | /* only need to update the VLAN if not in promiscuous mode */ | 784 | /* only need to update the VLAN if not in promiscuous mode */ |
@@ -970,14 +970,7 @@ static void fm10k_set_rx_mode(struct net_device *dev) | |||
970 | 970 | ||
971 | fm10k_mbx_lock(interface); | 971 | fm10k_mbx_lock(interface); |
972 | 972 | ||
973 | /* synchronize all of the addresses */ | 973 | /* update xcast mode first, but only if it changed */ |
974 | if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { | ||
975 | __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync); | ||
976 | if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI) | ||
977 | __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync); | ||
978 | } | ||
979 | |||
980 | /* if we aren't changing modes there is nothing to do */ | ||
981 | if (interface->xcast_mode != xcast_mode) { | 974 | if (interface->xcast_mode != xcast_mode) { |
982 | /* update VLAN table */ | 975 | /* update VLAN table */ |
983 | if (xcast_mode == FM10K_XCAST_MODE_PROMISC) | 976 | if (xcast_mode == FM10K_XCAST_MODE_PROMISC) |
@@ -992,6 +985,13 @@ static void fm10k_set_rx_mode(struct net_device *dev) | |||
992 | interface->xcast_mode = xcast_mode; | 985 | interface->xcast_mode = xcast_mode; |
993 | } | 986 | } |
994 | 987 | ||
988 | /* synchronize all of the addresses */ | ||
989 | if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { | ||
990 | __dev_uc_sync(dev, fm10k_uc_sync, fm10k_uc_unsync); | ||
991 | if (xcast_mode != FM10K_XCAST_MODE_ALLMULTI) | ||
992 | __dev_mc_sync(dev, fm10k_mc_sync, fm10k_mc_unsync); | ||
993 | } | ||
994 | |||
995 | fm10k_mbx_unlock(interface); | 995 | fm10k_mbx_unlock(interface); |
996 | } | 996 | } |
997 | 997 | ||
@@ -1051,6 +1051,9 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface) | |||
1051 | vid, true, 0); | 1051 | vid, true, 0); |
1052 | } | 1052 | } |
1053 | 1053 | ||
1054 | /* update xcast mode before syncronizing addresses */ | ||
1055 | hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode); | ||
1056 | |||
1054 | /* synchronize all of the addresses */ | 1057 | /* synchronize all of the addresses */ |
1055 | if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { | 1058 | if (xcast_mode != FM10K_XCAST_MODE_PROMISC) { |
1056 | __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync); | 1059 | __dev_uc_sync(netdev, fm10k_uc_sync, fm10k_uc_unsync); |
@@ -1058,9 +1061,6 @@ void fm10k_restore_rx_state(struct fm10k_intfc *interface) | |||
1058 | __dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync); | 1061 | __dev_mc_sync(netdev, fm10k_mc_sync, fm10k_mc_unsync); |
1059 | } | 1062 | } |
1060 | 1063 | ||
1061 | /* update xcast mode */ | ||
1062 | hw->mac.ops.update_xcast_mode(hw, glort, xcast_mode); | ||
1063 | |||
1064 | fm10k_mbx_unlock(interface); | 1064 | fm10k_mbx_unlock(interface); |
1065 | 1065 | ||
1066 | /* record updated xcast mode state */ | 1066 | /* record updated xcast mode state */ |
@@ -1126,7 +1126,7 @@ static struct rtnl_link_stats64 *fm10k_get_stats64(struct net_device *netdev, | |||
1126 | } | 1126 | } |
1127 | 1127 | ||
1128 | for (i = 0; i < interface->num_tx_queues; i++) { | 1128 | for (i = 0; i < interface->num_tx_queues; i++) { |
1129 | ring = ACCESS_ONCE(interface->rx_ring[i]); | 1129 | ring = ACCESS_ONCE(interface->tx_ring[i]); |
1130 | 1130 | ||
1131 | if (!ring) | 1131 | if (!ring) |
1132 | continue; | 1132 | continue; |
@@ -1382,6 +1382,9 @@ static const struct net_device_ops fm10k_netdev_ops = { | |||
1382 | .ndo_do_ioctl = fm10k_ioctl, | 1382 | .ndo_do_ioctl = fm10k_ioctl, |
1383 | .ndo_dfwd_add_station = fm10k_dfwd_add_station, | 1383 | .ndo_dfwd_add_station = fm10k_dfwd_add_station, |
1384 | .ndo_dfwd_del_station = fm10k_dfwd_del_station, | 1384 | .ndo_dfwd_del_station = fm10k_dfwd_del_station, |
1385 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1386 | .ndo_poll_controller = fm10k_netpoll, | ||
1387 | #endif | ||
1385 | .ndo_features_check = fm10k_features_check, | 1388 | .ndo_features_check = fm10k_features_check, |
1386 | }; | 1389 | }; |
1387 | 1390 | ||
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c index 8978d55a1c51..df9fda38bdd1 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -94,7 +94,7 @@ void fm10k_service_event_schedule(struct fm10k_intfc *interface) | |||
94 | { | 94 | { |
95 | if (!test_bit(__FM10K_SERVICE_DISABLE, &interface->state) && | 95 | if (!test_bit(__FM10K_SERVICE_DISABLE, &interface->state) && |
96 | !test_and_set_bit(__FM10K_SERVICE_SCHED, &interface->state)) | 96 | !test_and_set_bit(__FM10K_SERVICE_SCHED, &interface->state)) |
97 | schedule_work(&interface->service_task); | 97 | queue_work(fm10k_workqueue, &interface->service_task); |
98 | } | 98 | } |
99 | 99 | ||
100 | static void fm10k_service_event_complete(struct fm10k_intfc *interface) | 100 | static void fm10k_service_event_complete(struct fm10k_intfc *interface) |
@@ -191,7 +191,6 @@ static void fm10k_reset_subtask(struct fm10k_intfc *interface) | |||
191 | interface->flags &= ~FM10K_FLAG_RESET_REQUESTED; | 191 | interface->flags &= ~FM10K_FLAG_RESET_REQUESTED; |
192 | 192 | ||
193 | netdev_err(interface->netdev, "Reset interface\n"); | 193 | netdev_err(interface->netdev, "Reset interface\n"); |
194 | interface->tx_timeout_count++; | ||
195 | 194 | ||
196 | fm10k_reinit(interface); | 195 | fm10k_reinit(interface); |
197 | } | 196 | } |
@@ -357,11 +356,10 @@ void fm10k_update_stats(struct fm10k_intfc *interface) | |||
357 | net_stats->rx_packets = pkts; | 356 | net_stats->rx_packets = pkts; |
358 | interface->alloc_failed = alloc_failed; | 357 | interface->alloc_failed = alloc_failed; |
359 | interface->rx_csum_errors = rx_csum_errors; | 358 | interface->rx_csum_errors = rx_csum_errors; |
360 | interface->rx_errors = rx_errors; | ||
361 | 359 | ||
362 | hw->mac.ops.update_hw_stats(hw, &interface->stats); | 360 | hw->mac.ops.update_hw_stats(hw, &interface->stats); |
363 | 361 | ||
364 | for (i = 0; i < FM10K_MAX_QUEUES_PF; i++) { | 362 | for (i = 0; i < hw->mac.max_queues; i++) { |
365 | struct fm10k_hw_stats_q *q = &interface->stats.q[i]; | 363 | struct fm10k_hw_stats_q *q = &interface->stats.q[i]; |
366 | 364 | ||
367 | tx_bytes_nic += q->tx_bytes.count; | 365 | tx_bytes_nic += q->tx_bytes.count; |
@@ -378,7 +376,7 @@ void fm10k_update_stats(struct fm10k_intfc *interface) | |||
378 | interface->rx_drops_nic = rx_drops_nic; | 376 | interface->rx_drops_nic = rx_drops_nic; |
379 | 377 | ||
380 | /* Fill out the OS statistics structure */ | 378 | /* Fill out the OS statistics structure */ |
381 | net_stats->rx_errors = interface->stats.xec.count; | 379 | net_stats->rx_errors = rx_errors; |
382 | net_stats->rx_dropped = interface->stats.nodesc_drop.count; | 380 | net_stats->rx_dropped = interface->stats.nodesc_drop.count; |
383 | } | 381 | } |
384 | 382 | ||
@@ -808,7 +806,7 @@ static void fm10k_napi_enable_all(struct fm10k_intfc *interface) | |||
808 | } | 806 | } |
809 | } | 807 | } |
810 | 808 | ||
811 | static irqreturn_t fm10k_msix_clean_rings(int irq, void *data) | 809 | static irqreturn_t fm10k_msix_clean_rings(int __always_unused irq, void *data) |
812 | { | 810 | { |
813 | struct fm10k_q_vector *q_vector = data; | 811 | struct fm10k_q_vector *q_vector = data; |
814 | 812 | ||
@@ -818,7 +816,7 @@ static irqreturn_t fm10k_msix_clean_rings(int irq, void *data) | |||
818 | return IRQ_HANDLED; | 816 | return IRQ_HANDLED; |
819 | } | 817 | } |
820 | 818 | ||
821 | static irqreturn_t fm10k_msix_mbx_vf(int irq, void *data) | 819 | static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data) |
822 | { | 820 | { |
823 | struct fm10k_intfc *interface = data; | 821 | struct fm10k_intfc *interface = data; |
824 | struct fm10k_hw *hw = &interface->hw; | 822 | struct fm10k_hw *hw = &interface->hw; |
@@ -840,6 +838,28 @@ static irqreturn_t fm10k_msix_mbx_vf(int irq, void *data) | |||
840 | return IRQ_HANDLED; | 838 | return IRQ_HANDLED; |
841 | } | 839 | } |
842 | 840 | ||
841 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
842 | /** | ||
843 | * fm10k_netpoll - A Polling 'interrupt' handler | ||
844 | * @netdev: network interface device structure | ||
845 | * | ||
846 | * This is used by netconsole to send skbs without having to re-enable | ||
847 | * interrupts. It's not called while the normal interrupt routine is executing. | ||
848 | **/ | ||
849 | void fm10k_netpoll(struct net_device *netdev) | ||
850 | { | ||
851 | struct fm10k_intfc *interface = netdev_priv(netdev); | ||
852 | int i; | ||
853 | |||
854 | /* if interface is down do nothing */ | ||
855 | if (test_bit(__FM10K_DOWN, &interface->state)) | ||
856 | return; | ||
857 | |||
858 | for (i = 0; i < interface->num_q_vectors; i++) | ||
859 | fm10k_msix_clean_rings(0, interface->q_vector[i]); | ||
860 | } | ||
861 | |||
862 | #endif | ||
843 | #define FM10K_ERR_MSG(type) case (type): error = #type; break | 863 | #define FM10K_ERR_MSG(type) case (type): error = #type; break |
844 | static void fm10k_print_fault(struct fm10k_intfc *interface, int type, | 864 | static void fm10k_print_fault(struct fm10k_intfc *interface, int type, |
845 | struct fm10k_fault *fault) | 865 | struct fm10k_fault *fault) |
@@ -964,7 +984,7 @@ static void fm10k_reset_drop_on_empty(struct fm10k_intfc *interface, u32 eicr) | |||
964 | } | 984 | } |
965 | } | 985 | } |
966 | 986 | ||
967 | static irqreturn_t fm10k_msix_mbx_pf(int irq, void *data) | 987 | static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data) |
968 | { | 988 | { |
969 | struct fm10k_intfc *interface = data; | 989 | struct fm10k_intfc *interface = data; |
970 | struct fm10k_hw *hw = &interface->hw; | 990 | struct fm10k_hw *hw = &interface->hw; |
@@ -986,6 +1006,7 @@ static irqreturn_t fm10k_msix_mbx_pf(int irq, void *data) | |||
986 | /* service mailboxes */ | 1006 | /* service mailboxes */ |
987 | if (fm10k_mbx_trylock(interface)) { | 1007 | if (fm10k_mbx_trylock(interface)) { |
988 | mbx->ops.process(hw, mbx); | 1008 | mbx->ops.process(hw, mbx); |
1009 | /* handle VFLRE events */ | ||
989 | fm10k_iov_event(interface); | 1010 | fm10k_iov_event(interface); |
990 | fm10k_mbx_unlock(interface); | 1011 | fm10k_mbx_unlock(interface); |
991 | } | 1012 | } |
@@ -1002,6 +1023,8 @@ static irqreturn_t fm10k_msix_mbx_pf(int irq, void *data) | |||
1002 | 1023 | ||
1003 | /* we should validate host state after interrupt event */ | 1024 | /* we should validate host state after interrupt event */ |
1004 | hw->mac.get_host_state = 1; | 1025 | hw->mac.get_host_state = 1; |
1026 | |||
1027 | /* validate host state, and handle VF mailboxes in the service task */ | ||
1005 | fm10k_service_event_schedule(interface); | 1028 | fm10k_service_event_schedule(interface); |
1006 | 1029 | ||
1007 | /* re-enable mailbox interrupt and indicate 20us delay */ | 1030 | /* re-enable mailbox interrupt and indicate 20us delay */ |
@@ -1069,7 +1092,7 @@ static s32 fm10k_mbx_mac_addr(struct fm10k_hw *hw, u32 **results, | |||
1069 | } | 1092 | } |
1070 | 1093 | ||
1071 | static s32 fm10k_1588_msg_vf(struct fm10k_hw *hw, u32 **results, | 1094 | static s32 fm10k_1588_msg_vf(struct fm10k_hw *hw, u32 **results, |
1072 | struct fm10k_mbx_info *mbx) | 1095 | struct fm10k_mbx_info __always_unused *mbx) |
1073 | { | 1096 | { |
1074 | struct fm10k_intfc *interface; | 1097 | struct fm10k_intfc *interface; |
1075 | u64 timestamp; | 1098 | u64 timestamp; |
@@ -1089,7 +1112,7 @@ static s32 fm10k_1588_msg_vf(struct fm10k_hw *hw, u32 **results, | |||
1089 | 1112 | ||
1090 | /* generic error handler for mailbox issues */ | 1113 | /* generic error handler for mailbox issues */ |
1091 | static s32 fm10k_mbx_error(struct fm10k_hw *hw, u32 **results, | 1114 | static s32 fm10k_mbx_error(struct fm10k_hw *hw, u32 **results, |
1092 | struct fm10k_mbx_info *mbx) | 1115 | struct fm10k_mbx_info __always_unused *mbx) |
1093 | { | 1116 | { |
1094 | struct fm10k_intfc *interface; | 1117 | struct fm10k_intfc *interface; |
1095 | struct pci_dev *pdev; | 1118 | struct pci_dev *pdev; |
@@ -1165,7 +1188,7 @@ static s32 fm10k_lport_map(struct fm10k_hw *hw, u32 **results, | |||
1165 | } | 1188 | } |
1166 | 1189 | ||
1167 | static s32 fm10k_update_pvid(struct fm10k_hw *hw, u32 **results, | 1190 | static s32 fm10k_update_pvid(struct fm10k_hw *hw, u32 **results, |
1168 | struct fm10k_mbx_info *mbx) | 1191 | struct fm10k_mbx_info __always_unused *mbx) |
1169 | { | 1192 | { |
1170 | struct fm10k_intfc *interface; | 1193 | struct fm10k_intfc *interface; |
1171 | u16 glort, pvid; | 1194 | u16 glort, pvid; |
@@ -1206,7 +1229,7 @@ static s32 fm10k_update_pvid(struct fm10k_hw *hw, u32 **results, | |||
1206 | } | 1229 | } |
1207 | 1230 | ||
1208 | static s32 fm10k_1588_msg_pf(struct fm10k_hw *hw, u32 **results, | 1231 | static s32 fm10k_1588_msg_pf(struct fm10k_hw *hw, u32 **results, |
1209 | struct fm10k_mbx_info *mbx) | 1232 | struct fm10k_mbx_info __always_unused *mbx) |
1210 | { | 1233 | { |
1211 | struct fm10k_swapi_1588_timestamp timestamp; | 1234 | struct fm10k_swapi_1588_timestamp timestamp; |
1212 | struct fm10k_iov_data *iov_data; | 1235 | struct fm10k_iov_data *iov_data; |
@@ -1488,7 +1511,7 @@ void fm10k_up(struct fm10k_intfc *interface) | |||
1488 | /* enable transmits */ | 1511 | /* enable transmits */ |
1489 | netif_tx_start_all_queues(interface->netdev); | 1512 | netif_tx_start_all_queues(interface->netdev); |
1490 | 1513 | ||
1491 | /* kick off the service timer */ | 1514 | /* kick off the service timer now */ |
1492 | hw->mac.get_host_state = 1; | 1515 | hw->mac.get_host_state = 1; |
1493 | mod_timer(&interface->service_timer, jiffies); | 1516 | mod_timer(&interface->service_timer, jiffies); |
1494 | } | 1517 | } |
@@ -1528,8 +1551,6 @@ void fm10k_down(struct fm10k_intfc *interface) | |||
1528 | /* disable polling routines */ | 1551 | /* disable polling routines */ |
1529 | fm10k_napi_disable_all(interface); | 1552 | fm10k_napi_disable_all(interface); |
1530 | 1553 | ||
1531 | del_timer_sync(&interface->service_timer); | ||
1532 | |||
1533 | /* capture stats one last time before stopping interface */ | 1554 | /* capture stats one last time before stopping interface */ |
1534 | fm10k_update_stats(interface); | 1555 | fm10k_update_stats(interface); |
1535 | 1556 | ||
@@ -1655,6 +1676,9 @@ static int fm10k_sw_init(struct fm10k_intfc *interface, | |||
1655 | (unsigned long)interface); | 1676 | (unsigned long)interface); |
1656 | INIT_WORK(&interface->service_task, fm10k_service_task); | 1677 | INIT_WORK(&interface->service_task, fm10k_service_task); |
1657 | 1678 | ||
1679 | /* kick off service timer now, even when interface is down */ | ||
1680 | mod_timer(&interface->service_timer, (HZ * 2) + jiffies); | ||
1681 | |||
1658 | /* Intitialize timestamp data */ | 1682 | /* Intitialize timestamp data */ |
1659 | fm10k_ts_init(interface); | 1683 | fm10k_ts_init(interface); |
1660 | 1684 | ||
@@ -1871,6 +1895,8 @@ static void fm10k_remove(struct pci_dev *pdev) | |||
1871 | struct fm10k_intfc *interface = pci_get_drvdata(pdev); | 1895 | struct fm10k_intfc *interface = pci_get_drvdata(pdev); |
1872 | struct net_device *netdev = interface->netdev; | 1896 | struct net_device *netdev = interface->netdev; |
1873 | 1897 | ||
1898 | del_timer_sync(&interface->service_timer); | ||
1899 | |||
1874 | set_bit(__FM10K_SERVICE_DISABLE, &interface->state); | 1900 | set_bit(__FM10K_SERVICE_DISABLE, &interface->state); |
1875 | cancel_work_sync(&interface->service_task); | 1901 | cancel_work_sync(&interface->service_task); |
1876 | 1902 | ||
@@ -1984,7 +2010,8 @@ static int fm10k_resume(struct pci_dev *pdev) | |||
1984 | * a sleep state. The fm10k hardware does not support wake on lan so the | 2010 | * a sleep state. The fm10k hardware does not support wake on lan so the |
1985 | * driver simply needs to shut down the device so it is in a low power state. | 2011 | * driver simply needs to shut down the device so it is in a low power state. |
1986 | **/ | 2012 | **/ |
1987 | static int fm10k_suspend(struct pci_dev *pdev, pm_message_t state) | 2013 | static int fm10k_suspend(struct pci_dev *pdev, |
2014 | pm_message_t __always_unused state) | ||
1988 | { | 2015 | { |
1989 | struct fm10k_intfc *interface = pci_get_drvdata(pdev); | 2016 | struct fm10k_intfc *interface = pci_get_drvdata(pdev); |
1990 | struct net_device *netdev = interface->netdev; | 2017 | struct net_device *netdev = interface->netdev; |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c index 159cd8463800..891e21874b2a 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_pf.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_pf.c | |||
@@ -329,6 +329,9 @@ static s32 fm10k_update_xc_addr_pf(struct fm10k_hw *hw, u16 glort, | |||
329 | struct fm10k_mac_update mac_update; | 329 | struct fm10k_mac_update mac_update; |
330 | u32 msg[5]; | 330 | u32 msg[5]; |
331 | 331 | ||
332 | /* clear set bit from VLAN ID */ | ||
333 | vid &= ~FM10K_VLAN_CLEAR; | ||
334 | |||
332 | /* if glort or vlan are not valid return error */ | 335 | /* if glort or vlan are not valid return error */ |
333 | if (!fm10k_glort_valid_pf(hw, glort) || vid >= FM10K_VLAN_TABLE_VID_MAX) | 336 | if (!fm10k_glort_valid_pf(hw, glort) || vid >= FM10K_VLAN_TABLE_VID_MAX) |
334 | return FM10K_ERR_PARAM; | 337 | return FM10K_ERR_PARAM; |
@@ -676,7 +679,8 @@ static s32 fm10k_iov_assign_resources_pf(struct fm10k_hw *hw, u16 num_vfs, | |||
676 | /* loop through unallocated rings assigning them back to PF */ | 679 | /* loop through unallocated rings assigning them back to PF */ |
677 | for (i = FM10K_MAX_QUEUES_PF; i < vf_q_idx; i++) { | 680 | for (i = FM10K_MAX_QUEUES_PF; i < vf_q_idx; i++) { |
678 | fm10k_write_reg(hw, FM10K_TXDCTL(i), 0); | 681 | fm10k_write_reg(hw, FM10K_TXDCTL(i), 0); |
679 | fm10k_write_reg(hw, FM10K_TXQCTL(i), FM10K_TXQCTL_PF | vid); | 682 | fm10k_write_reg(hw, FM10K_TXQCTL(i), FM10K_TXQCTL_PF | |
683 | FM10K_TXQCTL_UNLIMITED_BW | vid); | ||
680 | fm10k_write_reg(hw, FM10K_RXQCTL(i), FM10K_RXQCTL_PF); | 684 | fm10k_write_reg(hw, FM10K_RXQCTL(i), FM10K_RXQCTL_PF); |
681 | } | 685 | } |
682 | 686 | ||
@@ -1249,8 +1253,8 @@ s32 fm10k_iov_msg_mac_vlan_pf(struct fm10k_hw *hw, u32 **results, | |||
1249 | } | 1253 | } |
1250 | 1254 | ||
1251 | /* notify switch of request for new multicast address */ | 1255 | /* notify switch of request for new multicast address */ |
1252 | err = hw->mac.ops.update_mc_addr(hw, vf_info->glort, mac, | 1256 | err = hw->mac.ops.update_mc_addr(hw, vf_info->glort, mac, vlan, |
1253 | !(vlan & FM10K_VLAN_CLEAR), 0); | 1257 | !(vlan & FM10K_VLAN_CLEAR)); |
1254 | } | 1258 | } |
1255 | 1259 | ||
1256 | return err; | 1260 | return err; |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_ptp.c b/drivers/net/ethernet/intel/fm10k/fm10k_ptp.c index 02008e976d18..9043633c3e50 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_ptp.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_ptp.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -319,7 +319,8 @@ static int fm10k_ptp_settime(struct ptp_clock_info *ptp, | |||
319 | } | 319 | } |
320 | 320 | ||
321 | static int fm10k_ptp_enable(struct ptp_clock_info *ptp, | 321 | static int fm10k_ptp_enable(struct ptp_clock_info *ptp, |
322 | struct ptp_clock_request *rq, int on) | 322 | struct ptp_clock_request *rq, |
323 | int __always_unused on) | ||
323 | { | 324 | { |
324 | struct ptp_clock_time *t = &rq->perout.period; | 325 | struct ptp_clock_time *t = &rq->perout.period; |
325 | struct fm10k_intfc *interface; | 326 | struct fm10k_intfc *interface; |
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c index 17219678439a..94f0f6a146d9 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_vf.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_vf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* Intel Ethernet Switch Host Interface Driver | 1 | /* Intel Ethernet Switch Host Interface Driver |
2 | * Copyright(c) 2013 - 2014 Intel Corporation. | 2 | * Copyright(c) 2013 - 2015 Intel Corporation. |
3 | * | 3 | * |
4 | * This program is free software; you can redistribute it and/or modify it | 4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | 5 | * under the terms and conditions of the GNU General Public License, |
@@ -124,6 +124,10 @@ static s32 fm10k_init_hw_vf(struct fm10k_hw *hw) | |||
124 | /* record maximum queue count */ | 124 | /* record maximum queue count */ |
125 | hw->mac.max_queues = i; | 125 | hw->mac.max_queues = i; |
126 | 126 | ||
127 | /* fetch default VLAN */ | ||
128 | hw->mac.default_vid = (fm10k_read_reg(hw, FM10K_TXQCTL(0)) & | ||
129 | FM10K_TXQCTL_VID_MASK) >> FM10K_TXQCTL_VID_SHIFT; | ||
130 | |||
127 | return 0; | 131 | return 0; |
128 | } | 132 | } |
129 | 133 | ||