Deleted Added
sdiff udiff text old ( 302408 ) new ( 320897 )
full compact
1/******************************************************************************
2
3 Copyright (c) 2001-2017, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: stable/11/sys/dev/ixgbe/ixgbe_vf.c 320897 2017-07-11 21:25:07Z erj $*/
34
35
36#include "ixgbe.h"
37
38#ifndef IXGBE_VFWRITE_REG
39#define IXGBE_VFWRITE_REG IXGBE_WRITE_REG
40#endif
41#ifndef IXGBE_VFREAD_REG
42#define IXGBE_VFREAD_REG IXGBE_READ_REG
43#endif
44

--- 13 unchanged lines hidden (view full) ---

58 hw->mac.ops.reset_hw = ixgbe_reset_hw_vf;
59 hw->mac.ops.start_hw = ixgbe_start_hw_vf;
60 /* Cannot clear stats on VF */
61 hw->mac.ops.clear_hw_cntrs = NULL;
62 hw->mac.ops.get_media_type = NULL;
63 hw->mac.ops.get_mac_addr = ixgbe_get_mac_addr_vf;
64 hw->mac.ops.stop_adapter = ixgbe_stop_adapter_vf;
65 hw->mac.ops.get_bus_info = NULL;
66 hw->mac.ops.negotiate_api_version = ixgbevf_negotiate_api_version;
67
68 /* Link */
69 hw->mac.ops.setup_link = ixgbe_setup_mac_link_vf;
70 hw->mac.ops.check_link = ixgbe_check_mac_link_vf;
71 hw->mac.ops.get_link_capabilities = NULL;
72
73 /* RAR, Multicast, VLAN */
74 hw->mac.ops.set_rar = ixgbe_set_rar_vf;
75 hw->mac.ops.set_uc_addr = ixgbevf_set_uc_addr_vf;
76 hw->mac.ops.init_rx_addrs = NULL;
77 hw->mac.ops.update_mc_addr_list = ixgbe_update_mc_addr_list_vf;
78 hw->mac.ops.update_xcast_mode = ixgbevf_update_xcast_mode;
79 hw->mac.ops.enable_mc = NULL;
80 hw->mac.ops.disable_mc = NULL;
81 hw->mac.ops.clear_vfta = NULL;
82 hw->mac.ops.set_vfta = ixgbe_set_vfta_vf;
83 hw->mac.ops.set_rlpml = ixgbevf_rlpml_set_vf;
84
85 hw->mac.max_tx_queues = 1;
86 hw->mac.max_rx_queues = 1;
87
88 hw->mbx.ops.init_params = ixgbe_init_mbx_params_vf;
89
90 return IXGBE_SUCCESS;
91}

--- 133 unchanged lines hidden (view full) ---

225 IXGBE_VF_PERMADDR_MSG_LEN, 0);
226 if (ret_val)
227 return ret_val;
228
229 if (msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK) &&
230 msgbuf[0] != (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_NACK))
231 return IXGBE_ERR_INVALID_MAC_ADDR;
232
233 if (msgbuf[0] == (IXGBE_VF_RESET | IXGBE_VT_MSGTYPE_ACK))
234 memcpy(hw->mac.perm_addr, addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
235
236 hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD];
237
238 return ret_val;
239}
240
241/**
242 * ixgbe_stop_adapter_vf - Generic stop Tx/Rx units
243 * @hw: pointer to hardware structure

--- 75 unchanged lines hidden (view full) ---

319 break;
320 }
321
322 /* vector can only be 12-bits or boundary will be exceeded */
323 vector &= 0xFFF;
324 return vector;
325}
326
327static s32 ixgbevf_write_msg_read_ack(struct ixgbe_hw *hw, u32 *msg,
328 u32 *retmsg, u16 size)
329{
330 struct ixgbe_mbx_info *mbx = &hw->mbx;
331 s32 retval = mbx->ops.write_posted(hw, msg, size, 0);
332
333 if (retval)
334 return retval;
335
336 return mbx->ops.read_posted(hw, retmsg, size, 0);
337}
338
339/**
340 * ixgbe_set_rar_vf - set device MAC address
341 * @hw: pointer to hardware structure
342 * @index: Receive address register to write
343 * @addr: Address to put into receive address register
344 * @vmdq: VMDq "set" or "pool" index
345 * @enable_addr: set flag that address is active
346 **/
347s32 ixgbe_set_rar_vf(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
348 u32 enable_addr)
349{
350 u32 msgbuf[3];
351 u8 *msg_addr = (u8 *)(&msgbuf[1]);
352 s32 ret_val;
353 UNREFERENCED_3PARAMETER(vmdq, enable_addr, index);
354
355 memset(msgbuf, 0, 12);
356 msgbuf[0] = IXGBE_VF_SET_MAC_ADDR;
357 memcpy(msg_addr, addr, 6);
358 ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3);
359
360 msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
361
362 /* if nacked the address was rejected, use "perm_addr" */
363 if (!ret_val &&
364 (msgbuf[0] == (IXGBE_VF_SET_MAC_ADDR | IXGBE_VT_MSGTYPE_NACK))) {
365 ixgbe_get_mac_addr_vf(hw, hw->mac.addr);
366 return IXGBE_ERR_MBX;
367 }
368
369 return ret_val;
370}
371
372/**
373 * ixgbe_update_mc_addr_list_vf - Update Multicast addresses
374 * @hw: pointer to the HW structure
375 * @mc_addr_list: array of multicast addresses to program

--- 37 unchanged lines hidden (view full) ---

413 DEBUGOUT1("Hash value = 0x%03X\n", vector);
414 vector_list[i] = (u16)vector;
415 }
416
417 return mbx->ops.write_posted(hw, msgbuf, IXGBE_VFMAILBOX_SIZE, 0);
418}
419
420/**
421 * ixgbevf_update_xcast_mode - Update Multicast mode
422 * @hw: pointer to the HW structure
423 * @xcast_mode: new multicast mode
424 *
425 * Updates the Multicast Mode of VF.
426 **/
427s32 ixgbevf_update_xcast_mode(struct ixgbe_hw *hw, int xcast_mode)
428{
429 u32 msgbuf[2];
430 s32 err;
431
432 switch (hw->api_version) {
433 case ixgbe_mbox_api_12:
434 /* New modes were introduced in 1.3 version */
435 if (xcast_mode > IXGBEVF_XCAST_MODE_ALLMULTI)
436 return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
437 /* Fall through */
438 case ixgbe_mbox_api_13:
439 break;
440 default:
441 return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
442 }
443
444 msgbuf[0] = IXGBE_VF_UPDATE_XCAST_MODE;
445 msgbuf[1] = xcast_mode;
446
447 err = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
448 if (err)
449 return err;
450
451 msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
452 if (msgbuf[0] == (IXGBE_VF_UPDATE_XCAST_MODE | IXGBE_VT_MSGTYPE_NACK))
453 return IXGBE_ERR_FEATURE_NOT_SUPPORTED;
454 return IXGBE_SUCCESS;
455}
456
457/**
458 * ixgbe_set_vfta_vf - Set/Unset vlan filter table address
459 * @hw: pointer to the HW structure
460 * @vlan: 12 bit VLAN ID
461 * @vind: unused by VF drivers
462 * @vlan_on: if TRUE then set bit, else clear bit
463 * @vlvf_bypass: boolean flag indicating updating default pool is okay
464 *
465 * Turn on/off specified VLAN in the VLAN filter table.
466 **/
467s32 ixgbe_set_vfta_vf(struct ixgbe_hw *hw, u32 vlan, u32 vind,
468 bool vlan_on, bool vlvf_bypass)
469{
470 u32 msgbuf[2];
471 s32 ret_val;
472 UNREFERENCED_2PARAMETER(vind, vlvf_bypass);
473
474 msgbuf[0] = IXGBE_VF_SET_VLAN;
475 msgbuf[1] = vlan;
476 /* Setting the 8 bit field MSG INFO to TRUE indicates "add" */
477 msgbuf[0] |= vlan_on << IXGBE_VT_MSGINFO_SHIFT;
478
479 ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
480 if (!ret_val && (msgbuf[0] & IXGBE_VT_MSGTYPE_ACK))
481 return IXGBE_SUCCESS;
482
483 return ret_val | (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK);
484}
485
486/**
487 * ixgbe_get_num_of_tx_queues_vf - Get number of TX queues

--- 30 unchanged lines hidden (view full) ---

518 for (i = 0; i < IXGBE_ETH_LENGTH_OF_ADDRESS; i++)
519 mac_addr[i] = hw->mac.perm_addr[i];
520
521 return IXGBE_SUCCESS;
522}
523
524s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
525{
526 u32 msgbuf[3], msgbuf_chk;
527 u8 *msg_addr = (u8 *)(&msgbuf[1]);
528 s32 ret_val;
529
530 memset(msgbuf, 0, sizeof(msgbuf));
531 /*
532 * If index is one then this is the start of a new list and needs
533 * indication to the PF so it can do it's own list management.
534 * If it is zero then that tells the PF to just clear all of
535 * this VF's macvlans and there is no new list.
536 */
537 msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT;
538 msgbuf[0] |= IXGBE_VF_SET_MACVLAN;
539 msgbuf_chk = msgbuf[0];
540 if (addr)
541 memcpy(msg_addr, addr, 6);
542
543 ret_val = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 3);
544 if (!ret_val) {
545 msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
546
547 if (msgbuf[0] == (msgbuf_chk | IXGBE_VT_MSGTYPE_NACK))
548 return IXGBE_ERR_OUT_OF_MEM;
549 }
550
551 return ret_val;
552}
553
554/**
555 * ixgbe_setup_mac_link_vf - Setup MAC link settings
556 * @hw: pointer to hardware structure
557 * @speed: new link speed
558 * @autoneg: TRUE if autonegotiation enabled

--- 52 unchanged lines hidden (view full) ---

611 if (!(links_reg & IXGBE_LINKS_UP))
612 goto out;
613 }
614 }
615
616 switch (links_reg & IXGBE_LINKS_SPEED_82599) {
617 case IXGBE_LINKS_SPEED_10G_82599:
618 *speed = IXGBE_LINK_SPEED_10GB_FULL;
619 if (hw->mac.type >= ixgbe_mac_X550) {
620 if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
621 *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
622 }
623 break;
624 case IXGBE_LINKS_SPEED_1G_82599:
625 *speed = IXGBE_LINK_SPEED_1GB_FULL;
626 break;
627 case IXGBE_LINKS_SPEED_100_82599:
628 *speed = IXGBE_LINK_SPEED_100_FULL;
629 if (hw->mac.type == ixgbe_mac_X550) {
630 if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
631 *speed = IXGBE_LINK_SPEED_5GB_FULL;
632 }
633 break;
634 case IXGBE_LINKS_SPEED_10_X550EM_A:
635 *speed = IXGBE_LINK_SPEED_UNKNOWN;
636 /* Since Reserved in older MAC's */
637 if (hw->mac.type >= ixgbe_mac_X550)
638 *speed = IXGBE_LINK_SPEED_10_FULL;
639 break;
640 default:
641 *speed = IXGBE_LINK_SPEED_UNKNOWN;
642 }
643
644 /* if the read failed it could just be a mailbox collision, best wait
645 * until we are called again and don't report an error
646 */
647 if (mbx->ops.read(hw, &in_msg, 1, 0))
648 goto out;
649

--- 20 unchanged lines hidden (view full) ---

670 return ret_val;
671}
672
673/**
674 * ixgbevf_rlpml_set_vf - Set the maximum receive packet length
675 * @hw: pointer to the HW structure
676 * @max_size: value to assign to max frame size
677 **/
678s32 ixgbevf_rlpml_set_vf(struct ixgbe_hw *hw, u16 max_size)
679{
680 u32 msgbuf[2];
681 s32 retval;
682
683 msgbuf[0] = IXGBE_VF_SET_LPE;
684 msgbuf[1] = max_size;
685
686 retval = ixgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
687 if (retval)
688 return retval;
689 if ((msgbuf[0] & IXGBE_VF_SET_LPE) &&
690 (msgbuf[0] & IXGBE_VT_MSGTYPE_NACK))
691 return IXGBE_ERR_MBX;
692
693 return 0;
694}
695
696/**
697 * ixgbevf_negotiate_api_version - Negotiate supported API version
698 * @hw: pointer to the HW structure
699 * @api: integer containing requested API version
700 **/
701int ixgbevf_negotiate_api_version(struct ixgbe_hw *hw, int api)
702{
703 int err;
704 u32 msg[3];
705
706 /* Negotiate the mailbox API version */
707 msg[0] = IXGBE_VF_API_NEGOTIATE;
708 msg[1] = api;
709 msg[2] = 0;
710
711 err = ixgbevf_write_msg_read_ack(hw, msg, msg, 3);
712 if (!err) {
713 msg[0] &= ~IXGBE_VT_MSGTYPE_CTS;
714
715 /* Store value and return 0 on success */
716 if (msg[0] == (IXGBE_VF_API_NEGOTIATE | IXGBE_VT_MSGTYPE_ACK)) {
717 hw->api_version = api;
718 return 0;
719 }

--- 8 unchanged lines hidden (view full) ---

728 unsigned int *default_tc)
729{
730 int err;
731 u32 msg[5];
732
733 /* do nothing if API doesn't support ixgbevf_get_queues */
734 switch (hw->api_version) {
735 case ixgbe_mbox_api_11:
736 case ixgbe_mbox_api_12:
737 case ixgbe_mbox_api_13:
738 break;
739 default:
740 return 0;
741 }
742
743 /* Fetch queue configuration from the PF */
744 msg[0] = IXGBE_VF_GET_QUEUES;
745 msg[1] = msg[2] = msg[3] = msg[4] = 0;
746
747 err = ixgbevf_write_msg_read_ack(hw, msg, msg, 5);
748 if (!err) {
749 msg[0] &= ~IXGBE_VT_MSGTYPE_CTS;
750
751 /*
752 * if we we didn't get an ACK there must have been
753 * some sort of mailbox error so we should treat it
754 * as such
755 */

--- 27 unchanged lines hidden ---