diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/ixgbe/ixgbe.h | 3 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 4 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_sriov.c | 104 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_sriov.h | 6 | ||||
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_type.h | 5 |
5 files changed, 118 insertions, 4 deletions
diff --git a/drivers/net/ixgbe/ixgbe.h b/drivers/net/ixgbe/ixgbe.h index 79c35ae3718c..d0ea3d6dea95 100644 --- a/drivers/net/ixgbe/ixgbe.h +++ b/drivers/net/ixgbe/ixgbe.h | |||
| @@ -111,7 +111,10 @@ struct vf_data_storage { | |||
| 111 | u16 default_vf_vlan_id; | 111 | u16 default_vf_vlan_id; |
| 112 | u16 vlans_enabled; | 112 | u16 vlans_enabled; |
| 113 | bool clear_to_send; | 113 | bool clear_to_send; |
| 114 | bool pf_set_mac; | ||
| 114 | int rar; | 115 | int rar; |
| 116 | u16 pf_vlan; /* When set, guest VLAN config not allowed. */ | ||
| 117 | u16 pf_qos; | ||
| 115 | }; | 118 | }; |
| 116 | 119 | ||
| 117 | /* wrapper around a pointer to a socket buffer, | 120 | /* wrapper around a pointer to a socket buffer, |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 0a0e90e80025..d1a1868df817 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -6311,6 +6311,10 @@ static const struct net_device_ops ixgbe_netdev_ops = { | |||
| 6311 | .ndo_vlan_rx_add_vid = ixgbe_vlan_rx_add_vid, | 6311 | .ndo_vlan_rx_add_vid = ixgbe_vlan_rx_add_vid, |
| 6312 | .ndo_vlan_rx_kill_vid = ixgbe_vlan_rx_kill_vid, | 6312 | .ndo_vlan_rx_kill_vid = ixgbe_vlan_rx_kill_vid, |
| 6313 | .ndo_do_ioctl = ixgbe_ioctl, | 6313 | .ndo_do_ioctl = ixgbe_ioctl, |
| 6314 | .ndo_set_vf_mac = ixgbe_ndo_set_vf_mac, | ||
| 6315 | .ndo_set_vf_vlan = ixgbe_ndo_set_vf_vlan, | ||
| 6316 | .ndo_set_vf_tx_rate = ixgbe_ndo_set_vf_bw, | ||
| 6317 | .ndo_get_vf_config = ixgbe_ndo_get_vf_config, | ||
| 6314 | #ifdef CONFIG_NET_POLL_CONTROLLER | 6318 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 6315 | .ndo_poll_controller = ixgbe_netpoll, | 6319 | .ndo_poll_controller = ixgbe_netpoll, |
| 6316 | #endif | 6320 | #endif |
diff --git a/drivers/net/ixgbe/ixgbe_sriov.c b/drivers/net/ixgbe/ixgbe_sriov.c index 53f364d57739..221b2ca994e6 100644 --- a/drivers/net/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ixgbe/ixgbe_sriov.c | |||
| @@ -126,13 +126,34 @@ void ixgbe_set_vmolr(struct ixgbe_hw *hw, u32 vf, bool aupe) | |||
| 126 | IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); | 126 | IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | static void ixgbe_set_vmvir(struct ixgbe_adapter *adapter, u32 vid, u32 vf) | ||
| 130 | { | ||
| 131 | struct ixgbe_hw *hw = &adapter->hw; | ||
| 132 | |||
| 133 | if (vid) | ||
| 134 | IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), | ||
| 135 | (vid | IXGBE_VMVIR_VLANA_DEFAULT)); | ||
| 136 | else | ||
| 137 | IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf), 0); | ||
| 138 | } | ||
| 139 | |||
| 129 | inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) | 140 | inline void ixgbe_vf_reset_event(struct ixgbe_adapter *adapter, u32 vf) |
| 130 | { | 141 | { |
| 131 | struct ixgbe_hw *hw = &adapter->hw; | 142 | struct ixgbe_hw *hw = &adapter->hw; |
| 132 | 143 | ||
| 133 | /* reset offloads to defaults */ | 144 | /* reset offloads to defaults */ |
| 134 | ixgbe_set_vmolr(hw, vf, true); | 145 | if (adapter->vfinfo[vf].pf_vlan) { |
| 135 | 146 | ixgbe_set_vf_vlan(adapter, true, | |
| 147 | adapter->vfinfo[vf].pf_vlan, vf); | ||
| 148 | ixgbe_set_vmvir(adapter, | ||
| 149 | (adapter->vfinfo[vf].pf_vlan | | ||
| 150 | (adapter->vfinfo[vf].pf_qos << | ||
| 151 | VLAN_PRIO_SHIFT)), vf); | ||
| 152 | ixgbe_set_vmolr(hw, vf, false); | ||
| 153 | } else { | ||
| 154 | ixgbe_set_vmvir(adapter, 0, vf); | ||
| 155 | ixgbe_set_vmolr(hw, vf, true); | ||
| 156 | } | ||
| 136 | 157 | ||
| 137 | /* reset multicast table array for vf */ | 158 | /* reset multicast table array for vf */ |
| 138 | adapter->vfinfo[vf].num_vf_mc_hashes = 0; | 159 | adapter->vfinfo[vf].num_vf_mc_hashes = 0; |
| @@ -266,10 +287,12 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf) | |||
| 266 | case IXGBE_VF_SET_MAC_ADDR: | 287 | case IXGBE_VF_SET_MAC_ADDR: |
| 267 | { | 288 | { |
| 268 | u8 *new_mac = ((u8 *)(&msgbuf[1])); | 289 | u8 *new_mac = ((u8 *)(&msgbuf[1])); |
| 269 | if (is_valid_ether_addr(new_mac)) | 290 | if (is_valid_ether_addr(new_mac) && |
| 291 | !adapter->vfinfo[vf].pf_set_mac) | ||
| 270 | ixgbe_set_vf_mac(adapter, vf, new_mac); | 292 | ixgbe_set_vf_mac(adapter, vf, new_mac); |
| 271 | else | 293 | else |
| 272 | retval = -1; | 294 | ixgbe_set_vf_mac(adapter, |
| 295 | vf, adapter->vfinfo[vf].vf_mac_addresses); | ||
| 273 | } | 296 | } |
| 274 | break; | 297 | break; |
| 275 | case IXGBE_VF_SET_MULTICAST: | 298 | case IXGBE_VF_SET_MULTICAST: |
| @@ -363,3 +386,76 @@ void ixgbe_ping_all_vfs(struct ixgbe_adapter *adapter) | |||
| 363 | } | 386 | } |
| 364 | } | 387 | } |
| 365 | 388 | ||
| 389 | int ixgbe_ndo_set_vf_mac(struct net_device *netdev, int vf, u8 *mac) | ||
| 390 | { | ||
| 391 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | ||
| 392 | if (!is_valid_ether_addr(mac) || (vf >= adapter->num_vfs)) | ||
| 393 | return -EINVAL; | ||
| 394 | adapter->vfinfo[vf].pf_set_mac = true; | ||
| 395 | dev_info(&adapter->pdev->dev, "setting MAC %pM on VF %d\n", mac, vf); | ||
| 396 | dev_info(&adapter->pdev->dev, "Reload the VF driver to make this" | ||
| 397 | " change effective."); | ||
| 398 | if (test_bit(__IXGBE_DOWN, &adapter->state)) { | ||
| 399 | dev_warn(&adapter->pdev->dev, "The VF MAC address has been set," | ||
| 400 | " but the PF device is not up.\n"); | ||
| 401 | dev_warn(&adapter->pdev->dev, "Bring the PF device up before" | ||
| 402 | " attempting to use the VF device.\n"); | ||
| 403 | } | ||
| 404 | return ixgbe_set_vf_mac(adapter, vf, mac); | ||
| 405 | } | ||
| 406 | |||
| 407 | int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos) | ||
| 408 | { | ||
| 409 | int err = 0; | ||
| 410 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | ||
| 411 | |||
| 412 | if ((vf >= adapter->num_vfs) || (vlan > 4095) || (qos > 7)) | ||
| 413 | return -EINVAL; | ||
| 414 | if (vlan || qos) { | ||
| 415 | err = ixgbe_set_vf_vlan(adapter, true, vlan, vf); | ||
| 416 | if (err) | ||
| 417 | goto out; | ||
| 418 | ixgbe_set_vmvir(adapter, vlan | (qos << VLAN_PRIO_SHIFT), vf); | ||
| 419 | ixgbe_set_vmolr(&adapter->hw, vf, false); | ||
| 420 | adapter->vfinfo[vf].pf_vlan = vlan; | ||
| 421 | adapter->vfinfo[vf].pf_qos = qos; | ||
| 422 | dev_info(&adapter->pdev->dev, | ||
| 423 | "Setting VLAN %d, QOS 0x%x on VF %d\n", vlan, qos, vf); | ||
| 424 | if (test_bit(__IXGBE_DOWN, &adapter->state)) { | ||
| 425 | dev_warn(&adapter->pdev->dev, | ||
| 426 | "The VF VLAN has been set," | ||
| 427 | " but the PF device is not up.\n"); | ||
| 428 | dev_warn(&adapter->pdev->dev, | ||
| 429 | "Bring the PF device up before" | ||
| 430 | " attempting to use the VF device.\n"); | ||
| 431 | } | ||
| 432 | } else { | ||
| 433 | err = ixgbe_set_vf_vlan(adapter, false, | ||
| 434 | adapter->vfinfo[vf].pf_vlan, vf); | ||
| 435 | ixgbe_set_vmvir(adapter, vlan, vf); | ||
| 436 | ixgbe_set_vmolr(&adapter->hw, vf, true); | ||
| 437 | adapter->vfinfo[vf].pf_vlan = 0; | ||
| 438 | adapter->vfinfo[vf].pf_qos = 0; | ||
| 439 | } | ||
| 440 | out: | ||
| 441 | return err; | ||
| 442 | } | ||
| 443 | |||
| 444 | int ixgbe_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate) | ||
| 445 | { | ||
| 446 | return -EOPNOTSUPP; | ||
| 447 | } | ||
| 448 | |||
| 449 | int ixgbe_ndo_get_vf_config(struct net_device *netdev, | ||
| 450 | int vf, struct ifla_vf_info *ivi) | ||
| 451 | { | ||
| 452 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | ||
| 453 | if (vf >= adapter->num_vfs) | ||
| 454 | return -EINVAL; | ||
| 455 | ivi->vf = vf; | ||
| 456 | memcpy(&ivi->mac, adapter->vfinfo[vf].vf_mac_addresses, ETH_ALEN); | ||
| 457 | ivi->tx_rate = 0; | ||
| 458 | ivi->vlan = adapter->vfinfo[vf].pf_vlan; | ||
| 459 | ivi->qos = adapter->vfinfo[vf].pf_qos; | ||
| 460 | return 0; | ||
| 461 | } | ||
diff --git a/drivers/net/ixgbe/ixgbe_sriov.h b/drivers/net/ixgbe/ixgbe_sriov.h index 7fb12885cf5d..184730ecdfb6 100644 --- a/drivers/net/ixgbe/ixgbe_sriov.h +++ b/drivers/net/ixgbe/ixgbe_sriov.h | |||
| @@ -42,6 +42,12 @@ int ixgbe_vf_configuration(struct pci_dev *pdev, unsigned int event_mask); | |||
| 42 | void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter); | 42 | void ixgbe_disable_tx_rx(struct ixgbe_adapter *adapter); |
| 43 | void ixgbe_ping_all_vfs(struct ixgbe_adapter *adapter); | 43 | void ixgbe_ping_all_vfs(struct ixgbe_adapter *adapter); |
| 44 | void ixgbe_dump_registers(struct ixgbe_adapter *adapter); | 44 | void ixgbe_dump_registers(struct ixgbe_adapter *adapter); |
| 45 | int ixgbe_ndo_set_vf_mac(struct net_device *netdev, int queue, u8 *mac); | ||
| 46 | int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int queue, u16 vlan, | ||
| 47 | u8 qos); | ||
| 48 | int ixgbe_ndo_set_vf_bw(struct net_device *netdev, int vf, int tx_rate); | ||
| 49 | int ixgbe_ndo_get_vf_config(struct net_device *netdev, | ||
| 50 | int vf, struct ifla_vf_info *ivi); | ||
| 45 | 51 | ||
| 46 | #endif /* _IXGBE_SRIOV_H_ */ | 52 | #endif /* _IXGBE_SRIOV_H_ */ |
| 47 | 53 | ||
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index a0f9084c81cd..4277cbbb8126 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
| @@ -219,6 +219,7 @@ | |||
| 219 | #define IXGBE_MTQC 0x08120 | 219 | #define IXGBE_MTQC 0x08120 |
| 220 | #define IXGBE_VLVF(_i) (0x0F100 + ((_i) * 4)) /* 64 of these (0-63) */ | 220 | #define IXGBE_VLVF(_i) (0x0F100 + ((_i) * 4)) /* 64 of these (0-63) */ |
| 221 | #define IXGBE_VLVFB(_i) (0x0F200 + ((_i) * 4)) /* 128 of these (0-127) */ | 221 | #define IXGBE_VLVFB(_i) (0x0F200 + ((_i) * 4)) /* 128 of these (0-127) */ |
| 222 | #define IXGBE_VMVIR(_i) (0x08000 + ((_i) * 4)) /* 64 of these (0-63) */ | ||
| 222 | #define IXGBE_VT_CTL 0x051B0 | 223 | #define IXGBE_VT_CTL 0x051B0 |
| 223 | #define IXGBE_VFRE(_i) (0x051E0 + ((_i) * 4)) | 224 | #define IXGBE_VFRE(_i) (0x051E0 + ((_i) * 4)) |
| 224 | #define IXGBE_VFTE(_i) (0x08110 + ((_i) * 4)) | 225 | #define IXGBE_VFTE(_i) (0x08110 + ((_i) * 4)) |
| @@ -1311,6 +1312,10 @@ | |||
| 1311 | #define IXGBE_VLVF_ENTRIES 64 | 1312 | #define IXGBE_VLVF_ENTRIES 64 |
| 1312 | #define IXGBE_VLVF_VLANID_MASK 0x00000FFF | 1313 | #define IXGBE_VLVF_VLANID_MASK 0x00000FFF |
| 1313 | 1314 | ||
| 1315 | /* Per VF Port VLAN insertion rules */ | ||
| 1316 | #define IXGBE_VMVIR_VLANA_DEFAULT 0x40000000 /* Always use default VLAN */ | ||
| 1317 | #define IXGBE_VMVIR_VLANA_NEVER 0x80000000 /* Never insert VLAN tag */ | ||
| 1318 | |||
| 1314 | #define IXGBE_ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.1q protocol */ | 1319 | #define IXGBE_ETHERNET_IEEE_VLAN_TYPE 0x8100 /* 802.1q protocol */ |
| 1315 | 1320 | ||
| 1316 | /* STATUS Bit Masks */ | 1321 | /* STATUS Bit Masks */ |
