33#include <net/rss_config.h>
34#include <netinet/in_rss.h>
38#define DPRINTF device_printf
60 uint32_t *cmd_type_len, uint32_t *olinfo_status);
62 uint32_t *cmd_type_len, uint32_t *olinfo_status);
64static void igb_rx_checksum(uint32_t staterr, if_rxd_info_t ri, uint32_t ptype);
89 uint32_t *olinfo_status)
93 uint32_t type_tucmd_mlhl = 0, vlan_macip_lens = 0;
94 uint32_t mss_l4len_idx = 0;
97 switch(pi->ipi_etype) {
107 panic(
"%s: CSUM_TSO but no supported IP version (0x%04x)",
108 __func__, ntohs(pi->ipi_etype));
115 paylen = pi->ipi_len - pi->ipi_ehdrlen - pi->ipi_ip_hlen - pi->ipi_tcp_hlen;
118 if (pi->ipi_mflags & M_VLANTAG) {
154 uint32_t *olinfo_status)
158 uint32_t vlan_macip_lens, type_tucmd_mlhl;
159 uint32_t mss_l4len_idx;
160 mss_l4len_idx = vlan_macip_lens = type_tucmd_mlhl = 0;
164 return (
igb_tso_setup(txr, pi, cmd_type_len, olinfo_status));
177 if (pi->ipi_mflags & M_VLANTAG) {
186 switch(pi->ipi_etype) {
200 switch (pi->ipi_ipproto) {
202 if (pi->ipi_csum_flags & (CSUM_IP_TCP | CSUM_IP6_TCP)) {
208 if (pi->ipi_csum_flags & (CSUM_IP_UDP | CSUM_IP6_UDP)) {
214 if (pi->ipi_csum_flags & (CSUM_IP_SCTP | CSUM_IP6_SCTP)) {
240 if_softc_ctx_t scctx = sc->
shared;
243 int nsegs = pi->ipi_nsegs;
244 bus_dma_segment_t *segs = pi->ipi_segs;
255 if (pi->ipi_mflags & M_VLANTAG)
259 ntxd = scctx->isc_ntxd[0];
263 if (i == scctx->isc_ntxd[0])
270 for (j = 0; j < nsegs; j++) {
275 seglen = segs[j].ds_len;
276 segaddr = htole64(segs[j].ds_addr);
283 if (++i == scctx->isc_ntxd[0]) {
294 pi->ipi_new_pidx = i;
313 if_softc_ctx_t scctx = sc->
shared;
317 qidx_t processed = 0;
319 qidx_t cur, prev, ntxd, rs_cidx;
326 cur = txr->
tx_rsq[rs_cidx];
339 ntxd = scctx->isc_ntxd[0];
342 delta = (int32_t)cur - (int32_t)prev;
349 rs_cidx = (rs_cidx + 1) & (ntxd-1);
352 cur = txr->
tx_rsq[rs_cidx];
365 if_softc_ctx_t scctx = sc->
shared;
366 uint16_t rxqid = iru->iru_qsidx;
371 uint32_t next_pidx, pidx;
375 paddrs = iru->iru_paddrs;
376 pidx = iru->iru_pidx;
377 count = iru->iru_count;
379 for (i = 0, next_pidx = pidx; i < count; i++) {
383 if (++next_pidx == scctx->isc_nrxd[0])
402 if_softc_ctx_t scctx = sc->
shared;
406 uint32_t staterr = 0;
409 for (cnt = 0, i = idx; cnt < scctx->isc_nrxd[0] && cnt <= budget;) {
415 if (++i == scctx->isc_nrxd[0])
434 if_softc_ctx_t scctx = sc->
shared;
440 uint32_t ptype, staterr;
469 ri->iri_frags[i].irf_flid = 0;
470 ri->iri_frags[i].irf_idx = cidx;
471 ri->iri_frags[i].irf_len = len;
473 if (++cidx == scctx->isc_nrxd[0])
476 if (rxr->hdr_split ==
true) {
477 ri->iri_frags[i].irf_flid = 1;
478 ri->iri_frags[i].irf_idx = cidx;
479 if (++cidx == scctx->isc_nrxd[0])
488 if ((scctx->isc_capenable & IFCAP_RXCSUM) != 0)
498 ri->iri_flags |= M_VLANTAG;
519 uint16_t status = (uint16_t)staterr;
520 uint8_t errors = (uint8_t)(staterr >> 24);
531 ri->iri_csum_flags = (CSUM_IP_CHECKED | CSUM_IP_VALID);
534 if (__predict_true(status &
539 ri->iri_csum_flags |= CSUM_SCTP_VALID;
541 ri->iri_csum_flags |= CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
542 ri->iri_csum_data = htons(0xffff);
557 return M_HASHTYPE_RSS_TCP_IPV4;
559 return M_HASHTYPE_RSS_IPV4;
561 return M_HASHTYPE_RSS_TCP_IPV6;
563 return M_HASHTYPE_RSS_IPV6_EX;
565 return M_HASHTYPE_RSS_IPV6;
567 return M_HASHTYPE_RSS_TCP_IPV6_EX;
569 return M_HASHTYPE_OPAQUE;
#define E1000_RXDADV_RSSTYPE_IPV4_TCP
#define E1000_ADVTXD_DTYP_CTXT
#define E1000_RXDADV_PKTTYPE_SCTP
#define E1000_ADVTXD_DCMD_DEXT
#define E1000_RXDADV_RSSTYPE_IPV6
#define E1000_RXDADV_RSSTYPE_MASK
#define E1000_ADVTXD_PAYLEN_SHIFT
#define E1000_ADVTXD_DCMD_IFCS
#define E1000_RXDADV_RSSTYPE_IPV4
#define E1000_ADVTXD_DCMD_VLE
#define E1000_RXDADV_PKTTYPE_ETQF
#define E1000_RXDADV_RSSTYPE_IPV6_TCP
#define E1000_ADVTXD_DCMD_TSE
#define E1000_RXDADV_RSSTYPE_IPV6_EX
#define E1000_ADVTXD_DCMD_RS
#define E1000_RXDADV_RSSTYPE_IPV6_TCP_EX
#define E1000_ADVTXD_DTYP_DATA
#define E1000_ADVTXD_TUCMD_IPV4
#define E1000_ADVTXD_L4LEN_SHIFT
#define E1000_ADVTXD_TUCMD_L4T_SCTP
#define E1000_ADVTXD_TUCMD_L4T_TCP
#define E1000_ADVTXD_TUCMD_IPV6
#define E1000_ADVTXD_TUCMD_L4T_UDP
#define E1000_ADVTXD_MACLEN_SHIFT
#define E1000_ADVTXD_VLAN_SHIFT
#define E1000_ADVTXD_MSS_SHIFT
#define E1000_RXD_STAT_VP
#define E1000_RXD_STAT_IPCS
#define E1000_RXDEXT_STATERR_LB
#define E1000_RXD_ERR_IPE
#define E1000_RXD_STAT_IXSM
#define E1000_RXD_STAT_UDPCS
#define E1000_TXD_CMD_IFCS
#define E1000_TXD_STAT_DD
#define E1000_RXDEXT_ERR_FRAME_ERR_MASK
#define E1000_RXD_STAT_DD
#define E1000_RXD_STAT_TCPCS
#define E1000_RXD_ERR_TCPE
#define E1000_TXD_POPTS_TXSM
#define E1000_RXD_STAT_EOP
#define E1000_TXD_POPTS_IXSM
#define E1000_TXD_CMD_EOP
#define E1000_WRITE_REG(hw, reg, value)
static int igb_isc_txd_encap(void *arg, if_pkt_info_t pi)
void igb_if_enable_intr(if_ctx_t ctx)
static int igb_isc_rxd_pkt_get(void *arg, if_rxd_info_t ri)
static void igb_isc_rxd_refill(void *arg, if_rxd_update_t iru)
static int igb_tso_setup(struct tx_ring *txr, if_pkt_info_t pi, uint32_t *cmd_type_len, uint32_t *olinfo_status)
static void igb_isc_txd_flush(void *arg, uint16_t txqid, qidx_t pidx)
static int igb_determine_rsstype(uint16_t pkt_info)
static int igb_isc_rxd_available(void *arg, uint16_t rxqid, qidx_t idx, qidx_t budget)
static void igb_rx_checksum(uint32_t staterr, if_rxd_info_t ri, uint32_t ptype)
static int igb_tx_ctx_setup(struct tx_ring *txr, if_pkt_info_t pi, uint32_t *cmd_type_len, uint32_t *olinfo_status)
static void igb_isc_rxd_flush(void *arg, uint16_t rxqid, uint8_t flid __unused, qidx_t pidx)
static int igb_isc_txd_credits_update(void *arg, uint16_t txqid, bool clear)
union e1000_adv_tx_context_desc::@10 u
struct e1000_mac_info mac
struct em_rx_queue * rx_queues
unsigned long dropped_pkts
struct em_tx_queue * tx_queues
unsigned long rx_discarded
union e1000_rx_desc_extended * rx_base
struct e1000_tx_desc * tx_base
struct e1000_adv_rx_desc::@12::@14 upper
struct e1000_adv_rx_desc::@12::@13::@15::@17 hs_rss
union e1000_adv_rx_desc::@12::@13::@16 hi_dword
struct e1000_adv_rx_desc::@11 read
struct e1000_adv_rx_desc::@12::@13 lower
union e1000_adv_rx_desc::@12::@13::@15 lo_dword
struct e1000_adv_rx_desc::@12 wb
struct e1000_adv_tx_desc::@8 read