Deleted Added
full compact
if_nfe.c (270876) if_nfe.c (271782)
1/* $OpenBSD: if_nfe.c,v 1.54 2006/04/07 12:38:12 jsg Exp $ */
2
3/*-
4 * Copyright (c) 2006 Shigeaki Tagashira <shigeaki@se.hiroshima-u.ac.jp>
5 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
6 * Copyright (c) 2005, 2006 Jonathan Gray <jsg@openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any

--- 7 unchanged lines hidden (view full) ---

16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21/* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */
22
23#include <sys/cdefs.h>
1/* $OpenBSD: if_nfe.c,v 1.54 2006/04/07 12:38:12 jsg Exp $ */
2
3/*-
4 * Copyright (c) 2006 Shigeaki Tagashira <shigeaki@se.hiroshima-u.ac.jp>
5 * Copyright (c) 2006 Damien Bergamini <damien.bergamini@free.fr>
6 * Copyright (c) 2005, 2006 Jonathan Gray <jsg@openbsd.org>
7 *
8 * Permission to use, copy, modify, and distribute this software for any

--- 7 unchanged lines hidden (view full) ---

16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21/* Driver for NVIDIA nForce MCP Fast Ethernet and Gigabit Ethernet */
22
23#include <sys/cdefs.h>
24__FBSDID("$FreeBSD: head/sys/dev/nfe/if_nfe.c 270876 2014-08-31 12:48:13Z glebius $");
24__FBSDID("$FreeBSD: head/sys/dev/nfe/if_nfe.c 271782 2014-09-18 15:56:14Z glebius $");
25
26#ifdef HAVE_KERNEL_OPTION_HEADERS
27#include "opt_device_polling.h"
28#endif
29
30#include <sys/param.h>
31#include <sys/endian.h>
32#include <sys/systm.h>

--- 2111 unchanged lines hidden (view full) ---

2144 len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2145 }
2146
2147 if (flags & NFE_RX_READY)
2148 break;
2149 prog++;
2150 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2151 if (!(flags & NFE_RX_VALID_V1)) {
25
26#ifdef HAVE_KERNEL_OPTION_HEADERS
27#include "opt_device_polling.h"
28#endif
29
30#include <sys/param.h>
31#include <sys/endian.h>
32#include <sys/systm.h>

--- 2111 unchanged lines hidden (view full) ---

2144 len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2145 }
2146
2147 if (flags & NFE_RX_READY)
2148 break;
2149 prog++;
2150 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2151 if (!(flags & NFE_RX_VALID_V1)) {
2152 if_incierrors(ifp, 1);
2152 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2153 nfe_discard_rxbuf(sc, sc->rxq.cur);
2154 continue;
2155 }
2156 if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2157 flags &= ~NFE_RX_ERROR;
2158 len--; /* fix buffer length */
2159 }
2160 } else {
2161 if (!(flags & NFE_RX_VALID_V2)) {
2153 nfe_discard_rxbuf(sc, sc->rxq.cur);
2154 continue;
2155 }
2156 if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2157 flags &= ~NFE_RX_ERROR;
2158 len--; /* fix buffer length */
2159 }
2160 } else {
2161 if (!(flags & NFE_RX_VALID_V2)) {
2162 if_incierrors(ifp, 1);
2162 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2163 nfe_discard_rxbuf(sc, sc->rxq.cur);
2164 continue;
2165 }
2166
2167 if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2168 flags &= ~NFE_RX_ERROR;
2169 len--; /* fix buffer length */
2170 }
2171 }
2172
2173 if (flags & NFE_RX_ERROR) {
2163 nfe_discard_rxbuf(sc, sc->rxq.cur);
2164 continue;
2165 }
2166
2167 if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2168 flags &= ~NFE_RX_ERROR;
2169 len--; /* fix buffer length */
2170 }
2171 }
2172
2173 if (flags & NFE_RX_ERROR) {
2174 if_incierrors(ifp, 1);
2174 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2175 nfe_discard_rxbuf(sc, sc->rxq.cur);
2176 continue;
2177 }
2178
2179 m = data->m;
2180 if (nfe_newbuf(sc, sc->rxq.cur) != 0) {
2175 nfe_discard_rxbuf(sc, sc->rxq.cur);
2176 continue;
2177 }
2178
2179 m = data->m;
2180 if (nfe_newbuf(sc, sc->rxq.cur) != 0) {
2181 if_inciqdrops(ifp, 1);
2181 if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
2182 nfe_discard_rxbuf(sc, sc->rxq.cur);
2183 continue;
2184 }
2185
2186 if ((vtag & NFE_RX_VTAG) != 0 &&
2187 (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
2188 m->m_pkthdr.ether_vtag = vtag & 0xffff;
2189 m->m_flags |= M_VLANTAG;

--- 10 unchanged lines hidden (view full) ---

2200 (flags & NFE_RX_UDP_CSUMOK) != 0) {
2201 m->m_pkthdr.csum_flags |=
2202 CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2203 m->m_pkthdr.csum_data = 0xffff;
2204 }
2205 }
2206 }
2207
2182 nfe_discard_rxbuf(sc, sc->rxq.cur);
2183 continue;
2184 }
2185
2186 if ((vtag & NFE_RX_VTAG) != 0 &&
2187 (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
2188 m->m_pkthdr.ether_vtag = vtag & 0xffff;
2189 m->m_flags |= M_VLANTAG;

--- 10 unchanged lines hidden (view full) ---

2200 (flags & NFE_RX_UDP_CSUMOK) != 0) {
2201 m->m_pkthdr.csum_flags |=
2202 CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2203 m->m_pkthdr.csum_data = 0xffff;
2204 }
2205 }
2206 }
2207
2208 if_incipackets(ifp, 1);
2208 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
2209
2210 NFE_UNLOCK(sc);
2211 if_input(ifp, m);
2212 NFE_LOCK(sc);
2213 rx_npkts++;
2214 }
2215
2216 if (prog > 0)

--- 43 unchanged lines hidden (view full) ---

2260 len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2261 }
2262
2263 if (flags & NFE_RX_READY)
2264 break;
2265 prog++;
2266 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2267 if (!(flags & NFE_RX_VALID_V1)) {
2209
2210 NFE_UNLOCK(sc);
2211 if_input(ifp, m);
2212 NFE_LOCK(sc);
2213 rx_npkts++;
2214 }
2215
2216 if (prog > 0)

--- 43 unchanged lines hidden (view full) ---

2260 len = le16toh(desc32->length) & NFE_RX_LEN_MASK;
2261 }
2262
2263 if (flags & NFE_RX_READY)
2264 break;
2265 prog++;
2266 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2267 if (!(flags & NFE_RX_VALID_V1)) {
2268 if_incierrors(ifp, 1);
2268 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2269 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2270 continue;
2271 }
2272 if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2273 flags &= ~NFE_RX_ERROR;
2274 len--; /* fix buffer length */
2275 }
2276 } else {
2277 if (!(flags & NFE_RX_VALID_V2)) {
2269 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2270 continue;
2271 }
2272 if ((flags & NFE_RX_FIXME_V1) == NFE_RX_FIXME_V1) {
2273 flags &= ~NFE_RX_ERROR;
2274 len--; /* fix buffer length */
2275 }
2276 } else {
2277 if (!(flags & NFE_RX_VALID_V2)) {
2278 if_incierrors(ifp, 1);
2278 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2279 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2280 continue;
2281 }
2282
2283 if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2284 flags &= ~NFE_RX_ERROR;
2285 len--; /* fix buffer length */
2286 }
2287 }
2288
2289 if (flags & NFE_RX_ERROR) {
2279 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2280 continue;
2281 }
2282
2283 if ((flags & NFE_RX_FIXME_V2) == NFE_RX_FIXME_V2) {
2284 flags &= ~NFE_RX_ERROR;
2285 len--; /* fix buffer length */
2286 }
2287 }
2288
2289 if (flags & NFE_RX_ERROR) {
2290 if_incierrors(ifp, 1);
2290 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
2291 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2292 continue;
2293 }
2294
2295 m = data->m;
2296 if (nfe_jnewbuf(sc, sc->jrxq.jcur) != 0) {
2291 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2292 continue;
2293 }
2294
2295 m = data->m;
2296 if (nfe_jnewbuf(sc, sc->jrxq.jcur) != 0) {
2297 if_inciqdrops(ifp, 1);
2297 if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
2298 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2299 continue;
2300 }
2301
2302 if ((vtag & NFE_RX_VTAG) != 0 &&
2303 (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
2304 m->m_pkthdr.ether_vtag = vtag & 0xffff;
2305 m->m_flags |= M_VLANTAG;

--- 10 unchanged lines hidden (view full) ---

2316 (flags & NFE_RX_UDP_CSUMOK) != 0) {
2317 m->m_pkthdr.csum_flags |=
2318 CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2319 m->m_pkthdr.csum_data = 0xffff;
2320 }
2321 }
2322 }
2323
2298 nfe_discard_jrxbuf(sc, sc->jrxq.jcur);
2299 continue;
2300 }
2301
2302 if ((vtag & NFE_RX_VTAG) != 0 &&
2303 (if_getcapenable(ifp) & IFCAP_VLAN_HWTAGGING) != 0) {
2304 m->m_pkthdr.ether_vtag = vtag & 0xffff;
2305 m->m_flags |= M_VLANTAG;

--- 10 unchanged lines hidden (view full) ---

2316 (flags & NFE_RX_UDP_CSUMOK) != 0) {
2317 m->m_pkthdr.csum_flags |=
2318 CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2319 m->m_pkthdr.csum_data = 0xffff;
2320 }
2321 }
2322 }
2323
2324 if_incipackets(ifp, 1);
2324 if_inc_counter(ifp, IFCOUNTER_IPACKETS, 1);
2325
2326 NFE_UNLOCK(sc);
2327 if_input(ifp, m);
2328 NFE_LOCK(sc);
2329 rx_npkts++;
2330 }
2331
2332 if (prog > 0)

--- 41 unchanged lines hidden (view full) ---

2374
2375 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2376 if ((flags & NFE_TX_LASTFRAG_V1) == 0)
2377 continue;
2378 if ((flags & NFE_TX_ERROR_V1) != 0) {
2379 device_printf(sc->nfe_dev,
2380 "tx v1 error 0x%4b\n", flags, NFE_V1_TXERR);
2381
2325
2326 NFE_UNLOCK(sc);
2327 if_input(ifp, m);
2328 NFE_LOCK(sc);
2329 rx_npkts++;
2330 }
2331
2332 if (prog > 0)

--- 41 unchanged lines hidden (view full) ---

2374
2375 if ((sc->nfe_flags & (NFE_JUMBO_SUP | NFE_40BIT_ADDR)) == 0) {
2376 if ((flags & NFE_TX_LASTFRAG_V1) == 0)
2377 continue;
2378 if ((flags & NFE_TX_ERROR_V1) != 0) {
2379 device_printf(sc->nfe_dev,
2380 "tx v1 error 0x%4b\n", flags, NFE_V1_TXERR);
2381
2382 if_incoerrors(ifp, 1);
2382 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2383 } else
2383 } else
2384 if_incopackets(ifp, 1);
2384 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
2385 } else {
2386 if ((flags & NFE_TX_LASTFRAG_V2) == 0)
2387 continue;
2388 if ((flags & NFE_TX_ERROR_V2) != 0) {
2389 device_printf(sc->nfe_dev,
2390 "tx v2 error 0x%4b\n", flags, NFE_V2_TXERR);
2385 } else {
2386 if ((flags & NFE_TX_LASTFRAG_V2) == 0)
2387 continue;
2388 if ((flags & NFE_TX_ERROR_V2) != 0) {
2389 device_printf(sc->nfe_dev,
2390 "tx v2 error 0x%4b\n", flags, NFE_V2_TXERR);
2391 if_incoerrors(ifp, 1);
2391 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2392 } else
2392 } else
2393 if_incopackets(ifp, 1);
2393 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
2394 }
2395
2396 /* last fragment of the mbuf chain transmitted */
2397 KASSERT(data->m != NULL, ("%s: freeing NULL mbuf!", __func__));
2398 bus_dmamap_sync(sc->txq.tx_data_tag, data->tx_data_map,
2399 BUS_DMASYNC_POSTWRITE);
2400 bus_dmamap_unload(sc->txq.tx_data_tag, data->tx_data_map);
2401 m_freem(data->m);

--- 316 unchanged lines hidden (view full) ---

2718 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2719 return;
2720 }
2721 sc->nfe_force_tx = 0;
2722
2723 if_printf(ifp, "watchdog timeout\n");
2724
2725 if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
2394 }
2395
2396 /* last fragment of the mbuf chain transmitted */
2397 KASSERT(data->m != NULL, ("%s: freeing NULL mbuf!", __func__));
2398 bus_dmamap_sync(sc->txq.tx_data_tag, data->tx_data_map,
2399 BUS_DMASYNC_POSTWRITE);
2400 bus_dmamap_unload(sc->txq.tx_data_tag, data->tx_data_map);
2401 m_freem(data->m);

--- 316 unchanged lines hidden (view full) ---

2718 NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_KICKTX | sc->rxtxctl);
2719 return;
2720 }
2721 sc->nfe_force_tx = 0;
2722
2723 if_printf(ifp, "watchdog timeout\n");
2724
2725 if_setdrvflagbits(ifp, 0, IFF_DRV_RUNNING);
2726 if_incoerrors(ifp, 1);
2726 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
2727 nfe_init_locked(sc);
2728}
2729
2730
2731static void
2732nfe_init(void *xsc)
2733{
2734 struct nfe_softc *sc = xsc;

--- 683 unchanged lines hidden ---
2727 nfe_init_locked(sc);
2728}
2729
2730
2731static void
2732nfe_init(void *xsc)
2733{
2734 struct nfe_softc *sc = xsc;

--- 683 unchanged lines hidden ---