unsigned long mode;
        int link_speed;
+       u8 duplex;
 
        bool carrier_link_up;
        bool hw_control;
                    trigger_data->link_speed == SPEED_1000)
                        blink_on = true;
 
+               if (test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &trigger_data->mode) &&
+                   trigger_data->duplex == DUPLEX_HALF)
+                       blink_on = true;
+
+               if (test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &trigger_data->mode) &&
+                   trigger_data->duplex == DUPLEX_FULL)
+                       blink_on = true;
+
                if (blink_on)
                        led_set_brightness(led_cdev,
                                           led_cdev->blink_brightness);
        if (!trigger_data->carrier_link_up)
                return;
 
-       if (!__ethtool_get_link_ksettings(trigger_data->net_dev, &cmd))
+       if (!__ethtool_get_link_ksettings(trigger_data->net_dev, &cmd)) {
                trigger_data->link_speed = cmd.base.speed;
+               trigger_data->duplex = cmd.base.duplex;
+       }
 }
 
 static ssize_t device_name_show(struct device *dev,
 
        trigger_data->carrier_link_up = false;
        trigger_data->link_speed = SPEED_UNKNOWN;
+       trigger_data->duplex = DUPLEX_UNKNOWN;
        if (trigger_data->net_dev != NULL) {
                rtnl_lock();
                get_device_state(trigger_data);
        case TRIGGER_NETDEV_LINK_10:
        case TRIGGER_NETDEV_LINK_100:
        case TRIGGER_NETDEV_LINK_1000:
+       case TRIGGER_NETDEV_HALF_DUPLEX:
+       case TRIGGER_NETDEV_FULL_DUPLEX:
        case TRIGGER_NETDEV_TX:
        case TRIGGER_NETDEV_RX:
                bit = attr;
        case TRIGGER_NETDEV_LINK_10:
        case TRIGGER_NETDEV_LINK_100:
        case TRIGGER_NETDEV_LINK_1000:
+       case TRIGGER_NETDEV_HALF_DUPLEX:
+       case TRIGGER_NETDEV_FULL_DUPLEX:
        case TRIGGER_NETDEV_TX:
        case TRIGGER_NETDEV_RX:
                bit = attr;
 DEFINE_NETDEV_TRIGGER(link_10, TRIGGER_NETDEV_LINK_10);
 DEFINE_NETDEV_TRIGGER(link_100, TRIGGER_NETDEV_LINK_100);
 DEFINE_NETDEV_TRIGGER(link_1000, TRIGGER_NETDEV_LINK_1000);
+DEFINE_NETDEV_TRIGGER(half_duplex, TRIGGER_NETDEV_HALF_DUPLEX);
+DEFINE_NETDEV_TRIGGER(full_duplex, TRIGGER_NETDEV_FULL_DUPLEX);
 DEFINE_NETDEV_TRIGGER(tx, TRIGGER_NETDEV_TX);
 DEFINE_NETDEV_TRIGGER(rx, TRIGGER_NETDEV_RX);
 
        &dev_attr_link_10.attr,
        &dev_attr_link_100.attr,
        &dev_attr_link_1000.attr,
+       &dev_attr_full_duplex.attr,
+       &dev_attr_half_duplex.attr,
        &dev_attr_rx.attr,
        &dev_attr_tx.attr,
        &dev_attr_interval.attr,
 
        trigger_data->carrier_link_up = false;
        trigger_data->link_speed = SPEED_UNKNOWN;
+       trigger_data->duplex = DUPLEX_UNKNOWN;
        switch (evt) {
        case NETDEV_CHANGENAME:
                get_device_state(trigger_data);
                invert = test_bit(TRIGGER_NETDEV_LINK, &trigger_data->mode) ||
                         test_bit(TRIGGER_NETDEV_LINK_10, &trigger_data->mode) ||
                         test_bit(TRIGGER_NETDEV_LINK_100, &trigger_data->mode) ||
-                        test_bit(TRIGGER_NETDEV_LINK_1000, &trigger_data->mode);
+                        test_bit(TRIGGER_NETDEV_LINK_1000, &trigger_data->mode) ||
+                        test_bit(TRIGGER_NETDEV_HALF_DUPLEX, &trigger_data->mode) ||
+                        test_bit(TRIGGER_NETDEV_FULL_DUPLEX, &trigger_data->mode);
                interval = jiffies_to_msecs(
                                atomic_read(&trigger_data->interval));
                /* base state is ON (link present) */