sfxge_tx.c (277895) | sfxge_tx.c (278221) |
---|---|
1/*- 2 * Copyright (c) 2010-2011 Solarflare Communications, Inc. 3 * All rights reserved. 4 * 5 * This software was developed in part by Philip Paeps under contract for 6 * Solarflare Communications, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 29 unchanged lines hidden (view full) --- 38 * 39 * So, event queue plus label mapping to Tx queue index is: 40 * if event queue index is 0, TxQ-index = TxQ-label * [0..SFXGE_TXQ_NTYPES) 41 * else TxQ-index = SFXGE_TXQ_NTYPES + EvQ-index - 1 42 * See sfxge_get_txq_by_label() sfxge_ev.c 43 */ 44 45#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2010-2011 Solarflare Communications, Inc. 3 * All rights reserved. 4 * 5 * This software was developed in part by Philip Paeps under contract for 6 * Solarflare Communications, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 29 unchanged lines hidden (view full) --- 38 * 39 * So, event queue plus label mapping to Tx queue index is: 40 * if event queue index is 0, TxQ-index = TxQ-label * [0..SFXGE_TXQ_NTYPES) 41 * else TxQ-index = SFXGE_TXQ_NTYPES + EvQ-index - 1 42 * See sfxge_get_txq_by_label() sfxge_ev.c 43 */ 44 45#include <sys/cdefs.h> |
46__FBSDID("$FreeBSD: head/sys/dev/sfxge/sfxge_tx.c 277895 2015-01-29 19:11:37Z arybchik $"); | 46__FBSDID("$FreeBSD: head/sys/dev/sfxge/sfxge_tx.c 278221 2015-02-04 20:03:57Z arybchik $"); |
47 48#include <sys/types.h> 49#include <sys/mbuf.h> 50#include <sys/smp.h> 51#include <sys/socket.h> 52#include <sys/sysctl.h> 53#include <sys/syslog.h> 54 --- 58 unchanged lines hidden (view full) --- 113static int sfxge_tx_queue_tso(struct sfxge_txq *txq, struct mbuf *mbuf, 114 const bus_dma_segment_t *dma_seg, int n_dma_seg); 115 116void 117sfxge_tx_qcomplete(struct sfxge_txq *txq, struct sfxge_evq *evq) 118{ 119 unsigned int completed; 120 | 47 48#include <sys/types.h> 49#include <sys/mbuf.h> 50#include <sys/smp.h> 51#include <sys/socket.h> 52#include <sys/sysctl.h> 53#include <sys/syslog.h> 54 --- 58 unchanged lines hidden (view full) --- 113static int sfxge_tx_queue_tso(struct sfxge_txq *txq, struct mbuf *mbuf, 114 const bus_dma_segment_t *dma_seg, int n_dma_seg); 115 116void 117sfxge_tx_qcomplete(struct sfxge_txq *txq, struct sfxge_evq *evq) 118{ 119 unsigned int completed; 120 |
121 mtx_assert(&evq->lock, MA_OWNED); | 121 SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); |
122 123 completed = txq->completed; 124 while (completed != txq->pending) { 125 struct sfxge_tx_mapping *stmp; 126 unsigned int id; 127 128 id = completed++ & txq->ptr_mask; 129 --- 43 unchanged lines hidden (view full) --- 173{ 174 struct sfxge_tx_dpl *stdp; 175 struct mbuf *mbuf, *get_next, **get_tailp; 176 volatile uintptr_t *putp; 177 uintptr_t put; 178 unsigned int count; 179 unsigned int non_tcp_count; 180 | 122 123 completed = txq->completed; 124 while (completed != txq->pending) { 125 struct sfxge_tx_mapping *stmp; 126 unsigned int id; 127 128 id = completed++ & txq->ptr_mask; 129 --- 43 unchanged lines hidden (view full) --- 173{ 174 struct sfxge_tx_dpl *stdp; 175 struct mbuf *mbuf, *get_next, **get_tailp; 176 volatile uintptr_t *putp; 177 uintptr_t put; 178 unsigned int count; 179 unsigned int non_tcp_count; 180 |
181 mtx_assert(&txq->lock, MA_OWNED); | 181 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
182 183 stdp = &txq->dpl; 184 185 /* Acquire the put list. */ 186 putp = &stdp->std_put; 187 put = atomic_readandclear_ptr(putp); 188 mbuf = (void *)put; 189 --- 26 unchanged lines hidden (view full) --- 216 stdp->std_get_non_tcp_count += non_tcp_count; 217} 218 219#endif /* SFXGE_HAVE_MQ */ 220 221static void 222sfxge_tx_qreap(struct sfxge_txq *txq) 223{ | 182 183 stdp = &txq->dpl; 184 185 /* Acquire the put list. */ 186 putp = &stdp->std_put; 187 put = atomic_readandclear_ptr(putp); 188 mbuf = (void *)put; 189 --- 26 unchanged lines hidden (view full) --- 216 stdp->std_get_non_tcp_count += non_tcp_count; 217} 218 219#endif /* SFXGE_HAVE_MQ */ 220 221static void 222sfxge_tx_qreap(struct sfxge_txq *txq) 223{ |
224 mtx_assert(SFXGE_TXQ_LOCK(txq), MA_OWNED); | 224 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
225 226 txq->reaped = txq->completed; 227} 228 229static void 230sfxge_tx_qlist_post(struct sfxge_txq *txq) 231{ 232 unsigned int old_added; 233 unsigned int level; 234 int rc; 235 | 225 226 txq->reaped = txq->completed; 227} 228 229static void 230sfxge_tx_qlist_post(struct sfxge_txq *txq) 231{ 232 unsigned int old_added; 233 unsigned int level; 234 int rc; 235 |
236 mtx_assert(SFXGE_TXQ_LOCK(txq), MA_OWNED); | 236 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
237 238 KASSERT(txq->n_pend_desc != 0, ("txq->n_pend_desc == 0")); 239 KASSERT(txq->n_pend_desc <= SFXGE_TSO_MAX_DESC, 240 ("txq->n_pend_desc too large")); 241 KASSERT(!txq->blocked, ("txq->blocked")); 242 243 old_added = txq->added; 244 --- 158 unchanged lines hidden (view full) --- 403 struct sfxge_softc *sc; 404 struct sfxge_tx_dpl *stdp; 405 struct mbuf *mbuf, *next; 406 unsigned int count; 407 unsigned int non_tcp_count; 408 unsigned int pushed; 409 int rc; 410 | 237 238 KASSERT(txq->n_pend_desc != 0, ("txq->n_pend_desc == 0")); 239 KASSERT(txq->n_pend_desc <= SFXGE_TSO_MAX_DESC, 240 ("txq->n_pend_desc too large")); 241 KASSERT(!txq->blocked, ("txq->blocked")); 242 243 old_added = txq->added; 244 --- 158 unchanged lines hidden (view full) --- 403 struct sfxge_softc *sc; 404 struct sfxge_tx_dpl *stdp; 405 struct mbuf *mbuf, *next; 406 unsigned int count; 407 unsigned int non_tcp_count; 408 unsigned int pushed; 409 int rc; 410 |
411 mtx_assert(&txq->lock, MA_OWNED); | 411 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
412 413 sc = txq->sc; 414 stdp = &txq->dpl; 415 pushed = txq->added; 416 417 prefetch_read_many(sc->enp); 418 prefetch_read_many(txq->common); 419 --- 59 unchanged lines hidden (view full) --- 479/* 480 * Service the deferred packet list. 481 * 482 * NOTE: drops the txq mutex! 483 */ 484static inline void 485sfxge_tx_qdpl_service(struct sfxge_txq *txq) 486{ | 412 413 sc = txq->sc; 414 stdp = &txq->dpl; 415 pushed = txq->added; 416 417 prefetch_read_many(sc->enp); 418 prefetch_read_many(txq->common); 419 --- 59 unchanged lines hidden (view full) --- 479/* 480 * Service the deferred packet list. 481 * 482 * NOTE: drops the txq mutex! 483 */ 484static inline void 485sfxge_tx_qdpl_service(struct sfxge_txq *txq) 486{ |
487 mtx_assert(&txq->lock, MA_OWNED); | 487 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
488 489 do { 490 if (SFXGE_TX_QDPL_PENDING(txq)) 491 sfxge_tx_qdpl_swizzle(txq); 492 493 if (!txq->blocked) 494 sfxge_tx_qdpl_drain(txq); 495 | 488 489 do { 490 if (SFXGE_TX_QDPL_PENDING(txq)) 491 sfxge_tx_qdpl_swizzle(txq); 492 493 if (!txq->blocked) 494 sfxge_tx_qdpl_drain(txq); 495 |
496 mtx_unlock(&txq->lock); | 496 SFXGE_TXQ_UNLOCK(txq); |
497 } while (SFXGE_TX_QDPL_PENDING(txq) && | 497 } while (SFXGE_TX_QDPL_PENDING(txq) && |
498 mtx_trylock(&txq->lock)); | 498 SFXGE_TXQ_TRYLOCK(txq)); |
499} 500 501/* 502 * Put a packet on the deferred packet list. 503 * 504 * If we are called with the txq lock held, we put the packet on the "get 505 * list", otherwise we atomically push it on the "put list". The swizzle 506 * function takes care of ordering. --- 7 unchanged lines hidden (view full) --- 514{ 515 struct sfxge_tx_dpl *stdp; 516 517 stdp = &txq->dpl; 518 519 KASSERT(mbuf->m_nextpkt == NULL, ("mbuf->m_nextpkt != NULL")); 520 521 if (locked) { | 499} 500 501/* 502 * Put a packet on the deferred packet list. 503 * 504 * If we are called with the txq lock held, we put the packet on the "get 505 * list", otherwise we atomically push it on the "put list". The swizzle 506 * function takes care of ordering. --- 7 unchanged lines hidden (view full) --- 514{ 515 struct sfxge_tx_dpl *stdp; 516 517 stdp = &txq->dpl; 518 519 KASSERT(mbuf->m_nextpkt == NULL, ("mbuf->m_nextpkt != NULL")); 520 521 if (locked) { |
522 mtx_assert(&txq->lock, MA_OWNED); | 522 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
523 524 sfxge_tx_qdpl_swizzle(txq); 525 526 if (stdp->std_get_count >= stdp->std_get_max) { 527 txq->get_overflow++; 528 return (ENOBUFS); 529 } 530 if (sfxge_is_mbuf_non_tcp(mbuf)) { --- 52 unchanged lines hidden (view full) --- 583 goto fail; 584 } 585 586 /* 587 * Try to grab the txq lock. If we are able to get the lock, 588 * the packet will be appended to the "get list" of the deferred 589 * packet list. Otherwise, it will be pushed on the "put list". 590 */ | 523 524 sfxge_tx_qdpl_swizzle(txq); 525 526 if (stdp->std_get_count >= stdp->std_get_max) { 527 txq->get_overflow++; 528 return (ENOBUFS); 529 } 530 if (sfxge_is_mbuf_non_tcp(mbuf)) { --- 52 unchanged lines hidden (view full) --- 583 goto fail; 584 } 585 586 /* 587 * Try to grab the txq lock. If we are able to get the lock, 588 * the packet will be appended to the "get list" of the deferred 589 * packet list. Otherwise, it will be pushed on the "put list". 590 */ |
591 locked = mtx_trylock(&txq->lock); | 591 locked = SFXGE_TXQ_TRYLOCK(txq); |
592 593 if (sfxge_tx_qdpl_put(txq, m, locked) != 0) { 594 if (locked) | 592 593 if (sfxge_tx_qdpl_put(txq, m, locked) != 0) { 594 if (locked) |
595 mtx_unlock(&txq->lock); | 595 SFXGE_TXQ_UNLOCK(txq); |
596 rc = ENOBUFS; 597 goto fail; 598 } 599 600 /* 601 * Try to grab the lock again. 602 * 603 * If we are able to get the lock, we need to process the deferred 604 * packet list. If we are not able to get the lock, another thread 605 * is processing the list. 606 */ 607 if (!locked) | 596 rc = ENOBUFS; 597 goto fail; 598 } 599 600 /* 601 * Try to grab the lock again. 602 * 603 * If we are able to get the lock, we need to process the deferred 604 * packet list. If we are not able to get the lock, another thread 605 * is processing the list. 606 */ 607 if (!locked) |
608 locked = mtx_trylock(&txq->lock); | 608 locked = SFXGE_TXQ_TRYLOCK(txq); |
609 610 if (locked) { 611 /* Try to service the list. */ 612 sfxge_tx_qdpl_service(txq); 613 /* Lock has been dropped. */ 614 } 615 616 return (0); --- 4 unchanged lines hidden (view full) --- 621} 622 623static void 624sfxge_tx_qdpl_flush(struct sfxge_txq *txq) 625{ 626 struct sfxge_tx_dpl *stdp = &txq->dpl; 627 struct mbuf *mbuf, *next; 628 | 609 610 if (locked) { 611 /* Try to service the list. */ 612 sfxge_tx_qdpl_service(txq); 613 /* Lock has been dropped. */ 614 } 615 616 return (0); --- 4 unchanged lines hidden (view full) --- 621} 622 623static void 624sfxge_tx_qdpl_flush(struct sfxge_txq *txq) 625{ 626 struct sfxge_tx_dpl *stdp = &txq->dpl; 627 struct mbuf *mbuf, *next; 628 |
629 mtx_lock(&txq->lock); | 629 SFXGE_TXQ_LOCK(txq); |
630 631 sfxge_tx_qdpl_swizzle(txq); 632 for (mbuf = stdp->std_get; mbuf != NULL; mbuf = next) { 633 next = mbuf->m_nextpkt; 634 m_freem(mbuf); 635 } 636 stdp->std_get = NULL; 637 stdp->std_get_count = 0; 638 stdp->std_get_non_tcp_count = 0; 639 stdp->std_getp = &stdp->std_get; 640 | 630 631 sfxge_tx_qdpl_swizzle(txq); 632 for (mbuf = stdp->std_get; mbuf != NULL; mbuf = next) { 633 next = mbuf->m_nextpkt; 634 m_freem(mbuf); 635 } 636 stdp->std_get = NULL; 637 stdp->std_get_count = 0; 638 stdp->std_get_non_tcp_count = 0; 639 stdp->std_getp = &stdp->std_get; 640 |
641 mtx_unlock(&txq->lock); | 641 SFXGE_TXQ_UNLOCK(txq); |
642} 643 644void 645sfxge_if_qflush(struct ifnet *ifp) 646{ 647 struct sfxge_softc *sc; 648 int i; 649 --- 98 unchanged lines hidden (view full) --- 748 efx_tx_qpush(txq->common, txq->added); 749 } 750} 751 752void sfxge_if_start(struct ifnet *ifp) 753{ 754 struct sfxge_softc *sc = ifp->if_softc; 755 | 642} 643 644void 645sfxge_if_qflush(struct ifnet *ifp) 646{ 647 struct sfxge_softc *sc; 648 int i; 649 --- 98 unchanged lines hidden (view full) --- 748 efx_tx_qpush(txq->common, txq->added); 749 } 750} 751 752void sfxge_if_start(struct ifnet *ifp) 753{ 754 struct sfxge_softc *sc = ifp->if_softc; 755 |
756 mtx_lock(&sc->tx_lock); | 756 SFXGE_TXQ_LOCK(sc->txq[0]); |
757 sfxge_if_start_locked(ifp); | 757 sfxge_if_start_locked(ifp); |
758 mtx_unlock(&sc->tx_lock); | 758 SFXGE_TXQ_UNLOCK(sc->txq[0]); |
759} 760 761static inline void 762sfxge_tx_qdpl_service(struct sfxge_txq *txq) 763{ | 759} 760 761static inline void 762sfxge_tx_qdpl_service(struct sfxge_txq *txq) 763{ |
764 struct sfxge_softc *sc = txq->sc; 765 struct ifnet *ifp = sc->ifnet; | 764 struct ifnet *ifp = txq->sc->ifnet; |
766 | 765 |
767 mtx_assert(&sc->tx_lock, MA_OWNED); | 766 SFXGE_TXQ_LOCK_ASSERT_OWNED(txq); |
768 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 769 sfxge_if_start_locked(ifp); | 767 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 768 sfxge_if_start_locked(ifp); |
770 mtx_unlock(&sc->tx_lock); | 769 SFXGE_TXQ_UNLOCK(txq); |
771} 772 773#endif /* SFXGE_HAVE_MQ */ 774 775/* 776 * Software "TSO". Not quite as good as doing it in hardware, but 777 * still faster than segmenting in the stack. 778 */ --- 334 unchanged lines hidden (view full) --- 1113sfxge_tx_qunblock(struct sfxge_txq *txq) 1114{ 1115 struct sfxge_softc *sc; 1116 struct sfxge_evq *evq; 1117 1118 sc = txq->sc; 1119 evq = sc->evq[txq->evq_index]; 1120 | 770} 771 772#endif /* SFXGE_HAVE_MQ */ 773 774/* 775 * Software "TSO". Not quite as good as doing it in hardware, but 776 * still faster than segmenting in the stack. 777 */ --- 334 unchanged lines hidden (view full) --- 1112sfxge_tx_qunblock(struct sfxge_txq *txq) 1113{ 1114 struct sfxge_softc *sc; 1115 struct sfxge_evq *evq; 1116 1117 sc = txq->sc; 1118 evq = sc->evq[txq->evq_index]; 1119 |
1121 mtx_assert(&evq->lock, MA_OWNED); | 1120 SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); |
1122 1123 if (txq->init_state != SFXGE_TXQ_STARTED) 1124 return; 1125 | 1121 1122 if (txq->init_state != SFXGE_TXQ_STARTED) 1123 return; 1124 |
1126 mtx_lock(SFXGE_TXQ_LOCK(txq)); | 1125 SFXGE_TXQ_LOCK(txq); |
1127 1128 if (txq->blocked) { 1129 unsigned int level; 1130 1131 level = txq->added - txq->completed; 1132 if (level <= SFXGE_TXQ_UNBLOCK_LEVEL(txq->entries)) 1133 txq->blocked = 0; 1134 } --- 14 unchanged lines hidden (view full) --- 1149{ 1150 struct sfxge_txq *txq; 1151 struct sfxge_evq *evq; 1152 unsigned int count; 1153 1154 txq = sc->txq[index]; 1155 evq = sc->evq[txq->evq_index]; 1156 | 1126 1127 if (txq->blocked) { 1128 unsigned int level; 1129 1130 level = txq->added - txq->completed; 1131 if (level <= SFXGE_TXQ_UNBLOCK_LEVEL(txq->entries)) 1132 txq->blocked = 0; 1133 } --- 14 unchanged lines hidden (view full) --- 1148{ 1149 struct sfxge_txq *txq; 1150 struct sfxge_evq *evq; 1151 unsigned int count; 1152 1153 txq = sc->txq[index]; 1154 evq = sc->evq[txq->evq_index]; 1155 |
1157 mtx_lock(SFXGE_TXQ_LOCK(txq)); | 1156 SFXGE_TXQ_LOCK(txq); |
1158 1159 KASSERT(txq->init_state == SFXGE_TXQ_STARTED, 1160 ("txq->init_state != SFXGE_TXQ_STARTED")); 1161 1162 txq->init_state = SFXGE_TXQ_INITIALIZED; 1163 txq->flush_state = SFXGE_FLUSH_PENDING; 1164 1165 /* Flush the transmit queue. */ 1166 efx_tx_qflush(txq->common); 1167 | 1157 1158 KASSERT(txq->init_state == SFXGE_TXQ_STARTED, 1159 ("txq->init_state != SFXGE_TXQ_STARTED")); 1160 1161 txq->init_state = SFXGE_TXQ_INITIALIZED; 1162 txq->flush_state = SFXGE_FLUSH_PENDING; 1163 1164 /* Flush the transmit queue. */ 1165 efx_tx_qflush(txq->common); 1166 |
1168 mtx_unlock(SFXGE_TXQ_LOCK(txq)); | 1167 SFXGE_TXQ_UNLOCK(txq); |
1169 1170 count = 0; 1171 do { 1172 /* Spin for 100ms. */ 1173 DELAY(100000); 1174 1175 if (txq->flush_state != SFXGE_FLUSH_PENDING) 1176 break; 1177 } while (++count < 20); 1178 | 1168 1169 count = 0; 1170 do { 1171 /* Spin for 100ms. */ 1172 DELAY(100000); 1173 1174 if (txq->flush_state != SFXGE_FLUSH_PENDING) 1175 break; 1176 } while (++count < 20); 1177 |
1179 mtx_lock(&evq->lock); 1180 mtx_lock(SFXGE_TXQ_LOCK(txq)); | 1178 SFXGE_EVQ_LOCK(evq); 1179 SFXGE_TXQ_LOCK(txq); |
1181 1182 KASSERT(txq->flush_state != SFXGE_FLUSH_FAILED, 1183 ("txq->flush_state == SFXGE_FLUSH_FAILED")); 1184 1185 txq->flush_state = SFXGE_FLUSH_DONE; 1186 1187 txq->blocked = 0; 1188 txq->pending = txq->added; --- 13 unchanged lines hidden (view full) --- 1202 1203 /* Destroy the common code transmit queue. */ 1204 efx_tx_qdestroy(txq->common); 1205 txq->common = NULL; 1206 1207 efx_sram_buf_tbl_clear(sc->enp, txq->buf_base_id, 1208 EFX_TXQ_NBUFS(sc->txq_entries)); 1209 | 1180 1181 KASSERT(txq->flush_state != SFXGE_FLUSH_FAILED, 1182 ("txq->flush_state == SFXGE_FLUSH_FAILED")); 1183 1184 txq->flush_state = SFXGE_FLUSH_DONE; 1185 1186 txq->blocked = 0; 1187 txq->pending = txq->added; --- 13 unchanged lines hidden (view full) --- 1201 1202 /* Destroy the common code transmit queue. */ 1203 efx_tx_qdestroy(txq->common); 1204 txq->common = NULL; 1205 1206 efx_sram_buf_tbl_clear(sc->enp, txq->buf_base_id, 1207 EFX_TXQ_NBUFS(sc->txq_entries)); 1208 |
1210 mtx_unlock(&evq->lock); 1211 mtx_unlock(SFXGE_TXQ_LOCK(txq)); | 1209 SFXGE_EVQ_UNLOCK(evq); 1210 SFXGE_TXQ_UNLOCK(txq); |
1212} 1213 1214static int 1215sfxge_tx_qstart(struct sfxge_softc *sc, unsigned int index) 1216{ 1217 struct sfxge_txq *txq; 1218 efsys_mem_t *esmp; 1219 uint16_t flags; --- 32 unchanged lines hidden (view full) --- 1252 } 1253 1254 /* Create the common code transmit queue. */ 1255 if ((rc = efx_tx_qcreate(sc->enp, index, txq->type, esmp, 1256 sc->txq_entries, txq->buf_base_id, flags, evq->common, 1257 &txq->common)) != 0) 1258 goto fail; 1259 | 1211} 1212 1213static int 1214sfxge_tx_qstart(struct sfxge_softc *sc, unsigned int index) 1215{ 1216 struct sfxge_txq *txq; 1217 efsys_mem_t *esmp; 1218 uint16_t flags; --- 32 unchanged lines hidden (view full) --- 1251 } 1252 1253 /* Create the common code transmit queue. */ 1254 if ((rc = efx_tx_qcreate(sc->enp, index, txq->type, esmp, 1255 sc->txq_entries, txq->buf_base_id, flags, evq->common, 1256 &txq->common)) != 0) 1257 goto fail; 1258 |
1260 mtx_lock(SFXGE_TXQ_LOCK(txq)); | 1259 SFXGE_TXQ_LOCK(txq); |
1261 1262 /* Enable the transmit queue. */ 1263 efx_tx_qenable(txq->common); 1264 1265 txq->init_state = SFXGE_TXQ_STARTED; 1266 | 1260 1261 /* Enable the transmit queue. */ 1262 efx_tx_qenable(txq->common); 1263 1264 txq->init_state = SFXGE_TXQ_STARTED; 1265 |
1267 mtx_unlock(SFXGE_TXQ_LOCK(txq)); | 1266 SFXGE_TXQ_UNLOCK(txq); |
1268 1269 return (0); 1270 1271fail: 1272 efx_sram_buf_tbl_clear(sc->enp, txq->buf_base_id, 1273 EFX_TXQ_NBUFS(sc->txq_entries)); 1274 return (rc); 1275} --- 81 unchanged lines hidden (view full) --- 1357 free(txq->stmp, M_SFXGE); 1358 1359 /* Release DMA memory mapping. */ 1360 sfxge_dma_free(&txq->mem); 1361 1362 sc->txq[index] = NULL; 1363 1364#ifdef SFXGE_HAVE_MQ | 1267 1268 return (0); 1269 1270fail: 1271 efx_sram_buf_tbl_clear(sc->enp, txq->buf_base_id, 1272 EFX_TXQ_NBUFS(sc->txq_entries)); 1273 return (rc); 1274} --- 81 unchanged lines hidden (view full) --- 1356 free(txq->stmp, M_SFXGE); 1357 1358 /* Release DMA memory mapping. */ 1359 sfxge_dma_free(&txq->mem); 1360 1361 sc->txq[index] = NULL; 1362 1363#ifdef SFXGE_HAVE_MQ |
1365 mtx_destroy(&txq->lock); | 1364 SFXGE_TXQ_LOCK_DESTROY(txq); |
1366#endif 1367 1368 free(txq, M_SFXGE); 1369} 1370 1371static int 1372sfxge_tx_qinit(struct sfxge_softc *sc, unsigned int txq_index, 1373 enum sfxge_txq_type type, unsigned int evq_index) --- 89 unchanged lines hidden (view full) --- 1463 1464 /* Initialize the deferred packet list. */ 1465 stdp = &txq->dpl; 1466 stdp->std_put_max = sfxge_tx_dpl_put_max; 1467 stdp->std_get_max = sfxge_tx_dpl_get_max; 1468 stdp->std_get_non_tcp_max = sfxge_tx_dpl_get_non_tcp_max; 1469 stdp->std_getp = &stdp->std_get; 1470 | 1365#endif 1366 1367 free(txq, M_SFXGE); 1368} 1369 1370static int 1371sfxge_tx_qinit(struct sfxge_softc *sc, unsigned int txq_index, 1372 enum sfxge_txq_type type, unsigned int evq_index) --- 89 unchanged lines hidden (view full) --- 1462 1463 /* Initialize the deferred packet list. */ 1464 stdp = &txq->dpl; 1465 stdp->std_put_max = sfxge_tx_dpl_put_max; 1466 stdp->std_get_max = sfxge_tx_dpl_get_max; 1467 stdp->std_get_non_tcp_max = sfxge_tx_dpl_get_non_tcp_max; 1468 stdp->std_getp = &stdp->std_get; 1469 |
1471 mtx_init(&txq->lock, "txq", NULL, MTX_DEF); | 1470 SFXGE_TXQ_LOCK_INIT(txq, "txq"); |
1472 1473 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev), 1474 SYSCTL_CHILDREN(txq_node), OID_AUTO, 1475 "dpl_get_count", CTLFLAG_RD | CTLFLAG_STATS, 1476 &stdp->std_get_count, 0, ""); 1477 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev), 1478 SYSCTL_CHILDREN(txq_node), OID_AUTO, 1479 "dpl_get_non_tcp_count", CTLFLAG_RD | CTLFLAG_STATS, --- 155 unchanged lines hidden --- | 1471 1472 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev), 1473 SYSCTL_CHILDREN(txq_node), OID_AUTO, 1474 "dpl_get_count", CTLFLAG_RD | CTLFLAG_STATS, 1475 &stdp->std_get_count, 0, ""); 1476 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev), 1477 SYSCTL_CHILDREN(txq_node), OID_AUTO, 1478 "dpl_get_non_tcp_count", CTLFLAG_RD | CTLFLAG_STATS, --- 155 unchanged lines hidden --- |