Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/e1000/if_igb.c
Show First 20 Lines • Show All 4,624 Lines • ▼ Show 20 Lines | #endif | ||||
if ((i & 3) == 3) { | if ((i & 3) == 3) { | ||||
E1000_WRITE_REG(hw, E1000_RETA(i >> 2), reta); | E1000_WRITE_REG(hw, E1000_RETA(i >> 2), reta); | ||||
reta = 0; | reta = 0; | ||||
} | } | ||||
} | } | ||||
/* Now fill in hash table */ | /* Now fill in hash table */ | ||||
/* XXX This means RSS enable + 8 queues for my igb (82580.) */ | /* | ||||
mrqc = E1000_MRQC_ENABLE_RSS_4Q; | * MRQC: Multiple Receive Queues Command | ||||
* Set queuing to RSS control, number depends on the device. | |||||
*/ | |||||
mrqc = E1000_MRQC_ENABLE_RSS_8Q; | |||||
#ifdef RSS | #ifdef RSS | ||||
/* XXX ew typecasting */ | /* XXX ew typecasting */ | ||||
rss_getkey((uint8_t *) &rss_key); | rss_getkey((uint8_t *) &rss_key); | ||||
#else | #else | ||||
arc4rand(&rss_key, sizeof(rss_key), 0); | arc4rand(&rss_key, sizeof(rss_key), 0); | ||||
#endif | #endif | ||||
for (i = 0; i < 10; i++) | for (i = 0; i < 10; i++) | ||||
▲ Show 20 Lines • Show All 491 Lines • ▼ Show 20 Lines | if (eop) { | ||||
if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) | if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) | ||||
igb_rx_checksum(staterr, rxr->fmp, ptype); | igb_rx_checksum(staterr, rxr->fmp, ptype); | ||||
if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && | if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 && | ||||
(staterr & E1000_RXD_STAT_VP) != 0) { | (staterr & E1000_RXD_STAT_VP) != 0) { | ||||
rxr->fmp->m_pkthdr.ether_vtag = vtag; | rxr->fmp->m_pkthdr.ether_vtag = vtag; | ||||
rxr->fmp->m_flags |= M_VLANTAG; | rxr->fmp->m_flags |= M_VLANTAG; | ||||
} | } | ||||
#ifdef RSS | |||||
/* XXX set flowtype once this works right */ | /* | ||||
* In case of multiqueue, we have RXCSUM.PCSD bit set | |||||
* and never cleared. This means we have RSS hash | |||||
* available to be used. | |||||
*/ | |||||
if (adapter->num_queues > 1) { | |||||
rxr->fmp->m_pkthdr.flowid = | rxr->fmp->m_pkthdr.flowid = | ||||
le32toh(cur->wb.lower.hi_dword.rss); | le32toh(cur->wb.lower.hi_dword.rss); | ||||
switch (pkt_info & E1000_RXDADV_RSSTYPE_MASK) { | switch (pkt_info & E1000_RXDADV_RSSTYPE_MASK) { | ||||
case E1000_RXDADV_RSSTYPE_IPV4_TCP: | case E1000_RXDADV_RSSTYPE_IPV4_TCP: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV4); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_TCP_IPV4); | |||||
break; | break; | ||||
case E1000_RXDADV_RSSTYPE_IPV4: | case E1000_RXDADV_RSSTYPE_IPV4: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV4); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_IPV4); | |||||
break; | break; | ||||
case E1000_RXDADV_RSSTYPE_IPV6_TCP: | case E1000_RXDADV_RSSTYPE_IPV6_TCP: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV6); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_TCP_IPV6); | |||||
break; | break; | ||||
case E1000_RXDADV_RSSTYPE_IPV6_EX: | case E1000_RXDADV_RSSTYPE_IPV6_EX: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV6_EX); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_IPV6_EX); | |||||
break; | break; | ||||
case E1000_RXDADV_RSSTYPE_IPV6: | case E1000_RXDADV_RSSTYPE_IPV6: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_IPV6); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_IPV6); | |||||
break; | break; | ||||
case E1000_RXDADV_RSSTYPE_IPV6_TCP_EX: | case E1000_RXDADV_RSSTYPE_IPV6_TCP_EX: | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_RSS_TCP_IPV6_EX); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_RSS_TCP_IPV6_EX); | |||||
break; | break; | ||||
/* XXX no UDP support in RSS just yet */ | |||||
#ifdef notyet | |||||
case E1000_RXDADV_RSSTYPE_IPV4_UDP: | |||||
case E1000_RXDADV_RSSTYPE_IPV6_UDP: | |||||
case E1000_RXDADV_RSSTYPE_IPV6_UDP_EX: | |||||
#endif | |||||
default: | default: | ||||
/* XXX fallthrough */ | /* XXX fallthrough */ | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_OPAQUE); | M_HASHTYPE_SET(rxr->fmp, | ||||
M_HASHTYPE_OPAQUE); | |||||
} | } | ||||
#elif !defined(IGB_LEGACY_TX) | } else { | ||||
#ifndef IGB_LEGACY_TX | |||||
rxr->fmp->m_pkthdr.flowid = que->msix; | rxr->fmp->m_pkthdr.flowid = que->msix; | ||||
M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_OPAQUE); | M_HASHTYPE_SET(rxr->fmp, M_HASHTYPE_OPAQUE); | ||||
#endif | #endif | ||||
} | |||||
sendmp = rxr->fmp; | sendmp = rxr->fmp; | ||||
/* Make sure to set M_PKTHDR. */ | /* Make sure to set M_PKTHDR. */ | ||||
sendmp->m_flags |= M_PKTHDR; | sendmp->m_flags |= M_PKTHDR; | ||||
rxr->fmp = NULL; | rxr->fmp = NULL; | ||||
rxr->lmp = NULL; | rxr->lmp = NULL; | ||||
} | } | ||||
next_desc: | next_desc: | ||||
▲ Show 20 Lines • Show All 1,198 Lines • Show Last 20 Lines |