i40evf: allocate ring structs dynamically
[deliverable/linux.git] / drivers / net / ethernet / intel / i40evf / i40evf_virtchnl.c
index 32e620e1eb5c9549db7f2743a1b2b2986523666f..9b55576226572b24f1152cdc8d70979f630ee885 100644 (file)
@@ -255,19 +255,19 @@ void i40evf_configure_queues(struct i40evf_adapter *adapter)
        for (i = 0; i < pairs; i++) {
                vqpi->txq.vsi_id = vqci->vsi_id;
                vqpi->txq.queue_id = i;
-               vqpi->txq.ring_len = adapter->tx_rings[i]->count;
-               vqpi->txq.dma_ring_addr = adapter->tx_rings[i]->dma;
+               vqpi->txq.ring_len = adapter->tx_rings[i].count;
+               vqpi->txq.dma_ring_addr = adapter->tx_rings[i].dma;
                vqpi->txq.headwb_enabled = 1;
                vqpi->txq.dma_headwb_addr = vqpi->txq.dma_ring_addr +
                    (vqpi->txq.ring_len * sizeof(struct i40e_tx_desc));
 
                vqpi->rxq.vsi_id = vqci->vsi_id;
                vqpi->rxq.queue_id = i;
-               vqpi->rxq.ring_len = adapter->rx_rings[i]->count;
-               vqpi->rxq.dma_ring_addr = adapter->rx_rings[i]->dma;
+               vqpi->rxq.ring_len = adapter->rx_rings[i].count;
+               vqpi->rxq.dma_ring_addr = adapter->rx_rings[i].dma;
                vqpi->rxq.max_pkt_size = adapter->netdev->mtu
                                        + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
-               vqpi->rxq.databuffer_size = adapter->rx_rings[i]->rx_buf_len;
+               vqpi->rxq.databuffer_size = adapter->rx_rings[i].rx_buf_len;
                vqpi++;
        }
 
@@ -360,7 +360,7 @@ void i40evf_map_queues(struct i40evf_adapter *adapter)
        vimi->num_vectors = adapter->num_msix_vectors;
        /* Queue vectors first */
        for (v_idx = 0; v_idx < q_vectors; v_idx++) {
-               q_vector = adapter->q_vector[v_idx];
+               q_vector = adapter->q_vectors + v_idx;
                vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id;
                vimi->vecmap[v_idx].vector_id = v_idx + NONQ_VECS;
                vimi->vecmap[v_idx].txq_map = q_vector->ring_mask;
@@ -391,6 +391,7 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
        struct i40e_virtchnl_ether_addr_list *veal;
        int len, i = 0, count = 0;
        struct i40evf_mac_filter *f;
+       bool more = false;
 
        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
                /* bail because we already have a command pending */
@@ -415,7 +416,9 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
                count = (I40EVF_MAX_AQ_BUF_SIZE -
                         sizeof(struct i40e_virtchnl_ether_addr_list)) /
                        sizeof(struct i40e_virtchnl_ether_addr);
-               len = I40EVF_MAX_AQ_BUF_SIZE;
+               len = sizeof(struct i40e_virtchnl_ether_addr_list) +
+                     (count * sizeof(struct i40e_virtchnl_ether_addr));
+               more = true;
        }
 
        veal = kzalloc(len, GFP_ATOMIC);
@@ -431,7 +434,8 @@ void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
                        f->add = false;
                }
        }
-       adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
+       if (!more)
+               adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
                           (u8 *)veal, len);
        kfree(veal);
@@ -450,6 +454,7 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
        struct i40e_virtchnl_ether_addr_list *veal;
        struct i40evf_mac_filter *f, *ftmp;
        int len, i = 0, count = 0;
+       bool more = false;
 
        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
                /* bail because we already have a command pending */
@@ -474,7 +479,9 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
                count = (I40EVF_MAX_AQ_BUF_SIZE -
                         sizeof(struct i40e_virtchnl_ether_addr_list)) /
                        sizeof(struct i40e_virtchnl_ether_addr);
-               len = I40EVF_MAX_AQ_BUF_SIZE;
+               len = sizeof(struct i40e_virtchnl_ether_addr_list) +
+                     (count * sizeof(struct i40e_virtchnl_ether_addr));
+               more = true;
        }
        veal = kzalloc(len, GFP_ATOMIC);
        if (!veal)
@@ -490,7 +497,8 @@ void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
                        kfree(f);
                }
        }
-       adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
+       if (!more)
+               adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS,
                           (u8 *)veal, len);
        kfree(veal);
@@ -509,6 +517,7 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter)
        struct i40e_virtchnl_vlan_filter_list *vvfl;
        int len, i = 0, count = 0;
        struct i40evf_vlan_filter *f;
+       bool more = false;
 
        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
                /* bail because we already have a command pending */
@@ -534,7 +543,9 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter)
                count = (I40EVF_MAX_AQ_BUF_SIZE -
                         sizeof(struct i40e_virtchnl_vlan_filter_list)) /
                        sizeof(u16);
-               len = I40EVF_MAX_AQ_BUF_SIZE;
+               len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
+                     (count * sizeof(u16));
+               more = true;
        }
        vvfl = kzalloc(len, GFP_ATOMIC);
        if (!vvfl)
@@ -549,7 +560,8 @@ void i40evf_add_vlans(struct i40evf_adapter *adapter)
                        f->add = false;
                }
        }
-       adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
+       if (!more)
+               adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_VLAN, (u8 *)vvfl, len);
        kfree(vvfl);
 }
@@ -567,6 +579,7 @@ void i40evf_del_vlans(struct i40evf_adapter *adapter)
        struct i40e_virtchnl_vlan_filter_list *vvfl;
        struct i40evf_vlan_filter *f, *ftmp;
        int len, i = 0, count = 0;
+       bool more = false;
 
        if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
                /* bail because we already have a command pending */
@@ -592,7 +605,9 @@ void i40evf_del_vlans(struct i40evf_adapter *adapter)
                count = (I40EVF_MAX_AQ_BUF_SIZE -
                         sizeof(struct i40e_virtchnl_vlan_filter_list)) /
                        sizeof(u16);
-               len = I40EVF_MAX_AQ_BUF_SIZE;
+               len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
+                     (count * sizeof(u16));
+               more = true;
        }
        vvfl = kzalloc(len, GFP_ATOMIC);
        if (!vvfl)
@@ -608,7 +623,8 @@ void i40evf_del_vlans(struct i40evf_adapter *adapter)
                        kfree(f);
                }
        }
-       adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
+       if (!more)
+               adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
        i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_VLAN, (u8 *)vvfl, len);
        kfree(vvfl);
 }
@@ -724,9 +740,29 @@ void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
                return;
        }
        if (v_retval) {
-               dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
-                       v_retval, i40evf_stat_str(&adapter->hw, v_retval),
-                       v_opcode);
+               switch (v_opcode) {
+               case I40E_VIRTCHNL_OP_ADD_VLAN:
+                       dev_err(&adapter->pdev->dev, "Failed to add VLAN filter, error %s\n",
+                               i40evf_stat_str(&adapter->hw, v_retval));
+                       break;
+               case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
+                       dev_err(&adapter->pdev->dev, "Failed to add MAC filter, error %s\n",
+                               i40evf_stat_str(&adapter->hw, v_retval));
+                       break;
+               case I40E_VIRTCHNL_OP_DEL_VLAN:
+                       dev_err(&adapter->pdev->dev, "Failed to delete VLAN filter, error %s\n",
+                               i40evf_stat_str(&adapter->hw, v_retval));
+                       break;
+               case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
+                       dev_err(&adapter->pdev->dev, "Failed to delete MAC filter, error %s\n",
+                               i40evf_stat_str(&adapter->hw, v_retval));
+                       break;
+               default:
+                       dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
+                               v_retval,
+                               i40evf_stat_str(&adapter->hw, v_retval),
+                               v_opcode);
+               }
        }
        switch (v_opcode) {
        case I40E_VIRTCHNL_OP_GET_STATS: {
This page took 0.032235 seconds and 5 git commands to generate.