mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-21 07:15:49 +00:00
igc: sysctl for TCP flag handling during TSO
Add tso_tcp_flags_mask_first_segment, tso_tcp_flags_mask_middle_segment, and tso_tcp_flags_mask_last_segment sysctl-variables to control the handling of TCP flags during TSO. This allows to change the masks appropriate for classical ECN and to configure appropriate masks for accurate ECN. MFC after: 3 days Sponsored by: Netflix
This commit is contained in:
parent
90853dfac8
commit
ab540d44ba
@ -127,6 +127,7 @@ static void igc_print_debug_info(struct igc_softc *);
|
|||||||
static int igc_is_valid_ether_addr(u8 *);
|
static int igc_is_valid_ether_addr(u8 *);
|
||||||
static void igc_neweitr(struct igc_softc *, struct igc_rx_queue *,
|
static void igc_neweitr(struct igc_softc *, struct igc_rx_queue *,
|
||||||
struct tx_ring *, struct rx_ring *);
|
struct tx_ring *, struct rx_ring *);
|
||||||
|
static int igc_sysctl_tso_tcp_flags_mask(SYSCTL_HANDLER_ARGS);
|
||||||
/* Management and WOL Support */
|
/* Management and WOL Support */
|
||||||
static void igc_get_hw_control(struct igc_softc *);
|
static void igc_get_hw_control(struct igc_softc *);
|
||||||
static void igc_release_hw_control(struct igc_softc *);
|
static void igc_release_hw_control(struct igc_softc *);
|
||||||
@ -497,6 +498,27 @@ igc_if_attach_pre(if_ctx_t ctx)
|
|||||||
CTLTYPE_INT | CTLFLAG_RW, sc, 0,
|
CTLTYPE_INT | CTLFLAG_RW, sc, 0,
|
||||||
igc_sysctl_dmac, "I", "DMA Coalesce");
|
igc_sysctl_dmac, "I", "DMA Coalesce");
|
||||||
|
|
||||||
|
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
|
||||||
|
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
|
||||||
|
OID_AUTO, "tso_tcp_flags_mask_first_segment",
|
||||||
|
CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
|
||||||
|
sc, 0, igc_sysctl_tso_tcp_flags_mask, "IU",
|
||||||
|
"TSO TCP flags mask for first segment");
|
||||||
|
|
||||||
|
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
|
||||||
|
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
|
||||||
|
OID_AUTO, "tso_tcp_flags_mask_middle_segment",
|
||||||
|
CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
|
||||||
|
sc, 1, igc_sysctl_tso_tcp_flags_mask, "IU",
|
||||||
|
"TSO TCP flags mask for middle segment");
|
||||||
|
|
||||||
|
SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
|
||||||
|
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
|
||||||
|
OID_AUTO, "tso_tcp_flags_mask_last_segment",
|
||||||
|
CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
|
||||||
|
sc, 2, igc_sysctl_tso_tcp_flags_mask, "IU",
|
||||||
|
"TSO TCP flags mask for last segment");
|
||||||
|
|
||||||
/* Determine hardware and mac info */
|
/* Determine hardware and mac info */
|
||||||
igc_identify_hardware(ctx);
|
igc_identify_hardware(ctx);
|
||||||
|
|
||||||
@ -3013,6 +3035,43 @@ igc_print_nvm_info(struct igc_softc *sc)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
igc_sysctl_tso_tcp_flags_mask(SYSCTL_HANDLER_ARGS)
|
||||||
|
{
|
||||||
|
struct igc_softc *sc;
|
||||||
|
u32 reg, val, shift;
|
||||||
|
int error, mask;
|
||||||
|
|
||||||
|
sc = oidp->oid_arg1;
|
||||||
|
switch (oidp->oid_arg2) {
|
||||||
|
case 0:
|
||||||
|
reg = IGC_DTXTCPFLGL;
|
||||||
|
shift = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
reg = IGC_DTXTCPFLGL;
|
||||||
|
shift = 16;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
reg = IGC_DTXTCPFLGH;
|
||||||
|
shift = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return (EINVAL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
val = IGC_READ_REG(&sc->hw, reg);
|
||||||
|
mask = (val >> shift) & 0xfff;
|
||||||
|
error = sysctl_handle_int(oidp, &mask, 0, req);
|
||||||
|
if (error != 0 || req->newptr == NULL)
|
||||||
|
return (error);
|
||||||
|
if (mask < 0 || mask > 0xfff)
|
||||||
|
return (EINVAL);
|
||||||
|
val = (val & ~(0xfff << shift)) | (mask << shift);
|
||||||
|
IGC_WRITE_REG(&sc->hw, reg, val);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set flow control using sysctl:
|
* Set flow control using sysctl:
|
||||||
* Flow control values:
|
* Flow control values:
|
||||||
|
@ -145,6 +145,8 @@
|
|||||||
#define IGC_FFVT_REG(_i) (0x09800 + ((_i) * 8))
|
#define IGC_FFVT_REG(_i) (0x09800 + ((_i) * 8))
|
||||||
#define IGC_FFLT_REG(_i) (0x05F00 + ((_i) * 8))
|
#define IGC_FFLT_REG(_i) (0x05F00 + ((_i) * 8))
|
||||||
#define IGC_TXPBS 0x03404 /* Tx Packet Buffer Size - RW */
|
#define IGC_TXPBS 0x03404 /* Tx Packet Buffer Size - RW */
|
||||||
|
#define IGC_DTXTCPFLGL 0x0359C /* DMA Tx Control flag low - RW */
|
||||||
|
#define IGC_DTXTCPFLGH 0x035A0 /* DMA Tx Control flag high - RW */
|
||||||
/* Statistics Register Descriptions */
|
/* Statistics Register Descriptions */
|
||||||
#define IGC_CRCERRS 0x04000 /* CRC Error Count - R/clr */
|
#define IGC_CRCERRS 0x04000 /* CRC Error Count - R/clr */
|
||||||
#define IGC_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */
|
#define IGC_ALGNERRC 0x04004 /* Alignment Error Count - R/clr */
|
||||||
|
Loading…
Reference in New Issue
Block a user