return err;
 }
 #endif /* CONFIG_I40E_DCB */
+#define SPEED_SIZE 14
+#define FC_SIZE 8
+/**
+ * i40e_print_link_message - print link up or down
+ * @vsi: the VSI for which link needs a message
+ */
+static void i40e_print_link_message(struct i40e_vsi *vsi, bool isup)
+{
+       char speed[SPEED_SIZE] = "Unknown";
+       char fc[FC_SIZE] = "RX/TX";
+
+       if (!isup) {
+               netdev_info(vsi->netdev, "NIC Link is Down\n");
+               return;
+       }
+
+       switch (vsi->back->hw.phy.link_info.link_speed) {
+       case I40E_LINK_SPEED_40GB:
+               strncpy(speed, "40 Gbps", SPEED_SIZE);
+               break;
+       case I40E_LINK_SPEED_10GB:
+               strncpy(speed, "10 Gbps", SPEED_SIZE);
+               break;
+       case I40E_LINK_SPEED_1GB:
+               strncpy(speed, "1000 Mbps", SPEED_SIZE);
+               break;
+       default:
+               break;
+       }
+
+       switch (vsi->back->hw.fc.current_mode) {
+       case I40E_FC_FULL:
+               strncpy(fc, "RX/TX", FC_SIZE);
+               break;
+       case I40E_FC_TX_PAUSE:
+               strncpy(fc, "TX", FC_SIZE);
+               break;
+       case I40E_FC_RX_PAUSE:
+               strncpy(fc, "RX", FC_SIZE);
+               break;
+       default:
+               strncpy(fc, "None", FC_SIZE);
+               break;
+       }
+
+       netdev_info(vsi->netdev, "NIC Link is Up %s Full Duplex, Flow Control: %s\n",
+                   speed, fc);
+}
 
 /**
  * i40e_up_complete - Finish the last steps of bringing up a connection
 
        if ((pf->hw.phy.link_info.link_info & I40E_AQ_LINK_UP) &&
            (vsi->netdev)) {
-               netdev_info(vsi->netdev, "NIC Link is Up\n");
+               i40e_print_link_message(vsi, true);
                netif_tx_start_all_queues(vsi->netdev);
                netif_carrier_on(vsi->netdev);
        } else if (vsi->netdev) {
-               netdev_info(vsi->netdev, "NIC Link is Down\n");
+               i40e_print_link_message(vsi, false);
        }
 
        /* replay FDIR SB filters */
 
        if (new_link == old_link)
                return;
-
        if (!test_bit(__I40E_DOWN, &pf->vsi[pf->lan_vsi]->state))
-               netdev_info(pf->vsi[pf->lan_vsi]->netdev,
-                           "NIC Link is %s\n", (new_link ? "Up" : "Down"));
+               i40e_print_link_message(pf->vsi[pf->lan_vsi], new_link);
 
        /* Notify the base of the switch tree connected to
         * the link.  Floating VEBs are not notified.