TIPS/LinuxKernel/ethtoolの作成

Last-modified: 2007-03-09 (金) 15:00:47

ethtoolコマンドでethernetドライバにget/setする方法

起動時

再起動しても設定が反映されるようにするにはネットワークの設定ファイルにETHTOOL_OPTS行を追加して記述すればよい。

[例]
[/etc/sysconfig/network-scripts/ifcfg-eth0]

DEVICE=eth0
BOOTPROTO=static
IPADDR=***.***.***.***
NETMASK=255.255.255.0
ONBOOT=yes
ETHTOOL_OPTS="autoneg off speed 100 duplex full"  #<===ここ
TYPE=Ethernet

ドライバの仕組み

net/core/ethtool.c

  • set/getの関数が用意されている

イーサドライバ内

  • struct ethtool_opsに登録する
    例)drivers/net/8139too.c

net_device構造体で登録

       dev->ethtool_ops = &rtl8139_ethtool_ops;

関数ポインタ群の構造体は

static struct ethtool_ops rtl8139_ethtool_ops = {
       .get_drvinfo            = rtl8139_get_drvinfo,
       .get_settings           = rtl8139_get_settings,
       .set_settings           = rtl8139_set_settings,
       .get_regs_len           = rtl8139_get_regs_len,
       .get_regs               = rtl8139_get_regs,
       .nway_reset             = rtl8139_nway_reset,
       .get_link               = rtl8139_get_link,
       .get_msglevel           = rtl8139_get_msglevel,
       .set_msglevel           = rtl8139_set_msglevel,
       .get_wol                = rtl8139_get_wol,
       .set_wol                = rtl8139_set_wol,
       .get_strings            = rtl8139_get_strings,
       .get_stats_count        = rtl8139_get_stats_count,
       .get_ethtool_stats      = rtl8139_get_ethtool_stats,
       .get_perm_addr          = ethtool_op_get_perm_addr,
};

それぞれの動作

ethtool help

  • ethtool -S <device>
    rtl8139_get_drvinfo: get_drvinfo
    rtl8139_get_stats_count: get_stats_count
    rtl8139_get_regs_len: get_regs_len
    rtl8139_get_stats_count: get_stats_count
    rtl8139_get_strings: get_strings
    rtl8139_get_stats_count: get_stats_count
    rtl8139_get_ethtool_stats: get_ethtool_stats
$ ethtool -S eth0
NIC statistics:
    early_rx: 0
    tx_buf_mapped: 0
    tx_timeouts: 0
    rx_lost_in_ring: 0

ethtool <device>

rtl8139_get_settings: get_settings
rtl8139_get_wol: get_wol
rtl8139_get_msglevel: get_msglevel
rtl8139_get_link: get_link
# ethtool eth0
Settings for eth0:
       Supported ports: [ TP MII ]
       Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Supports auto-negotiation: Yes
       Advertised link modes:  10baseT/Full
                               100baseT/Half 100baseT/Full
       Advertised auto-negotiation: Yes
       Speed: 10Mb/s
       Duplex: Half
       Port: MII
       PHYAD: 32
       Transceiver: internal
       Auto-negotiation: on
       Supports Wake-on: pumbg
       Wake-on: d
       Current message level: 0x00000007 (7)
       Link detected: no

ethtool -i

sh-3.00# ethtool -i eth0

driver: 8139too
version: 0.9.27
firmware-version:
bus-info: 0000:00:01.0

sh-3.00# dmesg

rtl8139_get_drvinfo: get_drvinfo
rtl8139_get_stats_count: get_stats_count
rtl8139_get_regs_len: get_regs_len

ethtool -d

RealTek RTL-8100B/8139D registers:
------------------------------
0x00: MAC Address                      08:00:83:ff:24:32
0x08: Multicast Address Filter     0x80000000 0x00000000
0x10: Transmit Status Desc 0                  0x00002000
0x14: Transmit Status Desc 1                  0x00002000
0x18: Transmit Status Desc 2                  0x00002000
0x1C: Transmit Status Desc 3                  0x00002000
0x20: Transmit Start Addr  0                  0x0db6a000
0x24: Transmit Start Addr  1                  0x0db6a600
0x28: Transmit Start Addr  2                  0x0db6ac00
0x2C: Transmit Start Addr  3                  0x0db6b200
0x30: Rx buffer addr (C mode)                 0x0d500000
0x34: Early Rx Byte Count                              0
0x36: Early Rx Status                               0x0a
      ERxGood ERxOverWrite
0x37: Command                                       0x0d
      Rx on, Tx on
0x38: Current Address of Packet Read (C mode)     0x5768
0x3A: Current Rx buffer address (C mode)          0x5778
0x3C: Interrupt Mask                              0xc07f
      SERR TimeOut RxFIFO LinkChg RxNoBuf TxErr TxOK RxErr RxOK
0x3E: Interrupt Status                            0x0000
0x40: Tx Configuration                        0x77400680
0x44: Rx Configuration                        0x0000f78e
0x48: Timer count                             0x288182c1
0x4C: Missed packet counter                     0x000000
0x50: EEPROM Command                                0x01
0x51: Config 0                                      0x10
0x52: Config 1                                      0x8d
0x54: Timer interrupt                         0x00000000
0x58: Media status                                  0x1c
0x59: Config 3                                      0xc5
0x5A: Config 4                                      0x88
0x5C: Multiple Interrupt Select                   0x0000
0x5E: PCI revision id                               0x10
0x60: Transmit Status of All Desc (C mode)        0x000f
0x62: MII Basic Mode Control Register             0x1100
0x64: MII Basic Mode Status Register              0x7809
0x66: MII Autonegotiation Advertising             0x01c1
0x68: MII Link Partner Ability                    0x0000
0x6A: MII Expansion                               0x0000
0x6C: MII Disconnect counter                      0x0000
0x6E: MII False carrier sense counter             0x0000
0x70: MII Nway test                               0x0000
0x72: MII RX_ER counter                           0x0000
0x74: MII CS configuration                        0x03c0
0x78: PHY parameter 1                         0x60f60c59
0x7C: Twister parameter                       0x7b732660
0x80: PHY parameter 2                               0x1a
0x84: PM CRC for wakeup frame 0                     0x80
0x85: PM CRC for wakeup frame 1                     0x00
0x86: PM CRC for wakeup frame 2                     0x08
0x87: PM CRC for wakeup frame 3                     0x00
0x88: PM CRC for wakeup frame 4                     0x00
0x89: PM CRC for wakeup frame 5                     0x00
0x8A: PM CRC for wakeup frame 6                     0x00
0x8B: PM CRC for wakeup frame 7                     0x40
0x8C: PM wakeup frame 0            0x00000800 0x00000800
0x94: PM wakeup frame 1            0x00002000 0x00002000
0x9C: PM wakeup frame 2            0x00000000 0x00000000
0xA4: PM wakeup frame 3            0x00000000 0x00010000
0xAC: PM wakeup frame 4            0x00020000 0x00000000
0xB4: PM wakeup frame 5            0x00000000 0x00001800
0xBC: PM wakeup frame 6            0x00010000 0x00000030
0xC4: PM wakeup frame 7            0x00000000 0x00000004
0xCC: PM LSB CRC for wakeup frame 0                 0x00
0xCD: PM LSB CRC for wakeup frame 1                 0x00
0xCE: PM LSB CRC for wakeup frame 2                 0x10
0xCF: PM LSB CRC for wakeup frame 3                 0x00
0xD0: PM LSB CRC for wakeup frame 4                 0x00
0xD1: PM LSB CRC for wakeup frame 5                 0x00
0xD2: PM LSB CRC for wakeup frame 6                 0x00
0xD3: PM LSB CRC for wakeup frame 7                 0x82
0xD8: Config 5                                      0x07
rtl8139_get_drvinfo: get_drvinfo
rtl8139_get_stats_count: get_stats_count
rtl8139_get_regs_len: get_regs_len
rtl8139_get_regs_len: get_regs_len
rtl8139_get_regs: get_regs

ethtool -r

# ethtool -r eth0
# dmesg -c
rtl8139_nway_reset: nway_reset
#

ethtool -s

sh-3.00# ethtool -s eth0 speed 100
sh-3.00# dmesg -c
rtl8139_get_settings: get_settings
rtl8139_set_settings: set_settings

usage

ethtool version 1.8
Usage:
       ethtool DEVNAME
       ethtool -a DEVNAME
       ethtool -A DEVNAME \
               [ autoneg on|off ] \
               [ rx on|off ] \
               [ tx on|off ]
       ethtool -c DEVNAME
       ethtool -C DEVNAME \
               [adaptive-rx on|off] \
               [adaptive-tx on|off] \
               [rx-usecs N] \
               [rx-frames N] \
               [rx-usecs-irq N] \
               [rx-frames-irq N] \
               [tx-usecs N] \
               [tx-frames N] \
               [tx-usecs-irq N] \
               [tx-frames-irq N] \
               [stats-block-usecs N] \
               [pkt-rate-low N] \
               [rx-usecs-low N] \
               [rx-frames-low N] \
               [tx-usecs-low N] \
               [tx-frames-low N] \
               [pkt-rate-high N] \
               [rx-usecs-high N] \
               [rx-frames-high N] \
               [tx-usecs-high N] \
               [tx-frames-high N] \
               [sample-interval N]
       ethtool -g DEVNAME
       ethtool -G DEVNAME \
               [ rx N ] \
               [ rx-mini N ] \
               [ rx-jumbo N ] \
               [ tx N ]
       ethtool -i DEVNAME
       ethtool -d DEVNAME
       ethtool -e DEVNAME \
               [ raw on|off ] \
               [ offset N ] \
               [ length N ]
       ethtool -E DEVNAME \
               [ magic N ] \
               [ offset N ] \
               [ value N ]
       ethtool -k DEVNAME
       ethtool -K DEVNAME \
               [ rx on|off ] \
               [ tx on|off ] \
               [ sg on|off ] \
               [ tso on|off ]
       ethtool -r DEVNAME
       ethtool -p DEVNAME [ %d ]
       ethtool -t DEVNAME [online|(offline)]
       ethtool -s DEVNAME \
               [ speed 10|100|1000 ] \
               [ duplex half|full ]    \
               [ port tp|aui|bnc|mii|fibre ] \
               [ autoneg on|off ] \
               [ phyad %d ] \
               [ xcvr internal|external ] \
               [ wol p|u|m|b|a|g|s|d... ] \
               [ sopass %x:%x:%x:%x:%x:%x ] \
               [ msglvl %d ]
       ethtool -S DEVNAME