Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/e1000/if_em.c
Show All 12 Lines | |||||
adapter->media = iflib_get_media(ctx); | adapter->media = iflib_get_media(ctx); | ||||
hw = &adapter->hw; | hw = &adapter->hw; | ||||
adapter->tx_process_limit = scctx->isc_ntxd[0]; | adapter->tx_process_limit = scctx->isc_ntxd[0]; | ||||
/* SYSCTL stuff */ | /* SYSCTL stuff */ | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "nvm", CTLTYPE_INT|CTLFLAG_RW, adapter, 0, | OID_AUTO, "nvm", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0, | |||||
em_sysctl_nvm_info, "I", "NVM Information"); | em_sysctl_nvm_info, "I", "NVM Information"); | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "debug", CTLTYPE_INT|CTLFLAG_RW, adapter, 0, | OID_AUTO, "debug", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0, | |||||
em_sysctl_debug_info, "I", "Debug Information"); | em_sysctl_debug_info, "I", "Debug Information"); | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "fc", CTLTYPE_INT|CTLFLAG_RW, adapter, 0, | OID_AUTO, "fc", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0, | |||||
em_set_flowcntl, "I", "Flow Control"); | em_set_flowcntl, "I", "Flow Control"); | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "reg_dump", CTLTYPE_STRING | CTLFLAG_RD, adapter, 0, | OID_AUTO, "reg_dump", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT, adapter, 0, | |||||
em_get_regs, "A", "Dump Registers"); | em_get_regs, "A", "Dump Registers"); | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "rs_dump", CTLTYPE_INT | CTLFLAG_RW, adapter, 0, | OID_AUTO, "rs_dump", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, adapter, 0, | |||||
em_get_rs, "I", "Dump RS indexes"); | em_get_rs, "I", "Dump RS indexes"); | ||||
/* Determine hardware and mac info */ | /* Determine hardware and mac info */ | ||||
em_identify_hardware(ctx); | em_identify_hardware(ctx); | ||||
scctx->isc_tx_nsegments = EM_MAX_SCATTER; | scctx->isc_tx_nsegments = EM_MAX_SCATTER; | ||||
scctx->isc_nrxqsets_max = scctx->isc_ntxqsets_max = em_set_num_queues(ctx); | scctx->isc_nrxqsets_max = scctx->isc_ntxqsets_max = em_set_num_queues(ctx); | ||||
if (bootverbose) | if (bootverbose) | ||||
Show All 24 Lines | |||||
if (e1000_check_reset_block(hw)) | if (e1000_check_reset_block(hw)) | ||||
device_printf(dev, "PHY reset is blocked" | device_printf(dev, "PHY reset is blocked" | ||||
" due to SOL/IDER session.\n"); | " due to SOL/IDER session.\n"); | ||||
/* Sysctl for setting Energy Efficient Ethernet */ | /* Sysctl for setting Energy Efficient Ethernet */ | ||||
hw->dev_spec.ich8lan.eee_disable = eee_setting; | hw->dev_spec.ich8lan.eee_disable = eee_setting; | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), | ||||
OID_AUTO, "eee_control", CTLTYPE_INT|CTLFLAG_RW, | OID_AUTO, "eee_control", | ||||
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | |||||
adapter, 0, em_sysctl_eee, "I", | adapter, 0, em_sysctl_eee, "I", | ||||
"Disable Energy Efficient Ethernet"); | "Disable Energy Efficient Ethernet"); | ||||
/* | /* | ||||
** Start from a known state, this is | ** Start from a known state, this is | ||||
** important in reading the nvm and | ** important in reading the nvm and | ||||
** mac from that. | ** mac from that. | ||||
*/ | */ | ||||
Show All 24 Lines | |||||
"Link MSI-X IRQ Handled"); | "Link MSI-X IRQ Handled"); | ||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "rx_overruns", | SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "rx_overruns", | ||||
CTLFLAG_RD, &adapter->rx_overruns, | CTLFLAG_RD, &adapter->rx_overruns, | ||||
"RX overruns"); | "RX overruns"); | ||||
SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_timeouts", | SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "watchdog_timeouts", | ||||
CTLFLAG_RD, &adapter->watchdog_events, | CTLFLAG_RD, &adapter->watchdog_events, | ||||
"Watchdog timeouts"); | "Watchdog timeouts"); | ||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "device_control", | SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "device_control", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_CTRL, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, E1000_CTRL, | |||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Device Control Register"); | "Device Control Register"); | ||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_control", | SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "rx_control", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, E1000_RCTL, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, E1000_RCTL, | |||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Receiver Control Register"); | "Receiver Control Register"); | ||||
SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_high_water", | SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_high_water", | ||||
CTLFLAG_RD, &adapter->hw.fc.high_water, 0, | CTLFLAG_RD, &adapter->hw.fc.high_water, 0, | ||||
"Flow Control High Watermark"); | "Flow Control High Watermark"); | ||||
SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_low_water", | SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "fc_low_water", | ||||
CTLFLAG_RD, &adapter->hw.fc.low_water, 0, | CTLFLAG_RD, &adapter->hw.fc.low_water, 0, | ||||
"Flow Control Low Watermark"); | "Flow Control Low Watermark"); | ||||
for (int i = 0; i < adapter->tx_num_queues; i++, tx_que++) { | for (int i = 0; i < adapter->tx_num_queues; i++, tx_que++) { | ||||
struct tx_ring *txr = &tx_que->txr; | struct tx_ring *txr = &tx_que->txr; | ||||
snprintf(namebuf, QUEUE_NAME_LEN, "queue_tx_%d", i); | snprintf(namebuf, QUEUE_NAME_LEN, "queue_tx_%d", i); | ||||
queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, | queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, | ||||
CTLFLAG_RD, NULL, "TX Queue Name"); | CTLFLAG_RD, NULL, "TX Queue Name"); | ||||
queue_list = SYSCTL_CHILDREN(queue_node); | queue_list = SYSCTL_CHILDREN(queue_node); | ||||
SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head", | SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, | |||||
E1000_TDH(txr->me), | E1000_TDH(txr->me), | ||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Transmit Descriptor Head"); | "Transmit Descriptor Head"); | ||||
SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail", | SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, | |||||
E1000_TDT(txr->me), | E1000_TDT(txr->me), | ||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Transmit Descriptor Tail"); | "Transmit Descriptor Tail"); | ||||
SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "tx_irq", | SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "tx_irq", | ||||
CTLFLAG_RD, &txr->tx_irq, | CTLFLAG_RD, &txr->tx_irq, | ||||
"Queue MSI-X Transmit Interrupts"); | "Queue MSI-X Transmit Interrupts"); | ||||
} | } | ||||
for (int j = 0; j < adapter->rx_num_queues; j++, rx_que++) { | for (int j = 0; j < adapter->rx_num_queues; j++, rx_que++) { | ||||
struct rx_ring *rxr = &rx_que->rxr; | struct rx_ring *rxr = &rx_que->rxr; | ||||
snprintf(namebuf, QUEUE_NAME_LEN, "queue_rx_%d", j); | snprintf(namebuf, QUEUE_NAME_LEN, "queue_rx_%d", j); | ||||
queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, | queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, namebuf, | ||||
CTLFLAG_RD, NULL, "RX Queue Name"); | CTLFLAG_RD, NULL, "RX Queue Name"); | ||||
queue_list = SYSCTL_CHILDREN(queue_node); | queue_list = SYSCTL_CHILDREN(queue_node); | ||||
SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head", | SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, | |||||
E1000_RDH(rxr->me), | E1000_RDH(rxr->me), | ||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Receive Descriptor Head"); | "Receive Descriptor Head"); | ||||
SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail", | SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail", | ||||
CTLTYPE_UINT | CTLFLAG_RD, adapter, | CTLTYPE_UINT | CTLFLAG_RD | CTLFLAG_NEEDGIANT, | ||||
adapter, | |||||
E1000_RDT(rxr->me), | E1000_RDT(rxr->me), | ||||
em_sysctl_reg_handler, "IU", | em_sysctl_reg_handler, "IU", | ||||
"Receive Descriptor Tail"); | "Receive Descriptor Tail"); | ||||
SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "rx_irq", | SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "rx_irq", | ||||
CTLFLAG_RD, &rxr->rx_irq, | CTLFLAG_RD, &rxr->rx_irq, | ||||
"Queue MSI-X Receive Interrupts"); | "Queue MSI-X Receive Interrupts"); | ||||
} | } | ||||
Show All 24 Lines | |||||
const char *description, struct em_int_delay_info *info, | const char *description, struct em_int_delay_info *info, | ||||
int offset, int value) | int offset, int value) | ||||
{ | { | ||||
info->adapter = adapter; | info->adapter = adapter; | ||||
info->offset = offset; | info->offset = offset; | ||||
info->value = value; | info->value = value; | ||||
SYSCTL_ADD_PROC(device_get_sysctl_ctx(adapter->dev), | SYSCTL_ADD_PROC(device_get_sysctl_ctx(adapter->dev), | ||||
SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)), | SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)), | ||||
OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, | OID_AUTO, name, CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, | ||||
info, 0, em_sysctl_int_delay, "I", description); | info, 0, em_sysctl_int_delay, "I", description); | ||||
} | } | ||||
/* | /* | ||||
* Set flow control using sysctl: | * Set flow control using sysctl: | ||||
* Flow control values: | * Flow control values: | ||||
* 0 - off | * 0 - off | ||||
* 1 - rx pause | * 1 - rx pause | ||||
Show All 12 Lines |