cmd->base.port = PORT_FIBRE;
        else
                cmd->base.port = PORT_TP;
-       /* This driver supports only 10G capable adapters, so DUPLEX_FULL */
-       cmd->base.duplex = DUPLEX_FULL;
+
+       cmd->base.duplex = DUPLEX_UNKNOWN;
+       if (self->link_status.mbps)
+               cmd->base.duplex = self->link_status.full_duplex ?
+                                  DUPLEX_FULL : DUPLEX_HALF;
        cmd->base.autoneg = self->aq_nic_cfg.is_autoneg;
 
        ethtool_link_ksettings_zero_link_mode(cmd, supported);
                ethtool_link_ksettings_add_link_mode(cmd, supported,
                                                     1000baseT_Full);
 
+       if (self->aq_nic_cfg.aq_hw_caps->link_speed_msk & AQ_NIC_RATE_1G_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, supported,
+                                                    1000baseT_Half);
+
        if (self->aq_nic_cfg.aq_hw_caps->link_speed_msk & AQ_NIC_RATE_100M)
                ethtool_link_ksettings_add_link_mode(cmd, supported,
                                                     100baseT_Full);
 
+       if (self->aq_nic_cfg.aq_hw_caps->link_speed_msk & AQ_NIC_RATE_100M_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, supported,
+                                                    100baseT_Half);
+
        if (self->aq_nic_cfg.aq_hw_caps->link_speed_msk & AQ_NIC_RATE_10M)
                ethtool_link_ksettings_add_link_mode(cmd, supported,
                                                     10baseT_Full);
 
+       if (self->aq_nic_cfg.aq_hw_caps->link_speed_msk & AQ_NIC_RATE_10M_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, supported,
+                                                    10baseT_Half);
+
        if (self->aq_nic_cfg.aq_hw_caps->flow_control) {
                ethtool_link_ksettings_add_link_mode(cmd, supported,
                                                     Pause);
        if (self->aq_nic_cfg.is_autoneg)
                ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_10G)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_10G)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     10000baseT_Full);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_5G)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_5G)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     5000baseT_Full);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_2G5)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_2G5)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     2500baseT_Full);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_1G)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_1G)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     1000baseT_Full);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_100M)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_1G_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, advertising,
+                                                    1000baseT_Half);
+
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_100M)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     100baseT_Full);
 
-       if (self->aq_nic_cfg.link_speed_msk  & AQ_NIC_RATE_10M)
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_100M_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, advertising,
+                                                    100baseT_Half);
+
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_10M)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     10baseT_Full);
 
+       if (self->aq_nic_cfg.link_speed_msk & AQ_NIC_RATE_10M_HALF)
+               ethtool_link_ksettings_add_link_mode(cmd, advertising,
+                                                    10baseT_Half);
+
        if (self->aq_nic_cfg.fc.cur & AQ_NIC_FC_RX)
                ethtool_link_ksettings_add_link_mode(cmd, advertising,
                                                     Pause);
 int aq_nic_set_link_ksettings(struct aq_nic_s *self,
                              const struct ethtool_link_ksettings *cmd)
 {
-       u32 speed = 0U;
+       int fduplex = (cmd->base.duplex == DUPLEX_FULL);
+       u32 speed = cmd->base.speed;
        u32 rate = 0U;
        int err = 0;
 
+       if (!fduplex && speed > SPEED_1000) {
+               err = -EINVAL;
+               goto err_exit;
+       }
+
        if (cmd->base.autoneg == AUTONEG_ENABLE) {
                rate = self->aq_nic_cfg.aq_hw_caps->link_speed_msk;
                self->aq_nic_cfg.is_autoneg = true;
        } else {
-               speed = cmd->base.speed;
-
                switch (speed) {
                case SPEED_10:
-                       rate = AQ_NIC_RATE_10M;
+                       rate = fduplex ? AQ_NIC_RATE_10M : AQ_NIC_RATE_10M_HALF;
                        break;
 
                case SPEED_100:
-                       rate = AQ_NIC_RATE_100M;
+                       rate = fduplex ? AQ_NIC_RATE_100M
+                                      : AQ_NIC_RATE_100M_HALF;
                        break;
 
                case SPEED_1000:
-                       rate = AQ_NIC_RATE_1G;
+                       rate = fduplex ? AQ_NIC_RATE_1G : AQ_NIC_RATE_1G_HALF;
                        break;
 
                case SPEED_2500: