linux/drivers/net/ethernet/intel/i40evf/i40evf_virtchnl.c
<<
>>
Prefs
   1/*******************************************************************************
   2 *
   3 * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver
   4 * Copyright(c) 2013 - 2014 Intel Corporation.
   5 *
   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.
   9 *
  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
  13 * more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program.  If not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * The full GNU General Public License is included in this distribution in
  19 * the file called "COPYING".
  20 *
  21 * Contact Information:
  22 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 ******************************************************************************/
  26
  27#include "i40evf.h"
  28#include "i40e_prototype.h"
  29
  30/* busy wait delay in msec */
  31#define I40EVF_BUSY_WAIT_DELAY 10
  32#define I40EVF_BUSY_WAIT_COUNT 50
  33
  34/**
  35 * i40evf_send_pf_msg
  36 * @adapter: adapter structure
  37 * @op: virtual channel opcode
  38 * @msg: pointer to message buffer
  39 * @len: message length
  40 *
  41 * Send message to PF and print status if failure.
  42 **/
  43static int i40evf_send_pf_msg(struct i40evf_adapter *adapter,
  44                              enum i40e_virtchnl_ops op, u8 *msg, u16 len)
  45{
  46        struct i40e_hw *hw = &adapter->hw;
  47        i40e_status err;
  48
  49        if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED)
  50                return 0; /* nothing to see here, move along */
  51
  52        err = i40e_aq_send_msg_to_pf(hw, op, 0, msg, len, NULL);
  53        if (err)
  54                dev_err(&adapter->pdev->dev, "Unable to send opcode %d to PF, err %s, aq_err %s\n",
  55                        op, i40evf_stat_str(hw, err),
  56                        i40evf_aq_str(hw, hw->aq.asq_last_status));
  57        return err;
  58}
  59
  60/**
  61 * i40evf_send_api_ver
  62 * @adapter: adapter structure
  63 *
  64 * Send API version admin queue message to the PF. The reply is not checked
  65 * in this function. Returns 0 if the message was successfully
  66 * sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not.
  67 **/
  68int i40evf_send_api_ver(struct i40evf_adapter *adapter)
  69{
  70        struct i40e_virtchnl_version_info vvi;
  71
  72        vvi.major = I40E_VIRTCHNL_VERSION_MAJOR;
  73        vvi.minor = I40E_VIRTCHNL_VERSION_MINOR;
  74
  75        return i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_VERSION, (u8 *)&vvi,
  76                                  sizeof(vvi));
  77}
  78
  79/**
  80 * i40evf_verify_api_ver
  81 * @adapter: adapter structure
  82 *
  83 * Compare API versions with the PF. Must be called after admin queue is
  84 * initialized. Returns 0 if API versions match, -EIO if they do not,
  85 * I40E_ERR_ADMIN_QUEUE_NO_WORK if the admin queue is empty, and any errors
  86 * from the firmware are propagated.
  87 **/
  88int i40evf_verify_api_ver(struct i40evf_adapter *adapter)
  89{
  90        struct i40e_virtchnl_version_info *pf_vvi;
  91        struct i40e_hw *hw = &adapter->hw;
  92        struct i40e_arq_event_info event;
  93        enum i40e_virtchnl_ops op;
  94        i40e_status err;
  95
  96        event.buf_len = I40EVF_MAX_AQ_BUF_SIZE;
  97        event.msg_buf = kzalloc(event.buf_len, GFP_KERNEL);
  98        if (!event.msg_buf) {
  99                err = -ENOMEM;
 100                goto out;
 101        }
 102
 103        while (1) {
 104                err = i40evf_clean_arq_element(hw, &event, NULL);
 105                /* When the AQ is empty, i40evf_clean_arq_element will return
 106                 * nonzero and this loop will terminate.
 107                 */
 108                if (err)
 109                        goto out_alloc;
 110                op =
 111                    (enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high);
 112                if (op == I40E_VIRTCHNL_OP_VERSION)
 113                        break;
 114        }
 115
 116
 117        err = (i40e_status)le32_to_cpu(event.desc.cookie_low);
 118        if (err)
 119                goto out_alloc;
 120
 121        if (op != I40E_VIRTCHNL_OP_VERSION) {
 122                dev_info(&adapter->pdev->dev, "Invalid reply type %d from PF\n",
 123                        op);
 124                err = -EIO;
 125                goto out_alloc;
 126        }
 127
 128        pf_vvi = (struct i40e_virtchnl_version_info *)event.msg_buf;
 129        adapter->pf_version = *pf_vvi;
 130
 131        if ((pf_vvi->major > I40E_VIRTCHNL_VERSION_MAJOR) ||
 132            ((pf_vvi->major == I40E_VIRTCHNL_VERSION_MAJOR) &&
 133             (pf_vvi->minor > I40E_VIRTCHNL_VERSION_MINOR)))
 134                err = -EIO;
 135
 136out_alloc:
 137        kfree(event.msg_buf);
 138out:
 139        return err;
 140}
 141
 142/**
 143 * i40evf_send_vf_config_msg
 144 * @adapter: adapter structure
 145 *
 146 * Send VF configuration request admin queue message to the PF. The reply
 147 * is not checked in this function. Returns 0 if the message was
 148 * successfully sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not.
 149 **/
 150int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)
 151{
 152        u32 caps;
 153
 154        adapter->current_op = I40E_VIRTCHNL_OP_GET_VF_RESOURCES;
 155        adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG;
 156        caps = I40E_VIRTCHNL_VF_OFFLOAD_L2 |
 157               I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ |
 158               I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |
 159               I40E_VIRTCHNL_VF_OFFLOAD_VLAN |
 160               I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR |
 161               I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2;
 162
 163        adapter->current_op = I40E_VIRTCHNL_OP_GET_VF_RESOURCES;
 164        adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG;
 165        if (PF_IS_V11(adapter))
 166                return i40evf_send_pf_msg(adapter,
 167                                          I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
 168                                          (u8 *)&caps, sizeof(caps));
 169        else
 170                return i40evf_send_pf_msg(adapter,
 171                                          I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
 172                                          NULL, 0);
 173}
 174
 175/**
 176 * i40evf_get_vf_config
 177 * @hw: pointer to the hardware structure
 178 * @len: length of buffer
 179 *
 180 * Get VF configuration from PF and populate hw structure. Must be called after
 181 * admin queue is initialized. Busy waits until response is received from PF,
 182 * with maximum timeout. Response from PF is returned in the buffer for further
 183 * processing by the caller.
 184 **/
 185int i40evf_get_vf_config(struct i40evf_adapter *adapter)
 186{
 187        struct i40e_hw *hw = &adapter->hw;
 188        struct i40e_arq_event_info event;
 189        enum i40e_virtchnl_ops op;
 190        i40e_status err;
 191        u16 len;
 192
 193        len =  sizeof(struct i40e_virtchnl_vf_resource) +
 194                I40E_MAX_VF_VSI * sizeof(struct i40e_virtchnl_vsi_resource);
 195        event.buf_len = len;
 196        event.msg_buf = kzalloc(event.buf_len, GFP_KERNEL);
 197        if (!event.msg_buf) {
 198                err = -ENOMEM;
 199                goto out;
 200        }
 201
 202        while (1) {
 203                /* When the AQ is empty, i40evf_clean_arq_element will return
 204                 * nonzero and this loop will terminate.
 205                 */
 206                err = i40evf_clean_arq_element(hw, &event, NULL);
 207                if (err)
 208                        goto out_alloc;
 209                op =
 210                    (enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high);
 211                if (op == I40E_VIRTCHNL_OP_GET_VF_RESOURCES)
 212                        break;
 213        }
 214
 215        err = (i40e_status)le32_to_cpu(event.desc.cookie_low);
 216        memcpy(adapter->vf_res, event.msg_buf, min(event.msg_len, len));
 217
 218        i40e_vf_parse_hw_config(hw, adapter->vf_res);
 219out_alloc:
 220        kfree(event.msg_buf);
 221out:
 222        return err;
 223}
 224
 225/**
 226 * i40evf_configure_queues
 227 * @adapter: adapter structure
 228 *
 229 * Request that the PF set up our (previously allocated) queues.
 230 **/
 231void i40evf_configure_queues(struct i40evf_adapter *adapter)
 232{
 233        struct i40e_virtchnl_vsi_queue_config_info *vqci;
 234        struct i40e_virtchnl_queue_pair_info *vqpi;
 235        int pairs = adapter->num_active_queues;
 236        int i, len;
 237
 238        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 239                /* bail because we already have a command pending */
 240                dev_err(&adapter->pdev->dev, "Cannot configure queues, command %d pending\n",
 241                        adapter->current_op);
 242                return;
 243        }
 244        adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES;
 245        len = sizeof(struct i40e_virtchnl_vsi_queue_config_info) +
 246                       (sizeof(struct i40e_virtchnl_queue_pair_info) * pairs);
 247        vqci = kzalloc(len, GFP_KERNEL);
 248        if (!vqci)
 249                return;
 250
 251        vqci->vsi_id = adapter->vsi_res->vsi_id;
 252        vqci->num_queue_pairs = pairs;
 253        vqpi = vqci->qpair;
 254        /* Size check is not needed here - HW max is 16 queue pairs, and we
 255         * can fit info for 31 of them into the AQ buffer before it overflows.
 256         */
 257        for (i = 0; i < pairs; i++) {
 258                vqpi->txq.vsi_id = vqci->vsi_id;
 259                vqpi->txq.queue_id = i;
 260                vqpi->txq.ring_len = adapter->tx_rings[i].count;
 261                vqpi->txq.dma_ring_addr = adapter->tx_rings[i].dma;
 262                vqpi->txq.headwb_enabled = 1;
 263                vqpi->txq.dma_headwb_addr = vqpi->txq.dma_ring_addr +
 264                    (vqpi->txq.ring_len * sizeof(struct i40e_tx_desc));
 265
 266                vqpi->rxq.vsi_id = vqci->vsi_id;
 267                vqpi->rxq.queue_id = i;
 268                vqpi->rxq.ring_len = adapter->rx_rings[i].count;
 269                vqpi->rxq.dma_ring_addr = adapter->rx_rings[i].dma;
 270                vqpi->rxq.max_pkt_size = adapter->netdev->mtu
 271                                        + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
 272                vqpi->rxq.databuffer_size = adapter->rx_rings[i].rx_buf_len;
 273                if (adapter->flags & I40EVF_FLAG_RX_PS_ENABLED) {
 274                        vqpi->rxq.splithdr_enabled = true;
 275                        vqpi->rxq.hdr_size = I40E_RX_HDR_SIZE;
 276                }
 277                vqpi++;
 278        }
 279
 280        adapter->aq_required &= ~I40EVF_FLAG_AQ_CONFIGURE_QUEUES;
 281        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
 282                           (u8 *)vqci, len);
 283        kfree(vqci);
 284}
 285
 286/**
 287 * i40evf_enable_queues
 288 * @adapter: adapter structure
 289 *
 290 * Request that the PF enable all of our queues.
 291 **/
 292void i40evf_enable_queues(struct i40evf_adapter *adapter)
 293{
 294        struct i40e_virtchnl_queue_select vqs;
 295
 296        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 297                /* bail because we already have a command pending */
 298                dev_err(&adapter->pdev->dev, "Cannot enable queues, command %d pending\n",
 299                        adapter->current_op);
 300                return;
 301        }
 302        adapter->current_op = I40E_VIRTCHNL_OP_ENABLE_QUEUES;
 303        vqs.vsi_id = adapter->vsi_res->vsi_id;
 304        vqs.tx_queues = BIT(adapter->num_active_queues) - 1;
 305        vqs.rx_queues = vqs.tx_queues;
 306        adapter->aq_required &= ~I40EVF_FLAG_AQ_ENABLE_QUEUES;
 307        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ENABLE_QUEUES,
 308                           (u8 *)&vqs, sizeof(vqs));
 309}
 310
 311/**
 312 * i40evf_disable_queues
 313 * @adapter: adapter structure
 314 *
 315 * Request that the PF disable all of our queues.
 316 **/
 317void i40evf_disable_queues(struct i40evf_adapter *adapter)
 318{
 319        struct i40e_virtchnl_queue_select vqs;
 320
 321        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 322                /* bail because we already have a command pending */
 323                dev_err(&adapter->pdev->dev, "Cannot disable queues, command %d pending\n",
 324                        adapter->current_op);
 325                return;
 326        }
 327        adapter->current_op = I40E_VIRTCHNL_OP_DISABLE_QUEUES;
 328        vqs.vsi_id = adapter->vsi_res->vsi_id;
 329        vqs.tx_queues = BIT(adapter->num_active_queues) - 1;
 330        vqs.rx_queues = vqs.tx_queues;
 331        adapter->aq_required &= ~I40EVF_FLAG_AQ_DISABLE_QUEUES;
 332        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DISABLE_QUEUES,
 333                           (u8 *)&vqs, sizeof(vqs));
 334}
 335
 336/**
 337 * i40evf_map_queues
 338 * @adapter: adapter structure
 339 *
 340 * Request that the PF map queues to interrupt vectors. Misc causes, including
 341 * admin queue, are always mapped to vector 0.
 342 **/
 343void i40evf_map_queues(struct i40evf_adapter *adapter)
 344{
 345        struct i40e_virtchnl_irq_map_info *vimi;
 346        int v_idx, q_vectors, len;
 347        struct i40e_q_vector *q_vector;
 348
 349        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 350                /* bail because we already have a command pending */
 351                dev_err(&adapter->pdev->dev, "Cannot map queues to vectors, command %d pending\n",
 352                        adapter->current_op);
 353                return;
 354        }
 355        adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP;
 356
 357        q_vectors = adapter->num_msix_vectors - NONQ_VECS;
 358
 359        len = sizeof(struct i40e_virtchnl_irq_map_info) +
 360              (adapter->num_msix_vectors *
 361                sizeof(struct i40e_virtchnl_vector_map));
 362        vimi = kzalloc(len, GFP_KERNEL);
 363        if (!vimi)
 364                return;
 365
 366        vimi->num_vectors = adapter->num_msix_vectors;
 367        /* Queue vectors first */
 368        for (v_idx = 0; v_idx < q_vectors; v_idx++) {
 369                q_vector = adapter->q_vectors + v_idx;
 370                vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id;
 371                vimi->vecmap[v_idx].vector_id = v_idx + NONQ_VECS;
 372                vimi->vecmap[v_idx].txq_map = q_vector->ring_mask;
 373                vimi->vecmap[v_idx].rxq_map = q_vector->ring_mask;
 374        }
 375        /* Misc vector last - this is only for AdminQ messages */
 376        vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id;
 377        vimi->vecmap[v_idx].vector_id = 0;
 378        vimi->vecmap[v_idx].txq_map = 0;
 379        vimi->vecmap[v_idx].rxq_map = 0;
 380
 381        adapter->aq_required &= ~I40EVF_FLAG_AQ_MAP_VECTORS;
 382        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
 383                           (u8 *)vimi, len);
 384        kfree(vimi);
 385}
 386
 387/**
 388 * i40evf_add_ether_addrs
 389 * @adapter: adapter structure
 390 * @addrs: the MAC address filters to add (contiguous)
 391 * @count: number of filters
 392 *
 393 * Request that the PF add one or more addresses to our filters.
 394 **/
 395void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
 396{
 397        struct i40e_virtchnl_ether_addr_list *veal;
 398        int len, i = 0, count = 0;
 399        struct i40evf_mac_filter *f;
 400        bool more = false;
 401
 402        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 403                /* bail because we already have a command pending */
 404                dev_err(&adapter->pdev->dev, "Cannot add filters, command %d pending\n",
 405                        adapter->current_op);
 406                return;
 407        }
 408        list_for_each_entry(f, &adapter->mac_filter_list, list) {
 409                if (f->add)
 410                        count++;
 411        }
 412        if (!count) {
 413                adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
 414                return;
 415        }
 416        adapter->current_op = I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS;
 417
 418        len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 419              (count * sizeof(struct i40e_virtchnl_ether_addr));
 420        if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 421                dev_warn(&adapter->pdev->dev, "Too many add MAC changes in one request\n");
 422                count = (I40EVF_MAX_AQ_BUF_SIZE -
 423                         sizeof(struct i40e_virtchnl_ether_addr_list)) /
 424                        sizeof(struct i40e_virtchnl_ether_addr);
 425                len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 426                      (count * sizeof(struct i40e_virtchnl_ether_addr));
 427                more = true;
 428        }
 429
 430        veal = kzalloc(len, GFP_KERNEL);
 431        if (!veal)
 432                return;
 433
 434        veal->vsi_id = adapter->vsi_res->vsi_id;
 435        veal->num_elements = count;
 436        list_for_each_entry(f, &adapter->mac_filter_list, list) {
 437                if (f->add) {
 438                        ether_addr_copy(veal->list[i].addr, f->macaddr);
 439                        i++;
 440                        f->add = false;
 441                }
 442        }
 443        if (!more)
 444                adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
 445        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
 446                           (u8 *)veal, len);
 447        kfree(veal);
 448}
 449
 450/**
 451 * i40evf_del_ether_addrs
 452 * @adapter: adapter structure
 453 * @addrs: the MAC address filters to remove (contiguous)
 454 * @count: number of filtes
 455 *
 456 * Request that the PF remove one or more addresses from our filters.
 457 **/
 458void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
 459{
 460        struct i40e_virtchnl_ether_addr_list *veal;
 461        struct i40evf_mac_filter *f, *ftmp;
 462        int len, i = 0, count = 0;
 463        bool more = false;
 464
 465        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 466                /* bail because we already have a command pending */
 467                dev_err(&adapter->pdev->dev, "Cannot remove filters, command %d pending\n",
 468                        adapter->current_op);
 469                return;
 470        }
 471        list_for_each_entry(f, &adapter->mac_filter_list, list) {
 472                if (f->remove)
 473                        count++;
 474        }
 475        if (!count) {
 476                adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
 477                return;
 478        }
 479        adapter->current_op = I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS;
 480
 481        len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 482              (count * sizeof(struct i40e_virtchnl_ether_addr));
 483        if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 484                dev_warn(&adapter->pdev->dev, "Too many delete MAC changes in one request\n");
 485                count = (I40EVF_MAX_AQ_BUF_SIZE -
 486                         sizeof(struct i40e_virtchnl_ether_addr_list)) /
 487                        sizeof(struct i40e_virtchnl_ether_addr);
 488                len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 489                      (count * sizeof(struct i40e_virtchnl_ether_addr));
 490                more = true;
 491        }
 492        veal = kzalloc(len, GFP_KERNEL);
 493        if (!veal)
 494                return;
 495
 496        veal->vsi_id = adapter->vsi_res->vsi_id;
 497        veal->num_elements = count;
 498        list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
 499                if (f->remove) {
 500                        ether_addr_copy(veal->list[i].addr, f->macaddr);
 501                        i++;
 502                        list_del(&f->list);
 503                        kfree(f);
 504                }
 505        }
 506        if (!more)
 507                adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
 508        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS,
 509                           (u8 *)veal, len);
 510        kfree(veal);
 511}
 512
 513/**
 514 * i40evf_add_vlans
 515 * @adapter: adapter structure
 516 * @vlans: the VLANs to add
 517 * @count: number of VLANs
 518 *
 519 * Request that the PF add one or more VLAN filters to our VSI.
 520 **/
 521void i40evf_add_vlans(struct i40evf_adapter *adapter)
 522{
 523        struct i40e_virtchnl_vlan_filter_list *vvfl;
 524        int len, i = 0, count = 0;
 525        struct i40evf_vlan_filter *f;
 526        bool more = false;
 527
 528        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 529                /* bail because we already have a command pending */
 530                dev_err(&adapter->pdev->dev, "Cannot add VLANs, command %d pending\n",
 531                        adapter->current_op);
 532                return;
 533        }
 534
 535        list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 536                if (f->add)
 537                        count++;
 538        }
 539        if (!count) {
 540                adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
 541                return;
 542        }
 543        adapter->current_op = I40E_VIRTCHNL_OP_ADD_VLAN;
 544
 545        len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 546              (count * sizeof(u16));
 547        if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 548                dev_warn(&adapter->pdev->dev, "Too many add VLAN changes in one request\n");
 549                count = (I40EVF_MAX_AQ_BUF_SIZE -
 550                         sizeof(struct i40e_virtchnl_vlan_filter_list)) /
 551                        sizeof(u16);
 552                len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 553                      (count * sizeof(u16));
 554                more = true;
 555        }
 556        vvfl = kzalloc(len, GFP_KERNEL);
 557        if (!vvfl)
 558                return;
 559
 560        vvfl->vsi_id = adapter->vsi_res->vsi_id;
 561        vvfl->num_elements = count;
 562        list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 563                if (f->add) {
 564                        vvfl->vlan_id[i] = f->vlan;
 565                        i++;
 566                        f->add = false;
 567                }
 568        }
 569        if (!more)
 570                adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
 571        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_VLAN, (u8 *)vvfl, len);
 572        kfree(vvfl);
 573}
 574
 575/**
 576 * i40evf_del_vlans
 577 * @adapter: adapter structure
 578 * @vlans: the VLANs to remove
 579 * @count: number of VLANs
 580 *
 581 * Request that the PF remove one or more VLAN filters from our VSI.
 582 **/
 583void i40evf_del_vlans(struct i40evf_adapter *adapter)
 584{
 585        struct i40e_virtchnl_vlan_filter_list *vvfl;
 586        struct i40evf_vlan_filter *f, *ftmp;
 587        int len, i = 0, count = 0;
 588        bool more = false;
 589
 590        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 591                /* bail because we already have a command pending */
 592                dev_err(&adapter->pdev->dev, "Cannot remove VLANs, command %d pending\n",
 593                        adapter->current_op);
 594                return;
 595        }
 596
 597        list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 598                if (f->remove)
 599                        count++;
 600        }
 601        if (!count) {
 602                adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
 603                return;
 604        }
 605        adapter->current_op = I40E_VIRTCHNL_OP_DEL_VLAN;
 606
 607        len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 608              (count * sizeof(u16));
 609        if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 610                dev_warn(&adapter->pdev->dev, "Too many delete VLAN changes in one request\n");
 611                count = (I40EVF_MAX_AQ_BUF_SIZE -
 612                         sizeof(struct i40e_virtchnl_vlan_filter_list)) /
 613                        sizeof(u16);
 614                len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 615                      (count * sizeof(u16));
 616                more = true;
 617        }
 618        vvfl = kzalloc(len, GFP_KERNEL);
 619        if (!vvfl)
 620                return;
 621
 622        vvfl->vsi_id = adapter->vsi_res->vsi_id;
 623        vvfl->num_elements = count;
 624        list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) {
 625                if (f->remove) {
 626                        vvfl->vlan_id[i] = f->vlan;
 627                        i++;
 628                        list_del(&f->list);
 629                        kfree(f);
 630                }
 631        }
 632        if (!more)
 633                adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
 634        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_VLAN, (u8 *)vvfl, len);
 635        kfree(vvfl);
 636}
 637
 638/**
 639 * i40evf_set_promiscuous
 640 * @adapter: adapter structure
 641 * @flags: bitmask to control unicast/multicast promiscuous.
 642 *
 643 * Request that the PF enable promiscuous mode for our VSI.
 644 **/
 645void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags)
 646{
 647        struct i40e_virtchnl_promisc_info vpi;
 648
 649        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 650                /* bail because we already have a command pending */
 651                dev_err(&adapter->pdev->dev, "Cannot set promiscuous mode, command %d pending\n",
 652                        adapter->current_op);
 653                return;
 654        }
 655        adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE;
 656        vpi.vsi_id = adapter->vsi_res->vsi_id;
 657        vpi.flags = flags;
 658        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
 659                           (u8 *)&vpi, sizeof(vpi));
 660}
 661
 662/**
 663 * i40evf_request_stats
 664 * @adapter: adapter structure
 665 *
 666 * Request VSI statistics from PF.
 667 **/
 668void i40evf_request_stats(struct i40evf_adapter *adapter)
 669{
 670        struct i40e_virtchnl_queue_select vqs;
 671
 672        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 673                /* no error message, this isn't crucial */
 674                return;
 675        }
 676        adapter->current_op = I40E_VIRTCHNL_OP_GET_STATS;
 677        vqs.vsi_id = adapter->vsi_res->vsi_id;
 678        /* queue maps are ignored for this message - only the vsi is used */
 679        if (i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_GET_STATS,
 680                               (u8 *)&vqs, sizeof(vqs)))
 681                /* if the request failed, don't lock out others */
 682                adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
 683}
 684/**
 685 * i40evf_request_reset
 686 * @adapter: adapter structure
 687 *
 688 * Request that the PF reset this VF. No response is expected.
 689 **/
 690void i40evf_request_reset(struct i40evf_adapter *adapter)
 691{
 692        /* Don't check CURRENT_OP - this is always higher priority */
 693        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_RESET_VF, NULL, 0);
 694        adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
 695}
 696
 697/**
 698 * i40evf_virtchnl_completion
 699 * @adapter: adapter structure
 700 * @v_opcode: opcode sent by PF
 701 * @v_retval: retval sent by PF
 702 * @msg: message sent by PF
 703 * @msglen: message length
 704 *
 705 * Asynchronous completion function for admin queue messages. Rather than busy
 706 * wait, we fire off our requests and assume that no errors will be returned.
 707 * This function handles the reply messages.
 708 **/
 709void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
 710                                enum i40e_virtchnl_ops v_opcode,
 711                                i40e_status v_retval,
 712                                u8 *msg, u16 msglen)
 713{
 714        struct net_device *netdev = adapter->netdev;
 715
 716        if (v_opcode == I40E_VIRTCHNL_OP_EVENT) {
 717                struct i40e_virtchnl_pf_event *vpe =
 718                        (struct i40e_virtchnl_pf_event *)msg;
 719                switch (vpe->event) {
 720                case I40E_VIRTCHNL_EVENT_LINK_CHANGE:
 721                        adapter->link_up =
 722                                vpe->event_data.link_event.link_status;
 723                        if (adapter->link_up && !netif_carrier_ok(netdev)) {
 724                                dev_info(&adapter->pdev->dev, "NIC Link is Up\n");
 725                                netif_carrier_on(netdev);
 726                                netif_tx_wake_all_queues(netdev);
 727                        } else if (!adapter->link_up) {
 728                                dev_info(&adapter->pdev->dev, "NIC Link is Down\n");
 729                                netif_carrier_off(netdev);
 730                                netif_tx_stop_all_queues(netdev);
 731                        }
 732                        break;
 733                case I40E_VIRTCHNL_EVENT_RESET_IMPENDING:
 734                        dev_info(&adapter->pdev->dev, "PF reset warning received\n");
 735                        if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING)) {
 736                                adapter->flags |= I40EVF_FLAG_RESET_PENDING;
 737                                dev_info(&adapter->pdev->dev, "Scheduling reset task\n");
 738                                schedule_work(&adapter->reset_task);
 739                        }
 740                        break;
 741                default:
 742                        dev_err(&adapter->pdev->dev, "Unknown event %d from PF\n",
 743                                vpe->event);
 744                        break;
 745                }
 746                return;
 747        }
 748        if (v_retval) {
 749                switch (v_opcode) {
 750                case I40E_VIRTCHNL_OP_ADD_VLAN:
 751                        dev_err(&adapter->pdev->dev, "Failed to add VLAN filter, error %s\n",
 752                                i40evf_stat_str(&adapter->hw, v_retval));
 753                        break;
 754                case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
 755                        dev_err(&adapter->pdev->dev, "Failed to add MAC filter, error %s\n",
 756                                i40evf_stat_str(&adapter->hw, v_retval));
 757                        break;
 758                case I40E_VIRTCHNL_OP_DEL_VLAN:
 759                        dev_err(&adapter->pdev->dev, "Failed to delete VLAN filter, error %s\n",
 760                                i40evf_stat_str(&adapter->hw, v_retval));
 761                        break;
 762                case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
 763                        dev_err(&adapter->pdev->dev, "Failed to delete MAC filter, error %s\n",
 764                                i40evf_stat_str(&adapter->hw, v_retval));
 765                        break;
 766                default:
 767                        dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
 768                                v_retval,
 769                                i40evf_stat_str(&adapter->hw, v_retval),
 770                                v_opcode);
 771                }
 772        }
 773        switch (v_opcode) {
 774        case I40E_VIRTCHNL_OP_GET_STATS: {
 775                struct i40e_eth_stats *stats =
 776                        (struct i40e_eth_stats *)msg;
 777                adapter->net_stats.rx_packets = stats->rx_unicast +
 778                                                 stats->rx_multicast +
 779                                                 stats->rx_broadcast;
 780                adapter->net_stats.tx_packets = stats->tx_unicast +
 781                                                 stats->tx_multicast +
 782                                                 stats->tx_broadcast;
 783                adapter->net_stats.rx_bytes = stats->rx_bytes;
 784                adapter->net_stats.tx_bytes = stats->tx_bytes;
 785                adapter->net_stats.tx_errors = stats->tx_errors;
 786                adapter->net_stats.rx_dropped = stats->rx_discards;
 787                adapter->net_stats.tx_dropped = stats->tx_discards;
 788                adapter->current_stats = *stats;
 789                }
 790                break;
 791        case I40E_VIRTCHNL_OP_GET_VF_RESOURCES: {
 792                u16 len = sizeof(struct i40e_virtchnl_vf_resource) +
 793                          I40E_MAX_VF_VSI *
 794                          sizeof(struct i40e_virtchnl_vsi_resource);
 795                memcpy(adapter->vf_res, msg, min(msglen, len));
 796                i40e_vf_parse_hw_config(&adapter->hw, adapter->vf_res);
 797                /* restore current mac address */
 798                ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr);
 799                i40evf_process_config(adapter);
 800                }
 801                break;
 802        case I40E_VIRTCHNL_OP_ENABLE_QUEUES:
 803                /* enable transmits */
 804                i40evf_irq_enable(adapter, true);
 805                netif_tx_start_all_queues(adapter->netdev);
 806                netif_carrier_on(adapter->netdev);
 807                break;
 808        case I40E_VIRTCHNL_OP_DISABLE_QUEUES:
 809                i40evf_free_all_tx_resources(adapter);
 810                i40evf_free_all_rx_resources(adapter);
 811                if (adapter->state == __I40EVF_DOWN_PENDING)
 812                        adapter->state = __I40EVF_DOWN;
 813                break;
 814        case I40E_VIRTCHNL_OP_VERSION:
 815        case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP:
 816                /* Don't display an error if we get these out of sequence.
 817                 * If the firmware needed to get kicked, we'll get these and
 818                 * it's no problem.
 819                 */
 820                if (v_opcode != adapter->current_op)
 821                        return;
 822                break;
 823        default:
 824                if (v_opcode != adapter->current_op)
 825                        dev_warn(&adapter->pdev->dev, "Expected response %d from PF, received %d\n",
 826                                 adapter->current_op, v_opcode);
 827                break;
 828        } /* switch v_opcode */
 829        adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
 830}
 831