nxge_send.c revision 4496171313bed39e96f21bc2f9faf2868e267ae3
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER START
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The contents of this file are subject to the terms of the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Common Development and Distribution License (the "License").
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You may not use this file except in compliance with the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * See the License for the specific language governing permissions
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * and limitations under the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * When distributing Covered Code, include this CDDL HEADER in each
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If applicable, add the following below this CDDL HEADER, with the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * fields enclosed by brackets "[]" replaced with your own identifying
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * information: Portions Copyright [yyyy] [name of copyright owner]
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER END
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#pragma ident "%Z%%M% %I% %E% SMI"
18c2aff776a775d34a4c9893a4c72e0434d68e36artemtypedef struct _mac_tx_hint {
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint nxge_tx_lb_ring_1(p_mblk_t, uint32_t, p_mac_tx_hint_t);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemnxge_start(p_nxge_t nxgep, p_tx_ring_t tx_ring_p, p_mblk_t mp)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: tx dma channel %d", tx_ring_p->tdc));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: Starting tdc %d desc pending %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nxgep->statsp->port_stats.lb_mode == nxge_lb_normal) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "link not up or LB mode"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: cksum_flags 0x%x (partial checksum) ",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: tdc %d: dumping ...: b_rptr $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "(Before header reserve: ORIGINAL LEN %d)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NXGE_DEBUG_MSG((nxgep, TX_CTL, "==> nxge_start: dump packets "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "TX Descriptor ring is channel %d mark mode %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!nxge_txdma_reclaim(nxgep, tx_ring_p, nxge_tx_minfree)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "TX Descriptor ring is full: channel %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nxgep->resched_needed && !nxgep->resched_running) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tx_desc_ring_vp = (p_tx_desc_t)DMA_COMMON_VPTR(desc_area);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem tx_desc_ring_pp = (p_tx_desc_t)DMA_COMMON_IOADDR(desc_area);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NXGE_DEBUG_MSG((nxgep, TX_CTL, "==> nxge_start: wr_index %d i %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(1): wr_index %d i %d msgdsize %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The first 16 bytes of the premapped buffer are reserved
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * for header. No padding will be used.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem bcopy_thresh = (nxge_bcopy_thresh - TX_PKT_HEADER_SIZE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len <= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem NXGE_DEBUG_MSG((nxgep, TX_CTL, "==> nxge_start(1): nmblks %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "len %d pkt_len %d pack_len %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Hardware limits the transfer length to 4K.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If len is more than 4K, we need to break
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * nmp into two chunks: Make first chunk smaller
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * than 4K. The second chunk will be broken into
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * less than 4K (if needed) during the next pass.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "desc entry %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "DESC IOADDR $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "desc_vp $%p tx_desc_p $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "desc_pp $%p tx_desc_pp $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "len %d pkt_len %d pack_len %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "USE BCOPY: "));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(5): pack"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: pack(6) "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "(pkt_len %d pack_len %d)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(7): > max NEW "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy thresh %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "pkt_len %d pack_len %d(next)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(7_x2): "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "pkt_len %d pack_len %d (new hdrp $%p)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "USE BCOPY: before bcopy "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "DESC IOADDR $%p entry %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy packets %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy kaddr $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy ioaddr (SAD) $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy clen %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy boff %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "1USE BCOPY: "));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "2USE BCOPY: "));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "last USE BCOPY: copy from b_rptr $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "to KADDR $%p (len %d offset %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: dump packets "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "(After BCOPY len %d)"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "USE BCOPY: "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "DESC IOADDR $%p entry %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy packets %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy kaddr $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy ioaddr (SAD) $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy clen %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bcopy boff %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(12_1): "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "USE DVMA: len %d clen %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "ngathers %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * this is the fix for multiple
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * cookies, which are basicaly
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * a descriptor entry, we don't set
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * SOP bit as well as related fields
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start: DMA "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "ncookie %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "ngathers %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "dma_ioaddr $%p len %d"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "desc $%p descp $%p (%d)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "==> nxge_start(12_2): "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "USE DVMA: len %d clen %d ",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "DMA: ddi packets %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "dma mapping failed for %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "bytes addr $%p flags %x (%d)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } /* ddi dvma */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem sop_tx_desc_p->bits.ldw.sad = dma_ioaddr & 0xffffffff;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "Desc_entry %d ngathers %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "desc_vp $%p tx_desc_p $%p "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "len %d clen %d pkt_len %d pack_len %d nmblks %d "
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "dma_ioaddr (SAD) $%p mark %d",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem npi_desc_handle.function.function = nxgep->function_num;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem xfer_len = ((save_desc_p->value & TX_PKT_DESC_TR_LEN_MASK) >>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\t\tsad $%p\ttr_len %d len %d\tnptrs %d\t"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "mark %d sop %d\n",
&cksum_flags);
goto nxge_start_fail2;
goto nxge_start_fail2;
cksum_flags));
cksum_flags));
#if defined(_BIG_ENDIAN)
npads));
#ifdef NXGE_DEBUG
sad,
" (len/dump_len/pkt_len/tot_xfer_len) %d/%d/%d/%d):\n"
(char *)hdrp,
sop_index));
return (status);
for (i = 0; i < ngathers; i++) {
(void) dvma_unload(
USE_DMA) {
return (status);
tx_rings));
return (B_FALSE);
ring_index));
return (B_TRUE);
mblk_t *
return (mp);
return (mp);
switch (nxge_tx_lb_policy) {
== ETHERTYPE_IP)) {
sizeof (uint8_t)) {
sizeof (struct ether_header);
hdrs_size = 0;
sizeof (hdrs_buf))) {
if (mblk_len >=
% maxtdcs);
case NXGE_TX_LB_HASH:
return (ring_index);
return (DDI_INTR_CLAIMED);