1 /*******************************************************************************
3 Intel(R) Gigabit Ethernet Linux driver
4 Copyright(c) 2007-2013 Intel Corporation.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms and conditions of the GNU General Public License,
8 version 2, as published by the Free Software Foundation.
10 This program is distributed in the hope it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 The full GNU General Public License is included in this distribution in
20 the file called "LICENSE.GPL".
23 e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26 *******************************************************************************/
29 #include <linux/tcp.h>
33 #include <linux/if_vlan.h>
35 #ifdef CONFIG_IGB_VMDQ_NETDEV
36 int igb_vmdq_open(struct net_device
*dev
)
38 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
39 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
40 struct net_device
*main_netdev
= adapter
->netdev
;
41 int hw_queue
= vadapter
->rx_ring
->queue_index
+
42 adapter
->vfs_allocated_count
;
44 if (test_bit(__IGB_DOWN
, &adapter
->state
)) {
46 "Open %s before opening this device.\n",
50 netif_carrier_off(dev
);
51 vadapter
->tx_ring
->vmdq_netdev
= dev
;
52 vadapter
->rx_ring
->vmdq_netdev
= dev
;
53 if (is_valid_ether_addr(dev
->dev_addr
)) {
54 igb_del_mac_filter(adapter
, dev
->dev_addr
, hw_queue
);
55 igb_add_mac_filter(adapter
, dev
->dev_addr
, hw_queue
);
57 netif_carrier_on(dev
);
61 int igb_vmdq_close(struct net_device
*dev
)
63 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
64 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
65 int hw_queue
= vadapter
->rx_ring
->queue_index
+
66 adapter
->vfs_allocated_count
;
68 netif_carrier_off(dev
);
69 igb_del_mac_filter(adapter
, dev
->dev_addr
, hw_queue
);
71 vadapter
->tx_ring
->vmdq_netdev
= NULL
;
72 vadapter
->rx_ring
->vmdq_netdev
= NULL
;
76 netdev_tx_t
igb_vmdq_xmit_frame(struct sk_buff
*skb
, struct net_device
*dev
)
78 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
80 return igb_xmit_frame_ring(skb
, vadapter
->tx_ring
);
83 struct net_device_stats
*igb_vmdq_get_stats(struct net_device
*dev
)
85 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
86 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
87 struct e1000_hw
*hw
= &adapter
->hw
;
88 int hw_queue
= vadapter
->rx_ring
->queue_index
+
89 adapter
->vfs_allocated_count
;
91 vadapter
->net_stats
.rx_packets
+=
92 E1000_READ_REG(hw
, E1000_PFVFGPRC(hw_queue
));
93 E1000_WRITE_REG(hw
, E1000_PFVFGPRC(hw_queue
), 0);
94 vadapter
->net_stats
.tx_packets
+=
95 E1000_READ_REG(hw
, E1000_PFVFGPTC(hw_queue
));
96 E1000_WRITE_REG(hw
, E1000_PFVFGPTC(hw_queue
), 0);
97 vadapter
->net_stats
.rx_bytes
+=
98 E1000_READ_REG(hw
, E1000_PFVFGORC(hw_queue
));
99 E1000_WRITE_REG(hw
, E1000_PFVFGORC(hw_queue
), 0);
100 vadapter
->net_stats
.tx_bytes
+=
101 E1000_READ_REG(hw
, E1000_PFVFGOTC(hw_queue
));
102 E1000_WRITE_REG(hw
, E1000_PFVFGOTC(hw_queue
), 0);
103 vadapter
->net_stats
.multicast
+=
104 E1000_READ_REG(hw
, E1000_PFVFMPRC(hw_queue
));
105 E1000_WRITE_REG(hw
, E1000_PFVFMPRC(hw_queue
), 0);
106 /* only return the current stats */
107 return &vadapter
->net_stats
;
111 * igb_write_vm_addr_list - write unicast addresses to RAR table
112 * @netdev: network interface device structure
114 * Writes unicast address list to the RAR table.
115 * Returns: -ENOMEM on failure/insufficient address space
116 * 0 on no addresses written
117 * X on writing X addresses to the RAR table
119 static int igb_write_vm_addr_list(struct net_device
*netdev
)
121 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
122 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
124 int hw_queue
= vadapter
->rx_ring
->queue_index
+
125 adapter
->vfs_allocated_count
;
127 /* return ENOMEM indicating insufficient memory for addresses */
128 if (netdev_uc_count(netdev
) > igb_available_rars(adapter
))
131 if (!netdev_uc_empty(netdev
)) {
132 #ifdef NETDEV_HW_ADDR_T_UNICAST
133 struct netdev_hw_addr
*ha
;
135 struct dev_mc_list
*ha
;
137 netdev_for_each_uc_addr(ha
, netdev
) {
138 #ifdef NETDEV_HW_ADDR_T_UNICAST
139 igb_del_mac_filter(adapter
, ha
->addr
, hw_queue
);
140 igb_add_mac_filter(adapter
, ha
->addr
, hw_queue
);
142 igb_del_mac_filter(adapter
, ha
->da_addr
, hw_queue
);
143 igb_add_mac_filter(adapter
, ha
->da_addr
, hw_queue
);
152 #define E1000_VMOLR_UPE 0x20000000 /* Unicast promiscuous mode */
153 void igb_vmdq_set_rx_mode(struct net_device
*dev
)
155 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
156 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
157 struct e1000_hw
*hw
= &adapter
->hw
;
159 int hw_queue
= vadapter
->rx_ring
->queue_index
+
160 adapter
->vfs_allocated_count
;
162 /* Check for Promiscuous and All Multicast modes */
163 vmolr
= E1000_READ_REG(hw
, E1000_VMOLR(hw_queue
));
165 /* clear the affected bits */
166 vmolr
&= ~(E1000_VMOLR_UPE
| E1000_VMOLR_MPME
|
167 E1000_VMOLR_ROPE
| E1000_VMOLR_ROMPE
);
169 if (dev
->flags
& IFF_PROMISC
) {
170 vmolr
|= E1000_VMOLR_UPE
;
171 rctl
= E1000_READ_REG(hw
, E1000_RCTL
);
172 rctl
|= E1000_RCTL_UPE
;
173 E1000_WRITE_REG(hw
, E1000_RCTL
, rctl
);
175 rctl
= E1000_READ_REG(hw
, E1000_RCTL
);
176 rctl
&= ~E1000_RCTL_UPE
;
177 E1000_WRITE_REG(hw
, E1000_RCTL
, rctl
);
178 if (dev
->flags
& IFF_ALLMULTI
) {
179 vmolr
|= E1000_VMOLR_MPME
;
182 * Write addresses to the MTA, if the attempt fails
183 * then we should just turn on promiscuous mode so
184 * that we can at least receive multicast traffic
186 if (igb_write_mc_addr_list(adapter
->netdev
) != 0)
187 vmolr
|= E1000_VMOLR_ROMPE
;
189 #ifdef HAVE_SET_RX_MODE
191 * Write addresses to available RAR registers, if there is not
192 * sufficient space to store all the addresses then enable
193 * unicast promiscuous mode
195 if (igb_write_vm_addr_list(dev
) < 0)
196 vmolr
|= E1000_VMOLR_UPE
;
199 E1000_WRITE_REG(hw
, E1000_VMOLR(hw_queue
), vmolr
);
204 int igb_vmdq_set_mac(struct net_device
*dev
, void *p
)
206 struct sockaddr
*addr
= p
;
207 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
208 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
209 int hw_queue
= vadapter
->rx_ring
->queue_index
+
210 adapter
->vfs_allocated_count
;
212 igb_del_mac_filter(adapter
, dev
->dev_addr
, hw_queue
);
213 memcpy(dev
->dev_addr
, addr
->sa_data
, dev
->addr_len
);
214 return igb_add_mac_filter(adapter
, dev
->dev_addr
, hw_queue
);
217 int igb_vmdq_change_mtu(struct net_device
*dev
, int new_mtu
)
219 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
220 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
222 if (adapter
->netdev
->mtu
< new_mtu
) {
224 "Set MTU on %s to >= %d "
225 "before changing MTU on %s\n",
226 adapter
->netdev
->name
, new_mtu
, dev
->name
);
233 void igb_vmdq_tx_timeout(struct net_device
*dev
)
238 void igb_vmdq_vlan_rx_register(struct net_device
*dev
, struct vlan_group
*grp
)
240 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
241 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
242 struct e1000_hw
*hw
= &adapter
->hw
;
243 int hw_queue
= vadapter
->rx_ring
->queue_index
+
244 adapter
->vfs_allocated_count
;
246 vadapter
->vlgrp
= grp
;
248 igb_enable_vlan_tags(adapter
);
249 E1000_WRITE_REG(hw
, E1000_VMVIR(hw_queue
), 0);
253 void igb_vmdq_vlan_rx_add_vid(struct net_device
*dev
, unsigned short vid
)
255 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
256 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
257 #ifndef HAVE_NETDEV_VLAN_FEATURES
258 struct net_device
*v_netdev
;
260 int hw_queue
= vadapter
->rx_ring
->queue_index
+
261 adapter
->vfs_allocated_count
;
263 /* attempt to add filter to vlvf array */
264 igb_vlvf_set(adapter
, vid
, TRUE
, hw_queue
);
266 #ifndef HAVE_NETDEV_VLAN_FEATURES
268 /* Copy feature flags from netdev to the vlan netdev for this vid.
269 * This allows things like TSO to bubble down to our vlan device.
271 v_netdev
= vlan_group_get_device(vadapter
->vlgrp
, vid
);
272 v_netdev
->features
|= adapter
->netdev
->features
;
273 vlan_group_set_device(vadapter
->vlgrp
, vid
, v_netdev
);
278 void igb_vmdq_vlan_rx_kill_vid(struct net_device
*dev
, unsigned short vid
)
280 struct igb_vmdq_adapter
*vadapter
= netdev_priv(dev
);
281 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
282 int hw_queue
= vadapter
->rx_ring
->queue_index
+
283 adapter
->vfs_allocated_count
;
285 vlan_group_set_device(vadapter
->vlgrp
, vid
, NULL
);
286 /* remove vlan from VLVF table array */
287 igb_vlvf_set(adapter
, vid
, FALSE
, hw_queue
);
293 static int igb_vmdq_get_settings(struct net_device
*netdev
,
294 struct ethtool_cmd
*ecmd
)
296 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
297 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
298 struct e1000_hw
*hw
= &adapter
->hw
;
301 if (hw
->phy
.media_type
== e1000_media_type_copper
) {
303 ecmd
->supported
= (SUPPORTED_10baseT_Half
|
304 SUPPORTED_10baseT_Full
|
305 SUPPORTED_100baseT_Half
|
306 SUPPORTED_100baseT_Full
|
307 SUPPORTED_1000baseT_Full
|
310 ecmd
->advertising
= ADVERTISED_TP
;
312 if (hw
->mac
.autoneg
== 1) {
313 ecmd
->advertising
|= ADVERTISED_Autoneg
;
314 /* the e1000 autoneg seems to match ethtool nicely */
315 ecmd
->advertising
|= hw
->phy
.autoneg_advertised
;
318 ecmd
->port
= PORT_TP
;
319 ecmd
->phy_address
= hw
->phy
.addr
;
321 ecmd
->supported
= (SUPPORTED_1000baseT_Full
|
325 ecmd
->advertising
= (ADVERTISED_1000baseT_Full
|
329 ecmd
->port
= PORT_FIBRE
;
332 ecmd
->transceiver
= XCVR_INTERNAL
;
334 status
= E1000_READ_REG(hw
, E1000_STATUS
);
336 if (status
& E1000_STATUS_LU
) {
338 if ((status
& E1000_STATUS_SPEED_1000
) ||
339 hw
->phy
.media_type
!= e1000_media_type_copper
)
340 ecmd
->speed
= SPEED_1000
;
341 else if (status
& E1000_STATUS_SPEED_100
)
342 ecmd
->speed
= SPEED_100
;
344 ecmd
->speed
= SPEED_10
;
346 if ((status
& E1000_STATUS_FD
) ||
347 hw
->phy
.media_type
!= e1000_media_type_copper
)
348 ecmd
->duplex
= DUPLEX_FULL
;
350 ecmd
->duplex
= DUPLEX_HALF
;
356 ecmd
->autoneg
= hw
->mac
.autoneg
? AUTONEG_ENABLE
: AUTONEG_DISABLE
;
361 static u32
igb_vmdq_get_msglevel(struct net_device
*netdev
)
363 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
364 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
365 return adapter
->msg_enable
;
368 static void igb_vmdq_get_drvinfo(struct net_device
*netdev
,
369 struct ethtool_drvinfo
*drvinfo
)
371 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
372 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
373 struct net_device
*main_netdev
= adapter
->netdev
;
375 strncpy(drvinfo
->driver
, igb_driver_name
, 32);
376 strncpy(drvinfo
->version
, igb_driver_version
, 32);
378 strncpy(drvinfo
->fw_version
, "N/A", 4);
379 snprintf(drvinfo
->bus_info
, 32, "%s VMDQ %d", main_netdev
->name
,
380 vadapter
->rx_ring
->queue_index
);
381 drvinfo
->n_stats
= 0;
382 drvinfo
->testinfo_len
= 0;
383 drvinfo
->regdump_len
= 0;
386 static void igb_vmdq_get_ringparam(struct net_device
*netdev
,
387 struct ethtool_ringparam
*ring
)
389 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
391 struct igb_ring
*tx_ring
= vadapter
->tx_ring
;
392 struct igb_ring
*rx_ring
= vadapter
->rx_ring
;
394 ring
->rx_max_pending
= IGB_MAX_RXD
;
395 ring
->tx_max_pending
= IGB_MAX_TXD
;
396 ring
->rx_mini_max_pending
= 0;
397 ring
->rx_jumbo_max_pending
= 0;
398 ring
->rx_pending
= rx_ring
->count
;
399 ring
->tx_pending
= tx_ring
->count
;
400 ring
->rx_mini_pending
= 0;
401 ring
->rx_jumbo_pending
= 0;
403 static u32
igb_vmdq_get_rx_csum(struct net_device
*netdev
)
405 struct igb_vmdq_adapter
*vadapter
= netdev_priv(netdev
);
406 struct igb_adapter
*adapter
= vadapter
->real_adapter
;
408 return test_bit(IGB_RING_FLAG_RX_CSUM
, &adapter
->rx_ring
[0]->flags
);
412 static struct ethtool_ops igb_vmdq_ethtool_ops
= {
413 .get_settings
= igb_vmdq_get_settings
,
414 .get_drvinfo
= igb_vmdq_get_drvinfo
,
415 .get_link
= ethtool_op_get_link
,
416 .get_ringparam
= igb_vmdq_get_ringparam
,
417 .get_rx_csum
= igb_vmdq_get_rx_csum
,
418 .get_tx_csum
= ethtool_op_get_tx_csum
,
419 .get_sg
= ethtool_op_get_sg
,
420 .set_sg
= ethtool_op_set_sg
,
421 .get_msglevel
= igb_vmdq_get_msglevel
,
423 .get_tso
= ethtool_op_get_tso
,
425 #ifdef HAVE_ETHTOOL_GET_PERM_ADDR
426 .get_perm_addr
= ethtool_op_get_perm_addr
,
430 void igb_vmdq_set_ethtool_ops(struct net_device
*netdev
)
432 SET_ETHTOOL_OPS(netdev
, &igb_vmdq_ethtool_ops
);
436 #endif /* CONFIG_IGB_VMDQ_NETDEV */