ibmvnic: create send_control_ip_offload
authorLijun Pan <ljp@linux.ibm.com>
Mon, 28 Sep 2020 01:13:30 +0000 (20:13 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Sep 2020 23:06:08 +0000 (16:06 -0700)
Factor send_control_ip_offload out of handle_query_ip_offload_rsp.

Signed-off-by: Lijun Pan <ljp@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ibm/ibmvnic.c

index 7fba4860a2c2ff32a801cccfd14bd1ce45f3e142..1f7fe6b3dd5a1a44ff0128fa6e82c68eadfaea0f 100644 (file)
@@ -3981,6 +3981,85 @@ static void send_query_ip_offload(struct ibmvnic_adapter *adapter)
        ibmvnic_send_crq(adapter, &crq);
 }
 
+static void send_control_ip_offload(struct ibmvnic_adapter *adapter)
+{
+       struct ibmvnic_control_ip_offload_buffer *ctrl_buf = &adapter->ip_offload_ctrl;
+       struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf;
+       struct device *dev = &adapter->vdev->dev;
+       netdev_features_t old_hw_features = 0;
+       union ibmvnic_crq crq;
+
+       adapter->ip_offload_ctrl_tok =
+               dma_map_single(dev,
+                              ctrl_buf,
+                              sizeof(adapter->ip_offload_ctrl),
+                              DMA_TO_DEVICE);
+
+       if (dma_mapping_error(dev, adapter->ip_offload_ctrl_tok)) {
+               dev_err(dev, "Couldn't map ip offload control buffer\n");
+               return;
+       }
+
+       ctrl_buf->len = cpu_to_be32(sizeof(adapter->ip_offload_ctrl));
+       ctrl_buf->version = cpu_to_be32(INITIAL_VERSION_IOB);
+       ctrl_buf->ipv4_chksum = buf->ipv4_chksum;
+       ctrl_buf->ipv6_chksum = buf->ipv6_chksum;
+       ctrl_buf->tcp_ipv4_chksum = buf->tcp_ipv4_chksum;
+       ctrl_buf->udp_ipv4_chksum = buf->udp_ipv4_chksum;
+       ctrl_buf->tcp_ipv6_chksum = buf->tcp_ipv6_chksum;
+       ctrl_buf->udp_ipv6_chksum = buf->udp_ipv6_chksum;
+       ctrl_buf->large_tx_ipv4 = buf->large_tx_ipv4;
+       ctrl_buf->large_tx_ipv6 = buf->large_tx_ipv6;
+
+       /* large_rx disabled for now, additional features needed */
+       ctrl_buf->large_rx_ipv4 = 0;
+       ctrl_buf->large_rx_ipv6 = 0;
+
+       if (adapter->state != VNIC_PROBING) {
+               old_hw_features = adapter->netdev->hw_features;
+               adapter->netdev->hw_features = 0;
+       }
+
+       adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO;
+
+       if (buf->tcp_ipv4_chksum || buf->udp_ipv4_chksum)
+               adapter->netdev->hw_features |= NETIF_F_IP_CSUM;
+
+       if (buf->tcp_ipv6_chksum || buf->udp_ipv6_chksum)
+               adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM;
+
+       if ((adapter->netdev->features &
+           (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))
+               adapter->netdev->hw_features |= NETIF_F_RXCSUM;
+
+       if (buf->large_tx_ipv4)
+               adapter->netdev->hw_features |= NETIF_F_TSO;
+       if (buf->large_tx_ipv6)
+               adapter->netdev->hw_features |= NETIF_F_TSO6;
+
+       if (adapter->state == VNIC_PROBING) {
+               adapter->netdev->features |= adapter->netdev->hw_features;
+       } else if (old_hw_features != adapter->netdev->hw_features) {
+               netdev_features_t tmp = 0;
+
+               /* disable features no longer supported */
+               adapter->netdev->features &= adapter->netdev->hw_features;
+               /* turn on features now supported if previously enabled */
+               tmp = (old_hw_features ^ adapter->netdev->hw_features) &
+                       adapter->netdev->hw_features;
+               adapter->netdev->features |=
+                               tmp & adapter->netdev->wanted_features;
+       }
+
+       memset(&crq, 0, sizeof(crq));
+       crq.control_ip_offload.first = IBMVNIC_CRQ_CMD;
+       crq.control_ip_offload.cmd = CONTROL_IP_OFFLOAD;
+       crq.control_ip_offload.len =
+           cpu_to_be32(sizeof(adapter->ip_offload_ctrl));
+       crq.control_ip_offload.ioba = cpu_to_be32(adapter->ip_offload_ctrl_tok);
+       ibmvnic_send_crq(adapter, &crq);
+}
+
 static void handle_vpd_size_rsp(union ibmvnic_crq *crq,
                                struct ibmvnic_adapter *adapter)
 {
@@ -4050,8 +4129,6 @@ static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter)
 {
        struct device *dev = &adapter->vdev->dev;
        struct ibmvnic_query_ip_offload_buffer *buf = &adapter->ip_offload_buf;
-       netdev_features_t old_hw_features = 0;
-       union ibmvnic_crq crq;
        int i;
 
        dma_unmap_single(dev, adapter->ip_offload_tok,
@@ -4101,74 +4178,7 @@ static void handle_query_ip_offload_rsp(struct ibmvnic_adapter *adapter)
        netdev_dbg(adapter->netdev, "off_ipv6_ext_hd = %d\n",
                   buf->off_ipv6_ext_headers);
 
-       adapter->ip_offload_ctrl_tok =
-           dma_map_single(dev, &adapter->ip_offload_ctrl,
-                          sizeof(adapter->ip_offload_ctrl), DMA_TO_DEVICE);
-
-       if (dma_mapping_error(dev, adapter->ip_offload_ctrl_tok)) {
-               dev_err(dev, "Couldn't map ip offload control buffer\n");
-               return;
-       }
-
-       adapter->ip_offload_ctrl.len =
-           cpu_to_be32(sizeof(adapter->ip_offload_ctrl));
-       adapter->ip_offload_ctrl.version = cpu_to_be32(INITIAL_VERSION_IOB);
-       adapter->ip_offload_ctrl.ipv4_chksum = buf->ipv4_chksum;
-       adapter->ip_offload_ctrl.ipv6_chksum = buf->ipv6_chksum;
-       adapter->ip_offload_ctrl.tcp_ipv4_chksum = buf->tcp_ipv4_chksum;
-       adapter->ip_offload_ctrl.udp_ipv4_chksum = buf->udp_ipv4_chksum;
-       adapter->ip_offload_ctrl.tcp_ipv6_chksum = buf->tcp_ipv6_chksum;
-       adapter->ip_offload_ctrl.udp_ipv6_chksum = buf->udp_ipv6_chksum;
-       adapter->ip_offload_ctrl.large_tx_ipv4 = buf->large_tx_ipv4;
-       adapter->ip_offload_ctrl.large_tx_ipv6 = buf->large_tx_ipv6;
-
-       /* large_rx disabled for now, additional features needed */
-       adapter->ip_offload_ctrl.large_rx_ipv4 = 0;
-       adapter->ip_offload_ctrl.large_rx_ipv6 = 0;
-
-       if (adapter->state != VNIC_PROBING) {
-               old_hw_features = adapter->netdev->hw_features;
-               adapter->netdev->hw_features = 0;
-       }
-
-       adapter->netdev->hw_features = NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO;
-
-       if (buf->tcp_ipv4_chksum || buf->udp_ipv4_chksum)
-               adapter->netdev->hw_features |= NETIF_F_IP_CSUM;
-
-       if (buf->tcp_ipv6_chksum || buf->udp_ipv6_chksum)
-               adapter->netdev->hw_features |= NETIF_F_IPV6_CSUM;
-
-       if ((adapter->netdev->features &
-           (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))
-               adapter->netdev->hw_features |= NETIF_F_RXCSUM;
-
-       if (buf->large_tx_ipv4)
-               adapter->netdev->hw_features |= NETIF_F_TSO;
-       if (buf->large_tx_ipv6)
-               adapter->netdev->hw_features |= NETIF_F_TSO6;
-
-       if (adapter->state == VNIC_PROBING) {
-               adapter->netdev->features |= adapter->netdev->hw_features;
-       } else if (old_hw_features != adapter->netdev->hw_features) {
-               netdev_features_t tmp = 0;
-
-               /* disable features no longer supported */
-               adapter->netdev->features &= adapter->netdev->hw_features;
-               /* turn on features now supported if previously enabled */
-               tmp = (old_hw_features ^ adapter->netdev->hw_features) &
-                       adapter->netdev->hw_features;
-               adapter->netdev->features |=
-                               tmp & adapter->netdev->wanted_features;
-       }
-
-       memset(&crq, 0, sizeof(crq));
-       crq.control_ip_offload.first = IBMVNIC_CRQ_CMD;
-       crq.control_ip_offload.cmd = CONTROL_IP_OFFLOAD;
-       crq.control_ip_offload.len =
-           cpu_to_be32(sizeof(adapter->ip_offload_ctrl));
-       crq.control_ip_offload.ioba = cpu_to_be32(adapter->ip_offload_ctrl_tok);
-       ibmvnic_send_crq(adapter, &crq);
+       send_control_ip_offload(adapter);
 }
 
 static const char *ibmvnic_fw_err_cause(u16 cause)